dimanche 10 mai 2015

Télémètre infrarouge Sharp GP2Y0A21

Le capteur de proximité Sharp GP2Y0A21 est conçu pour détecter la présence d'un obstacle et, accessoirement, mesurer la distance de ce dernier.  Le capteur est constitué d'une LED infrarouge, d'un capteur infrarouge (une photodiode, je suppose) et d'un circuit qui traite le signal de façon à retourner une tension analogique dont la valeur dépend de la position de l'obstacle.

Connexions et première exploration

Le capteur Sharp est doté de 3 pins; mon modèle acheté sur eBay comportait déjà trois câbles dotés d'un connecteur JST (Japanese Solderless terminal), mais j'ai cru comprendre que ce n'est pas toujours le cas.

Les connexions sont extrêmement simples: le fil noir est la masse (GND), le fil rouge est l'alimentation 5 V, et le fil jaune porte le signal de sortie, dont la valeur maximale est d'un peu plus de 3 volts.

Pour vérifier le fonctionnement correct du capteur, on peut donc brancher ce dernier à une carte Arduino de la façon illustrée ci-dessous (fil noir à GND, fil rouge à 5 V et fil jaune à A0), puis utiliser l'exemple AnalogReadSerial fourni avec l'IDE Arduino (chemin d'accès:  Menu Exemples / 01. Basics / AnalogReadSerial).  Le moniteur série affichera une valeur différente selon la distance entre le capteur et un obstacle.



(Si votre intention n'est pas d'utiliser un microcontrôleur, vous pouvez bien sûr brancher le capteur à une tension continue de 5 volts, et mesurer avec un voltmètre la tension de sortie)

Utilisation comme capteur de proximité

Dans certains cas, vous désirez simplement détecter la présence d'un obstacle devant le capteur, sans chercher à connaître sa position exacte (par exemple: pour déclencher automatiquement un sèche-main aussitôt que l'utilisateur place ses mains au bon endroit).



Voici un sketch qui allume une LED lorsqu'une présence est détectée:  ça pourrait servir de base à un système d'alarme rudimentaire.  J'ai d'abord mesuré le signal de sortie du capteur Sharp lorsqu'aucun obstacle n'est présent (environ 40), puis j'allume une LED lorsque le signal est significativement différent de celui qui avait préalablement été mesuré (plus grand que 60).

Votre carte Arduino comporte probablement déjà une LED liée à la pin 13, il n'est donc pas strictement nécessaire d'en ajouter une.  Il est possible que vous deviez augmenter le seuil (celui que j'ai réglé à 60) si votre LED s'allume même en l'absence d'obstacle.






Utilisation pour la mesure précise d'une distance

Supposons maintenant que vous désirez connaître avec la meilleure précision possible la distance entre l'obstacle et le capteur... Ici, les choses se compliquent assez sérieusement!

Le problème principal, c'est que la tension de sortie du capteur n'est pas proportionnelle à la distance.  La fiche technique du capteur nous présente ce graphique du signal de sortie (sur l'axe vertical) en fonction de la distance en centimètres (sur l'axe horizontal).  Il n'y a rien de linéaire ici:  la tension passe de 0 à 3,1 volts pour les 6 premiers centimètres, puis elle diminue à nouveau à mesure qu'on augmente la distance.  Si la tension de sortie est de 1 volt, on peut en déduire que l'obstacle se trouve tout proche du capteur, à 1 ou 2 cm...ou peut-être bien à 27 cm, position où la courbe repasse par cette même valeur.

On doit donc positionner notre capteur de façon à ce qu'il soit impossible que l'obstacle soit situé à quelques centimètres seulement:  nous pourrons donc prendre pour acquis que la distance correcte est 27 cm et non 1 cm.

Présentées ainsi sous cette forme graphique, les données ne sont pas d'une très grande utilité, car il est difficile de les mesurer avec précision:  nous devrons construire notre propre courbe d'étalonnage en mesurant la tension de sortie du capteur pour plusieurs distances différentes entre le capteur et l'obstacle.

Optimiser la résolution

Mais avant tout, prenons toutes les précautions possibles pour que notre mesure soit précise au maximum: améliorons la résolution de l'Arduino.

Le convertisseur analogique/numérique de l'Arduino retourne une valeur entre 0 et 1023.  Lorsque la valeur maximale est 5 volts (ce qui est généralement le cas), nous obtenons une résolution de 5/1024 =  4,9 mV, ce qui signifie que nous ne pouvons pas différencier deux mesures dont la différence est inférieure à 4,9 mV.

Mais puisque la tension de sortie du capteur Sharp ne peut pas excéder 3,1 V, j'ai choisi d'abaisser à 3,3 V la tension de référence.  Pour ce faire, j'ai relié la sortie 3,3 V de l'Arduino à l'entrée "AREF", et j'ai ajouté cette ligne de code à l'intérieur de la partie setUp du sketch:

   analogReference(EXTERNAL);

Les 1024 valeurs possibles seront maintenant réparties sur 3,3 volts plutôt que sur 5 volts, et la résolution sera maintenant de 3,3/1024 = 3,2 mV.



Souder un condensateur?

Dans la fiche technique du capteur, Sharp recommande de souder un condensateur d'au moins 10 µF entre les connexions GND et 5 V, le plus proche possible du capteur.  Bien sûr, ce condensateur servira à stabiliser la tension d'alimentation, afin qu'elle fluctue le moins possible.  Moi, je veux bien, mais je ne peux m'empêcher de poser à voix haute cette petite questions qui me trotte dans la tête:  s'il est si important, ce condensateur, pourquoi n'est-il pas inclus dans le capteur lors de sa fabrication en usine?!?!?

Ceci dit, j'ai comparé les performances du capteur avec et sans un condensateur de 10 µF, et je n'ai pas constaté la moindre différence.

Compilation d'une courbe d'étalonnage

Nous voici prêts à accumuler les données qui serviront à produire notre courbe d'étalonnage.  J'ai d'abord placé une grosse boîte à une distance de 10 cm du capteur, et j'ai noté la mesure du capteur (en prenant une moyenne de 10 mesures, questions d'atténuer les fluctuations).  J'ai répété l'opération à 11 cm, 12 cm, etc, jusqu'à ce que la boîte se trouve à 60 cm de distance.  Lorsque la boîte se trouve à plus de 50 cm de distance, il faut la bouger de plusieurs centimètres pour que la mesure du capteur change un tout petit peu.

Voici le sketch que j'ai utilisé pour prendre les mesures:


Ces données peuvent ensuite servir à construire un tableau de conversion (par exemple, si votre capteur indique 654, vous faites correspondre cette valeur à une distance de 10 cm), mais je préférais tenter de trouver une équation d'étalonnage permettant de convertir la tension de sortie en une distance (l'inspiration pour trouver une telle équations m'est venue de cet article).


Équation d'étalonnage

J'ai donc copié  mes mesures dans LibreOffice Calc (j'aurais pu tout aussi bien utiliser Excel) pour tracer mon propre graphique de la distance en centimètres (sur l'axe des y) en fonction de la valeur retournée par mon capteur (sur l'axe des x)


J'ai ensuite tenté de tracer une courbe de tendance correspondant à l'ensemble de ces points, mais je n'y suis pas parvenu.  En ne conservant que les mesures échelonnées entre 10 cm et 25 cm, toutefois, j'ai pu obtenir une équation qui décrivait la courbe d'une façon assez convaincante:

distance en cm = 32076,6901689428 * (valeur du capteur)-1,2455865753


Voici donc un sketch qui me permet de connaître avec une assez bonne précision la position d'un obstacle placé devant le capteur.  Les résultats sont corrects pour une distance allant de 10 cm à environ 25 cm seulement (c'est assez peu, comme marge de manoeuvre).




GP2Y0A21 vs HC-SR04

Ceci étant dit, après avoir exploré les possibilités du GP2Y0A21 de Sharp, je peux maintenant déclarer que je préfère -- de loin -- le capteur à ultrasons HC-SR04:  le capteur a ultrason coûte beaucoup moins cher (on peut se procurer 4 ou 5 capteurs HC-SR04 pour le prix d'un seul capteur Sharp) et permet d'obtenir une position raisonnablement précise pour une assez grande plage de valeurs, par un calcul simple impliquant la vitesse du son.

Yves Pelletier   (Twitter, Facebook

1 commentaire:

  1. Bonjour, merci bien les informations
    je suis entrain de préparer un projet d'un barrière automatique, je voudrais utiliser un capteur sharp comme détecteur de présence d'une voiture, pouvez vous m'aider

    RépondreSupprimer