Test et étalonnage du capteur de proximité A02YK0, clone asiatique du Sharp GP2Y0A02YK0F • Domotique et objets connectés à faire soi-même

Le détecteur de proximité Sharp GP2Y0A02YK0F permet de réaliser des mesures de distance entre 20cm et 150cm. Il est assez facile de se procurer un clone asiatique noté A02YK0 pour moins de 4 euros. Il existe plusieurs librairies Arduino qui prennent en charge les différentes versions du capteur Sharp, mais très souvent la mesure renvoyée est totalement incorrecte pour les clones A02YK0 au delà de 70cm. Vous pourrez également étalonner votre capteur si les mesures sont trop aléatoires ou pas assez précises pour votre projet.

Nous allons voir comment faire pour étalonner manuellement le capteur de proximité pour améliorer la précision de mesure. Nous verrons également qu’il est possible de calibrer le capteur pour mesurer une plus courte distance en dessous de 120mm.

Montage de mesure

La méthode consiste à relever le signal analogique renvoyé par le capteur en fonction de la distance par rapport à un objet de référence (ici une simple boite d’emballage). Un simple mètre sera suffisant.

Le Sharp GP2Y0A02YK0F renvoi un signal analogique proportionnel à la distance mesurée. Connectez la sortie analogique sur une entrée analogique de l’Arduino A0 par exemple.

Il existe plusieurs librairies disponibles depuis le gestionnaire de bibliothèque de l’IDE Arduino. Après les avoir toutes testé, j’ai trouvé que la librairie ZSharpIR de zoubworldArduino (page GitHub) donnait les meilleures résultats

Modifications du code de la librairie ZSharp

La libraire ZSharp présente deux erreurs qu’il va falloir corriger manuellement avant de pouvoir l’utiliser. Ouvrez le dossier Arduino -> Librarie -> ZSharp. Ouvrez le fichier ZSharp.cpp dans un éditeur de texte (ou l’IDE Arduino) et faites les modifications suivantes :

  • Renommez WMath.h en Math.h
  • Mettez en commentaire la commande analogReadResolution(res) située à la fin du fichier

Enregistrez les modifications

Test du capteur de proximité avec la librairie ZSharp

J’ai réalisé une série de mesures en fonction de la distance. J’ai simplement mesuré la distance séparant le capteur du mur de mon bureau en faisant varier la distance. Pour déterminer chaque point, j’ai fait la moyenne de 10 mesures à la fréquence d’une mesure par seconde.

Voici un petit programme Arduino pour tester directement votre capteur à l’aide de la librairie ZSharp. Le capteur est connecté à l’entrée analogique A0 de l’Arduino ou de l’ESP8266.

Modifiez le model (modèle) en fonction de votre capteur :

  • 1080, GP2Y0A21YK0F (10 à 80 cm)
  • GP2D12_24, 10cm à 80cm
  • 20150, GP2Y0A02YK0F ( 20 à 150cm)
  • 100500, GP2Y0A710K0F (100cm à 500cm)
  • 430, GP2Y0A41SK0F (ou GP2D120, 4cm à 30cm)
#include 

#define ir A0
#define model 20150       //999 user type
#define DELAY_REFRESH     1000
ZSharpIR SharpIR(ir, model);

void setup() {
  Serial.begin(115200);

}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println(SharpIR.distance());
  delay(DELAY_REFRESH);
}

Comme vous pouvez le constater sur le graphique, le capteur, ou du moins la mesure retournée par la librairie ZSharp, est correcte jusqu’à 700mm. Au delà, la mesure dérive totalement et devient inexploitable.

gxvqchpafb5l5cf9rdf2-4128723

Etalonnage manuel du Sharp GP2Y0A02YK0F

Voyons maintenant s’il est possible d’améliorer les choses.

Créez un nouveau croquis Arduino et collez le code suivant. Il lit et affiche sur le moniteur série le signal analogique renvoyé par le capteur de proximité. Faites varier la distance entre un objet (un mur par exemple) et le capteur tous les 100mm en notant à chaque fois le signal analogique. Attendez quelques secondes que le signal soit stabilisé avant de passer à la mesure suivante.

void setup() {
  Serial.begin(115200);
}

void loop() {
  Serial.println(analogRead(A0));
  delay(2000);
}

Voici le relevé du signal en fonction de la distance ainsi que la représentation graphique de ce dernier. Comme vous pouvez le constater, le signal augmente jusqu’à une asymptote puis diminue de nouveau. Cela peut poser des problème dans certains projets. Dans le cas présent, il serait vraiment très risqué d’utiliser le capteur dans un projet robotique ou voiture autonome. Il faut être certain que la distance mesurée reste dans la plage de mesure du capteur.

Distance (mm) Signal
1500 70
1400 80
1300 90
1200 95
1100 112
1000 116
900 128
800 163
700 184
600 215
500 247
400 325
300 378
200 558

A l’aide d’un tableur (Calc de LibreOffice par exemple), tracez la courbe de la distance en fonction du signal. Faites un double clic sur le graphique pour l’éditer. Cliquez sur un point de la courbe pour ajouter une courbe de régression.

Sélectionnez le type puissance (power).

Voilà, on dispose maintenant d’une équation qui permet d’estimer quelque soit le signal analogique la distance en millimètre qui sépare l’objet du capteur.

On peut estimer l’erreur de mesure en calculant de façon théorique la distance que l’équation retourne en fonction du signal. On devrait obtenir une mesure correcte jusqu’à 1300mm (1,3m). Au delà, le signal est trop faible pour que l’équation soit précise.

Distance (mm) Signal Eval Delta Err
1500 70 1 795 295,3 19,7%
1400 80 1 566 166,0 11,9%
1300 90 1 388 88,2 6,8%
1200 95 1 313 113,4 9,5%
1100 112 1 110 9,8 0,9%
1000 116 1 071 70,7 7,1%
900 128 968 68,1 7,6%
800 163 756 -44,1 -5,5%
700 184 668 -32,3 -4,6%
600 215 569 -30,6 -5,1%
500 247 494 -6,0 -1,2%
400 325 373 -26,9 -6,7%
300 378 320 19,6 6,5%
200 558 215 14,6 7,3%

Ouvrez de nouveau de fichier ZSharp.cpp et allez placez vous juste après la ligne

// Sort it 
sort(ir_val,NB_SAMPLE);

Ajoutez le code suivant en remplaçant le coefficient et la puissance qui correspondant à votre courbe

if (_model==999){
    distanceMM=(int)(138773.464825 * pow(ir_val[0],-1.0233470));
    if ( distanceMM > 1600 ) {
        distanceMM = 1600;
    }
}

Enregistrez et remplacez le model par 999 dans le code Arduino avant de téléverser.

Voici ce que j’ai obtenu en reproduisant les essais précédents. Comme on pouvait le pressentir, au delà de 1300mm, la mesure est très aléatoire.

w1x3noezuiesru3mcxuo-5680646

Voici ce que ça donne en chiffres.

Distance (mm) Sharp A02YK0 (étalonné) Ecart de mesure Ecart type
200 212,0 12,0 0,32
300 283,4 -16,6 1,84
400 384,4 -15,6 7,52
500 481,7 -18,3 11,81
600 606,3 6,3 28,02
700 721,2 21,2 44,27
800 805,9 5,9 59,35
900 954,0 54,0 92,49
1000 1 090,5 90,5 133,90
1100 1 131,6 31,6 128,11
1200 1 196,0 -4,0 127,00
1300 1 221,7 -78,3 31,91
1400 1 385,0 -15,0 123,49
1500 1 412,3 -87,7 84,00

Test d’étalonnage en dessous de 200mm

Je me suis ensuite amusé à voir s’il était possible d’étalonner le capteur pour l’utiliser en dessous de 200mm. Le signal est exploitable jusqu’à 120mm puis s’effondre.

Ici, le capteur est sensible de 20 à 120mm.

On va faire de même que précédemment mais cette fois en choisissant une courbe de type polynomiale du second degré

Maintenant il ne nous reste plus qu’à écrire une petite fonction que l’on pourra appeler chaque fois qu’on voudra faire une mesure de distance avec le capteur Sharp. En fonction du tableur utilisé, vous pourrez obtenir une équation écrite suivant la notation scientifique. Si vous êtes fâché avec les maths, il suffit juste de décaler vers la gauche la virgule autant de fois que le chiffre indiqué sur la puissance (ici 10-4, donc 4).

Ensuite, on va simplement remplacer le x2 par  x * x dans le code Arduino ce qui donne

1.936428309·10-4 x2 + 6.987226424·10-2 x – 14.32575223

devient donc

0.0001936428309  x  X + 0.06987226424 * x – 14.32575223

Les parenthèses ne sont pas obligatoires dans le code Arduino.

Et voilà la fonction terminée

float getDistanceSharp(){
  int a0 = analogRead(PIN_GP2Y0A02YK0F);
  float dist = 0.0001936428309 * a0 *a0 + 0.06987226424 * a0 - 14.32575223;
  if ( dist < 20 ) {
    dist = 20;
  }
  return dist;
}

Voilà, maintenant vous pouvez intégrer ce clone asiatique du Sharp GP2Y0A02YK0F dans vos projets robotiques. Comme vous avez du le constater, le capteur testé a des caractéristiques plus limitées que la version originale. Annoncé entre 20 et 150cm, le signal devient difficile à traiter au delà de 130cm. Compte tenu de l’encombrement similaire à un capteur par ultrason HC-SR04, l’intérêt de ce clone du Sharp GP2Y0A02YK0F est assez limité. Dans le prochain article, nous ferrons une comparaison du Sharp A02YK0 avec le capteur par ultra-son HC-SR04 et VL53L0X qui détermine la distance en mesurant le temps de vol d’un laser.

Sur le même sujet

Avez-vous aimé cet article ?