Voila, nous sommes nombreux à faire cette manip, faire communiquer un ARDUINO avec un RASPBERRY en USB.
Pour ma part, grâce a ce site (merci !) et d'autres, ma communication se passe bien, SAUF QUE, à chaque envoie d'une trame à l'ARDUINO, tous mes I/O clignotent et mes relais claquettent de la même façon que quand je charge un sketch, bref, l'impression que l'ARDUINO se reset.
Étrangement, la réponse de l'ARDUINO a la requête du RASPBERRY est correcte.
J'ai donc tenté de garder la connexion ouverte en supprimant le "serial.close()" et en sortant de la boucle avec un "break", mais rien n'y fait!
#Reception des datas
lines=SerialArduino.readline()
time.sleep(1) #SerialArduino.close()
break
.....
Côté ARDUINO
while (Serial.available()>0) { // tant qu'un octet en reception
OctetReception=Serial.read(); // Lit le 1er octet recu et le met dans la variable
NbOctet=NbOctet+1;
if (OctetReception=='$') { // si Octet recu est l'octet de queue
Incoming=1;
delay(100); // pause
break; // sort de la boucle while
}
else {
CaractRecept=char(OctetReception); // convertit l'octet recu en caractere
if ((CaractRecept != char(10)) && (CaractRecept != char(13))){ // Eviter les retour chariot et saut de ligne
ChaineRecept=ChaineRecept+CaractRecept; // ajoute le caratere au String
}
}
}
.....
bonjour,
en principe le rasp ne peut alimenter qu'une très faible consommation, donc si l'arduino n'est pas alimenté via une autre source et qu'il doit alimenter des relais, etc... tout s'effondre et il reset.
donc alim externe pour l'arduino et ca ira mieux, idem si tu as des relais, alim externe pour eux aussi.
Oui désolé de ne pas l'avoir précisé. Ma maquette comporte deux alims, une de 9v 3A pour l'Arduino et une de 5v 5A pour le RPI et la carte relais, sachant qu'il y a un étage d'optocoupleur entre les sorties de l'Arduino et la carte relais pour séparer les potentiels.
C'est peut être difficile de donner plus d'info mais, avec ce que tu donne, comprend que c'est impossible de dire quelque chose.
Tu parles de relais qui claquettent, je dirais vire les dans un premier temps, je dit même vire tout.
Ne connecte rien sur les deux platines et vérifie la seule transmission entre les deux platines.
J'espère que tu comprend que je suis en train de te dire que quand cela ne va pas il faut décomposer ton montage, vérifier les différents fonctionnements un par un en étant systématique, ne faire qu'une chose à la fois sinon tu ne saura jamais ce qui n'a pas fonctionné.
Tu ne franchi pas une étape sans qu'elle soit fonctionnelle.
C'est la meilleure façon d'arriver rapidement à résoudre tes ennuis.
Merci 68tjs, le fait ai que j'ai deja fait le diagnostique, sans aucun periferique, l'arduino reset à la réception de la trame UART du raspberry, je pensais avoir été clair, mille excuses si ca n'a pas été le cas!
voir ici la paragraphe Réinitialisation (logicielle) automatique
Ce fonctionnement a d'autres implications. Quand la carte Mega2560 est connectée à un ordinateur fonctionnant soit sous Mac Os X ou Linux, la carte se réinitialise à chaque fois qu'une connexion se fait entre elle et le logiciel (via le port USB). Pendant la demi-seconde suivante, le bootloader s'exécute sur la carte Mega2560. Puisqu'il est programmé pour ignorer les données mal formatées (càd toute donnée en plus du transfert d'un nouveau programme), il interceptera les quelques premiers octets de donnée envoyé à la carte après qu'une connexion soit établie. Si un programme s'exécutant sur la carte reçoit une configuration initiale ou d'autres données quand il démarre, assurez-vous que le logiciel avec lequel il communique attend une seconde après l'ouverture de la connexion avant d'envoyer ces données.
La carte Mega2560 comporte une piste (du circuit imprimé) que vous pouvez couper pour désactiver la réinitialisation automatique. Les bords de chaque côté de la piste peuvent solidarisés ensemble pour la réactiver. Vous pouvez également désactiver la réinitialisation automatique en connectant une résistance de 110 Ohms entre le +5V et la ligne de réinitialisation (reset); voir ce fil du forum (en anglais) pour plus de détails.
pourquoi ne pas utiliser un des ports UART (1 à 3) ?
rjnc38:
voir ici la paragraphe Réinitialisation (logicielle) automatique
Ce problème n’apparaît qu'à l'ouverture du port sur le PC. Si on ne passe pas son temps à ouvrir/fermer le lien série on ne doit pas rencontrer ce problème.
Par contre, Alematt ne le dit pas, mais j'ai l'impression qu'il programme en Processing sur son RPi. Je suppose aussi que le morceau de code qu'il donne au début et situé dans loop(). Dans ce cas le SerialArduino = serial.Serial('/dev/ttyACM0') placé au début est exécuté à chaque boucle ce qui rouvre la connexion à chaque itération de loop(). Il faudrait placer cette instruction dans setup() et ne plus l'appeler par la suite.
Bonsoir à tous,
Désolé pour le retard, plutot booléen ces temps ci!
Merci rjnc38, j'ai déjà essayé la résistance de 110 ohms sans effet malheureusement, reste la piste à couper...
Fdufnews, sur RPI, il n'y a pas de setup ou de loop, le code est un fichier Python appelé par un gestionnaire de tache toute les minutes (crontab), de fait c'est vrai, la connexion est ouverte en début de code et fermée en fin.
Peut être devrais essayer de l'ouvrir au démarrage du RPI et le laisser ouvert!? Je vais tenter.
Le soucis est que la déclaration de. SerialArduino = serial.Serial('/dev/ttyACM0') ouvre le port par la même occasion, et que si je mets ce code au démarrage, il ne sera pas reconnu dans le fichier Python exécuté périodiquement. Je vais étudier ce point!
Tu devrais jeter un coup d'oeil à l'API de pySerial. A l'ouverture du port série tu peux définir l'état des lignes de handshake ce qui pourrait peut-être permettre de ne pas faire un reset de l'Arduino.
Pour cela, tu ne déclares pas le port utilisé lorsque tu crées l'instance de serial (none en lieu et place du /dev/tty...), tu déclares l'état des lignes de handshake avec rts() et dtr() puis tu ouvres le port avec open().
fdufnews: @rjnc38 peut-être parce que c'est le port0 qui est connecté à l'interface USB.
oui je sais mais je ne connais pas le RPI, le sens de ma question était : pourquoi faire cette liaison sur le port USB (qui présente ce pb) alors qu'il y a 3 autres ports UART sur une MEGA au pire utiliser les pin de l'UART0 (D0 et D1) qui n'ont pas ce pb
rjnc38:
pourquoi ne pas utiliser un des ports UART (1 à 3) ?
Le RPI fonctionne en 3,3v et l'Arduino en 5,0v, ce qui me contraindrait à passer par des optocoupleurs. A terme si je ne trouve pas de solution, j'emploierais celle ci car déjà testé et fonctionnelle.
fdufnews:
Tu devrais jeter un coup d'oeil à l'API de pySerial. A l'ouverture du port série tu peux définir l'état des lignes de handshake ce qui pourrait peut-être permettre de ne pas faire un reset de l'Arduino.
Pour cela, tu ne déclares pas le port utilisé lorsque tu crées l'instance de serial (none en lieu et place du /dev/tty...), tu déclares l'état des lignes de handshake avec rts() et dtr() puis tu ouvres le port avec open().
Merci de cette info fdufnews, je vais étudier ça de prés!
Alematt:
Le RPI fonctionne en 3,3v et l'Arduino en 5,0v, ce qui me contraindrait à passer par des optocoupleurs. A terme si je ne trouve pas de solution, j'emploierais celle ci car déjà testé et fonctionnelle.
on trouve pas mal d'exemples ou l'adaptation se limite a un pont de résistances entre le Tx de l'arduino et le RX du RPI