¿Se requiere programación cuando hacemos una interfaz entre un Arduino y Raspberry Pi usando UART?

Sí, ciertamente, y será cierto con muchas formas en que puede crear una red entre dos dispositivos de hardware. Los de uso común tienen que tener protocolos para comunicarse de manera efectiva, de lo contrario tenemos que codificar el protocolo.

Te sugiero que uses la comunicación serial entre ellos usando el cable usb arduino provisto con el arduino. Será mucho más fácil de implementar y sin problemas.

  • Conecte su arduino a pi en su puerto USB, como lo haría con cualquier otra computadora. Esto alimentaría su pi y también crearía una red de comunicación en serie entre ellos.
  • Ahora todo lo que tiene que hacer es codificar su pi para recibir y dar sentido a los datos en serie, su arduino para enviar datos en comunicación en serie y viceversa. Para codificar su arduino, puede codificar y grabar el código en su arduino en su PC y luego conectarse a pi o puede enviarse el código por correo electrónico y descargarlo en su pi, o puede instalar arduino IDE en pi usando este comando en la cáscara y el código en él.
    • sudo apt-get install arduino
  • Ahora, para el código arduino, debe definir una serie de software utilizando

Serial.begin (9600) // establece la fecha de bau en 9600

  • entonces necesita convertir datos a hexa y enviarlos a pi. Así de simple

sprintf (dataString, “% 02X”, 2); // esta línea convierte tus datos a hexa
Serial.println (dataString); // esta línea lo envía por usb a pi

Adjunto mi código que hice una vez para un proyecto, puede referirlo para comprender la implementación. Lee los comentarios en el código.

#include

SoftwareSerial BTSerial (3,9); // rx, tx para la comunicación bluetooth a arduino

// declaraciones
int lmotorpin1 = 5;
int lmotorpin2 = 6;
int rmotorpin1 = 10;
int rmotorpin2 = 11;
int luces = 12;
int read_bt = 0;
char dataString [50] = {0};

configuración nula ()

{
Serial.begin (9600); // inicio en serie para arduino a pi
BTSerial.begin (9600); // inicio en serie para bluetooth y arduino

pinMode (lmotorpin1, OUTPUT);
pinMode (lmotorpin2, OUTPUT);
pinMode (rmotorpin1, OUTPUT);
pinMode (rmotorpin2, OUTPUT);
pinMode (luces, SALIDA);

}

bucle vacío ()

{

if (BTSerial.available ())

{
read_bt = BTSerial.read ();

if (read_bt == 49) // adelante 1
{
digitalWrite (lmotorpin1, HIGH);
digitalWrite (lmotorpin2, LOW);
digitalWrite (rmotorpin1, HIGH);
digitalWrite (rmotorpin2, LOW);

}

if (read_bt == 50) // hacia atrás 2
{
digitalWrite (lmotorpin1, LOW);
digitalWrite (lmotorpin2, HIGH);
digitalWrite (rmotorpin1, LOW);
digitalWrite (rmotorpin2, HIGH);
}

if (read_bt == 51) // FORWARD left 3
{
digitalWrite (lmotorpin1, LOW);
digitalWrite (lmotorpin2, LOW);
digitalWrite (rmotorpin1, HIGH);
digitalWrite (rmotorpin2, LOW);
}

if (read_bt == 52) // FORWARD right 4
{
digitalWrite (lmotorpin1, HIGH);
digitalWrite (lmotorpin2, LOW);
digitalWrite (rmotorpin1, LOW);
digitalWrite (rmotorpin2, LOW);
}

if (read_bt == 53) // gira la cámara hacia la derecha 5
{

sprintf (dataString, “% 02X”, 1); // convierte un valor a hexa para enviar a pi
Serial.println (dataString); // enviar a pi

}

if (read_bt == 54) // gira la cámara hacia la izquierda 6
{

sprintf (dataString, “% 02X”, 2); // esta línea convierte tus datos a hexa
Serial.println (dataString); // esta línea lo envía por usb a pi

}
}

if (read_bt == 55) // detener 7
{digitalWrite (lmotorpin1, LOW);
digitalWrite (lmotorpin2, LOW);
digitalWrite (rmotorpin1, LOW);
digitalWrite (rmotorpin2, LOW);

sprintf (dataString, “% 02X”, 4); // convierte un valor a hexa
Serial.println (dataString);

}

if (read_bt == 56) // luces altas 8
{
digitalWrite (luces, ALTO);

read_bt = 0;
}

if (read_bt == 57) // luces bajas 9
{
digitalWrite (luces, BAJO);

read_bt = 0;
}

if (read_bt == ‘a’) // gira la cámara a neutral
{
sprintf (dataString, “% 02X”, 3); // convierte un valor a hexa
Serial.println (dataString);
}
}

  • Mi código era para que Arduino enviara datos a pi dependiendo de los datos que recibe de bluetooth, si su caso es opuesto, use Serial.read en lugar de serial.println para aceptar datos de pi.
  • Ahora, para la parte de Python en pi, el siguiente código se explica por sí mismo

import serial ## importa este módulo, si no funciona, instálalo en pi (buscalo en google para más información)
importar RPi.GPIO como GPIO
tiempo de importación

GPIO.setmode (GPIO.BOARD)
GPIO.setup (7, GPIO.OUT)
p = GPIO.PWM (7,50)
p.inicio (7.5)
ser = serial.Serial (‘/ dev / ttyACM0’, 9600) ## dirección de arduino en mi pi, el tuyo puede ser diferente
print (ser) ## comprueba tu dirección escribiendo ls / dev / tty * en la consola
## y saber qué antes y después de adjuntar arduino,
## para obtener su camino

tratar:
mientras cierto:

ser_read = int (ser.readline ()) ## para obtener datos del puerto serie,
## para enviar datos use ser.write ()
if (ser_read == 3):
p.ChangeDutyCycle (7.5)
time.sleep (1)
print (ser_read)

if (ser_read == 1):
p.ChangeDutyCycle (12.5)
time.sleep (1)
print (ser_read)

if (ser_read == 2):
p.ChangeDutyCycle (2.5)

if (ser_read == 4):
GPIO.cleanup ()
print (ser_read)

excepto KeyboardInterrupt:
p. parada
print (ser_read)

RYD

Obviamente, ¿de qué otra forma esperas analizar los datos en ambos extremos?