capteur suiveur de ligne

margamas

Member
bonjour
j'ai acheté plusieurs capteurs de suivi de ligne de marque Polulu à 3 capteurs logiques.
je n'arrive pas à le programmer sachant qu'il faut d'abord mettre chacun des capteurs en sortie et les mettre à t'état 1 puis mesurer le temps mis pour qu'il se décharge jusqu'à l'état bas, ce temps dépendant de la réflexion de la lumière sur le capteur
(enfin si j'ai tout compris car la documentation est en anglais)
je ne vois pas comment programmer ce type de capteur : comment faire pour demander au capteur si il a détecté une ligne noire ?
le lien de la documentation du capteur est ici https://www.pololu.com/product/2457
merci d'avance pour votre aide éventuelle
 

MGU

Senior Member
Bonjour,

Un truc vite fait, mais je doute...

Code:
#picaxe 08M2

do
high C.1
pause 200
reverse C.1
pulsin C.1,0,W13
;serout C.0 .visu LCD

if w13 > 2000 then gosub droite

loop

droite:
return
 

PapyJP

Senior Member
je ne vois pas comment programmer ce type de capteur : comment faire pour demander au capteur si il a détecté une ligne noire ?
>>> Vous pouvez toujours le lui demander ... il ne vous répondra pas.
Trève de plaisanterie, le site de Pololu est assez trompeur et il faut rassembler des infos éparses.

1/ Fonctionnement
Le schéma fourni laisse supposer que la diode IR éclaire le phototransistor.
Il n' en est rien: Elle éclaire le sol ( Optimal sensing distance: 0.125" (3 mm) ) et le phototransistor reçois la lumière réfléchie par le sol. Sa "résistance" dépends de l' éclairement qu' il reçoit par réflexion.
Si la lumière réfléchie est forte ( sol blanc ) sa résistance est faible et donc la capacité sera rapidement déchargée ( With a strong reflectance, the decay time can be as low as several dozen microseconds ) en une douzaine de us au mieux.
Si la lumière réfléchie est faible ( sol noir ) sa résistance est forte et donc la capacité sera lentement déchargée ( with no reflectance, the decay time can be up to a few milliseconds ) jusqu'à quelques ms.

2/ Stratégie.
Le jeu consiste alors:
-Commuter une broche en sortie pendant plusieurs us ( ? ---> Wait several microseconds to give the 2.2 nF capacitor node time to reach 5 V ) pour que les deux plaques du condo soient au même potentiel. Un oscillo serait bien commode pour déterminer ce temps ( t1 ).
-Commuter la broche en entrée
-Lire l' état de la broche au bout d' une ms ( t2 ).
> Si état haut ===> le capteur vise le noir
> Si état bas ===> le capteur vise le blanc
> Boucler
Vous pouvez jouer avec t2 pour ajuster la sensibilité suivant le coefficient de réflexion du blanc.
 

margamas

Member
merci pour vos réponses
le problème c'est qu'il est impossible de mettre un temps de pause inférieur à 1 ms me semble-t-il.
 

MGU

Senior Member
merci pour vos réponses
le problème c'est qu'il est impossible de mettre un temps de pause inférieur à 1 ms me semble-t-il.
Bonjour,

Si, il y a pauseus.

As tu fait un essai avec pulsin qui devrait renvoyer une valeur?

MM
 

margamas

Member
j'ai essayé vos 2 méthodes sans succès
le méthode avec pulsin permet de voir un changement d'état mais c'est aléatoire
Code:
main:
Cell_7_2:
	let dirsB = 255
	let dirsC = 0

	high C.1, C.2

pauseus 12
	reverse C.1, C.2

	pulsin C.1,0,w13
	if w13 > 1 then

		goto Cell_7_9
	end if
	pulsin C.2,0,w12
	if w12 > 1 then

		goto Cell_10_9
	end if
	high B.1, B.2

	goto Cell_7_2

Cell_10_9:
	low B.1
	high B.2

	goto Cell_7_2

Cell_7_9:
	low B.2
	high B.1

	goto Cell_7_2
 

MGU

Senior Member
j'ai essayé vos 2 méthodes sans succès
le méthode avec pulsin permet de voir un changement d'état mais c'est aléatoire
Code:
main:
Cell_7_2:
	let dirsB = 255
	let dirsC = 0

	high C.1, C.2

pauseus 12
	reverse C.1, C.2

	pulsin C.1,0,w13
	if w13 > 1 then

		goto Cell_7_9
	end if
	pulsin C.2,0,w12
	if w12 > 1 then

		goto Cell_10_9
	end if
	high B.1, B.2

	goto Cell_7_2

Cell_10_9:
	low B.1
	high B.2

	goto Cell_7_2

Cell_7_9:
	low B.2
	high B.1

	goto Cell_7_2
Bonjour,

Le plus surprenant aurait été que cela fonctionne du premier coup.

Le mieux serait de voir ce qui se passe à l'oscilloscope sur les sorties.

Le test avec w13>1 alors que w13 est une variable allant de 0 à 65535 ....

MM
 

margamas

Member
bonjour
j'ai essayé avec w13>2000 et ça ne fonctionne pas non plus
je pense aussi qu'il faut ajuster les paramètres
 

MGU

Senior Member
bonjour
j'ai essayé avec w13>2000 et ça ne fonctionne pas non plus
je pense aussi qu'il faut ajuster les paramètres
Bonjour,

Suivant ce que je crois comprendre de la distinction numérique ou analogique de ces capteurs, il semble que le capteur logique sorte un valeur logique suivant qu'il est ou non au dessus d'une ligne noire ou blanche
https://www.pololu.com/product/2457
Donc, le capteur logique sort des 0 ou des 1 qu'il suffirait de tester, la doc suggère un délai de 1 ms

high C3,C1,C2
pause 1
reverse C3,C1,C2
pause 1 (1 ms)
if valeurC3=1 then ...
if valeurC1=1 then...
if valeurC2=1 then...

Normalement, c'est simple. Attention, les I/O doivent être réversibles, il n'y a pas d'erreur signalée

MM
 
Last edited:

margamas

Member
bonjour
c'est exactement ce que j'ai fait en premier lieu
sur le 14m2 les entrées C.1 et C.2 sont réversibles

j'ai fait exactement le programme que vous suggérez
j'ai essayé d'ajouter pauseus 12 juste après high C.1,C.2
sans succès

ça a l'air pourtant simple comme vous dîtes ...
 

PapyJP

Senior Member
... donc, le capteur logique sort des 0 ou des 1 qu'il suffirait de tester, la doc suggère un délai de 1 ms
>>> Désolé mais pas d'accord MGU. En phase de décharge du condo ( dès que la broche Cx est en In, haute impédance ), la tension au noeud doit être une exponentielle décroissante. Voir avec un oscillo.
Sa pente dépends de la valeur de la "résistance" du phototransistor ( fortement éclairé ou pas , dépends du coefficient de réflexion du 'sol blanc' vs du 'sol noir').
Le jeu consiste à lire cette tension au bout d' un temps t2 ( 1ms suggéré ) en lisant Cx.
Le seuil de décision ( 0 ou 1 ) est celui du circuit d' entrée de la broche Cx.
Si la tension est > au seuil, on lira Cx=1
Si la tension est < au seuil, on lira Cx=0
>>> Ce capteur n' est pas évident à mettre en oeuvre car plusieurs paramètres ne sont pas maîtrisés:
-Les coef de réflexion du sol ===> pente de l'exponentielle décroissante dans le cas 'fort éclairement ' / 'faible éclairement'
-L' impédance du circuit lorsque Cx est en "Out" ===> temps de charge du condo ( on devrait trouver à l' oscillo une exponentielle croissante avec une asymptote horizontale située au dessus de 4 volts )
-L' impédance du circuit lorsque Cx est en "In" mais non lu ===> temps de décharge du condo

Je suis d' accord avec votre proposition de programme, à condition de maniper pour déterminer t1 et t2.
 

MGU

Senior Member
Oui, bien sûr, mais j'essayais de trouver une différence entre les capteurs logiques et analogiques.

A défaut d'oscillo, une mesure au voltmètre donnerait un petite indication.

MM
 

PapyJP

Senior Member
A défaut d'oscillo, une mesure au voltmètre donnerait un petite indication
Désolé encore
J' en doute ... sur une exponentielle qui ' dure ' une ms !
Mais toutes les idées sont bonnes !
Perso, en l' absence d' oscillo, je mettrais des patins de 3mm sous le CI ( hauteur recommandée ) et me fabriquerais une piste ( scotch noir sur un bristol blanc ).
Puis plein d' essais en prenant t1 très grand pour s'en affranchir ( 10ms par exemple, voire plus ) et ajusterais t2 en 'baladant' le capteur à la frontière.
Peut-être d' autres idées ?
 

PieM

Senior Member
J'avoue être un peu sceptique sur le fonctionnement de ce truc :

Supposons le phototransistor éclairé. OUT est à l'état haut. Le condo ne se chargera qu'au potentiel définit par R220 et Vce. Si ce potentiel est inférieur à la tension du 1 logique sur l'entrée considérée, on ne mesurera jamais rien !
Et dans l'autre sens, si Vce ne descend pas en dessous de 0.8V, le niveau logique ne peut être 0 vu par le picaxe.
 

PapyJP

Senior Member
Supposons le phototransistor éclairé. OUT est à l'état haut. Le condo ne se chargera qu'au potentiel définit par R220 et Vce. Si ce potentiel est inférieur à la tension du 1 logique sur l'entrée considérée, on ne mesurera jamais rien !
Ok, c' est bon. C' est que le capteur ' voit ' du blanc.
Et Lycée de Versailles ...
 

margamas

Member
bonjour
j'ai fait le programme suivant
Code:
main:
Cell_7_2:
	

	high C.1, C.2

	pauseus 12
	
	reverse C.1, C.2
	
	pauseus 500
	if pinC.1=1 then

		goto Cell_7_6
	end if
	if pinC.2=1 then

		goto Cell_10_7
	end if
	high B.1, B.2

	goto Cell_7_2

Cell_10_7:
	low B.1
	high B.2

	goto Cell_7_2

Cell_7_6:
	low B.2
	high B.1

	goto Cell_7_2
j'ai fait plusieurs essais avec des bandes de ruban adhésif noir sur du bristol blanc
j'ai essayé plusieurs temps t1 et t2 et ça ne fonctionne pas
je vais essayer encore mais j'ai des doutes sur ce programme
 
Last edited:

margamas

Member
j'ai repiqué sur un site le code en langage "arduino" de programmation d'un capteur :
Code:
DigitalInOut lineSensorsDigital[LINE_SENSOR_COUNT] = {
    DigitalInOut(p18), // white wire, left-most sensor
    DigitalInOut(p19), // orange wire, middle sensor
    DigitalInOut(p20), // brown wire, right-most sensor
};
 
void readSensors(uint16_t * values)
{
    for(uint8_t i = 0; i < LINE_SENSOR_COUNT; i++)
    {
        values[i] = 1000;
        lineSensorsDigital[i].mode(PullNone);
        lineSensorsDigital[i].output();
        lineSensorsDigital[i].write(1);
    }
    
    wait_us(10);
    
    Timer timer;
    timer.start();
 
    for(uint8_t i = 0; i < LINE_SENSOR_COUNT; i++)
    {
        lineSensorsDigital[i].input();
    }
 
    while(timer.read_us() < 1000)
    {
        for(uint8_t i = 0; i < LINE_SENSOR_COUNT; i++)
        {
            if (values[i] == 1000 && lineSensorsDigital[i].read() == 0)
            {
                values[i] = timer.read_us();   
            }
        }
    }
}
 

PapyJP

Senior Member
en fait les capteurs restent toujours à l'état bas
Voulez-vous dire que vous trouvez toujours zéro ( 0 ) en entrée sur Cx ( après t2=1ms de pause ) ?
Avec t1 = 500 ms, essayez de cacher le capteur avec un doigt ou un ruban bien opaque.Si vous trouvez toujours, dans ces conditions Cx=0, réduisez t2 jusqu'à trouver Cx=1 ( faite des boucles 'bidon' du genre ' reverse Cy ', (Cy n' étant pas utilisé), qui créeront des retards faibles ( < 1 ms ) ( quelques nop en assembleur ).
Si ça marche pas je donne ce capteur au chat !!!!!!!!!
Je suppose que le CI est correctement alimenté.
 
Last edited:

PapyJP

Senior Member
Mais si on place une pause de 5 s après le high, on doit lire 5 V quand même!
Non, pas évident !
Si, pendant ces cinq secondes, le capteur voit du blanc ( pas boit du blanc ! ) le phototransistor à une ' résistance ' faible ( due à l' éclairement réflechi par le sol blanc ) ===> les petits électrons fournis par Cx Out vont à la masse. Le condo ne se charge pas !
Cette manip doit être faite avec le capteur aveuglé ( voir #20 )
 

MGU

Senior Member
Non, pas évident !
Si, pendant ces cinq secondes, le capteur voit du blanc ( pas boit du blanc ! ) le phototransistor à une ' résistance ' faible ( due à l' éclairement réflechi par le sol blanc ) ===> les petits électrons fournis par Cx Out vont à la masse. Le condo ne se charge pas !
Cette manip doit être faite avec le capteur aveugle ( voir #20 )
Dans ce cas, on doit bien voir la transition entre blanc et noir...

MM
 

PapyJP

Senior Member
Je pense à un truc...
Non, le DS de Pololu dit " Wait several microseconds to give the 2.2 nF capacitor node time to reach 5 V "
C' est donc bien Cx Out qui charge la plaque inférieure du condo.
Cx étant repassé en In ( Cx In haute impédance ) le condo ne peut être déchargé qu' a travers le phototransistor dont la 'résistance' est fonction de l' éclairement qu'il reçoit.
 
Last edited:

MGU

Senior Member
Non, le DS de Pololu dit " Wait several microseconds to give the 2.2 nF capacitor node time to reach 5 V "
C' est donc bien Cx Out qui charge la plaque inférieure du condo.
Cx étant repassé en In ( Cx In haute impédance ) le condo ne peut être déchargé qu' a travers le phototransistor dont la 'résistance' est fonction de l' éclairement qu'il reçoit.
J'y reviens, d'après le schéma de la DS, le condo de 22nF est à 5 V d'un côté, et la sortie Cx de l'autre. Si Cx est à 5 V, le condo est déchargé à travers la 220 .
Lorsque cx passe en haute impédence, le condo se charge à travers le FT, plus ou moins vite et Cx retombe à 0 V.
Je voudrais être sûr que ce condo se décharge en mesurant Cx= 5V
Au fait, les alim sont bien les mêmes pour le µC et le suiveur de lignes?
Un schéma svp

MM
 

PieM

Senior Member
J'y reviens, d'après le schéma de la DS, le condo de 22nF est à 5 V d'un côté, et la sortie Cx de l'autre. Si Cx est à 5 V, le condo est déchargé à travers la 220 .
Lorsque cx passe en haute impédence, le condo se charge à travers le FT, plus ou moins vite et Cx retombe à 0 V.
Je voudrais être sûr que ce condo se décharge en mesurant Cx= 5V


MM
Le condo ne peut pas être complètement déchargé avec la sortie picaxe à 5V si le transistor n'est pas totalement bloqué. Il reste chargé à 5V - Vce
Je me répète, mais lire un temps , ça veut dire que Cx voit les deux niveaux logiques 0 et 1. si le collecteur du transistor n'atteint pas l'un de ces deux potentiels, on ne peut rien mesurer.
Ce dispositif me semble un peu tiré par les cheveux. Les détecteurs de ligne sont généralement composés d'un PT suivi d'un comparateur avec plus ou moins d'hystérésis.
 

PieM

Senior Member
y a un loup car margamas trouve toujours les capteurs à zéro ! ( voir #18 )
Ben oui, ça veut dire que le condo reste chargé .
j'ai bien écrit "Le condo ne peut pas être complètement déchargé avec la sortie picaxe à 5V si le transistor n'est pas totalement bloqué. Il reste chargé à 5V - Vce".
Et pour que le capteur soit à un niveau haut, il faut que le condo se décharge à une valeur < 2.57V différence entre les 4.5V et le niveau haut de l'entrée du picaxe (TTL) qui est de 1.93V

Il faut donc que Vce soit supérieur à 1.93V puis inférieur à 0.675V pour que les niveau logiques du picaxe soient atteints.
C'est mesurable sur la laision R220 - phototransistor quand on est sur du noir ou du blanc.
 

margamas

Member
je vais essayer d'alimenter en 5V on ne sait jamais
c'est quand même étrange que les niveaux des capteurs soient à 0
j'utilise une carte de prototypage pour le 14M2 disponible chez Gotronic ou A4
 

PieM

Senior Member
Ben oui, si le condo reste chargé on devrait lire des 1 sans arrêt !
Ou alors j' ai rien compris ...
?? le condo chargé a une armature à 5V (ou 4.5V) et l'autre à 0V + qq mV. C'est bien celle là qui est reliée au picaxe.
 

BESQUEUT

Senior Member
?? le condo chargé a une armature à 5V (ou 4.5V) et l'autre à 0V + qq mV. C'est bien celle là qui est reliée au picaxe.
Oui, c'est bien ce qui correspond au schéma... en tout cas quand le transistor est passant.
Mais dans ces conditions, comment peut-on charger un condensateur "by applying a voltage to its OUT pin" c'est à dire en appliquant une tension sur la broche OUT ?
Dans ce cas, le condensateur est pris entre deux broches positives : comment peut-on le charger ?

En réalité, c'est l'inverse qui se passe, ce qui ne change rien au programme :
- quand on met une tension sur OUT, on décharge le condensateur,
- puis quand on met OUT en haute impédance, il se charge plus ou moins vite suivant l'éclairage du photo-transistor,
- a un moment, il est suffisamment chargé pour que son coté négatif soit plus bas qu'un niveau logique, et donc que l'entrée logique soit négative.

Le programme #17 suppose que les différents capteurs sont mutuellement exclusifs, ce qui n'est pas forcément le cas !

Dan un premier temps, c'est plus simple de ne considérer qu'un seul capteur pour valider le concept, mais il faudra bien prendre en compte les 3 capteurs, et donc 3 chronométrages simultanés...
 
Last edited:

PieM

Senior Member
Oui, c'est bien ce qui correspond au schéma... en tout cas quand le transistor est passant.
Mais dans ces conditions, comment peut-on charger un condensateur "by applying a voltage to its OUT pin" c'est à dire en appliquant une tension sur la broche OUT ?
Dans ce cas, le condensateur est pris entre deux broches positives : comment peut-on le charger ?
Non c'est l'inverse: on le décharge en ayant OUT au potentiel de 5V. Sous réserve que le transistor est bloqué ! et c'est bien le problème à mon avis.
Rien ne dit que l'excursion en tension du collecteur du transistor (donc Vout) sort de la zone morte des niveaux logiques du picaxe. (qui n'est pas un comparateur.)

Tout pendant qu'on a pas mesuré cette tension avec le blanc et le noir, on va tourner en rond....
 

BESQUEUT

Senior Member
Non c'est l'inverse: on le décharge en ayant OUT au potentiel de 5V. Sous réserve que le transistor est bloqué !
Nous disons la même chose : c'est l'explication en anglais sur le site POLOLU qui est trompeuse...
Rien ne dit que l'excursion en tension du collecteur du transistor (donc Vout) sort de la zone morte des niveaux logiques du picaxe. (qui n'est pas un comparateur.)
Tout pendant qu'on a pas mesuré cette tension avec le blanc et le noir, on va tourner en rond....
Je suis moins pessimiste, mais il faudrait à minima écrire un programme qui ait une chance de marcher...
==> dès qu'on a mis une broche en lecture, entrer dans une boucle et lire l'état de la sortie en incrémentant un compteur (supprimer toute forme de pause)
==> comparer le nombre de boucles entre capteur éclairé et capteur masqué.

NB : l'exemple Arduino fait une mesure sophistiquée en us avec un timer. En fait, on se moque de l'unité de temps utilisée puisqu'on va comparer avec un seuil. Un nombre de boucles est quasiment équivalent a une mesure du temps écoulé.
Par contre, il y a un compteur par capteur. Je suppose que ces compteurs sont relevés de temps en temps pour prendre une décision pour le suivi de ligne. Ce n'est pas vraiment optimal question réactivité, mais c'est plus simple.
On pourrait aussi recharger chaque capteur individuellement dès qu'il a franchi le seuil bas et donc avoir une meilleure réactivité. Mais dans ce cas, les différents capteurs seront désynchronisés et c'est quasiment de la gestion multitâche...

Code:
do
        w1=0
        w2=0
	high C.1, C.2
	pauseus 12
	reverse C.1, C.2
	
	for w0=0 to 60000
		if pinC.1=1 then
			inc w1
		endif
	
		if pinC.2=1 then
			inc w2
		endif
	next w0

	sertxd (#w1," ",#w2,13,10)
loop
La méthode est conçue pour être plus précise que la lecture d'une tension avec un ADC, mais suppose un microprocesseur capable de mesurer des temps en us. Avec un Picaxe, je ne sais pas si c'est la meilleure approche. Il y a bien PULSIN, mais impossible de lire trois broches en même temps.

En tout cas, le Picaxe doit être réglé à sa vitesse maximale (SETFREQ...)
Si le rafraîchissement est trop lent, mettre 6000 ou 600, je ne sais pas quel est l'ordre de grandeur correct pour ce genre de boucle sur un Picaxe inconnu à une vitesse inconnue.
 
Last edited:

BESQUEUT

Senior Member
on le décharge en ayant OUT au potentiel de 5V.
Très fun : en partant d'un condensateur chargé vers 5V, on ajoute la tension de sortie du Picaxe et on a en théorie dans les 9V sur l'alim avant que le condensateur ne se décharge.
Heureusement, le condo est petit et il y a des tas de choses pour consommer du courant sur la ligne d'alimentation.
 

PieM

Senior Member
Très fun : en partant d'un condensateur chargé vers 5V, on ajoute la tension de sortie du Picaxe et on a en théorie dans les 9V sur l'alim avant que le condensateur ne se décharge.
En théorie mais pas en pratique ...

mais il faudrait à minima écrire un programme qui ait une chance de marcher...
Avec un phototransistor qui peut avoir un Vce sat de 0.75V, je me demande bien quel programme peut marcher ...
Si en statique, le picaxe ne voit pas de variation du niveau logique de son entrée, ce n'est pas un programme qui résoudra le problème.
Pour la nième fois, tout pendant que l'on ne connait pas les niveaux de tension noir/blanc du collecteur du transistor on peut faire toutes les suppositions que l'on veut ... dans le vide.

@margamas : dommage de ne pas avoir lu avant les nombreux posts sur le suivi de ligne avec de simples CNY.
 
Top