Lecture d’un potentiomètre. Entrées analogiques d’Arduino.
Dans ce post nous allons lire un signal analogique avec un potentiomètre et on montrera les données obtenues sur le port série (moniteur). Deuxièmement, on transformera ces données en tension, en pourcentage et on utilisera une moyenne, pour réduire les valeurs déréglées. Finalement, on variera l’intensité d’une led à l’aide d’un potentiomètre.
Tandis que les entrées digitales sont comme une sorte d’ interrupteur qui peut allumer ou éteindre une ampoule, les entrées analogiques sont plutôt comme un régulateur, permettant de choisir l’intensité de cette ampoule. Ainsi, les valeurs obtenues à travers les entrées analogiques peuvent être multiples. Quand Arduino reçoit les donnés d’une entrée analogique la tension est entre 0 et 5 Volts. Cette valeur, en volts, est automatiquement transformée par la plaque en une nouvelle valeur equivalente, sur une échelle d’entre 0 et 1023 selon la valeur reçue (0 V= 0 / 5V= 1023).
Pour tester comment fonctionnent ces entrées analogiques nous allons nous servir d’un potentiomètre, une résistance variable a trois bornes que permet de recueillir une tension qui dépend de la position du curseur et de la tension à laquelle est soumise la résistance. Il a la particularité de modifier la valeur de la résistance quand on le souhaite.
Table de matières:
Schéma.
Il est nécessaire:
- Arduino Uno ou équivalent.
- Une plaque d’essai ou breadboard.
- Trois fils.
- Un potentiomètre linéaire.
Cablage du circuit:
Le montage est très simple: la borne VCC du potentiomètre se relie avec l’entrée de 5V de la plaque Arduino, la borne GND se relie à la masse et la sortie de données OUT à l’entrée analogique A0.
Expérience 1: vérifier la sortie analogique des données.
Une entrée analogique nous offre des valeurs entre 0 et 1023, vérifions:
int valeur = 0; // Variable où on stock la valeur du potentiomètre
void setup() {
Serial.begin(9600); // Initialisons la communication serial
}
void loop() {
valeur = analogRead(A0); // on lit les données du pin A0
// on imprime la valeur sur le moniteur serie (0 - 1023)
Serial.print("Valeur analogique : ");
Serial.println(valeur);
delay(1000);
}
Une fois le code compilé , on ouvre le moniteur série et on exécute. En tournant la roue du potentiomètre on pourra observer comment les différentes valeurs ( entre 0 et 1023) s’affichent sur l’écran.
Expérience 2: transformer les données analogiques en tension.
Pour cette expérience on utilisera le même schéma. On ajoutera au code une nouvelle variable afin de stocker la tension et on convertira les données en volts. Comment fait-on cette conversion? On sait que 5 V correspondent à 1023, et la donné de valeur correspond à la lecture du potentiomètre:
Code:
int valeur = 0; // Variable où on stock la valeur du potentiomètre
float tension = 0; // Variable où on stock le voltage, la tension
void setup() {
Serial.begin(9600); // Initialisons la communication sérial
}
void loop() {
valeur = analogRead(A0); // on lit la valeur du pin A0
tension = (valeur*5.00/1023.00); // on calcule la tension
Serial.print("valeur analogique: ");
Serial.print(valeur);
Serial.print(" tension: ");
Serial.print(tension);
Serial.println("V");
delay(1000);
}
On peut observer que nous avons introduit une nouvelle variable du type float, nommée tension. Dans la fonction loop() nous avons ajouté l’instruction: tension=( valeur* 5.00/1023.00); c’est la formule servante à calculer notre tension.
Expérience 3: transformer les données en pourcentage.
Le cablage est toujours le même.
Pour calculer le pourcentage nous allons utiliser l’intruction map().
position = map (valeur, 0, 1023, 0, 100)
int valeur = 0; //variable où on stock la lecture analogique
int position; //position du potentiomètre en tant que pour cent
void setup() {
Serial.begin(9600);
}
void loop() {
valeur = analogRead(A0); // réalise la lecture analogique
position = map(valeur, 0, 1023, 0, 100); // convertir en pourcentage
Serial.print("Valeur %: ");
Serial.println(position);
delay(1000);
}
Quand on travaille avec de senseurs analogiques on peut parfois capter une valeur faussée et distordue, éloignée des autres valeurs, et pourtant inexacte. Les parasites sont une réalité pénible usant un potentiomètre. La façon la plus efficace pour réduire ces fausses données, est celle de recueillir plusieurs valeurs et faire la moyenne. Prenant cette moyenne comme la valeur la plus fiable.
Experiénce 4: faire la moyenne.
Pour cette expérience on va prendre dix valeurs afin de faire la moyenne:
int valeur = 0; // Variable où on stock la valeur du potentiométre
int total = 0;
int moyenne = 0;
int i=0;
void setup() {
Serial.begin(9600); // on commence la communication sérial
}
void loop() {
total = 0;
for(i=0; i <= 9; i++){
valeur = analogRead(A0); // on lit la valeur du pin A0
Serial.print(" valeur: ");
Serial.println(valeur);
delay(1);
total = total + valeur;
}
moyenne = total / i;
// on imprime la moyenne sur le monitor série (0 - 1023)
Serial.print("Valeur moyenne : ");
Serial.println(moyenne);
delay(1000);
}
Varier l’intensité d’une led avec un potentiomètre.
Tout ce qu’on vient de présenter dans ce tutoriel peut nous servir pour réaliser plusieurs opérations; par exemple, appliquer plus ou moins intensité à une diode, moduler la vitesse d’un moteur, modifier la fréquence d’un son…
il est nécessaire:
- Arduino Uno ou équivalent.
- Une plaque d’essai ou breadboard.
- Cinq fils.
- Une led.
- Un potentiomètre linéaire.
Schéma:
Code:
int valeur = 0; // Variable où on stock la valeur du potentiomètre
float tension = 0; // Variable où on stock la tension
int valeurPot=0;
void setup() {
pinMode(3,OUTPUT);
Serial.begin(9600); // on commence la communication sérial
}
void loop() {
valeur = analogRead(A0); // on lit la valeur du pin A0
tension = (valeur*5.00/1023.00); // on calcule la tension
valeurPot = map(valeur,0,1023,0,255);
analogWrite(3,valeurPot); // on allume le led (0-255)
Serial.print("valeur analogique: ");
Serial.print(valeur);
Serial.print(" tension: ");
Serial.print(tension);
Serial.print("V");
Serial.print(" valeur: ");
Serial.println(valeurPot);
delay(1000);
}