Accueil

EVITER LES OBSTACLES

grâce a deux

DETECTEURS INFRA ROUGES

 

En utilisant 2 détecteurs infra rouges on repére facilement les obstacles situés a devant le robot vers la droite ou vers la gauche: une LED infra rouge envoie un signal qui est réfléchi par l'obstacle , le signal renvoyé est détecté par une pho todiode infra rouge.

Montage:

Le montage comporte :

Les phtotodiodes de détection sont du type de celles utilisées par les téléviseurs pour recevoir les messages du boitier de télé commande. Elles ont la particularité de reconnaitre les infrarouges émis de façon discontinue avec des fréquences voisines de 38500 hertz. Cela les met a l'abri des interférences d'une partie des souces IR de l'environnement , mais pas toutes.

On doit donc faire émettre les LED infrarouges dans des fréquences entre 37 500 et 40 500 et en fait on totalisera trente lectures faites rapidement de 100 en 100. Seuls les objets assez proches réfléchissent assez pour alerter le détecteur et les fréquences les plus élevées détectent les objets les plus proches . La détection dépend aussi de la couleur des objets : les surfaces blanches réfléchissent beaucoup mieux que les surfaces noires.

Pour régler la zone de sensibilité optimale on teste les détecteurs face a un écran mobile et on ajuste la sensibilité en faisant varier le potentiométre.En général on cherche a détecter pour déclencher un virage d'évitement du robot a environ 15 centimétres de l'obstacle.

Mais comme les conditions d'éclairement et la couleur des obstacles peuvent faire changer la sensibilité on définit dans le programme un seuil pour des conditions normales, ceci permet en le changeant d'adapter les réponses aux conditions externes sans avoir dérégler les potentiométres.

D'autre part on multiplie la correction de trajectoire calculée initiallement par un facteur de sensibilité (de 4 au départ) qu'on peut faire varier pour avoir des réactions de correction plus ou moins rapides.

La méthode de commande des servos est trés classique sauf qu'au démarrage on régle les durées des impulsions envoyées aux servos droit et gauche (lduree et rduree) pour avoir un robot qui roule a mi vitesse : pour pouvoir accélérer ou ralentir facilement l'une des deux roues sans aller en butée. _Linit = 1550 et _Rinit = 1372 '

Ce qui est important pour la programmation paralléle : c'est que la méthode de commande des moteurs marche dans un cerveau (cog acivé par une commande COGNEW (rumotors,@stack2)) différent du programme principal qui assure la détection des obstacles et corrige les durées lduree et rduree des impulsions a envoyer aux servo moteurs . De cette façon la méthode "runmotors" n'a pas a attendre les résultats des lectures des détecteurs pour faire avancer le robot elle utilise les valeurs de lduree et rduree affichées actuellement sur le tableau et les déplacements du robot se font sans les a coups qu'on observait quand on avait pas de programme paralléle.

On notera qu'on attribue de la mémoire pour ce nouveau cog en écrivant : stack2[20] et qu'on le crée en lui donnant l'adresse (@stack2) de cet espace mémoire.

 

Programme:

{{
detecteurobstaclesIR.spin


'' * servo droit en p17 et gauche en pin 16
'' * photodiodes détectrices en P4 et P5
'' * LED émétrices en P6 et P7
'' * attention le détecteur TSOP1738 utilisé renvoie 0 si il recoit la lumiére réfléchie par une surface blanche
'' * et renvoie 39 si cumulé si il n'y a pas de lumiére réfléchie , cas d'une surface noire ou pas d'obstacle



}}

CON 'on définit des constantes

_xinfreq = 5_000_000 ' fréquence du quartz externe
_clkmode = xtal1 + pll16x 'fréquence de l'horloge du propeller réglée a 80 MHZ

_Linit = 1550 'pour démarrer en marche avant
_Rinit = 1372 ' a demi vitesse _Linit = 1550 et _Rinit= 1372

VAR'on réserve de l'espace pour des variables
long stack1[20] 'espace pour nouveau cerveau
long stack2[20]

byte cog1 'espace pour ID du cog
byte pin1, pin2,seuil, sensibilite
long Time,Lduree,Rduree

OBJ ' on fait appel a des objets externes pour détecter les rayons IR pulsés a 38 000 environ

irG : "Ir Detector" 'détecteur gauche
irD :"Ir Detector" 'detecteur droit
'debug : "FullDuplexSerial ' a utiliser pour tester les détecteur en envoyant leurs résultats vers l'hyperterminal du PC

PUB init
Time:=cnt
Lduree:=_Linit 'sinon pas de valeur pour démarrer
Rduree:= _Rinit 'IMPORTANT INITIALISER ces VARIABLES

sensibilite := 4 'régle la vitesse des corrections de trajectoire

seuil:=10 'régle le seuil au dessous duquel on estime qu'un objet est trop prés

pinmotorD:=17

pinmotorG:=16

pinLedIrG:=6

pinLedIrG:=7

pindetectG:=4

pindetectD:=5

pinLedsignalD:=26

pinLedsignalG:=27

irG.init(pinLedIrG,4pindetecG 'détecteur G
irD.init(pinLedIrD,pindetectD) 'détecteur D


cognew(runmotors, @stack2) 'la méthode qui fait avancer le robot


readIrDetectors 'la métode qui repére les obstacles et adapte les vitesses des moteurs

 

PUB runmotors

dira[pinmotorD]:=1 'servo droit
dira[pinmotorG]:=1 'servo gauche
outa[pinmotorD]:=0
outa[pinmotorG]:=0


Time:=cnt
repeat
pulseleft
pulseright

PUB ReadIrDetectors | distD, distG , offset ,sensibilite
dira[pinLedsignalD]:=1
dira[pinLedsignalG]:=1

repeat
offset:=0
sensibilite:=4

distD := irD.Distance ' Get IR distance (0 to 40)
distG := irG.Distance ' 39 = pas d'obstacle proche ou ligne noire
' entre 0 et 10 = obstacle blanc entre 0 et 18 cm


if (distG <seuil) 'sur 6-4
outa[pinledsignalG]:= 1 'LED rouge ON obstacle détecté par détecteur gauche BABORD
else
outa[pinledsignalG]:= 0

if (distD<seuil) 'sur 7-5
outa[pinledsignalD]:= 1 'LED vert ON et obstacle détecté par détecteur droit TRIBORD
else
outa[pinledsignalD]:= 0
'au départ Rinit=1372 Linit=1550
'pour ralentir se raprocher de 1450 pour accélerer s'en éloigner

if (distD >seuil)and ( distG >seuil)

'OK ne rin changer aux moteurs
elseif (distG <seuil) 'sur 6-4 et led ROUGE GAUCHE ON : obstacle a droite accélérer D ralentir G
offset:= (seuil-distG)*sensibilite
Lduree:= (_Linit - offset) #> 1450 'on rapproche gauche de 1450
Rduree:= (_Rinit - offset) #> 1250 'on éloigne droit de 1450
elseif ( distD<seuil)'sur 7-5 et led VERTE DROIT ON : obstacle a gauche accélerer G ralentir D
offset:= (seuil-distD)* sensibilite
Lduree:= (_Linit + offset) <# 1650
Rduree:= (_Rinit + offset) <# 1450

waitcnt (clkfreq/20 +cnt) 'un delai est indispensable ICI

'clkfreq1/10 a 1/20 possible
' si on met 1/100 les diodes témoin indiquent une détection droite et gauche en même temps


PUB pulseleft | duree
duree:=Lduree 'c'est ici qu'on récupére la valeur de lduree modifiée dans l'autre COG
outa[pinmotorG]:=1
waitcnt(((clkfreq/1_000_000) * duree) +cnt) 'clkfreq= 1seconde
outa[pinmotorG]:=0
waitcnt ( clkfreq/50 + cnt)

PUB pulseright | duree
duree:=Rduree 'c'est ici qu'on récupére la valeur de Rduree modifiée dans l'autre COG
outa[pinmotorD]:=1
waitcnt(((clkfreq/1_000_000)* duree) +cnt)
outa[pinmotorD]:=0
waitcnt ( clkfreq/50 + cnt)