IROBOT ROOMBA : CAPTEUR INFRA-ROUGE - IROBOT ROOMBA : CAPTEUR INFRA-ROUGE EXTRAIT DU POBOT
←
→
Transcription du contenu de la page
Si votre navigateur ne rend pas la page correctement, lisez s'il vous plaît le contenu de la page ci-dessous
iRobot Roomba : capteur infra-rouge Extrait du PoBot http://www.pobot.org iRobot Roomba : capteur infra-rouge - Composants - Les entrées - Capteurs de position - Date de mise en ligne : mercredi 16 mars 2011 PoBot Copyright © PoBot Page 1/7
iRobot Roomba : capteur infra-rouge Sommaire • Le codage • Comment décoder le signal (...) • Le petit programme qui va (...) J'utilise des robots aspirateurs Roomba de la société iRobot depuis plusieurs années. A force de me rendre l'inestimable service de ne pas avoir à passer l'aspirateur (et donc de ne plus me faire engueuler quand j'avais le malheur d'oublier...) il a fallu procéder à quelques réparations. Dernière réparation en date, le changement du pare-choc. Il était tellement rayé que les capteurs infra-rouge de proximité ne voyaient plus les obstacles... Refusant de jeter quoi que ce soit sans en avoir retiré tout ce qui pourrait m'être utile dans un avenir proche (hum ! c'est souvent lointain, très lointain), j'ai donc récupéré sur le pare-choc que je venais de changer pour cause de vieillissement prématuré, la petite tourelle du capteur infra-rouge. L'idée m'est venue d'essayer de fabriquer un petit robot qui utiliserait cette petite tourelle pour venir se recharger automatiquement sur le chargeur du Roomba. La tourelle contient un capteur infra-rouge à démodulateur de 38KHz, son signal passant à 0 quand elle détecte un signal de cette fréquence. Il en existe beaucoup dans le commerce, à commencer par le TSOP1838 de chez VISHAY ou celui de RadioShack (que j'ai testé avec une égale réussite). Le codage Première chose à faire trouver le codage du signal infra rouge. Est-ce du Sony, RC5, RC6, ... ? Rien de tout cela Copyright © PoBot Page 2/7
iRobot Roomba : capteur infra-rouge malheureusement, ou plutôt heureusement puisque finalement c'est beaucoup plus facile à traiter. Pour voir à quoi ressemble le signal infra-rouge j'ai utilisé le petit oscilloscope DSO Nano 2 de chez Seeeduino. Très pratique et surtout très facile d'utilisation pour quelqu'un qui a utilisé un oscilloscope pour la dernière fois en 1er année de fac (ah ouais, quand même...). Après quelques recherches sur internet je suis tombé sur un petit article décrivant les codes des trames. Les codes sont justes pour la télécommande mais faux pour le dock de rechargement. Remote control Power : 10001010 Spot : 10000100 Clean : 10001000 Max : 10000101 Left : 10000001 Forward/Left : 10001011 Forward : 10000010 Forward/Right : 10001100 Right : 10000001 Pause : 10001001 Docking station - FAUX ! Behind : 11110010 Left : 11111010 Slightly left : 11111011 Middle : 11111110 Slightly right : 11110111 Right : 11110110 Copyright © PoBot Page 3/7
iRobot Roomba : capteur infra-rouge Pourquoi sont-ils faux ? Parce que le dock du Roomba n'a que 3 leds d'émission infra-rouge : une dans la tourelle et deux dans la petite fenêtre en dessous, donnant les signaux gauche et droite (séparés par une cloison), avec une petite astuce, un troisième signal est émis, par l'addition des signaux gauche et droite, qui sont émis simultanément, ce signal n'est visible uniquement si on est dans l'axe du dock(c-a-d dans le champ de visibilité des deux leds). Cela donne plutôt le schéma ci-dessous : Grâce au DSO Nano j'ai pu retrouver les codes qui m'intéressent : Docking station - VRAI ! Dock Droit 10100100 -» 164 Dock Gauche 10101000 -» 168 Copyright © PoBot Page 4/7
iRobot Roomba : capteur infra-rouge Dock Milieu 10101100 -» 172 Dock Tourelle 10100001 -» 161 (Dock Droit | 10100100 -»164) OU (Dock Gauche | 10101000 -»168) = (Dock Milieu | 10101100 -»172 ) Ou plus visuellement : Comment décoder le signal ? Comme me l'a montré l'oscilloscope la durée totale de la trame dure 32 millisecondes ce qui donne 4 millisecondes par bit, puisqu'il s'agit d'un codage sur 8 bit. La première milliseconde est toujours basse, puis les deux suivantes sont basses ou hautes et la dernière milliseconde est haute. Donc 3 millisecondes basses donne 1 et une milliseconde basse donne 0. (connaissant le code du bouton de la télécommande associé à la trame du signal). Bien, maintenant que je connais la forme du signal et le codage de chaque trame, il ne me reste plus qu'à pondre le petit programme qui va bien. (pondre est le terme exact vu le temps que j'ai passé en salle de travail...) Le petit programme qui va bien La première idée qui m'est venue était d'utiliser la fonction PulseIn dans une interruption (fonction attachInterrupt(getIrKey(),LOW) - interruption sur passage niveau bas du signal). Très pratique, cette fonction renvoie le nombre de microsecondes d'un signal bas ou haut. Malheureusement, après plusieurs heures d'acharnement, je devais me rendre compte qu'à cause du time-out de 1ms du timer de l'interruption, il n'était pas possible d'utiliser cette fonction puisque 1 bit peut faire jusqu'à 3 millisecondes. Copyright © PoBot Page 5/7
iRobot Roomba : capteur infra-rouge Je décide alors de calculer le temps entre un passage du niveau bas au niveau haut, donc une interruption déclenchée par un changement de niveau logique, un digitalRead pour voir quel est l'état du capteur, et la fonction micros pour connaitre le nombre de micro-secondes écoulées depuis le début du programme. Il est vrai que la fonction digitalRead est une fonction qui est lente et pour cette raison il y a un risque de ne pas pouvoir lire les bits au bon moment. Avec une trame de 32ms et avec un bit 0 à 1 ms ça marche très bien. Pour un temps plus court le mieux est d'aller lire directement l'état du capteur sur le registre équivalent à la patte utilisée (PIND par exemple). Voici le petit programme pour Arduino qui va vous permettre de capturer le code envoyé par la télécommande ou par le dock : #define IR_PIN 2 unsigned long code[8] ; unsigned long val; unsigned int ir_value=0; int i; void setup() { pinMode(IR_PIN, INPUT); Serial.begin(115200); Serial.println("Ready..."); ir_value=0x00; attachInterrupt(0,getIrKey,CHANGE); i=0; } void getIrKey() { unsigned int j; if(i3200)||(j1700; //record the bit } } } void loop() { if(i==8){ i=0; translate(); } } void translate() { ir_value = 0; for(int j=0;j
iRobot Roomba : capteur infra-rouge Prochaine étape : l'algorithme permettant d'effectuer l'accostage du dock pour le rechargement du robot. A suivre... Copyright © PoBot Page 7/7
Vous pouvez aussi lire