Capteurs analogiques

Après les capteurs numériques la semaine dernière, nous allons découvrir aujourd'hui ce que sont les capteurs analogiques et comment les interfacer avec Arduino.

Pour comprendre la différence entre ces deux familles de capteurs, prenons deux exemples :

  • Le bouton poussoir est un capteur numérique qui peut nous donner deux informations sur l'état d'un bouton lorsqu'on le branche sur Arduino. Soit le bouton est appuyé (HIGH) soit il ne l'est pas (LOW)

  • Pour le capteur de luminosité qui est un capteur analogique, c'est diffèrent. Les valeurs renvoyées par Arduino si on lui branche ce capteur peuvent prendre des valeurs comprises entre 0 et 1023.

Nous pourrons ainsi savoir précisément si notre environnement est sombre ou lumineux selon si la valeur reçue est basse ou élevée

On teste ça avec un montage qui va nécessiter :

  • Un Arduino

  • Un câble USB

  • Une platine de prototypage

  • Une photorésistance

  • Deux résistances de 1kΩ

  • Une LED de votre couleur préférée

  • Des fils de prototypage

Voici le montage à réaliser :

Je vous invite à mettre la vidéo en pause le temps de réaliser ce montage avec le simulateur ou avec Arduino.

On passe au code et comme d'habitude, nous n'allons pas taper grand chose. Je vous invite à ouvrir l'exemple AnalogInOutSerial ou à copier le code situé en dessous de la vidéo dans le simulateur. Vous devriez avoir ceci sous les yeux

1
const int analogInPin = A0;  // Analog input pin that the potentiometer is attached to
2
const int analogOutPin = 9; // Analog output pin that the LED is attached to

Intéressons nous maintenant aux instructions présentes dans ce programme AnalogInOutSerial :

Après quelques lignes de commentaires, nous trouvons deux déclarations de constantes appelées analogInPin et analogOutPin qui correspondent à notre photorésistance branchée sur la broche A0 et analogOutPin qui est notre LED branchée sur la broche 9.

Nous déclarons ensuite deux variables entières appelées sensorValue et outputValue qui contiendront respectivement la valeur reçue par la photorésistance et la valeur envoyée à la LED.

1
int sensorValue = 0;        // value read from the pot
2
int outputValue = 0;        // value output to the PWM (analog out)

On passe au setup qui contient une seul instruction :

Serial.begin(9600);

C'est une nouveauté, vous noterez que cette fonction est séparé par un point. Cela signifie qu'elle appartient appartient à une librairie qui s'appelle ici Serial.

Nous reviendrons la semaine prochaine sur ce qu'est une librairie mais sachez que la fonction begin qui suit le point permet de dire que l'on souhaite communiquer avec l'ordinateur en utilisant notre port USB.

En effet, le port USB que nous utilisons pour téléverser nos programmes sur l'Arduino permet aussi d'envoyer et de recevoir du texte avec un ordinateur.

Le paramètre 9600 est la vitesse on échange les caractères.

1
void setup() {
2
  // initialize serial communications at 9600 bps:
3
  Serial.begin(9600);
4
}

Nous passons ensuite au bloc loop.

Comme dans l'exemple Button la semaine dernière, nous venons lire une valeur. Nous allons utiliser analogRead qui renvoie une valeur numérique comprise entre 0 et 1023.

Nous allons donc récupérer dans la variable sensorValue un nombre que nous allons ensuite renvoyer dans une LED pour définir son intensité lumineuse.

Il est en effet possible d'allumer une LED un petit peu grâce à la fonction analogWrite qui prend deux paramètres : le premier est le numéro de la broche qui va recevoir le courant. Le second paramètre est la valeur que nous voulons écrire comprise cette fois-ci entre 0 et 255.

1
analogWrite(analogOutPin, outputValue);

Cependant, comme vous pouvez le remarquer, nous avons ici un problème : avec analogRead, nous recevons une valeur comprise entre 0 et 1024 et nous devons ensuite écrire une valeur comprise entre 0 et 255.

Deux solutions existent pour répondre à ce problème, la première est de faire une règle de trois de ce type :

1
// changer l'intervalle
2
outputValue = (sensorValue * 255) / 1024;

Mais nous avons choisi d'utiliser une fonction appelée map qui est offerte par le langage Arduino et qui permet de faire passer une valeur située dans une intervalle vers un autre.

Les paramètres de ces fonctions sont les suivants :

  1. valeur dans l'intervalle initiale

  2. début de l'intervalle initiale

  3. fin de l'intervalle initiale

  4. début de l'intervalle visée

  5. fin de l'intervalle visée

Grâce à cette fonction, nous allons donc nous retrouver avec une valeur proportionnelle comprise entre 0 et 255 que nous allons envoyer dans la LED grâce à la fonction analogWrite.

1
// changer l'intervalle :
2
outputValue = map(sensorValue, 0, 1023, 0, 255);

Nous passons ensuite aux instructions Serial.print

Ces fonctions font suite à l'instruction Serial.begin dans le setup. Les fonctions print et println permettent d'envoyer du texte vers l'ordinateur qui pourra ensuite être visualisé dans le moniteur série que nous aborderons dans quelques secondes après avoir téléversé le programme.

1
// print the results to the Serial Monitor
2
// envoyer du texte vers l'ordinateur :
3
  Serial.print("sensor = ");
4
  Serial.print(sensorValue);
5
  Serial.print("\t output = ");
6
  Serial.println(outputValue);

Une fois le code chargé sur l'Arduino, la première chose à faire est de vérifier le bon fonctionnement de notre montage. Pour cela, passer la main sur le capteur de luminosité et regarder le résultat. Normalement, vous devriez voir baisser la luminosité de la LED lorsque vous cachez la lumière arrivant sur la photorésistance.

Ce changement peut être observé depuis l'ordinateur en utilisant le moniteur série. Une icône située ici permet d'ouvrir une fenêtre où l'on va voir s'afficher les caractères envoyés par les fonctions Serial.print. Selon le niveau de luminosité reçu, nous pouvons voir varier en temps réel les valeurs sensorvalue et outputValue.