Ligação serie arduino – banana pi

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