Précédemment, nous avons utilisé des valeurs digitales. Ces dernières ne peuvent prendre que des valeurs « binaires », c’est-à-dire 0 ou 1. On utilisera aussi les termes « ouvert », « open », « faux », « false » pour qualifier un 0, et « fermé », « closed », « vrai », « true » pour qualifier l’état 1. On par de valeurs booléennes, qui ne peuvent prendre que ces deux valeurs.
Le mode réel est différent, par exemple, la température extérieure peut être de -15°C ou de 25°C, ou de toute autre température comprise entre ces deux valeurs. On parle de valeur continue, ou discrète. Et le monde est généralement ainsi fait.
Pour être utilisée (et donc traitée) par un ordinateur, une valeur analogique doit être numérisée, cette numérisation est réalisée grâce à des convertisseurs analogique-numérique (CAN ou ADC en anglais, pour Analog-Digital Converter). Les Arduino disposent généralement de plusieurs entrées destinées à recevoir des signaux analogiques, le modèle UNO a 6 entrées, nommées de A0 à A5.
Le précision d’un CAN est déterminée par le nombre de bits, plus le nombre de bits est grand, plus la précision est grande. Le nombre de valeurs possibles est déterminé par le calcul :
où N est le nombre de bits du convertisseur. Sur l’Arduino UNO, le convertisseur a une capacité de 10 bits, on obtiendra :
On pourra lire des valeurs variant entre 0 et 1023.
Pour illustrer le fonctionnement du convertisseur, nous allons connecter un potentiomètre (un résistance variable) à une entrée, et faire clignoter une LED plus ou moins vite selon la valeur lue.
Réalisez le montage ci-dessous :
Lorsque l’on tourne le potentiomètre, on appliquera une tension électrique variant entre 0V et +5V.
Entrez le programme suivant :
const int sensorPin = A0;
const int ledPin = 13;
int sensorValue = 0;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
sensorValue = analogRead(sensorPin);
Serial.println(sensorValue);
digitalWrite(ledPin, HIGH);
delay(sensorValue);
digitalWrite(ledPin, LOW);
delay(sensorValue);
}
Dans le moniteur série, on peut lire les valeurs numérisées, et la LED L intégrée à l’Arduino clignote au rythme donné (ne pas confondre cette LED avec la LED TX qui indique une transmission sur le port série).
Quelle est la valeur réelle ?
Dans la console, on ne voit que la valeur numérique entre 0 et 1023. Si on désire connaître la tension électrique en Volts, il faut utiliser un règle de 3 :
. . .
const float tensionMax = 5.0;
const int valeurMaxDAC = 1023;
float tensionRelle = 0.0;
. . .
void loop() {
sensorValue = analogRead(sensorPin);
tensionRelle = (float)(sensorValue * tensionMax)/ valeurMaxDAC ;
Serial.println( tensionRelle );
. . .
}
On peut lire la tension en Volts dans le moniteur :
Quelle est la précision ?
La précision d’un convertisseur est déterminée par le nombre de bits. Dans l’exemple précédent, nous lisons une valeur maximale de 5V, un bit représente par conséquent :