Bonjour à tous et bonne année !
Je me bas depuis plusieurs jour avec le problème suivant :
Mon install : arduino uno r3 relié à mon raspberry pi2 en usb : cela créé automatiquement le port /dev/ttyACM0 sur le raspberry
But de la manoeuvre :
- l'arduino attend de recevoir le caractère "?" sur le port série, et dès qu'il le reçoit renvoie la chaîne "hello"
- côté raspberry : petit script python qui ouvre le port série, envoi le "?" et lit la réponse (hello)
Code arduino :
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
if (Serial.read() == '?') {
Serial.println("hello");
}
}
}
Code python raspberry pi :
import serial, time
ser = serial.Serial('/dev/ttyACM0',9600,timeout=5)
ser.write('?')
time.sleep(.5)
print ser.readline()
ser.close()
Problèmes :
- au 1er lancement du script python ("python test.py"), après le téléversement arduino fait, je n'ai aucune réponse, c'est le timeout=5 qui interrompt l'attente
- aux lancements suivants, j'ai des réponses plus ou moins correctes, le mot hello n'est parfois pas complet (hell, ou ho, ...) et parfois également c'est le timeout qui rend la main car le \n n'arrive pas
Le plus étrange, c'est que si je fais la même chose mais depuis le shell python, tout marche très bien, le 1er lancement et les suivants !
C'est python 2.7.3 qui est utilisé.
Les programmes sont pourtant simples et conformes aux différents exemples trouvés sur le net.
- Je me demandais si éventuellement ce n'était pas le Serial.read() de l'arduino qui mangeait sa propre réponse ? l'entrée et la sortie sont bien dissociées, non ? Mais dans ce cas pourquoi ça marcherait depuis le shell python ...
- Est-ce que la liaison via série usb n'est pas fiable, vaut mieux utiliser les pin rx/tx ? Dans mon cas ce ne sera pas possible car celles du raspberry sont déjà occupés par un autre montage
- L'arduino n'est pas directement relié au raspberry, il l'est via un hub usb, je vais essayer en direct
Si vous avez des idées... je suis preneur !
Merci d'avance