Detecteur de proximité infrarouge - Sharp gp2y0a21


Description
Senseur de distance Sharp 10-80cm
Le Sharp GP2Y0A est un senseur infrarouge réflectif destiné à mesurer les distances de 5 à 80 cm.

Très simple à câbler avec ses 3 connexions (une sortie analogie + alimentation), ce senseur est assez populaire du fait de son prix assez démocratique (~9 eur) mais aussi de sa simplicité de raccordement.

S'il ne peut pas servir à mesurer des distances de façon fiable (domaine réservé à l'ultrason), il permet néanmoins de détecter aisément des obstacles et leur distance approximative.

Considérations techniques
Comme précisé dans la datasheet, la tension analogique renvoyée par la capteur dépend de la distance de l'objet.
Source: datasheet
Ce que le graphe nous apprends:
  1. La tension maximale est de ~3.3 volts et diminue lorsque l'objet s'éloigne.
  2. La tension ne diminue pas proportionnellement à la distance (par ex: 10mv par 10cm) mais suit une courbe.
  3. Il est difficile d'évaluer les distances en dessous de 10 cm.
    Il est difficile d'évaluer les distances en 50 et 80 cm (perte de précision, la courbe s'aplatit).
    Il est impossible d'évaluer une distance au delà de 80 cm (personnellement, cela devient déjà difficile à partir de 50 cm)
  4. La détection de distance reste encore possible entre 5 et 10 cm.
    Par contre, la tension chute en dessous de 5cm, il est donc impossible de savoir si l'objet est très proche ou plus loin.
    Il est donc préférable d'éviter de descendre en deçà de 10 cm de distance.
Ce que la documentation nous apprends:
  • La distance de jugement idéale se situe à +/- 24 cm.
Ce que l'expérience m'a appris:
1) Le détecteur est sensible au revêtement de proximité!

Perché sur son pied (voir vidéo), le détecteur oscille entre 15 et 20 cm de distance mesuré lorsqu'aucun objet n'est présent!
Cela est causé par la réflexion de la surface de mon bureau... le senseur étant perché à 12 cm de haut, cela a du sens.

Cette mesure incorrecte/parasite (en un bruit de fond) disparait pour être remplacée par une mesure réaliste lorsqu'un objet est réellement placé devant le senseur.

Après avoir repositionné mon détecteur sur bord du bureau (donc face au vide), la mesure parasite (en bruit de fond) disparait littéralement.
Attention donc si ce type de senseur doit équiper un engin mobile... la distance par rapport au sol provoquera une mesure parasite.


2) il est difficile de mesurer une distance entre 5 et 10 cm, tout comme une distance supérieur à 50 cm (pour un objet non massif)... les corps massif sont détectés jusqu'à 70 cm sans problèmes.

3) Finalement, il ne faut pas oublier que la précision de mesure analogique est de 5mV (5volts/1024).
Cela nuit sensiblement à la précision de la mesure analogique. Il est pourtant possible d'y remédier en alimentant le détecteur en 3.3 v et en utilisant cette tension comme référence HRef (voir exemple avec un TMP36 sur ladyada).
La précision augmente alors à 3.3mV.

Où se procurer un détecteur de proximité
En Belgique, il est possible de se fournir un senseur Sharp GP2Y0A21 auprès d'Antratek Electronic (boîte sérieuse) pour +/- 11.89 eur (tva incluse).

Il faut s'assurer que le senseur soit livré avec un connecteurs JST3AA.
La référence complète est "3-Way cable with a JST3AA connector on one side".

Montage 
Le senseur de proximité se raccord à l'aide d'un connecteur JST 3 voies (3-Way cable with JST connector)

il suffit de placer les différents câbles du connecteur JST comme suit:
  • Rouge: +5v
  • Noir: GND
  • Jaune: Entrée Analogique A0
Les mesures sont affichées sur un afficheur LCD MOP-AL162A-BBTW: LCD 2x16 monté comme suit:

Pour le montage de l'afficheur LCD, vous pouvez vous référer à l'article "(voir article "Commande d'un afficheur LCD MOP-AL162A-BBTW: LCD 2x16" de ce même blog.

Résultats
Cette première vidéo montre comment le tests est effectué


Cette deuxième vidéo montre les résultat obtenu


Code Source
Code Source: SharpProximity.pde
/*
  Mesure de la proximité à l'aide d'un senseur infrarouge
  Sharp gp2y0a21yk Proximity Sensor
  Affichage sur LCD: MOP-AL162A-BBTW: LCD 2x16
 
 Le montage:
 Afficheur LCD
 * LCD RS     - pin 12
 * LCD Enable - pin 11
 * LCD D4     - pin 5
 * LCD D5     - pin 4
 * LCD D6     - pin 3
 * LCD D7     - pin 2
 * LCD R/W    - GND
 * LCD Vo contrast- potentiomètre 10K (entre Gnd et +5V)
 
 Senseur de proximité:
 * Sharp gp2y0a21yk Analog Output - Pin A0 (analogique)
 
 This example code is in the public domain.
 
*/

// include the library code:
#include <LiquidCrystal.h>


int sensorPin = 0; // Pin analogique pour lecture de la tension de sortie du senseur (Vout).
                   // La tension varie entre 0 et 3.3 volts.

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup(){
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  lcd.clear();
}


void loop(){
  float tension = lectureTension();
  String distanceStr = distanceRange();
  
  // Afficher la valeur en evitant le
  //   lcd.clear(), pour éviter l'effet de
  //   scintillement.
  lcd.setCursor(0,0);
  lcd.print( tension );
  lcd.print( " V" );

  // Efface les derniers caractères si
  //   la valeyr varie subitement
  lcd.print( "      " );
  
  lcd.setCursor(0,1);
  lcd.print( distanceStr );
  lcd.print( " cm    ");
  
  // ne pas rafraichir trop souvent
  delay(500);
  
}

//Description:
//  Lecture de la tension sur la pin A0
//  Le senseur est sensé retourner une valeur
//  entre 0 & 3.3 volts
//
//Returns:
//  La tension en volt
//
float lectureTension(){
 // Lecture de la valeur sur l'entrée analogique
 // Retourne une valeur entre 0->1024 pour 0->5v
 int valeur = analogRead(sensorPin);  

 // Converti la lecture en tension
 float tension = valeur * 5.0;
 tension /= 1024.0; 
 
 return tension;
}

// Tableaux qui permettent de convertir la tension en distance approximative.
//
float sharpVoltage[] = { 3.1, 2.5, 1.84, 1.42, 1.15, 1, 0.85, 0.73, 0.5, 0.4, 0.3 };     
int sharpCms[] = { 5, 10, 15, 20, 25, 30, 40, 50, 60, 70, 80 };

//Description:
//  Lecture de la tension sur l'entrée analogique 
//  et determination de la distance approximative
//
//Returns:
//  Index superieur (du tableau) dans lequel se situe la mesure.
//  Par exemple, si l'index retourné est 2, la tension du capteur se situe
//    entre les positions 1 et 2 (soit <=2.3v et >1.7v).
//  La distance est donc située entre 10 et 15 cm.
//
int distanceIndex(){
  float tension = lectureTension();
  // si tension inférieur à 0.3v on est soit très loin, soit très près
  // Donc la distance est considérée comme inconnue
  if( tension < 0.3 )
    return -1;
  // Localiser la position dans le tableau OU la tension
  // lue sur le senseur est plus grande que la valeur du tableau
  // de référence
  int index = 0;
  while( sharpVoltage[index] > tension ){
    index++;
    // Si on sort du tableau, la distance est inconnue!
    if( index == 11 )
      return -1;
  }
  return index;
}

//Description:
//  Retourne une evaluation de la distance sous forme d'une
//  chaine de caractères.
String distanceRange(){
  int idx = distanceIndex();
  if( idx == -1 )
    return "Inconnu";
  if( idx == 0 ) {       
    return "<= "+String(int(sharpCms[idx]));
  }
  return String(int(sharpCms[idx-1]))+"> x <="+String(int(sharpCms[idx]));
}


Références