Question de temps de réponse et delay sur un capteur ir sharp

Bonjour,

J'ai une question existentielle concernant les capteurs IR Sharp de type GP2D.

Voila j'en possède trois à l'avant de mon robot (1 au centre, 1 à gauche et un autre à droite) couplé à mon arduino uno.

Je fais avancer mon robot, puis dans mon code j'ai:

rightSensorCm = getRightIRSensor();
   delay(50);
   centerSensorCm = getCenterIRSensor();
   delay(50);
   leftSensorCm = getLeftIRSensor();
   delay(50);
...
puis algo de comparaison..

avec

int getLeftIRSensor()
{
  int leftSensorValue;
  leftSensorValue = irValueToCm(analogRead(leftSensorIr));
  sendValue('X',leftSensorValue);
  return leftSensorValue;
}
...

Ça marche plutôt pas mal, mais entre le moment ou mon robot avance, et la détection d'un obstacle (et donc l'arrêt du robot) j'ai 150ms qui se sont écoulé (3*50ms), ce qui est assez conséquent pour mon robot qui avance relativement vite.
Au début, je n'avais pas mis de delay(50); entre les trois mesures et j'obtenais des problèmes de mesures (je pensais que le rayon ir partait et parasitait la mesure du capteur suivant) j'ai donc regardé la datasheet de mon capteur: http://www.robotshop.com/eu/content/PDF/datasheet-gp2d120xj00f.pdf et j'ai vu que le 'temps de réponse' était de plus ou moins 40/50ms. C'est donc pour cela que j'ai rajouté ce fameux delay(50).

D'ou ma question: Ai-je raison concernant le parasitage et l'ajout des delay(50) ?
Comment puis-je optimiser la vérification de la valeur de mes trois capteurs?

Merci à vous.

cordialement,

D'ou ma question: Ai-je raison concernant le parasitage et l'ajout des delay(50) ?
Comment puis-je optimiser la vérification de la valeur de mes trois capteurs?

Le délai de 50ms n'est nécessaire qu'une fois. Tu bouges, tu attends 50ms, tu fais tes 3 mesures.
Après si tu trouves que c'est encore trop contraignant tu peux toujours faire les mesures au vol et tenir compte du fait que la mesure te retourne la position avec 50ms de retard. Les problèmes de mesures que tu avais précédemment étaient peut être dus à un parasitage de tes capteurs par les moteurs et non pas au délai d'acquisition des capteurs.

Merci pour ta réponse fdufnews.

Donc si je comprend bien tu préconises d'enlever les 3 50ms?
Effectivement, je préfère faire les mesures à la volée car en principe c'est justement les capteurs qui doivent stopper mon robot. Bien sur j'anticipe en jouant sur la distance de sécurité entre l'obstacle et les capteurs.

En fait, ce que je ne comprend pas, c'est que si on ne met pas de delay(50) entre chaque mesure, ne prend t'on pas le risque que "le rayon ir?" ne soit pas revenu au capteur et que la mesure soit fausse?

Si je comprend bien la datasheet (lien dans mon 1er post) il faut 5 ms entre la deuxième mesure d'un capteur et un résultat stabilisé?

j’avoue que j'ai du mal à comprendre ce point :~

Effectivement concernant les parasites, j'ai mis une ferrite autour de mon faisceau regroupant les fils des moteurs + triple condensateur sur chacun des moteurs + condensateur sur chacun des capteurs IR Sharp.

Merci beaucoup.

En fait, ce que je ne comprend pas, c'est que si on ne met pas de delay(50) entre chaque mesure, ne prend t'on pas le risque que "le rayon ir?" ne soit pas revenu au capteur et que la mesure soit fausse?

Dans la datasheet, il est dit que la récurrence des mesures est de 28 à 48ms (la fourchette est large tu noteras). Le résultat de la mesure apparait au pire 5ms plus tard sur la sortie.

En fait la sortie est toujours valide. Il n'y a jamais de moment où l'information est erronée. Elle est seulement plus ou moins vieille par rapport au moment de la prise de mesure qu'on ne connait pas. Vue de l'extérieur, on a aucune information quand à l'instant de la mesure. En conséquence de quoi tout délai n'a aucun impact si ce n'est de retarder un peu plus la prise en compte de l'info. La seule chose certaine c'est que la sortie est mise à jour au pire toute les 48ms donc il est inutile d’échantillonner plus rapidement ce signal. Cela dit si tu échantillonnes trop vite tu liras simplement 2 fois la même valeur et ce n'est pas bien gênant.

D'accord :slight_smile: je pense un peu mieux comprendre grâce à tes explications.

Ce que je retiens:
1/ Le temps de la mesure dure 38.3ms (marge de +- 9.6ms)
2/ Le résultat de la mesure apparaît au max 5ms aprés le début de prise de mesure.
3/ Ca ne sert à rien d'échantillonner à moins de 38.3+9.6ms car cela ne permet pas d'obtenir de meilleur résultat mais on peut quant même (au pire on aura n fois la même valeur).

Sinon côté pratique, j'ai fait un petit test en réduisant mes delay(50) par des delay(5) pour voir.
La, j'ai constaté que ca partait complètement en cacahuète (mon robot s'arrête sans cesse car la mesure du capteur gauche tombe sous le seuil de sécurité que j'ai programmé).

Bon la je me dis bizarre. Je coupe les moteurs, idem toujours le problème, donc pas des parasites... :0

Je repense à un problème d’interférence entre les trois capteurs IR.
Pour en avoir le coeur net, je pose mon robot sur ma table (sans obstacle devant) Voir photo de mon robot:

Pour comprendre imaginez le robot devant vous la tête au dessus, (avant du robot vers l'avant).

Je met mon doigt sur le capteur IR se trouvant sur la droite du robot -> le capteur IR gauche déconne toujours à plein tube
Je met mon doigt sur le capteur IR se trouvant au milieu du robot (sous le capteur ultrason) -> le capteur IR droit marche parfaitement.

J'ai donc constaté (grâce au fait de regarder du dessus) que ma tourelle était très légèrement désaxée (légèrement tourné vers la gauche de 1-2°).
En la repositionnant correctement (au milieu), j'ai constaté que le problème sur mon capteur IR gauche n'apparaissait plus!

Donc ce soir, je vais essayer:
1/ D'une part, de corriger l'alignement de ma tourelle
2/ Essayer de modifier l'ordre des mesures (actuellement droit puis milieu puis gauche vers droit puis gauche puis milieu)

Il s'agirait donc bien d'un problème d’interférence entre le capteur du milieu et gauche?
Ce problème n'apparaissait pas lorsque j'avais mes delay à 50.
Est-ce le rayon du capteur du milieu qui arrive dans le capteur de gauche, car la prise de mesure du capteurs gauche se fait trop tôt?

je n'arrive pas à comprendre d'ou vient le problème. ]:slight_smile:

salut, :stuck_out_tongue:

Bon j'ai fais les tests mentionnés dans mon post précédent.

Corriger l'alignement de ma tourelle ne change pas grand chose en fin de compte.
Et modifier l'ordre non plus.

Le seul moyen de corriger mon pb est de mettre des delay(50) au lieu d'aucun delay ou delay court comme 5 par exemple.

En fait je pense savoir d'ou vient mon pb:
Je pense que j'ai toujours eu ces parasites (plus présents sur le capteur gauche, pourquoi? la je ne sais pas (parasite avec le capteur du milieu apparemment car si je met mon doigt devant je n'ai plus le problème)), seulement avant en mettant des delay de 50, la probabilité que de tomber sur une mesure parasite été vraiment réduite.
En supprimant le delay, je fais plus de mesures, j'ai donc plus de probabilité de tomber sur une mesure erroné.

Solution:
je pense que je vais mettre en place un système de tir multiples de chacun des capteurs, puis faire une moyenne pour vérifier si j'ai bien un obstacle ou non devant mon robot.

à+

Moi je te propose plutôt ça : tes capteurs semblent alimentés en permanence. Si tu commandes l'alimentation indépendamment sur chaque module, tu pourras éteindre et allumer indépendament chaque module et éviter la pollution IR.

Il y a un autre problème qui pourrait être la cause de tes soucis. Lorsqu'on commute la source du convertisseur analogique-numérique (ce qui se passe lorsqu'on fait plusieurs conversions consécutives sur des pin différentes) il faut attendre un certain temps que le niveau se stabilise dans la chaine de conversion. Voir là dernier paragraphe: http://arduino.cc/en/Tutorial/AnalogInputPins. Le temps d'attente après la commutation de voie est dépendant de plusieurs paramètres dont l'impédance de sortie de la source que l'on mesure. Sharp étant très discret sur les caractéristiques de ses capteurs le meilleur temps ne peut être trouvé que par tâtonnement.

Concernant la pollution d'un capteur par un autre c'est possible mais Sharp ne donnant pas d'info sur le champ couvert par les leds et les capteurs il est difficile de se prononcer.

B@tto:
Moi je te propose plutôt ça : tes capteurs semblent alimentés en permanence. Si tu commandes l'alimentation indépendamment sur chaque module, tu pourras éteindre et allumer indépendament chaque module et éviter la pollution IR.

Meri pour ta proposition. Je suis ouvert concernant les solutions. Par contre quand tu parle de module, tu parle bien des capteurs? Comment puis-je commander l'alim indépendament sur chaque capteur? Enfin qu'est ce que cela implique au niveau de mon code ou hardware?

Dsl je suis un peu perdu et débutant comme vous pouvez vous en douter.

fdufnews:
Il y a un autre problème qui pourrait être la cause de tes soucis. Lorsqu'on commute la source du convertisseur analogique-numérique (ce qui se passe lorsqu'on fait plusieurs conversions consécutives sur des pin différentes) il faut attendre un certain temps que le niveau se stabilise dans la chaine de conversion. Voir là dernier paragraphe: http://arduino.cc/en/Tutorial/AnalogInputPins. Le temps d'attente après la commutation de voie est dépendant de plusieurs paramètres dont l'impédance de sortie de la source que l'on mesure. Sharp étant très discret sur les caractéristiques de ses capteurs le meilleur temps ne peut être trouvé que par tâtonnement.

Concernant la pollution d'un capteur par un autre c'est possible mais Sharp ne donnant pas d'info sur le champ couvert par les leds et les capteurs il est difficile de se prononcer.

Merci pour cette piste.
Dans mon cas je pense qu'il s'agit plus d'un problème de parasite entre le capteur du milieu sur celui de gauche.
Ce qui me conforte dans ce sens c'est:
-que les parasites sur le capteur gauche disparaissent lorsque je "cache" le capteur du milieu
-que, si l'on regarde la photo de mon robot, on peut voir que les capteurs se trouvent dans le même sens (émetteur à droite et récepteur a gauche. Donc je pense que le rayon du capteur du milieu arrive sur le récepteur du capteur gauche. Après je me trompe peut être...

Je vais essayer d'inverser mon capteur de gauche pour voir si ma théorie est bonne.

Je pense que j'ai peut être fait une erreur dans la conception de mon robot, j'aurais peut être du positionner les capteurs droite et gauche de manière a ce que les rayons se croisent comme j'ai pu le voir sur plusieurs autres robots...

J'attends aussi la solution de b@tto qui peu m'aider.

Merci!

Bin c'est simple : y'a un + sur ton capteur ? Bin tu le branches à un pindigital que tu mets à HIGH. Tu fais pareil sur les 3 autres capteurs sur 3 pin différents. Ensuite tu allumes le capteur 1, tu mesures, tu l'éteins. Rebelotte pour le n°2, puis le n°3. Ainsi aucune interférence possible.

Par contre le courant est limite pour un pin (d'après la datasheet 33mA en moyenne, 50 max) de l'Atmega, teste comme ça ça risque rien, mais dans le temps je te le déconseille, il faudra un transistor ou un relai pour faire l'interface de puissance.

Bonjour à tous,

J'ai finalement eu le temps de réaliser tous mes petits tests:

Rappel de mon problème:
J'ai de nombreux parasites, essentiellement sur mon capteur gauche. Voir photo du dessus: P1000522 | Daryl Robot Project
De plus j'avais constaté que positionner un obstacle loin mais un peu en décalé du capteur, ramenait le même résultat qu'avec un obstacle pile devant le capteur mais plus prés. (donc pas très précis si l'on passe prés d'un mur loin, mais sur le côté par ex) CE problème à l'air d'avoir lieu uniquement que le coté droit de chacun des capteurs :fearful:

Mon hypothèse:
Mon hypothèse est que le capteur du milieu parasite le capteur de gauche en envoyant probablement son rayon IR dans le récepteur du capteur gauche.
Hypothèse validée par la suite, car lorsque je pose mon doigt devant le capteur du milieu, je n'ai plus du tout de parasite sur le capteur gauche.
Pour le deuxième problème (précision) je ne sais pas.

Les différentes idées/solutions données par... vous ;):

1/ Passer les pins en digital puis allumer le capteur (HIGH) puis prendre la mesure, puis le repasser en LOW pour le couper. Ainsi, à chaque mesure le capteur en cours de mesure n'est pas parasité par les autres.

Résultat: Une faible diminution des parasites j'ai l'impression, ou plutôt une réduction de leur amplitude. L'effet reste tout de même très faible. Je pense que tout va trop vite et que les rayon IR parasitent tout de même...

2/ Utiliser un algo de "lissage". J'ai mis en place un algo de lissage. Dans un premier temps j'effectue X tirs (12 dans mon cas). Je tri les valeurs retournées dans l'ordre croissant, puis je prend les X valeurs situées au milieu du tableau (4 dans mon cas) et je fais la moyenne.

Résultat: Un lissage des valeurs des capteurs serte, mais quand le capteur retourne 6/8 parasites sur 12, on tend forcement vers une valeur parasite lissée au final. Donc dans mon cas pas d'une très grand aide... ]:slight_smile:

3/ Mettre des caches, ou cônes pour limiter les parasites. A l'aide de papier cartonné, j'ai réalisé des petits cônes que j'ai placé autour des capteurs.

Résultat: Et bien croyez le ou pas mais plus aucun parasites!! De plus les cônes améliorent considérablement la précision. J'ai testé en positionnant un obstacle loin et sur le coté du capteur (donc capteur m'indiquant que je suis à la limite de ma distance de sécurité) et j'ai placé le cône, et la la valeur est revenu à une valeur normale!

Verdict: La solution permettant une réduction totale des parasites et améliorant considérablement la précision est donc la mise en place de cône autour des capteurs. :stuck_out_tongue:
L'adjonction des 2 autres solutions permet bien évidement de réduire les parasites (HIGH/LOW) puis de lisser la valeur (algo) pour obtenir un résultat parfait.

Je vais essayé de faire des cônes en plastique pour faire quelque chose de plus propre.

Les cônes en papier:

Merci pour votre aide.

Je vais faire un billet sur mon blog avec vidéos à l'appui dans quelques jours. http://darylrobotproject.wordpress.com

++