Ligação serie entre o arduino e o banana pi.
O Banana pi M1 usado no projecto tem três portas serie, mas apenas uma está facilmente acessivel com a distribuição e kernel que estou a usar (nota 1).
O Banana pi tem uma logica 3.3V, enquanto que o Arduino nano tem de 5V, pelo que é necessário colocar um divisor de tensão (será melhor um conversor de nivel logico) entre o TX do Arduino (5V) e o RX (3.3V) do Banana 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).
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 Banana Pi (verde)
- Gnd do Banana pi (preto)
- Gnd do Arduino (azul)
Ligações
Banana Pi
- RX – Verde – J11-1 RXD (ligado ao out do divisor de tensão, que por sua vez liga ao pino D11 do Arduino)
- TX – Amarelo – J11-2 TXD (ligado ao D10 do Arduino)
- GND – Preto – J12-8 GND
Arduino
- RX – Amarelo (ligado ao TX do Banana Pi, J11-2 TXD)
- TX – laranja – D11 (ligado ao in do divisor de tensão , que por sua vez liga ao J11-1 RXD)
- GND – Azul
Nem todos os pinos do arduino suportam os interrupts necessários para o RX funcionar.
Software
Programas de teste para o Banana Pi e Arduino
Banana 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
Quando efectuei a ligação série do pi ao Arduino com o servo ligado, este começou a comportar-se de forma estranha. Uma pesquisa na net por softwareserial servo revelou que não existe forma fácil de resolver o problema. Parece que a solução é usar o Arduino mega.
Fiz algumas tentativas de mudança de pinos, do servo e da serial port, mas sem sucesso. A solução acabou por ser mudar o servo para o Arduino A, o que efectua os movimentos.
Serial info dmesg
[ 3.791205] Serial: 8250/16550 driver, 8 ports, IRQ sharing disabled [ 3.794503] console [ttyS0] disabled [ 3.814860] 1c28000.serial: ttyS0 at MMIO 0x1c28000 (irq = 45, base_baud = 1500000) is a 16550A [ 3.814910] console [ttyS0] enabled [ 3.838525] 1c28c00.serial: ttyS1 at MMIO 0x1c28c00 (irq = 46, base_baud = 1500000) is a U6_16550A [ 3.862112] 1c29c00.serial: ttyS2 at MMIO 0x1c29c00 (irq = 47, base_baud = 1500000) is a U6_16550A
Notas
O banana pi está a usar a distro linux Armbian 5.25 com o kernel 4.9.7-sunxi, que não tem acesso facil a configuração dos overlays necessária para activar as outras portas serie e outras formas de comunicação.
A versão do Armbian seguinte que já tem acesso facil a activação das portas de comunicação vem um novo kernel que não é estavel no banana pi.
Links
https://www.arduino.cc/en/Reference/SoftwareSerial