sexta-feira, 14 de março de 2014

Comunicação sem fio entre Raspberry Pi e Arduino utilizando tx/rx de 433Mhz





















Dos diversos meios de comunicação, certamente a sem fio é bem apreciada e prática em diversos projetos e alguns estão usando em conjunto a dupla Raspberry Pi e Arduino.

Para uma transmissão sem fio entre os dois, naturalmente que precisamos de um transmissor/receptor, abaixo podemos ver um dos mais baratos.





O conjunto está custando hoje 2,83 dólares na Dealextreme.

Reparei que alguns tutoriais em inglês estão erroneamente ensinando a ligação do receptor no Raspberry Pi. Acontece que ao ligar o VCC em 5V ele terá também 5V no pino DATA, mas o GPIO da placa não é tolerante a essa tensão, eles trabalham em 3.3V, você poderá danificar permanentemente seu Raspberry Pi se fizer isso. Uma das soluções para esse problema é utilizar um Logic Level Converter como esse, que regula seguramente a tensão tanto de 5V para 3.3V como de 3.3V para 5V se preciso.


Logical Level Converter
Logical Level Converter

Você pode também claro construir por conta própria, o esquemático do circuito acima está disponível como open hardware, tanto como seu arquivo do Eagle. Além de outros disponíveis na web como em http://elinux.org/RPi_GPIO_Interface_Circuits#Level_Shifters.

Apesar de marcar 5V no meu receptor, segundo informações técnicas nesse documento disponibilizado pela Deal Extreme, o receptor parece funcionar com ligações até de minimos 3V, algo que se realmente possível dispensaria o uso dos conversores.

Em relação ao transmissor nada disso é necessário, apesar de funcionar na faixa de 3V-12V(meus testes iniciais foram com os 3.3V do Raspberry Pi) pode-se ligar sem medo nos 5V da placa, pois quem gera a tensão nesse caso é o GPIO do Raspberry Pi, que quando ligado ao DATA do transmissor, esse vai para o base de um transistor. Quando ligado aos 5V, podemos ver abaixo que o valor efetivo da tensão(RMS) entre o DATA e GND não ultrapassa 3.33V.





No caso desse artigo, estamos utilizando o Raspberry Pi para transmitir e o Arduino para receber. Vamos começar pelas ligações físicas, se desejar coloque uma antena no transmissor e receptor, meus testes iniciais foram sem antena com o rx e tx próximos.

Primeiramente iremos conectar os pinos VCC, GND e DATA do transmissor no Raspberry Pi, o GPIO14 é o TX do UART.



Para conexão utilizei um cabo que sobrou da conexão usb da placa que utilizei na extensão USB com fonte para Raspberry Pi.




No meu caso que tenho o equipamento necessário(um dongle de tv/fm utilizado como SDR) posso analizar no mesmo se o tx já está apto a emitir algo, ativando e deixando o GPIO14 como output e com valor 1(HIGH):

echo 14 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio14/direction
echo 1 > /sys/class/gpio/gpio14/value



O próximo passo é ligar o receptor ao arduino, iremos conectar os pinos VCC, GND e somente um DATA, no caso do DATA qualquer um serve pois estão ligados à mesma trilha.




Como no arduino já vem tudo marcado nem é preciso diagrama, ligue VCC do transmissor ao 5V, GND ao GND e o DATA ao pino 0(RX).

Para conexão ao arduino eu utilizei uma protoboard.



No Raspberry Pi abra o arquivo /etc/inittab para desativarmos o console na porta serial, comente a seguinte linha:

T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100


Na parte de software iremos utilizar a biblioteca wiringPi, criada por Gordon Henderson para facilitar a programação dos GPIOs do Raspberry Pi. Utilizaremos para comunicação via serial no Raspberry Pi, ela é talvez o meio mais fácil para se utilizar a porta serial utilizando C, para mandar um byte você precisa de basicamente isso:




No segundo argumento de serialOpen se trata da velocidade de comunicação em bits por segundo, no meu caso 2400bps.


Baixe a lib utilizando o GIT:

git clone git://git.drogon.net/wiringPi
 
 
Caso não tenha o git instalado:

sudo apt-get install git-core

Entre no diretório e rode como root ou sudo:

./build

Esse comando irá compilar e instalar automaticamente a biblioteca.

Se tudo estiver certo basta então apenas compilar:

gcc codigo.c -lwiringPi -o codigo


No arduino utilizaremos o seguinte código:




Após o upload no arduino( que espero que já esteja familiarizado ), execute o programa no raspberry pi.

O led na placa do arduino irá acender e apagar a cada byte que receber correspondente a letra 'a'.

Entretanto pode ser que nem sempre isso ocorra, o problema é que em rádio frequência lidamos com interferência, mas pior que isso é que esse transmissor e receptor são dos mais baratos e o receptor é bem sensível a ruídos.

Outro ponto a analizar no caso desses, é que eles também não trabalham com um cristal, no caso do tx por exemplo o que parece ser um cristal, na verdade é um filtro SAW, com isso não se tem uma frequência muito estável, algo que pode ser visto abaixo apenas tocando na antena que coloquei(encapada).




Então naturalmente que uma verificação de erros como CRC ou checksum.
se fará necessária em muitos casos.

Esse artigo naturalmente não é um definitivo sobre o assunto, foi demonstrado quase que somente o básico e existem diversos tipos de receptores/transmissores, muitos melhores do que o demonstrado, que é um dos mais baratos e acessíveis.


Está gostando do blog? Ajude-nos a divulgar e curta nossa página no Facebook ou siga-nos no Twitter.



2 comentários:

  1. Excelente post. Tenho uma pergunta. Eu tenho um portao de garagem 433Mhz. Como fazer para clonar os códigos de transmissão de um transmissor do portão e programar esses codigos nesse transmissor que voce citou?

    ResponderExcluir
    Respostas
    1. Olá Luiz, é bem provável que seja possível entretanto eu nunca fiz algo do tipo.

      Excluir