segunda-feira, 21 de março de 2016

Raspberry Pi e Arduino: Comunicação serial de forma segura

raspberry pi e arduino

A conexão serial entre o Raspberry Pi e Arduino pode ser algo benéfico em diversos projetos que necessitam da integração dos dois. Existem diversas  possibilidades de conexão entre eles, inclusive via USB. Um dos exemplos já apresentados aqui envolvia a conexão sem fio em 433Mhz para transmitir dados do Raspberry Pi para o Arduino.

A forma mais fácil de conexão seja talvez a USB, que é similar em qualquer outro sistema linux, com acesso a um dispositivo serial geralmente em /dev/ttyACM0 ou /dev/ttyUSB0 . O que esse tutorial irá cobrir é a conexão direta via porta serial (GPIO14-15/UART0/PL011/ALT0).


Como ligar o Raspberry Pi e Arduino via serial


Embora possa parecer simples a ligação de somente dois fios ao TX/RX do Arduino há algo a se lembrar: estamos lidando com tensões de sinal diferentes: 5v/3.3v.

Existem muitas formas de realizar essa ligação, todas elas precisam levar em conta a conversão de tensões para impedir que a tensão de 5v chegue ao Raspberry Pi.

Alguns tutoriais tem ensinado ligações inseguras. A maior parte deles se preocupa em diminuir o sinal de 5v do TX do Arduino mas se esquecem que no RX temos um pull-up de 5v e ligam diretamente.

Algumas configurações podem fazer com que esses 5v cheguem ao Raspberry Pi o que não é uma boa ideia.

Há módulos práticos onde é possível realizar essas conversões como esse.


Ligacao elétrica entre o Raspberry Pi e Arduino


Irei apresentar aqui a opção que utilizei, nosso exemplo contará com a utilização do Arduino Uno.

Material:

- 1 transistor NPN (EBC) pn2222 (pode ser substituído por outros)
- Resistor de 1k, 2k, 10k e 100 Ohm.

Na parte de transmissão do Arduino para o Raspberry Pi iremos utilizar um simples divisor para 3.3v. Se for utilizar a protoboard é bom tomar cuidado para garantir que as conexões estejam certas e bem fixas. Um resistor com mal contato pode desfazer a configuração de divisor e levar os 5v até o GPIO do Raspberry Pi.

Na parte de recepção do Arduino vinda do Raspberry Pi iremos utilizar um transistor NPN na configuração emitter follower onde a tensão do emissor não será maior que a base (ligada aos 3.3v VCC do Raspberry Pi) menos 0.7v, ou seja, não maior do que 2.6v. Essa configuração além de proteger o GPIO do Raspberry Pi de tensões mais altas, irá manter os 5v quando em HIGH no coletor.

raspberry pi arduino esquema serial

raspberry pi arduino esquema visual serial

Apesar de não ser a melhor solução, essa configuração traz uma segurança maior do que a maioria divulgada por aí e pode ser feita com componentes "comuns".

Na imagem do osciloscópio abaixo temos o sinal em 5v sendo transmitido do Arduino Uno (laranja) para o Raspberry Pi convertido em 3.3v (azul).

transmissao serial arduino raspberry pi sinal

Nessa outra imagem abaixo temos o inverso, o sinal em 3.3v sendo transmitido do Raspberry Pi (azul) para o Arduino Uno convertido em 5v (laranja).

transmissao serial raspberry pi arduino sinal

O sinal LOW na conversão para o Arduino ficou em cerva de 700mV, dentro da margem em que um sinal é considerado LOW, o suficiente para nós.


Software para comunicação via serial com Python ou C


Antes de realizar qualquer tipo de comunicação via serial será necessário desativar o console que vem ativo por padrão na porta. Hoje isso pode ser feito por meio da ferramenta raspi-config, caso a opção não apareça na sua, atualize seu sistema.

Digite raspi-config, vá até Advanced Options, Serial, selecione No. Reinicie o sistema.

Para testar se as ligações estão funcionando, utilizaremos o seguinte código no Arduino:



No Raspberry Pi, somente para teste, em um terminal de o comando "cat /dev/ttyAMA0" que irá ler da porta serial. Em outro o comando "echo A > /dev/ttyAMA0". Caso a letra A seja lida corretamente no Arduino, ele retornará a string "blog.everpi.net" no primeiro terminal do Raspberry Pi.

Caso queira alterar a velocidade da serial, além da alteração no Serial.begin será necessário alterar também no Raspberry Pi, exemplo com stty:

stty -F /dev/ttyAMA0 115200

Caso precise de velocidades acima de 187500bps veja no artigo Como aumentar a velocidade da conexão serial (UART) do Raspberry Pi.

Abaixo um exemplo em python que faz algo parecido ao que fizemos no terminal. Caso não tenha o módulo serial instalado, execute antes:

apt-get install python-serial
 


Salve o código acima como rpi.py e rode python rpi.py. O código irá enviar a letra A a cada segundo e mostrar o retorno do Arduino na tela.

Abaixo temos o mesmo exemplo na linguagem C.



Salve como rpi.c, compile gcc rpi.c -o rpi e rode ./rpi


Considerações da porta serial no Raspberry Pi 3 Modelo B


Como citei brevemente no post de lançamento do Raspberry Pi 3 Modelo B, a UART0 (PL011/ALT0 porta serial utilizada nesse post) foi utilizada para o módulo Bluetooth da placa, sobrando apenas o Mini UART (ou UART1, ALT5) no GPIO.

O problema do Mini UART é que ele vem com várias limitações, ele não é uma implementação completa do UART e não tem um clock dedicado programável como o UART0 por exemplo. Sua velocidade é totalmente dependente do core clock. O Mini UART pode funcionar em várias aplicações enquanto que em outras não, houve relatos de algumas expansões com problemas para funcionar com o Mini UART. Felizmente há duas formas de contornar isso.

A primeira é somente em relação a estabilidade da velocidade do Mini UART (caso seja somente seu problema), onde é necessário fixar manualmente o core clock a 250Mhz no /boot/config.txt adicionando a linha: core_freq=250

A segunda é voltando o UART0 para o GPIO e colocando o Mini UART para funcionar com o módulo Bluetooth. Isso pode ser feito adicionando a linha dtoverlay=pi3-miniuart-bt ao /boot/config.txt.


Conclusão


A conexão com dispositivos que lidam com tensões diferentes como o Arduino e outros merecem cuidado. O assunto envolvendo conexões seriais é bem vasto, alguns podem necessitar de configurações mais avançadas que lidarão com outros parâmetros não citados aqui.

Nenhum comentário:

Postar um comentário