Explications sur l`utilisation des capteurs infrarouges avec ROBUS
Transcription
Explications sur l`utilisation des capteurs infrarouges avec ROBUS
Cet art méconnu qu’est la détection d’obstacles par infrarouge Serge Caron, Tech. Version 1.1, mars 2000 Ce document décrit le fonctionnement des dispositifs infrarouges utilisés sur ROBUS version 2 pour détecter la proximité d’objets. Ce genre de dispositifs est aussi utilisé par d’autres robots, comme par exemple le Rug Warrior, pour les mêmes raisons. Contrairement à une armure (ou jupe ou pare-chocs), les détecteurs infrarouges n’ont pas à entrer en contact physiquement avec l’obstacle afin de pouvoir le détecter. Cependant, les capteurs infrarouges ne couvrent généralement pas la totalité des angles du robot et ils ne peuvent pas détecter un objet noir. Un dispositif de détection par infrarouge compte deux éléments principaux : l’émetteur et le récepteur. Émetteur Lumière Objet Récepteur Le fonctionnement théorique est très simple : la diode émet de la lumière qui, si elle est reflétée par un obstacle, est captée par le récepteur infrarouge. Donc, tant que le récepteur ne perçoit pas de lumière, il n’y a pas d’obstacles devant. L’émetteur est une diode infrarouge. ROBUS utilise un OP132 d’Optrex. Cette diode émet de la lumière infrarouge lorsqu’un courant passe dedans. Plus le courant est élevé, plus la lumière est intense. Serge Caron, Tech. Explications infrarouge.doc Page 1 de 6 17/03/00 Le récepteur est plus complexe. ROBUS utilise un IS1U60L de Sharp. Le récepteur doit être en mesure de faire la différence entre la lumière infrarouge qui est omniprésente dans l’environnement et celle émise par l’émetteur. Le IS1U60L est un circuit électronique complexe capable de faire une telle distinction. La lumière infrarouge qu’il détecte est particulière : elle doit être pulsée à 38 kiloHertz. Le récepteur, lorsqu’il ne perçoit pas de lumière pulsée à 38kHz, retourne un “1” logique. Dès qu’il détecte la lumière de l’émetteur, il retourne un “0” logique. Émetteur (38kHz) Récepteur Note : ROBUS s’occupe déjà de moduler ses émetteurs infrarouges à 38kHz. L’usager n’a donc pas à s’en préoccuper. Il n’a qu’à activer et désactiver les diodes émettrices. IREMITx IRRECVx Mais c’est dans la mise en pratique que ça se gâte. En effet, le récepteur IS1U60L de Sharp avait été conçu comme récepteur pour les télécommandes de télé et de magnétoscope. Il n’a pas été conçu pour recevoir un flot continu d’informations infrarouge. Ainsi, le récepteur IS1U60L saturera (cessera de détecter) au bout d’un court moment s’il reçoit un flot continu de lumière pulsée à 38kHz : IREMITx IRRECVx Serge Caron, Tech. Explications infrarouge.doc Page 2 de 6 17/03/00 La solution est donc d’activer l’émetteur pendant un court moment, de l’arrêter un autre court moment, de recommencer, et ainsi de suite. De cette façon, on s’assure de ne pas saturer le récepteur, mais la détection d’obstacles devient plus difficile, car, au lieu d’obtenir un simple niveau logique à la sortie du récepteur infrarouge, on obtient une forme d’onde: IREMITx IRRECVx Il est intéressant de noter que la fréquence vue à la sortie du récepteur est égale à celle qu’on utilise pour activer/désactiver l’émetteur. Il faut donc trouver une façon de détecter la présence de cette forme d’onde sur la sortie du détecteur. Il existe deux façons aisées de le faire : 1) L’usager utilise le NE567 (“Phased Locked Loop” ou “PLL”) qui est déjà disponible sur ROBUS. On doit brancher la sortie du récepteur (IRRECVx) sur l’entrée du NE567 (PLL-IN) et activer/désactiver l’émetteur à une fréquence égale à laquelle le NE567 réagit. La sortie du NE567 (PLL-OUT) retournera un “0” logique s’il n’y a pas d’obstacle et un “1” logique s’il en détecte un. Le NE567 réagit à une fréquence de 1,2kHz. 2) On contrôle le tout avec une carte à microprocesseur telle que le Handy Board. Il nous faut une ligne de sortie pour contrôler l’émetteur et une ligne en entrée pour lire le récepteur. Prenons par exemple le montage suivant : ROBUS Handy Board Sortie PD5 IREMIT1 Entrée Digital 11 IRRECV1 Avec l’aide d’Interactive C, il est facile d’écrire une fonction qui contrôlera ce petit montage et qui indiquera s’il y a un obstacle ou non. Le fichier ir_front.c contient une fonction semblable que vous pouvez modifier a votre guise. Note : Les entrées digitales 10 à 15 passent par des inverseurs avant d’être lues par le Handy Board. Donc, lorsqu’un “1” logique se trouve sur une des ces entrées, la fonction digital() retourne un “0”. Serge Caron, Tech. Explications infrarouge.doc Page 3 de 6 17/03/00 int ir_detect(void) { int val1, val2; bit_set(0x1009,0x20); bit_set(0x1008,0x20); msleep(1L); val1 = digital(11); bit_clear(0x1008,0x20); msleep(1L); val2 = digital(11); bit_set(0x1008,0x20); return( ~val1 & val2 ); } /* /* /* /* /* /* /* /* PD5 en sortie pour l'emetteur */ PD5 a 1 = emetteur eteind */ attend 1 milliseconde */ lit le detecteur une 1ere fois */ Allume l'emetteur de gauche, PD5 */ attend 1 milliseconde */ relit le detecteur */ eteind l'emetteur gauche */ En termes simples, l’exemple ci-dessus : a) b) c) d) e) f) g) éteint l’émetteur; attend 1 milliseconde; lit le récepteur et sauvegarde la lecture dans val1; allume l’émetteur; attend 1 milliseconde; lit le récepteur et sauvegarde la lecture dans val2 et retourne une valeur logique indiquant la présence ou non d’obstacles. Pour déterminer si un obstacle est présent, il faut que le récepteur ne détecte pas de lumière lorsque l’émetteur est éteint (val1 = 0) et qu’il détecte de la lumière lorsque l’émetteur est allumé (val2 = 1). Le multiplexage de tout ce beau monde ROBUS est capable de monter deux émetteurs infrarouges avec un récepteur infrarouge par côté, pour un maximum de 8 émetteurs et 4 récepteurs. Le Handy Board, quant à lui, n’offre que 6 sorties à l’usager. Il en manque deux autres pour pouvoir brancher tous les émetteurs. Pour pallier à ce problème, une des solutions est de monter le Handy Voice sur le Handy Board. Cette carte d’expansion comporte, en plus de la puce de son, quatre sorties numériques, ce qui porte le total de sorties disponibles à neuf (le Handy Voice s’accapare une des sorties du Handy Board pour ses propres fins). Une autre solution est d’utiliser le circuit de multiplexage et de démultiplexage monté sur ROBUS. De cette façon, il est possible de contrôler tous les émetteurs et les récepteurs infrarouges avec quatre sorties et une entrée! Le circuit multiplexeur permet de brancher les quatre récepteurs sur une seule entrée du Handy Board, tandis que le démultiplexeur permet de contrôler les huit émetteurs avec une seule sortie. Les trois autres sorties servent à sélectionner quelle paire émetteur-récepteur est contrôlée par le Handy Board. Le schéma de la page suivante indique comment brancher ensemble les diverses lignes des connecteurs J9, J10 et le Handy Board. Serge Caron, Tech. Explications infrarouge.doc Page 4 de 6 17/03/00 Note : Les IRRECVx sont branchés sur deux entrées du multiplexeur à la fois car chaque récepteur sert pour deux émetteurs. Le récepteur doit donc rester sélectionné pour chacun de ses deux émetteurs. Très important : Le démultiplexeur 74HC138 inverse son entrée LEDMUX : toutes les lignes Y non-sélectionnées sont placées à “1”, tandis que la ligne Y sélectionnée tombe à “0” lorsque LEDMUX passe à “1”. Il faut donc inverser la logique de la sortie PD5 (bit_set() <-> bit_clear()) dans la fonction ir_detect() pour corriger la situation. Le fonctionnement du sélecteur est très simple : chacune des lignes d’entrées et de sortie du multiplexeur/démultiplexeur est sélectionnée par une adresse variant de 0 à 7. Par exemple, si vous écrivez “3” sur le sélecteur (lignes A0, A1 et A2), vous branchez la ligne RCV3 du multiplexeur sur RCVMUX et vous connectez LEDMUX sur LED3 du multiplexeur. Les autres lignes RCVx et LEDx sont complètement ignorées. Le schéma ci-dessus utilise encore Digital 11 et PD5, ce qui nous permet d’utiliser la routine ir_detect() (n’oubliez pas d’inverser la logique de PD5). Il ne reste plus qu’à écrire une fonction qui permet de changer l’adresse du sélecteur : Serge Caron, Tech. Explications infrarouge.doc Page 5 de 6 17/03/00 void choose_ir(int address) { /* s'assure de la validite de l'adresse */ if( address < 0 ) address=7; if( address > 7 ) address=0; bit_set(0x1009, 0b00010100); /* PD2 et PD4 en sortie */ bit_set(0x1026, 0b10000000); /* PA7 en sortie */ /* A0/PD2 */ if( address & 1 ) bit_set(0x1008, 0b00000100); else bit_clear(0x1008, 0b00000100); /* A1/PD4 */ if( address & 2 ) bit_set(0x1008, 0b00010000); else bit_clear(0x1008, 0b00010000); /* A2/PA7 */ if( address & 4 ) bit_set(0x1000, 0b10000000); else bit_clear(0x1000, 0b10000000); } Bon câblage! Serge Caron, Tech. Explications infrarouge.doc Page 6 de 6 17/03/00