Futabajara T4YF com "15" canais

Li-po, Li-Ion, Nimh, 1s2p, 10c...... quer aprender mais sobre o "combustivel" dos nossos modelos? Este é o local! Aqui também está aqueles esquema de carregador ou aquele ESC que estava procurando.
Avatar do usuário
Antonio Garcia
membro
Mensagens: 1054
Registrado em: Qui Set 20, 2007 4:43 pm
Localização: Niterói, RJ

Futabajara T4YF com "15" canais

Mensagem por Antonio Garcia »

Estou disponibilizando este projeto totalmente "digratis", como retribuição a tudo o que aprendi neste site. Meu desejo é que ele seja realmente de domínio público (entendeu, né ?). Serve também como estímulo para atrair mais gente para o também fascinante mundo da eletrônica.

Este projetinho nasceu da minha necessidade de poder alterar entre o modo filme e foto da camera digital em pleno vôo. A idéia era aproveitar o 5º canal "escondido" no Futaba 4YF (tem tópico no e-voo ensinando a desvendá-lo) para fazer o serviço, colocando um resistor para o modo e outro para o disparador, e usar 2 circuitos do switch com o CD4013 e mais um circuitinho adicional. Mas ia complicar o circuito, aí pensei: ora, porque não usar PIC ? Bem tirei a poeira dos meus PICs e montei um gravador na protoboard. Daí aproveitei e estendi o número de coisas a serem controladas, veja abaixo.

O princípio de funcionamento do sisteminha é simples. Para entendê-lo é preciso antes saber como é o sinal que é enviado para o servo. O receptor envia continuamente para o servo, em intervalos de aprox. 20ms, pulsos de 1ms a 2ms de largura. A largura desse pulso é determinada pela posição do stick no transmissor. O stick totalmente para um lado gera pulso de 1ms para o servo, totalmente para o outro, 2ms, e na posição neutro, aprox. 1,5ms e outros valores proporcionais ao curso do stick. O stick é acoplado diretamente ao eixo do potenciômetro. Então o que determina a lagura desse pulso é, no fundo, o valor de duas resistências no transmissor.

Alguns links para estudar mais sobre o assunto:
http://agert.homelinux.org/blog/index.php/PPM
http://webpages.charter.net/rcfu/HelpsHints/RadioOps.html
http://www.omegaco.demon.co.uk/mechtml/fmectech.htm#anchor160947
http://www.aerodesign.de/peter/2000/PCM/PCM_PPM_eng.html
http://www.chez.com/silicium31/les_docs.htm

Quando abri meu T4YF, constatei que, para o 5º canal, tem dois resistores de 4k7 cada um ligados em série, com uma tomada central indo para o chip codificador dos pulsos do Tx, uma ponta no negativo do circuito do transmissor, e outra no "positivo" (na verdade vai para um outro circuito do chip codificador. Ligando resistores em paralelo a um destes dois, simulamos o movimento do potenciômetro.

Assim, para cada "canal" adicional, acrescenta-se um resistor de valor diferente em paralelo a um dos resistores de 4k7 citados acima.

O papel do PIC, ligado ao 5º canal do receptor, é medir a largura do pulso e acionar o "canal" correspondente. As possibilidades são incontáveis. Pode-se, inclusive, controlar vários servos pelas portas do PIC. No código que estou fornecendo é mostrado como vou controlar o servo de TILT de -90º (olhando totalmente para baixo) a +90º (olhando totalmente para cima). Na verdade os servos aceitam um range de 0,5ms a 2,5 ms, correspondendo a um giro total de 180º do braço do servo. O servo de PAN vou rotacioná-lo de -180º a 180º, com interruptores de fim de curso externos ao servo. Dá também para fazer um outro painelzinho para controlar o trem de pouso, luzes de navegação, flaps em posições predeterminadas, por exemplo, 10, 15, 20 graus (aliás, qual o ângulo máximo de deflexão de um flap ? :roll: ). Acho que vou fazer uma nova asa com flaps para o meu Stick Bomber AP. 8)

Bem chega de lero-lero. Vamos às imagens:


Transmissor com o painelzinho com 11 canais adicionais:
[URL=http://imageshack.us][img:8e4eae0333]http://img262.imageshack.us/img262/7995/img0961lozr3.jpg[/img:8e4eae0333][/URL]
[URL=http://g.imageshack.us/img262/img0961lozr3.jpg/1/][img:8e4eae0333]http://img262.imageshack.us/img262/img0961lozr3.jpg/1/w640.png[/img:8e4eae0333][/URL]


Traseira do transmissor. Eu precisava de levar 3 fios (do "potenciômetro") até o painel. Por sorte, o conector quadrado deste TX tem dois pinos livres. O terceiro é o negativo, que já está disponível no conector quadrado. O comprimento deste cabinho é crítico, não pode ser longo.
[URL=http://imageshack.us][img:8e4eae0333]http://img241.imageshack.us/img241/3694/img0963loda3.jpg[/img:8e4eae0333][/URL]


Como o painel foi construído. À esquerda circuito do painel com os interruptores e resistores, o cabinho e a tomada para o conector quadrado e uma camada de depron por cima. No meio, a "skin" do painel, e à direita o revestimento, plástico usado como capa em encadernações espiral.
[URL=http://imageshack.us][img:8e4eae0333]http://img407.imageshack.us/img407/1516/img0960lort0.jpg[/img:8e4eae0333][/URL]


Esquema do painel do TX. O "+" pode estar trocado com o GND, não tenho certeza pois o rádio está fechado. Esqueci de desenhar no circuito , mas tem que colocar um resistor de 330 ou 390ohms em série com o "central":
[URL=http://imageshack.us][img:8e4eae0333]http://img100.imageshack.us/img100/4058/txis0.jpg[/img:8e4eae0333][/URL]


Esquema do circuito a ser ligado no 5º canal do receptor. Na minha câmera (Samsung L700), os botões de disparo (shutter), e zoom, têm um pino ligado ao negativo, por isso o diodo basta. Já os botões de power e mode, não são ligados ao negativo, por isso precisou do transistor (comum = mais barato):
[URL=http://imageshack.us][img:8e4eae0333]http://img264.imageshack.us/img264/3976/5canalcu7.jpg[/img:8e4eae0333][/URL]

Código fonte em C. Dá para melhorar várias coisas, mas vai esse mesmo. Tem que colocar o "include" com os defines correspondentes ao microcontrolador, PIC16F628, no caso. Removi, pq este include varia de acordo com o compilador usado. Para melhor visualização, tem que formatar o texto abaixo para uma fonte de largura fixa, exemplo: courier new.

[code:1:8e4eae0333]
#define TMODE 1289 /* periodo, em us, de cada pulso valido */
#define TZIN 1662
#define TZOUT 1825
#define TPOWER 1760
#define TSHUTTER 1398
#define TUP 1192
#define TDOWN 1121

#define DELTA 20 /* Janela de -DELTAus a +DELTAus, dentro da qual o pulso eh valido */

#define TMODE_INI TMODE-DELTA /* intervalo de cada pulso valido */
#define TMODE_FIM TMODE+DELTA
#define TZIN_INI TZIN-DELTA
#define TZIN_FIM TZIN+DELTA
#define TZOUT_INI TZOUT-DELTA
#define TZOUT_FIM TZOUT+DELTA
#define TPOWER_INI TPOWER-DELTA
#define TPOWER_FIM TPOWER+DELTA
#define TSHUTTER_INI TSHUTTER-DELTA
#define TSHUTTER_FIM TSHUTTER+DELTA
#define TUP_INI TUP-DELTA
#define TUP_FIM TUP+DELTA
#define TDOWN_INI TDOWN-DELTA
#define TDOWN_FIM TDOWN+DELTA

#define PMODE RA1
#define PZIN RA7
#define PZOUT RA0
#define PPOWER RA6
#define PSHUTTER RB7
#define PTILT RB6

#define ATIVA_PMODE PMODE=1
#define ATIVA_PZIN PZIN=0
#define ATIVA_PZOUT PZOUT=0
#define ATIVA_PPOWER PPOWER=1
#define ATIVA_PSHUTTER PSHUTTER=0

#define DESATIVA_PMODE PMODE=0
#define DESATIVA_PZIN PZIN=1
#define DESATIVA_PZOUT PZOUT=1
#define DESATIVA_PPOWER PPOWER=0
#define DESATIVA_PSHUTTER PSHUTTER=1

#define LIM_INF_TILT 500
#define CENTRO_TILT 1500
#define LIM_SUP_TILT 2500
#define DELTA_TILT 10

#define INT_RB0 0
#define INT_TMR1 1

#define LED RB3

#define TCURTO 0
#define TLONGO 1


static unsigned int valor_timer1;

static unsigned int contador;

static unsigned int pulso_tilt;
static char esperando;

void delay(unsigned char);

void main(void)
{
unsigned char i;

/* Desabilita comparadores */
CM2 = CM1 = CM0 = 1;

/* Configura Portas */
TRISA = 0b00111100;
TRISB = 0b00110111;

DESATIVA_PZIN;
DESATIVA_PZOUT;
DESATIVA_PSHUTTER;
DESATIVA_PMODE;
DESATIVA_PPOWER;

LED=0;

for (i=1; i<7; i++)
{
if(LED) LED=0;
else LED=1;

delay ( TCURTO );
}

/* Configura valor_timer1 como timer e desabilita */
TMR1CS = 0; TMR1ON = 0;
valor_timer1 = 0;
TMR1H = TMR1L = 0;

/* Direciona tratamento de interrup‡ao para RB0 */
esperando = INT_RB0;

/* Inicializa sevo de TILT */
pulso_tilt = CENTRO_TILT;
PTILT = 0;

/* Programa RB0 para interrupcao na subida */
INTEDG = 1;

/* Libera interrupcoes */
INTE = 1;
TMR1IE = 1;
PEIE = 1;
GIE = 1;

LED=0;

for (;;)
{
/* Se RB0 lo e timer0 nao zero e timer0 parado,
verifica qual porta devera ser acionada;
em seguida, gera pulso para servo da camera */
if (!TMR1ON && !RB0 && valor_timer1 > 0)
{
/* Desabilita interrupcao da RB0 */
INTE = 0;

if ( valor_timer1 >= TMODE_INI && valor_timer1 <= TMODE_FIM )
{ ATIVA_PMODE; DESATIVA_PZIN; DESATIVA_PZOUT; DESATIVA_PPOWER; DESATIVA_PSHUTTER; LED=1; }
else
if ( valor_timer1 >= TZIN_INI && valor_timer1 <= TZIN_FIM )
{ DESATIVA_PMODE; ATIVA_PZIN; DESATIVA_PZOUT; DESATIVA_PPOWER; DESATIVA_PSHUTTER; LED=1; }
else
if ( valor_timer1 >= TZOUT_INI && valor_timer1 <= TZOUT_FIM )
{ DESATIVA_PMODE; DESATIVA_PZIN; ATIVA_PZOUT; DESATIVA_PPOWER; DESATIVA_PSHUTTER; LED=1; }
else
if ( valor_timer1 >= TPOWER_INI && valor_timer1 <= TPOWER_FIM )
{ DESATIVA_PMODE; DESATIVA_PZIN; DESATIVA_PZOUT; ATIVA_PPOWER; DESATIVA_PSHUTTER; LED=1; }
else
if ( valor_timer1 >= TSHUTTER_INI && valor_timer1 <= TSHUTTER_FIM )
{ DESATIVA_PMODE; DESATIVA_PZIN; DESATIVA_PZOUT; DESATIVA_PPOWER; ATIVA_PSHUTTER; LED=1; }
else
if ( valor_timer1 >= TUP_INI && valor_timer1 <= TUP_FIM )
{
LED=1;
if ( pulso_tilt < LIM_SUP_TILT )
pulso_tilt += DELTA_TILT ;

if ( pulso_tilt > LIM_SUP_TILT )
pulso_tilt = LIM_SUP_TILT;
}
else
if ( valor_timer1 >= TDOWN_INI && valor_timer1 <= TDOWN_FIM )
{
LED=1;
if ( pulso_tilt > LIM_INF_TILT )
pulso_tilt -= DELTA_TILT;

if ( pulso_tilt < LIM_INF_TILT )
pulso_tilt = LIM_INF_TILT;
}
else
{
DESATIVA_PMODE; DESATIVA_PZIN;
DESATIVA_PZOUT; DESATIVA_PPOWER;
DESATIVA_PSHUTTER;
LED=0;
}

/* Gera pulso para o servo de TILT */
esperando = INT_TMR1;
valor_timer1 = 0xFFFF - pulso_tilt + 50;
TMR1H = ((unsigned int)valor_timer1 >> 8) & 0x00FF;
TMR1L = (unsigned int)valor_timer1 & 0x00FF;
TMR1IE = 1;
TMR1ON = 1;
PTILT = 1;
/* espera overflow Ttimer1 */
for (;esperando == INT_TMR1;);
PTILT = 0;

valor_timer1 = 0;
TMR1H = TMR1L = 0;
INTF = TMR1IF = 0;
INTEDG = 1;
INTE = 1;
}
}
}

void interrupt intrr(void)
{
switch ( esperando )
{
case INT_RB0:
TMR1ON = RB0;
INTEDG = !RB0;

if( !RB0 )
valor_timer1 = (((unsigned int) TMR1H) << 8) | ((unsigned int) TMR1L);

break;

case INT_TMR1:
TMR1ON = 0;
TMR1IE = 0;
esperando = INT_RB0;
break;
}

/* Limpa flag de interrup‡ao da RB0 */
INTF = 0;

/* Limpa flag de interrup‡ao do timer1 */
TMR1IF = 0;

}

void delay(unsigned char tempo)
{
contador = 0;
switch (tempo)
{
case TCURTO:
contador = (unsigned int) 20000;
break;
case TLONGO:
contador = (unsigned int) 40000;
break;
}

for(; contador > 0 ; contador --);
}
[/code:1:8e4eae0333]
Avatar do usuário
Antonio Garcia
membro
Mensagens: 1054
Registrado em: Qui Set 20, 2007 4:43 pm
Localização: Niterói, RJ

Mensagem por Antonio Garcia »

Bem, espero que gostem. O forum colocou os emoticons no código fonte, mas deu para entedr né ? Um abraço a todos.
Avatar do usuário
fabio_sp
membro
Mensagens: 1681
Registrado em: Dom Nov 05, 2006 4:45 pm
Localização: São Paulo, SP

Mensagem por fabio_sp »

CARA, MEUS PARABENS!!!! isso é genial!
Avatar do usuário
RCampos
membro
Mensagens: 935
Registrado em: Sáb Ago 11, 2007 12:30 pm
Localização: Uberaba-MG
Contato:

Mensagem por RCampos »

Cara que loucura!
Já tinha adicionado o quinto canal no 4yf mas isso aí é insano, você encheu ele de canais.
Parabéns pelo projeto.
Avatar do usuário
RCampos
membro
Mensagens: 935
Registrado em: Sáb Ago 11, 2007 12:30 pm
Localização: Uberaba-MG
Contato:

Mensagem por RCampos »

Coloca o código com o BBCode [b:abd06c0a28][code][/b:abd06c0a28]
JairVenturii
membro
Mensagens: 257
Registrado em: Seg Mar 10, 2008 1:08 pm
Localização: Rio do Sul,Santa Catarina
Contato:

Mensagem por JairVenturii »

mto legal mas gente to com uma dúvida com o rádio S400 da JR eu sei que posso colocar o 5 canal nele mas como coloco??
Avatar do usuário
Igor Souza
membro
Mensagens: 5427
Registrado em: Dom Nov 19, 2006 12:47 pm
Localização: São Paulo - SP
Contato:

Mensagem por Igor Souza »

:shock: :shock: :shock: :shock: caramba!!!

... e eu tentando programar um atmel pra que um carrinho siga uma linha preta :lol:

Abrcs!
A bagunça gerada é proporcional ao espaço disponível para a mesma.
[Trex 700N2E; Trex 600E ("compactado"), KKminiQuad; KKTri, DX7]
Avatar do usuário
Antonio Garcia
membro
Mensagens: 1054
Registrado em: Qui Set 20, 2007 4:43 pm
Localização: Niterói, RJ

Mensagem por Antonio Garcia »

Ah, obrigado moderador por ter colocado o programa no formato certo. Ficou bem melhor. Grato!!!
Avatar do usuário
As de espadas
membro
Mensagens: 166
Registrado em: Ter Abr 03, 2007 1:48 pm
Localização: Criciuma-sc

Mensagem por As de espadas »

PQP :shock: :shock: :shock:

esse tx eu tenho :twisted:
GMT
membro
Mensagens: 294
Registrado em: Sáb Dez 30, 2006 5:23 pm
Localização: Goiânia, Goiás

Mensagem por GMT »

Parabéns pelo detalhe na explicação! Até eu que sou burro entendi! :D
Pelo que percebi a quantidade de canais neste caso está limitada pela precisão dos resistores, logo pode usar talvez até mais de 15 né?
Dá pra usar potenciometros também ao invés de apenas switches, basta reservar uma parte da gama de resistências disponíveis para o potênciometro, daí o PIC cuida de decodificar. No caso dos botões direcionais, daria pra substituir por potenciometros, bastaria colocar no pic um "multiplicador" pro tamanho do pulso. Nossa se continuar assim vou acabar sugerindo um protocolo pra usar nesse "range" de pulsos do quinto canal! :D
Mas uma vez, parabéns!
Responder