Seguí las instrucciones en este sitio web con éxito:
http://www.doctormonk.com/2012/04/raspberry-pi-and-arduino.html
y pude obtener comunicación entre el pi y mi mega arudino exactamente como lo especifica el sitio web.
Sin embargo, en lugar de enviar un número entero que represente la cantidad de veces que parpadea el LED, quiero enviar un texto ASCII como:
"MOVER 5 METROS HACIA ADELANTE", "GIRAR A LA IZQUIERDA", "MOVER 10 METROS HACIA ATRÁS" hacia el arduino desde el pi.
Escribí el siguiente código:
char inData[64];
char inChar=-1;
void setup(){
Serial.begin(9600);
Serial.begin("Waiting for Raspberry Pi to send a signal...\n");
}
void loop(){
byte numBytesAvailable= Serial.available();
// if there is something to read
if (numBytesAvailable > 0){
// store everything into "inData"
int i;
for (i=0;i<numBytesAvailable;i++){
inChar= Serial.read();
inData[i] = inChar;
}
inData[i] = '\0';
Serial.print("Arduino Received: ");
Serial.println(inData);
}
}
Actualicé el código anterior con éxito a mi Arduino Mega 2560.
Cambié a mi terminal de Python en la Raspberry Pi y en la consola escribí:
import serial
ser = serial.Serial('/dev/ttyACM1',9600)
ser.write("MOVE")
Lo que se muestra en el monitor serie de mi Arduino es el siguiente:
Arduino Received: M
Arduino Received: O
Arduino Received: V
Arduino Received: E
Pero lo que quiero es:
Arduino Received: MOVE
¿Cómo cambio el código anterior para obtener todos los caracteres en el búfer inData?
Respuestas:
El problema es que el Arduino está dando vueltas tan rápido que ejecutará la
if (numBytesAvailable > 0)
línea varias veces entre cada carácter que llegue a través del puerto serie. Entonces, tan pronto como llega un personaje, lo agarra, realiza un bucle de cero a uno e imprime un solo personaje.Lo que debe hacer es enviar un carácter de final de línea ('\ n') después de cada comando desde su programa Python. Luego, haga que su código Arduino guarde cada carácter que recibe y solo actúe sobre el mensaje una vez que reciba el carácter de fin de línea.
Entonces, si cambia su código de Python, envíe un carácter de final de línea, así:
Entonces su código Arduino puede ser algo como esto:
fuente
La secuencia de comandos de Python es el envío de cuatro bytes,
M
,O
,V
, yE
. ¿Cómo se supone que Arduino sabe que es una sola cuerda? Considere que el código Python:es completamente idéntico a
desde el punto de vista de Arduino. Los puertos serie transfieren caracteres, no cadenas.
En su código, el Arduino es rápido (en comparación con la velocidad de 9600 baudios), por lo que cada vez que llama
Serial.available()
, solo ve uno de esos cuatro caracteres. Es por eso que obtuviste la salida que hiciste.Lo que tendrá que hacer es idear alguna forma de delimitar cadenas, es decir, marcarlas de alguna manera desde Python para que el Arduino pueda agregar los caracteres individuales que recibe en su concepto de cadena de alto nivel .
El uso de líneas es sencillo: envíe cada cadena terminada con un carácter de nueva línea (
'\n'
). En el Arduino, lee los caracteres y agrégalos a tu cadena. Cuando vea a'\n'
, la cadena ha terminado y puede imprimirla.fuente
El código anterior funciona perfecto en mi conexión entre Pi y Arduino
fuente
Usar en
.readline
lugar de.read
Tuve el mismo problema y esto lo solucionó de inmediato. Espero que esto haya ayudado!
fuente
Así es como lo hice desde el primer ejemplo:
fuente