Jean-Christophe Dalouzy 836 Posté(e) 13 août 2024 Bonjour, Je suis actuellement en train de développer un programme python pour piloter un arduino, l'ensemble sera en charge de piloter un setup astro. Je rencontre un soucis de communication sur le port COM entre le programme python et l'Arduino que je ne saisis absolument pas. Y a-t-il quelqu'un qui a déjà développé une application de ce genre sur le forum ? Jean-Christophe Partager ce message Lien à poster Partager sur d’autres sites
artemis 3 302 Posté(e) 13 août 2024 Bonjour, j'ai un setup mais interfacé par un programme sous Lazarus (pas en python) qui pilote une arduino Nano... je ne sais pas si cela pourrait te servir ? Xavier Partager ce message Lien à poster Partager sur d’autres sites
apricot 1 739 Posté(e) 13 août 2024 Juste une suggestion; demander à Chat GPT. Je viens de jeter un oeil, il suggère 4 points à vérifier et le code qui va avec. Partager ce message Lien à poster Partager sur d’autres sites
DOLGULDUR 124 Posté(e) 13 août 2024 (modifié) Il m'est arrivé de communiquer soir directement en python via le port série/usb soit plus simplement avec un protocole de communication établi par le firmware firmata/pyfirmata. Pour un exemple de code astro/python/Arduino basé sur pyserial il y a ça: https://github.com/panoptes/panoptes-utils/blob/develop/src/panoptes/utils/serial/device.py Modifié 13 août 2024 par DOLGULDUR Partager ce message Lien à poster Partager sur d’autres sites
Raphael_OD 1 586 Posté(e) 15 août 2024 (modifié) PySerial ne te convient pas ? Coté Python ou coté Arduino tes problèmes ...? Modifié 15 août 2024 par Raphael_OD Partager ce message Lien à poster Partager sur d’autres sites
Jean-Christophe Dalouzy 836 Posté(e) 15 août 2024 Bonjour, Merci pour vos réponses. @apricot Je n'ai pas pensé à chatGPT... je n'ai pas le réflexe. Je vais voir si l'outil peut m'aider @DOLGULDUR Pour ma connexion, j'utilise pour l'instant, la façon traditionnelle (println / write sur le port COM via la bibliothèque serial) sans passer par firmata. En fait ce que je ne comprends absolument pas est que quand je saisis la commande au clavier dans une interface python pour l'envoyer sur le port COM de l'arduino ça fonctionne nickel, mais quand je fais exactement la même chose en intégrant cette commande dans le code python pour exécution directe (nécessaire dans le cas d'une IHM) et bien, l'arduino ne répond pas. J'avais vu des tutos avec firmata, je vais tenter, même si cela va m'obliger à modifier tout le code. L'autre piste que j'ai cru identifier serait une incompatibilité entre une IHM et une communication sur port COM. La seule solution serait dans ce cas de faire du thread... mais là, je ne suis pas super à l'aise car je n'en ai jamais fait. Merci en tout cas pour votre aide. Partager ce message Lien à poster Partager sur d’autres sites
Jean-Christophe Dalouzy 836 Posté(e) 15 août 2024 @Raphael_OD justement, c'est Pyserial que j'utilise. Je pense que le problème vient du code python. Pour être plus claire, ci-après l'extrait du code python : ------------------------ la fonction d'envoi de la commande ------------------ def envoiCommande(commandeAenvoyer): commande_a_envoyer = str(CaractereSpecialDebutDeCommunication + commandeAenvoyer + CaractereSpecialFinDeCommunication) print(commande_a_envoyer.encode()) commande_serie.write(commande_a_envoyer.encode('utf-8')) ------------------------ le code d'execution ------------------ commande_string = 'getHAmb'envoiCommande(commande_string) --> cas 1 au lancement du programme : un échecafficheReponseArduino() ----> Lancement dans une interface python ensuite et quand je tape 'getHAmb', cela fonctionne nickel alors que c'est toujours la même fonction envoiCommande(commande_string) qui est utilisée. while 1: commande_string = recueilInstruction() if commande_string == "EXIT": break else: envoiCommande(commande_string) afficheReponseArduino() Ce n'est évidemment qu'un extrait du code. Partager ce message Lien à poster Partager sur d’autres sites
Jean-Christophe Dalouzy 836 Posté(e) 15 août 2024 Je viens de trouver un artifice... j'utilise la fonction recueilInstruction() qui servait initialement à récupérer les informations saisies au clavier en injectant dans cette fonction directement le string que je souhaite sans passer par la saisie au clavier ... et ça marche alors que si je fixe directement le string dans la fonction envoiCommande().... ça ne marche pas !! Alors là, franchement, pour moi c'est un mystère car ça ne change rien sur le fond à part passer par une fonction supplémentaire. J'adore le python, mais des fois, il y a des zones d'ombre surtout pour moi qui vient du C++ :-). Merci encore pour votre aide. Jean-Christophe Partager ce message Lien à poster Partager sur d’autres sites
DOLGULDUR 124 Posté(e) 15 août 2024 Si je comprends bien, il y aurait un effet de bord (positif) lie a la fonction "input" (probablement utilisee dans recueilInstruction). De loin, sans avoir plus de detail, je dirais qu'il s'agit peut etre d'un delai qui s'applique lorsque l'input manuelle est utilisee. Ou bien un flush de buffer interne, peut-etre cette discussion peut elle aider a comprendre ce qui se passe par rapport au reste de ton code: https://stackoverflow.com/questions/7266558/pyserial-buffer-wont-flush Partager ce message Lien à poster Partager sur d’autres sites
Jean-Christophe Dalouzy 836 Posté(e) 16 août 2024 @DOLGULDUR C'est exactement cela, je pense que la fonction input génère une latence positive sur les échanges sur le port COM. J'avais essayé de mettre un peu de délais, mais cela n'avait rien changé. J'ai réglé le problème en faisant une boucle envoie de la commande/réception jusqu'à retour des informations positives... cela marche au bout de 3 boucles seulement, mais cela génère un peu de latence sans impact fonctionnel mais ce n'est pas très propre. Je vais regarder en détail ton lien et certainement passer également en thread. Jean-Christophe 1 Partager ce message Lien à poster Partager sur d’autres sites
Jean-Christophe Dalouzy 836 Posté(e) 16 août 2024 @DOLGULDUR Je viens de tester avec les fonction flushInput() et flushOutput() du buffer interne et en effet, cela devait être ça le problème, car cela fonctionne maintenant nickel sans faire de boucle. Merci :-). 1 Partager ce message Lien à poster Partager sur d’autres sites