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.14, août 2004
Ce document décrit le fonctionnement des dispositifs infrarouges utilisés sur ROBUS 2004 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
ou OP133 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
01/09/04
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. Note : Les diodes
émettent avec un “0” logique.
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
01/09/04
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 (“Phase 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 d’environ 1,1kHz.
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 :
Handy Board
ROBUS
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
01/09/04
int ir_detect(void)
{ int val1, val2;
bit_set(0x1009,0x20);
/* PD5 en sortie pour l'emetteur */
bit_set(0x1008,0x20);
/* PD5 a 1 (emetteur OFF) */
msleep(1L);
/* attend 1 milliseconde */
val1 = digital(11);
/* lit le detecteur une 1ere fois */
bit_clear(0x1008,0x20);
/* Allume l'emetteur PD5 */
msleep(1L);
/* attend 1 milliseconde */
val2 = digital(11);
/* relit le detecteur */
bit_set(0x1008,0x20);
/* Eteind l'emetteur PD5 */
/* Pour une detection, le detecteur doit etre 0 lorsque
l'emetteur est OFF et 1 lorsque l'emetteur est ON */
return( ~val1 & val2 ); }
L’exemple ci-dessus est une version adaptée du contenu de ir_front.c pour fonctionner avec le
multiplexeur. 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 de la sortie PD3 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
Serge Caron, Tech.
Explications infrarouge.doc
Page 4 de 6
01/09/04
indique comment brancher ensemble les diverses lignes des connecteurs J9, J6 et le Handy
Board.
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.
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 circuit du démultiplexeur est monté de façon à respecter la logique des lignes IREMITx. Du
point de vue logiciel, c’est un peu comme s’il n’était plus là une fois que la bonne adresse est
sélectionnée.
Le schéma ci-dessus utilise encore Digital 11 et PD5, ce qui nous permet d’utiliser la routine
ir_detect(). 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
01/09/04
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
01/09/04