lundi 21 mai 2012

Télécommande infrarouge lego power function et librairie arduino

Un chassis motorisé de légo technic est souvent très pratique pour réaliser une base pour un robot. L'idée de cet article est de vous présenter une librairie pour arduino qui permet de commander le récepteur infrarouge des legos technics power functions. Le principe de l'interface est d'émuler les signaux de la télécommande. En effet le protocole lego n'est pas très complexe, et surtout il ouvre la possibilité d'adresser le récépteur légo différemment et donc d'accéder  a de nouvelles fonctionnalités tels que la vitesse de rotation de chaque moteur (sur 7 niveaux) et la fonction de frein qui permet d'immobiliser l'axe du moteur. Pour mettre en exemple cette librairie je vous propose de réaliser une télécommande améliorée pour lego technics power function.




Lego Power Functions récepteur

 Les légos power functions sont devenu assez courants dans des lots de taille considérable de lego technics. Les power functions se composent d'un moteur assez gros pour la motorisation généralement, d'un moteur de taille moyenne généralement pour contrôler des bras ou autres, d'un récepteur infrarouge d'un pack d'alimentation et de l'émetteur infrarouge. Chaque récepteur comporte deux connecteurs pour des moteurs et possède un switch pour régler le canal sur lequel il doit attendre les commandes. Chaque émetteur infrarouge comporte évidement la fonction de sélection de canal pour déterminer sur quel canal émettre.



Télécommande améliorée à base d'arduino

La télécommande que je vous présente ici est très simple. Son cout global n'excède pas une trentaine d'euros. En effet son composant principal est un teensy2.0++ qui est compatible à 100% avec l'IDE arduino.
La télécommande comporte 8 boutons en tout. 4 boutons pour chaque moteur. Deux boutons servent a regler la vitesse et changer de sens pour chaque moteur. Un bouton permet d'envoyer un signal de vitesse nulle pour chaque moteur, et enfin un autre bouton permet d'envoyer la commande de frein pour chaque moteur. Cette commande permet d'appliquer une contrainte sur l'axe du moteur à l'arrêt.





Librairie pour arduino LegoRC

Le code source permettant de communiquer avec le récepteur légo est une classe. Le constructeur de cette classe prend en paramètre la broche sur laquelle vous avez branché la diode infrarouge. On utilisera que trois méthodes publiques: sendCommand(int n1, int n2, int n3), sendSignalString(String msg), autoSend(). Chaque signal infrarouge se compose de 3 mots de 4 bits et d'un mot de vérification (checksum des 3 mots). SendCommand vous permet d'envoyer les 3 mots en entiers compris entre 0 et 15. La méthode sendSignalString, vous permet d'envoyer une chaine de caractères contenant les caractères '1' ou '0'. Cette chaine correspond a la concaténation des trois commandes en binaire. Cette chaine devra obligatoirement faire 16 caractères. Vous aurez donc dans ce cas là calculer la valeur du checksum vous mêmes.


Protocole infrarouge, signaux et documentation

Le protocole utilisé par le récepteur légo est expliqué en détail dans le document: Lego Power Function RC v120.pdf . En effet dans ce document on comprends rapidement quels commande envoyer pour chaque comportement des moteurs voulus. J'attire votre attention sur le Combo PWM mode. Ce mode permet de contrôler les deux moteurs avec une seule commande envoyé. Pour envoyer les commandes au récepteur vous allez pouvoir utiliser la méthode sendCommand de la classe LegoRC. En effet les mots correspondent aux "nibble" de la documentation. Donc le premier mot sera un mot de configuration. Le deuxième la commande pour le moteur B et le troisième la commande pour le moteur A.
Vous pouvez explorer ce document qui comporte tous les modes d'adressage supporté par le récepteur. J'ai choisi d'utiliser le Combo PWM mode car ce dernier permet d'avoir le contrôle de la vitesse. En effet chaque moteur a 7 niveaux de vitesse différente pour chaque sens.


Partie électronique de la télécommande

Comme dis ci dessus, la partie électronique ne présente vraiment aucune difficulté particulière. En effet tout le travail est assuré par le micro contrôleur Teensy2.0++. J'attire cependant votre attention sur quelques détails. Je vous recommande de ne pas oublier de mettre une résistance sur la led infrarouge. Résistance d'environ 220 Ohm. Par ailleurs pour bien distinguer chaque état des boutons il faut une résistance de rappel a la masse. Il s'agit de connecter la pin d'entrée de l'inter a la masse à travers d'une résistance d'environ 30 kOhm. et le bouton positionnera cette pin au +5V lorsque le bouton est enfoncé. Par ailleurs le ciruit est entièrement auto alimenté par l'USB du teensy. Il ne faudra donc surtout pas oublier de relier les broches GND et +5V du teensy à celles du circuit.



Quelques photos




Documents annexes

Lego Power Function RC v120.pdf
Classe LegoRC pour arduino.zip
Programme complet telecommande infrarouge lego pour arduino.zip


14 commentaires:

  1. Bravo c'est bien pourais tu m'envoyer des photo de la telecommande ?

    RépondreSupprimer
    Réponses
    1. Salut, merci pour ton commentaire =), j'ai rajouté quelques photos a l'article =)

      Supprimer
  2. Bonjour

    J'ai tester votre Programme avec une arduino ADK , afin de pouvoir piloter mes Lego directement a partir de mon telephone android , mais je rencontre un probléme , le programme arduino par sur une boucle sans fin dans la function lego.sendCommand(4, m1msg, m2msg);

    J'utilise arduino Mega ADK et arduino 1.03
    Avez vous une idée du probléme rencontré

    Merci pour votre partage

    RépondreSupprimer
  3. Salut, je peux mettre l'article sur mon site en te mentionnant et avec un lien ?

    RépondreSupprimer
    Réponses
    1. Avec le plaisir, tu peux même remanier l'article comme tu veux, cela ne me pose aucun problème dès lors que tu cite la source =)

      Supprimer
    2. un grand merci à toi :) J'ai fais quelques adaptations graphiques je te donne le lien quand c'est fini

      Supprimer
    3. Super! Avec joie, n'hésite pas a la poster ici (dans les commentaires) Cela pourra peut être aider des personnes dans la réalisation de ce genre de périphériques

      Supprimer
  4. Excellent ...

    Cela me sera très utile pour diriger mon réseau de train ...
    Je vais entièrement le programmer avec une arduino DUE, mais c'est mon premier projet et donc je découvre (il faut bien découvrir au début ;-) )

    Voila j'ai quelques petites questions:
    A quoi sert le Toggle?
    le checksum dans le PDF lego c'est le LRC (= LLLL)?
    Comment le calculer? En additionnant tous les chiffres? Ou quelque chose d'autre?
    Si quelqu'un a un lien ou une explication plus en détail de: sendCommand(int n1, int n2, int n3), sendSignalString(String msg) et autoSend().



    Merci d'avance et @+

    Matthieu

    RépondreSupprimer
    Réponses
    1. Bonjour Mathieu,

      Je viens de voir ton message! je peux t'expliquer en détail le send command, mais faut que je me replonge dans le code (ca date un peu) je vais revoir un peu la doc et te répondre rapidement.

      Par contre est tu sur que le reseau de train est compatible avec le meme protocole IR? (je te pose la question car je n'ai jamais eu l'occasion de manipuler des trains légos, de fait je suis totalement ignorant dans le domaine =)

      Supprimer
    2. Ah oui j'oubliais, ce n'est pas pour faire de la pub pour mon blog sur mon propre blog mais regarde l'article http://artiom-fedorov.blogspot.fr/2012/05/robot-suiveur-de-lignes-base-du-teensy.html

      J'utilise la lib proposée dans cet article justement! en attendant ca pourra peut être t'inspirer =)

      Supprimer
    3. Oui bonjour Artiom,

      je n' espérai pas une réponse aussi rapide, merci beaucoup

      Pour la comptabilité il y a surement 1 ( des 3 ) trains qui est compatible car c'est un aussi powerfunctions ... Enfin le récepteur la télécommande et le boîtier a pile, le moteur me semble aussi Power Functions ...

      Pour les 2 autres trains je sais pas car ce sont des trains plus anciens ... Je peux vous envoyer des photos si vous voulez. Mais le récepteur, moteur, et boitier à pile est un morceau ... Si je n'arrive pas à "cloner" cette télécommande, je pourrais toujours intervenir manuellement sur les télécommandes en fermant un relais, etc. Mais avec la télécommande plus récente ce n'est pas possible avec la nouvelle ... Donc pour cella ce devra être digital ...

      Voila j'attends tes explications avec impatience,
      1000 mercis

      et @+

      Supprimer
    4. Bonjour Artiom,

      Merci beaucoup d'avoir répondu si vite ...

      Alors dans mon réseau de trains j'ai 3 trains: 2 anciens et 1 nouveau. Le nouveau est surement compatible avec Power Functions car le récepteur et boitier est le même que sur le site ( le moteur je sais pas car il est pas le même que sur ce site ... ) ... Pour les 2 anciennes c'est plus compliqué car le récepteur et boitier a pile sont en un morceau ... On ne peut pas acheter les éléments séparés et ils ne sont pas compatible avec Power Functions ... Mais j'ai une sortie de rechange ... Je peux relier une sortie arduino a un relais qui ferme un circuit et alors ça fait comme si on avait pousse sur le bouton de la télécommande ( Quand on pousse il y a une petite plaque,métallique qui ferme ce circuit).

      Donc pour les 2 anciens je sais faire sans mais pas pour la nouvelle car la télécommande est plus compliquée...

      Donc je cherche une possibilité pour celle en Power Functions et éventuellement pour les autres ...

      merci tout le monde :D

      @+

      Matthieu

      Supprimer
    5. Bonjour,

      Vu que mon projet navancais pas j'ai été demande de l'aide autre part ...

      Donc voila j'arrive a commander mon train avec la fonction SendCommand mais alors dans mon programme je n'arrive ni a mettre du Delay, ni a mettre plusieurs sendCommand dans la meme boucle...

      il y a pe une explication?

      merci beaucoup pour votre aide ...

      Matthieu

      Supprimer
    6. Bonjour,
      Bravo et Merci pour cette réalisation précieuse.
      Mais comment la transposer sur un Arduino Nano avec le choix des 4 canaux ?
      Alain

      Supprimer