J'ai suivi avec succès les instructions sur ce site:
http://www.doctormonk.com/2012/04/raspberry-pi-and-arduino.html
et j'ai pu obtenir une communication entre le pi et mon méga arudino exactement comme le spécifie le site Web.
Cependant, au lieu d'envoyer un entier représentant le nombre de fois que la LED clignote, je veux envoyer du texte ASCII comme:
"DÉPLACEZ 5 MÈTRES EN AVANT", "TOURNEZ À GAUCHE", "DÉPLACEZ 10 MÈTRES EN ARRIÈRE" vers l'arduino depuis la pi.
J'ai écrit le code suivant:
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);
}
}
J'ai flashé avec succès le code ci-dessus sur mon Arduino Mega 2560.
Je suis passé à mon terminal python sur le Raspberry Pi et dans la console j'ai tapé:
import serial
ser = serial.Serial('/dev/ttyACM1',9600)
ser.write("MOVE")
Ce qui s'affiche sur le moniteur série de mon Arduino est le suivant:
Arduino Received: M
Arduino Received: O
Arduino Received: V
Arduino Received: E
Mais ce que je veux c'est:
Arduino Received: MOVE
Comment puis-je changer le code ci-dessus pour obtenir tous les caractères dans le tampon inData?
Réponses:
Le problème est que l'Arduino tourne si vite qu'il exécutera la
if (numBytesAvailable > 0)
ligne plusieurs fois entre chaque caractère arrivant via le port série. Ainsi, dès qu'un personnage arrive, il l'attrape, boucle de zéro à un et imprime un seul caractère.Ce que vous devez faire est d'envoyer un caractère de fin de ligne ('\ n') après chaque commande de votre programme Python. Ensuite, demandez à votre code Arduino de tamponner chaque caractère qu'il reçoit et n'agissez sur le message qu'une fois qu'il reçoit le caractère de fin de ligne.
Donc, si vous changez votre code Python, envoyez un caractère de fin de ligne, comme ceci:
Ensuite, votre code Arduino peut ressembler à ceci:
la source
Votre script Python envoie quatre octets,
M
,O
,V
etE
. Comment l'Arduino est-il censé savoir qu'il s'agit d'une seule chaîne? Considérez que le code Python:est complètement identique à
du point de vue de l'Arduino. Les ports série transfèrent les caractères, pas les chaînes.
Dans votre code, l'Arduino est rapide (par rapport au débit de 9600 bauds), donc à chaque fois qu'il appelle
Serial.available()
, il ne voit qu'un de ces quatre caractères. C'est pourquoi vous avez obtenu le résultat que vous avez obtenu.Ce que vous devrez faire est de trouver un moyen de délimiter les chaînes, c'est-à-dire de les marquer d'une manière quelconque à partir de Python afin que l'Arduino puisse ajouter les caractères individuels qu'il reçoit dans votre concept de haut niveau d'une chaîne .
L'utilisation des lignes est simple: envoyez chaque chaîne terminée par un caractère de nouvelle ligne (
'\n'
). Sur l'Arduino, lisez les caractères et ajoutez-les à votre chaîne. Lorsque vous voyez un'\n'
, la chaîne est terminée et vous pouvez l'imprimer.la source
Le code ci-dessus fonctionne parfaitement sur ma connexion entre Pi et Arduino
la source
Utiliser
.readline
au lieu de.read
J'ai eu le même problème et cela l'a réglé immédiatement. J'espère que cela a aidé!
la source
Voici comment je l'ai fait à partir du premier exemple:
la source