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) |