Sharp GP2Y0A21YK0

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche

Introduction

Le détecteur de distance Sharp GP2Y0A21YK est un senseur de proximité infrarouge évaluant la distance sur base de la quantité de lumière infrarouge reçu en retour.

Sharp GP2Y0A21YK.jpg

Sa technologie infrarouge offre une évaluation de la distance moins rigoureuse qu'un senseur ulrasons mais reste cependant très économique. Il permet donc la détection d'obstacles (et jugement de distances) à prix abordable.

Ce senseur dispose d'une électronique embarquée qui le rend à la fois autonome et permet de proposer un interface simple à mettre en oeuvre. En effet, le senseur fournit une tension analogique qui est proportionnel à la distance à laquelle l'objet est détecté.

La tension de sortie varie de 2,3 - 0,4 Volts pour une distance variant respectivement 10 - 80 cm. Il suffit donc de bancher ce senseur sur une entrée Analogique pour évaluer la distance.

Ou acheter

Cet article est disponible chez MC Hobby.

Il inclus le connecteur de raccordement et un PinHeader pour faciliter le raccordement sur breadboard.

Montage général

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

il suffit de placer les différents câbles du connecteur JST comme suit:

  • Rouge: +5v
  • Noir: GND/Masse
  • Jaune: Entrée Analogique A0

Sharp GP2Y0A21YK arduino.png

Considérations techniques

Comme précisé dans la fiche technique, la tension analogique renvoyée par la capteur dépend de la distance de l'objet.

Documentation

GraphTensionDistance.png

Ce que le graphe nous apprends:

  • La tension maximale est de ~3.3 volts et diminue lorsque l'objet s'éloigne.
  • La tension ne diminue pas proportionnellement à la distance (par ex: 10mv par 10cm) mais suit une courbe.
  • 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)
  • 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.

Expérience

Ce que l'expérience nous à 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) Imprécision des mesures proches et lointaines

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) Résolution de l'entrée Analogique

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 cet exemple avec un TMP36 sur ladyada). La précision augmente alors à 3.3mV.

Exemple pratique

En raccordant le senseur de distance sur l'entrée Analogique A0

Sharp GP2Y0A21YK arduino.png

Et en ajoutant un afficheur LCD 2x16 (LCD MOP-AL162A-BBTW) monté comme suit:

Sharp LCD Schema.png

Pour le montage de l'afficheur LCD, vous pouvez vous référer à l'article "Commande d'un afficheur LCD MOP-AL162A-BBTW: LCD 2x16" sur le Blog Arduino Notepad.

/*
  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]));
}

Autre Information

Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : «  Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.

L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.