Messages recommandés

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

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

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

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é par DOLGULDUR

Partager ce message


Lien à poster
Partager sur d’autres sites

PySerial ne te convient pas ? 

Coté Python ou coté Arduino tes problèmes ...?

 

Modifié par Raphael_OD

Partager ce message


Lien à poster
Partager sur d’autres sites

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

@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 échec
afficheReponseArduino()

 

----> 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

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

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

@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

  • J'aime 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant