Sharp GP2Y0A21YK0

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

Introduction

Le détecteur de distance Sharp GP2Y0A21YK (10-80cm) 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
Sharp GP2Y0A21YK (10-80cm)

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.

Si vous avez besoin d'évaluer une distance plus importante, vous pouvez également utiliser son grand frère le Sharp GP2Y0A2YK0F (20-150cm)

Sharp GP2Y0A2YK0F.jpg
Sharp GP2Y0A2YK0F (20-150cm)

Montage général

Les deux modèles de senseurs se raccordent de la même façon... ils sont très simple à câbler et n'utilise que 3 connexions (une sortie analogie + alimentation).

Les senseurs Sharp sont assez populaires du fait de leur prix assez démocratique mais aussi de leur simplicité de mise en oeuvre.

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

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

Sharp GP2Y0A21YK arduino.png

Le fil jaune (ou blanc) transporte le signal de sortie... c'est celui-là qu'il faut lire sur notre micro-controleur :-)

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 Sharp 10-80cm

Voici le graphe de tension/distance pour le senseur Sharp GP2Y0A21YK (10-80cm)

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.

Documentation Sharp 20-170cm

Le graphique suivant correspond le graph de correspondance tension/distance pour le senseur Sharp GP2Y0A2YK0F (20-150cm).

GraphTensionDistance-GP2Y0A2YK0F.jpg

Retour d'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

Cet exemple utilise un senseur de distance raccordé sur la broche analogique A0 et un afficheur LCD.

Le senseur de distance se raccorde comme suit sur l'entrée Analogique A0

Sharp GP2Y0A21YK arduino.png

Vous pouvez ensuite réaliser le montage de l'afficheur LCD comme précisé dans le tutoriel qui lui est dédié.

Pour rappel, voici comment l'afficheur LCD est raccordé sur votre Arduino:

Afficheur-lcd-montage.jpg

N'hésitez pas à vous reporter au tutoriel de l'afficheur LCD pour plus de précisions.


/*
  Mesure de la proximité à l'aide d'un senseur infrarouge
  Sharp gp2y0a21yk Proximity Sensor et Affichage sur LCD 2x16
 
 --- Afficheur LCD ---
 * Article disponible chez MCHobby
     http://shop.mchobby.be/product.php?id_product=176
 * Montage: 
     http://wiki.mchobby.be/index.php?title=Afficheur_LCD
 
 --- Senseur de proximité ---
 * Sharp gp2y0a21yk sortie analigique
 * Article disponible chez MCHobby
     http://shop.mchobby.be/product.php?id_product=35
 * Montage: 
     Broche/Pin A0 (analogique)
     http://wiki.mchobby.be/index.php?title=Sharp_GP2Y0A21YK0
 
 License: CC-BY-SA
 Crédit: Meurisse D. de www.mchobby.be "vente de kit et composants"
 
*/

// Inclure les librairie:
#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.

// Initialisation de la librairie LCD avec les différentes broches utilisées
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);;

void setup(){
  // Positionner le curseur sur l'afficheur LCD: 
  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ésultat en Vidéo

{{#Widget:Iframe |url=http://www.youtube.com/embed/USQK0_XNWZE |width=420 |height=315 |border=0 }} {{#Widget:Iframe |url=http://www.youtube.com/embed/uG-G_SSHyw8 |width=420 |height=315 |border=0 }}

Où acheter

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.