Modifications

Sauter à la navigation Sauter à la recherche
3 908 octets ajoutés ,  17 mars 2012 à 17:45
aucun résumé de modification
Ligne 69 : Ligne 69 :  
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 [http://www.ladyada.net/learn/sensors/tmp36.html cet exemple avec un TMP36 sur ladyada]).
 
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 [http://www.ladyada.net/learn/sensors/tmp36.html cet exemple avec un TMP36 sur ladyada]).
 
La précision augmente alors à 3.3mV.
 
La précision augmente alors à 3.3mV.
 +
 +
== Exemple pratique ==
 +
En raccordant le senseur de distance sur l'entrée Analogique A0
 +
 +
[[File:Sharp GP2Y0A21YK arduino.png]]
 +
 +
Et en ajoutant un afficheur LCD 2x16 (LCD MOP-AL162A-BBTW) monté comme suit:
 +
 +
[[File:Sharp LCD Schema.png]]
 +
 +
Pour le montage de l'afficheur LCD, vous pouvez vous référer à l'article "[http://arduino103.blogspot.com/2011/06/commande-dun-afficheur-lcd-mop-al162a.html Commande d'un afficheur LCD MOP-AL162A-BBTW: LCD 2x16]" sur le Blog Arduino Notepad.
 +
 +
<nowiki>/*
 +
  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]));
 +
}
 +
</nowiki>
    
== Autre Information ==
 
== Autre Information ==
 
   
 
   
   
[http://mchobby.be/data-files/datasheet/GP2Y0A21YK0F%20DataSheet.pdf Fiche technique] (DataSheet)
 
[http://mchobby.be/data-files/datasheet/GP2Y0A21YK0F%20DataSheet.pdf Fiche technique] (DataSheet)
29 910

modifications

Menu de navigation