Capteur de distance infrarouge

Transcription

Capteur de distance infrarouge
http://www.didel.com/
[email protected]
www.didel.com/kidules/KiDistIr.pdf
Capteur de distance infrarouge
Les capteurs par réflexion infrarouge ont comme avantage d’être petits, bon marché et faciles à
mettre en œuvre. Mais ils sont sensible à la lumière ambiante (surtout les spots) et sont difficiles à
calibrer. Ils ne conviennent aussi que pour des courtes distances, qui dépendent de la taille du
capteur, de son optique, de la puissance émise, de filtres éventuels. Des explication générales
sont données sous www.didel.com/doc/sens/DocIr.pdf
Le capteur double KiDist2 a été développé pour le KiCar www.didel.com/kidules/KiCar.pdf avec
plusieurs options avec et sans transistors, ou avec potentiomètre, www.didel.com/kits/Dist2Ir.pdf
Le module Dist3IR www.didel.com/pic/Dist3Ir.pdf , a trois capteurs et deux transistors. Il peut être câblé
pour 1,2, 3 capteurs de distance. Il n’a pas le connecteur Molex normalisé.
Principe
Le principe d'un capteur par réflexion est
d'éclairer l'obstacle avec une LED infrarouge,
et de mesurer la lumière réfléchie avec une
photodiode ou un phototransistor. L'objet
éclairé retransmet une énergie inversément
proportionnelle au carré de la distance.
Le schéma de câblage d'un détecteur
d'obstacle est évident. Une résistance fixe le
courant dans la LED qui éclaire l'obstacle. La
résistance du photo-transistor est mesurée
soit avec un diviseur de tension, soit par
mesure du temps de charge ou décharge
d'un condensateur, ce qui couvre une gamme
de distance plus grande.
Une photodiode, un phototransistor, laissent passer un courant proportionnel à l'énergie
lumineuse reçue. Dans l'obscurité totale, il y a un courant de fuite (dark current). Une diode
travaille avec des niveaux de courants faibles (surtout les diodes de type PIN), alors qu'un
phototransistors génère un courant plus élevé, tout en ayant un courant de fuite
proportionnellement plus élevé. La solution d'emploi facile, avec de nombreux composants à
disposition, est le phototransistor. Le LIT301 a de meilleures performances puisque les diodes ont
un boitier qui fait optique pour concentrer la lumière.
Solution analogique
Le câblage en diviseur de tension est une solution simple, utilisable lorsque la lumière ne varie
pas trop, ce qui est le cas dans des machines, mais pas avec des robots mesurant des distances.
On remplace la résistance par un potentiomètre, pour
avoir une marge manœuvre s’il y a trop de lumière. Si on
lit la tension sans éclairage IR, elle doit être proche du
maximum (255). Les valeurs éclairées par les diodes IR
pour une distance moyenne doivent être de 100-150. La
résistance doit être choisie en conséquence. Ceci garanti
la meilleure détection d’obstacles à la distance prévue. Le
document www.didel.com/doc/sens/DocIr.pdf explique
bien pourquoi le domaine de travail est étroit.
La mesure d’un signal analogique est expliquée sous www.didel.com/kidules/Analogue.pdf.
Le kit Dist2IrPot facilite le montage sur KiCar. On
affiche la valeur sur le portB, mais étant donné
que les bits 4-8 passent par les amplis moteurs,
il ne faut afficher que 4 bits, ce qui est suffisant
pour régler le pot et voir les valeurs obscures et
éclairé par une lampe de poch à filament (une
Led blanche n’envoie pas les bonnes
fréquences). Programme KidiCarAnalo.pde
Mesure par décharge d’un condo
La solution préférée pour la mesure est de charger le
condensateur de l’interface en mettant la ligne en sortie
du processeur, à l’état 1. On commute en entrée, et on
mesure le temps de décharge, d’autant plus rapide qu’il y
a plus de lumière. La valeur du condensateur est telle que
le processeur compte avec suffisamment de précision.
Dans l’obscurité, le condensateur se décharge pas, et un
compteur limite la mesure à par exemple une valeur de
100. On verra que l’on compte toutes les 100ms, donc la
durée de la mesure est de 10 ms.
Pour diminuer l’effet de la lumière ambiante, on peut faire une première mesure sans éclairage IR,
puis une 2e mesure avec éclairage, La différence corrige un peu, mais ce qui est important, c’est
de vérifier que la lumière ambiante donne une valeur très différente. Si non, la capteur est mal
dirigé ou doit être protégé par des caches bien placés.
Donc pour la mesure, on précharge 100 us, ou commute en entrée, et on lit la valeur qui décroit
exponentiellement. Tant que le seul est supérieur à l’état 1 (environ 1.9Và 5V, 0.8V à 3V) on compte.
cnt = 0 ;
for (i=0; i<100; i++) {
delayMicroseconds (100)
if (Dist0 == On) cnt0++ ;
distance0 = cnt0 ;
La distance max est de 100 D1ce qui fait une durée d’acquisition de 20ms.
{
Visualisation du compteur, de la décharge et du
seuil
Le premier cycle a la diode d’éclairage IR éteinte,
e
donc décharge lente. Le 2 cycle mesure la lumière
réfléchie par l’obstacle.
La routine est facile à écrire. Après avoir chargé les condensateur on exécute une boucle toutes les 500
microsecondes (période d’interruption) dans laquelle on incrémente les compteurs associés à chaque
capteur. Un décompteur détermine la valeur maximum mesurée (quand c’est obscur) et définit la durée de
la mesure.
On a donc les instructions suivante pour la fonction de lecture, qui dure 12millisecondes à chaque appel
Il faut d’abord réfléchir quel valeur mettre pour la direction du port A, en tenant compte de tous les bits. On
peut câbler deux ou 4 capteurs de distance. Notre application en utiliser 2 les capteurs étant câblés sur
U6bot, photocapteurs sur RA0 RA1 appelés Dist0 et Dist1, le transistor qui allume des deux diodes IR par
le bit RC0 appelé IR01.
RA0 RA1 commutent en écriture d’un 1 (5V) et lecture du signal qui se décharge pour stopper le comptage.
//KidiCarD1.pde
#include "KiCarDef.h"
#define Dist01Cha PORTA = 0b11111111
#define Dist01In TRISA = 0b11111111
#define Dist01Out TRISA = 0b11111100
u8 distance0 ; u8 distance1 ;
void GetDist ()
{
u8 cnt0, cnt1, tmp, i ;
Dist01Out ;
Dist01Cha ;
delayMicroseconds (100) ;
Dist01In ;
IR01 = On ;
cnt0 = 0 ; cnt1 = 0 ;
for (i=0; i<100; i++) {
delayMicroseconds (100) ;
if (Dist0 == On) cnt0++ ;
if (Dist1 == On) cnt1++ ;
}
distance0 = cnt0 ;
distance1 = cnt1 ;
IR01 = Off ;
}
Dans le programme principal on apelle la procédure qui
mets à jour les variables distance0 et distance1
GetDist () ;
if (distance0 < 40) {..faire ceci..
}
Pour précharger, puis lire, il faut agir sur la
directions et sur la valeur en sortie
définitions
variables globales
nom de la procédure
On se mets en sortie
On charge les condos
Environ 100 us pour une bonne charge
On se remets en entrée
On active le transistor qui allume l’éclairage IR
On initialise les compteurs
La boucle de mesure
On sauve les valeurs calculées
On coupe l’infrarouge
jdn 110810