IROBOT ROOMBA : CAPTEUR INFRA-ROUGE - IROBOT ROOMBA : CAPTEUR INFRA-ROUGE EXTRAIT DU POBOT

La page est créée Antoine Marie
 
CONTINUER À LIRE
IROBOT ROOMBA : CAPTEUR INFRA-ROUGE - IROBOT ROOMBA : CAPTEUR INFRA-ROUGE EXTRAIT DU POBOT
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