Partage
  • Partager sur Facebook
  • Partager sur Twitter

Envoi/Réception de données Raspberry/Arduino

    15 décembre 2014 à 22:43:49

    Bonsoir à toutes et à tous !

    Avant toute chose, c'est la première fois que je rédige un sujet sur OCR, donc soyez indulgents si je me suis planté de forum, vu que mon "problème" lie à la fois Raspberry, Arduino, et du code en python...

    J'en viens donc à ce fameux problème.
    J'ai un projet à réaliser (enfin, à finir...) cette année, et ce à l'aide d'une centrale inertielle (on va réaliser un sphère, un peu comme dans cette vidéo http://www.instructables.com/id/Remote-Controlled-Basket-Ball-Robot/) , et pour ce faire, on a décidé d'utiliser une Raspberry (qui servira à recevoir des données envoyées par la manette et à prendre des photos), et une Arduino, qui recevra les données de la Raspberry par USB et fera tourner un servomoteur et/ou un moteur DC en fonction des données reçues.

    Cependant, ne sachant pas trop comment m'y prendre, et n'y connaissant pas grand chose en python, j'ai cherché un peu et ai trouvé un code permettant de "convertir" les actions à la manette en valeur (plus on pousse le stick gauche vers le haut, plus une valeur LY augmente par exemple, jusqu'à une valeur max) : https://github.com/martinohanlon/XboxController/blob/master/XboxController.py

    Et là, les soucis commencent :

    Notre Raspberry ne gère que la réception de données (elle devrait pouvoir prendre des photos à l'aide d'une caméra, mais je ne parviens pas à lancer un programme au démarrage de la Raspberry...), ainsi que l'envoi de ces dernières vers l'Arduino qui gère un moteur et un servomoteur. J'ai donc inclut dans tout ce gros code une ligne avec ser.write("une valeur que je veux envoyer vers l'Arduino"), ici pour être précis :

    try: 
    ser.write(xboxCont.LTHUMBX) 
    #start the controller xboxCont.start() 
    print "xbox controller running" 
    while True: 
    time.sleep(1) 
    #Ctrl C 
    except KeyboardInterrupt: 
    print "User cancelled" 
    #error except: 
    print "Unexpected error:", sys.exc_info()[0] 
    raise 
    finally:
    #stop the controller 
    xboxCont.stop()

    Pour vérifier que l'Arduino recevait bien les infos, on a mis un petit prog qui fait clignoter une led autant de fois que le valeur envoyé (on a limité les valeurs à prendre entre -30 et 30 - 30 étant le seuil à partir duquel le prog commence à prendre des valeurs - sachant que seul le premier chiffre est pris en compte pour une raison qui m'échappe), mais lorsqu'on lance le programme avec la manette, et l'Arduino connectée à la Raspberry (par USB), l'Arduino reçoit directement une valeur, sans que l'on ait touché à rien, et lorsqu'on essaie de pousser un peu le stick, puis de le laisser tranquille un moment, la led n'arrête pas de clignoter, signifiant que l'Arduino reçoit toujours des données (la led RX clignote en permanence de mémoire)...

    Ma question est donc la suivante : Pensez vous qu'il soit possible de récupérer uniquement (et ce pour un temps très court, sans récupérer tout le flot) une valeur envoyée par la manette sur la Raspberry (une sorte de variable qui stockerai cette valeur et se contenterai de l'envoyer à l'Arduino)?
    Et si oui, comment faire?
    En gros : comment faire pour ne récupérer qu'une valeur dans le flot de données que reçoit (et affiche) la Raspberry, ne pas modifier cette valeur, et l'envoyer à l'Arduino?

    Une des pistes que je pense exploiter serait de restreindre encore plus les conditions sur l'Arduino : si elle reçoit 100, on passe à l'état 1, le moteur tourne, si elle reçoit -100, on passe l'état à -1, le moteur tourne dans l'autre sens.

    Si jamais je n'ai pas été assez clair n'hésitez pas à me le dire, j'essaierai de reformuler, bien que je sois un peu perdu dans tout ce fouillis...mais pour faire simple, je veux "juste" envoyer des données par USB de ma Raspberry à une Arduino (si possible vérifier ce que je reçois), via un code Python.

    PS : si jamais quelqu'un peut m'expliquer un peu ce que le code fait, je suis tout autant preneur ; la partie des définitions ne me gène pas, mais les gros blocs par la suite sont plus...mystiques, et surtout les différents appels que je ne comprends pas trop, notamment vers la fin où, en essayant de commenter des lignes pour enlever des valeurs qui ne me servaient pas (et en enlevant les appels de la fonction qui suivent), comme celles-ci :

    def controlCallBack(xboxControlId, value): 
    print "Control Id = {}, Value = {}".format(xboxControlId, value)

    J'ai des erreurs un peu partout >_<

    Je vous remercie par avance de vos réponses (et désolé pour le pavé)!

    -
    Edité par Katapult 15 décembre 2014 à 22:50:08

    • Partager sur Facebook
    • Partager sur Twitter
      16 décembre 2014 à 5:42:02

      salut,

      on dirait que tu rentres dans une boucle infinie ?

      essayes de faire un schéma de l' algorithme de ton programme entier et vérifies les conditions d' entrée et de sortie de tes boucles.

      • Partager sur Facebook
      • Partager sur Twitter

      Envoi/Réception de données Raspberry/Arduino

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown