Ligação serie entre o Arduino e o Raspberry Pi.
O Raspberry Pi funciona com uma logica de 3.3V, enquanto que o Arduino trabalha a 5V, pelo que é necessário colocar um divisor de tensão, ou um conversor de nivel lógico, entre o TX do Arduino (5V) e o RX (3.3V) do Raspberry Pi.
O Arduino tem a sua porta serie afecta à USB serial, pelo que é necessário usar a biblioteca SoftwareSerial, com o RX no D10 e TX no D11 (este liga ao in do divisor de tensão, ou ao conversor de nivel lógico) .
Divisor de tensão, de 5V para 3.3V
Da esquerda para a direita na direção do orificio, com as resistencias de frente:
- In do TX do Arduino (laranja)
- Out do RX do Raspberry Pi (verde)
- Gnd do Raspberry pi (preto)
- Gnd do Arduino (azul)
Pinos do Raspberry Pi
Existem modelos do Raspberry Pi com 26 pinos e outros com 40 pinos, que são compativeis com os de 26 pinos.
Como os 26 primeiros pinos são iguais, então em todos os Raspberry Pi a porta serie são os pinos 8 e 10 (Tx, Rx).
Ligações
Raspberry Pi
- RX – Verde – pino 10 (GPIO15 Rx) (ligado ao out do divisor de tensão, ou ao conversor de nivel lógico, que por sua vez liga ao pino D11 do Arduino)
- TX – Amarelo – pino 8 (GPIO14 Tx) (ligado ao D10 do Arduino)
- GND – Preto – pino 6 (GND)
Arduino
- RX – Amarelo – D10 (ligado ao TX do Raspberry Pi – pino 8 (GPIO14)
- TX – laranja – D11 (ligado ao in do divisor de tensão, ou ao conversor de nivel lógico, que por sua vez liga ao pino 10 (GPIO15))
- GND – Azul
Nem todos os pinos do arduino suportam os interrupts necessários para o RX funcionar.
Configuração do Raspberry Pi
O Raspberry Pi necessita de configuração prévia para poder usar a comunicação via serial GPIO.
raspi-config
Interfacing Options > Serial (Shell and kernel messages) > No > Yes
reboot
Software
Programas de teste para o Raspberry Pi e Arduino
Raspberry Pi
Solução com kermit. Necessita de instalar o pacote do kermit.
apt install kermit
Para sai do programa: CTRL \
#!/usr/bin/kermit # Custom C-Kermit settings set line /dev/ttyAMA0 set speed 4800 set serial 8n1 # General C-Kermit settings. These probably don't need to change. set flow-control none set file type bin set carrier-watch off set prefixing all set modem none echo "Prepared to connect." connect
Arduino
#include <SoftwareSerial.h> SoftwareSerial mySerial(10, 11); // RX, TX void setup() { Serial.begin(115200); while (!Serial) {} Serial.println("Start!"); mySerial.begin(4800); mySerial.println("Hello, world?"); } void loop() { if (mySerial.available()) { Serial.write(mySerial.read()); } if (Serial.available()) { mySerial.write(Serial.read()); } }
Problemas
O softwareserial é incompativel com a utilização do Servo, Uma pesquisa na net revelou que não existe forma fácil de resolver o problema. Parece que a solução é usar o Arduino mega.
Links
https://www.arduino.cc/en/Reference/SoftwareSerial