Radar de détection Infrarouge
Pour détecter un obstacle se trouvant devant le robot nous
allons utiliser un radar infrarouge.
Principe de fonctionnement
Le radar se compose de deux led émettrices infrarouge (une de chaque côté à
l'avant) et d'un récepteur infrarouge au centre. Les led émettent à tour de rôle un
faisceau lumineux infrarouge. Au cas où le faisceau est réfléchi, il revient percuter
le récepteur infrarouge. En fonction de la led qui émettait, on sait de quel côté se
trouve l'obstacle et l'on peut engager une manoeuvre de contournement.
Le récepteur infrarouge : SHARP IS1U60

Le récepteur réagit à un faisceau infrarouge modulé à une fréquence de 38khz. Sa
sortie passe au niveau 0 lors de la réception. L'avantage de travailler avec
une fréquence de 38khz est qu'on se prémunisse contre toute lumière parasite.
But à atteindre
Il va falloir qu'on génère des trains d'impulsions de 38khz vers les diodes émettrices
et tester si la sortie du récepteur passe à 0. En cas d'obstacle, on allume
une LED du côté correspondant.
Le schéma et les signaux en sortie du PIC

Le montage électronique réalisé sur la carte d'expérimentation pour
PIC16F84

Le programme en CCS
Reprenons notre programme de test du servomoteur. Nous allons lui rajouter la
fonction de détection d'obstacle en plus de la fonction de commande du
servomoteur.
Il n'est pas nécessaire de détecter en permanence s'il y a obstacle. Si on le
fait une fois toutes les 18ms, c'est largement suffisant. En plus, cela économise
les piles.
18ms, ça tombe bien. On a déjà notre COMPTEUR1 qui comptes les interruptions
pendant 18ms.
On va générer nos trains d'impulsions de 38khz à chaque passage de COMPTEUR1
par 180 afin de ne pas perturber la fonction de commande du servo qui est appelé
à chaque fois que COMPTEUR1 =360.
Un petit calcul. f=38khz, donc t=1/f = 26µs.
La période de notre signal est de 26µs. On va envoyer un train de 50
impulsions ( c'est suffisant.) d'abord sur la LED INFRAROUGE gauche puis sur la droite.
En même temps, on teste la sortie du récepteur infrarouge. (voir le schéma pour la
forme des signaux)
Le programme dans le prochain post.
//**********************
// Programme principal
//**********************
main() {
init_timer();
while (TRUE) { // boucle sans fin
SENS=AV; // en avant pendant 3"
delay_ms(3000);
SENS=STOP; // stop 1"
delay_ms(1000);
SENS=AR; // en arrière 3"
delay_ms(3000);
SENS=STOP; // stop
delay_ms(1000);
SENS=AVP; // en avant petite vitesse 3"
delay_ms(3000);
SENS=STOP; // stop
delay_ms(1000);
SENS=ARP; // en arrière petite vitesse
delay_ms(3000);
SENS=STOP; // stop
delay_ms(1000);
}
}
Conclusion
Ca fonctionne à merveille.
Lorsqu'on rapproche un objet ( dans mon cas la boîte du servo ) à 20 cm, il le
détecte bien. La LED s'allume du côté de l'objet. A noter qu'il est possible
de règler la distance de détection en faisant varier l'intensité qui circule
dans les LEDS.
En même temps le servo tourne impertubablement une fois dans un sens puis dans
l'autre. Le système d'interruption fonctionne bien.
Le fréquencemètre m'affiche bien 38khz lorsque je mesure sur la LED. (nota:
pour effectuer la mesure j'ai fait une petite modif du prog pour qu'il envoie en
continu du 38k)
Un petit inconvénient tout de même : lorsqu'on lui présente un objet de
couleur noir il ne le détecte pas du tout. Ceci est normal car le noir ne réfléchie
pas la lumière. C'est pour cela qu'on a prévu une détection de collision par
switch.
A très bientôt pour la suite. 