1
Partie 3 : La structure d’un programme en « langage Arduino » :
Lecture de données analogiques Thème 3
Jusqu’ici, vous avez utilisé des entrées numériques qui ne prennent que deux valeurs : 1 ou 0.
Vous allez à présent découvrir comment utiliser des entrées analogiques qui permettent de recevoir des données électriques plus subtiles.
Cette découverte des entrées analogiques se fera à travers la prise en main d’un nouveau composant : le potentiomètre analogique.
Vous allez apprendre à vous en servir pour créer toute une nouvelle gamme de réactions en traitant des données qui ne sont pas uniquement des 1 et des 0.
Le potentiomètre
Le potentiomètre est une résistance dont la valeur varie.
Le principe est assez simple : un curseur se déplace sur une piste résistante (au passage de l'électricité) et permet de faire varier la résistance du potentiomètre. Donc l'électricité entre par un côté du potentiomètre et sort par le curseur. Si le curseur est proche de l'entrée, la résistance est faible et si le curseur est éloigné de l'entrée, la résistance et grande.
La flèche représente le curseur.
On dit qu'il s'agit d'un potentiomètre linéaire, car le déplacement du curseur fait augmenter la résistance de façon régulière. On peut donc s'attendre, en positionnant le curseur bien au centre, que la valeur de la résistance soit égale à la moitié de la résistance totale possible.
Si vous utilisez un potentiomètre de résistance maximum 10 KΩ :
• Si vous placez le curseur à fond du côté de la patte d'entrée, la valeur de résistance sera de 0 Ω.
• Si vous placez le curseur au milieu, la valeur de résistance sera de 5 KΩ (la moitié du maximum).
• Si vous placez le curseur à fond de l'autre côté, la valeur de la résistance sera de 10 kΩ (valeur max).
Vous devrez connecter la patte centrale du potentiomètre sur un pin analogique (CAN) (patte du curseur celle au centre, notée C sur l'image) et connecter ensuite l'une des deux pattes restante (soit A ou B) sur le +5V et l'autre sur le ground.
L'Arduino possède 6 CAN, en effet, vous pouvez transformer jusqu'à 6 signaux analogiques en signaux numériques, donc en nombres entiers ! Ce n'est qu'une fois le signal transformé en nombre qu'il est exploitable avec un programme.
Les 6 CAN sont notées A0, A1, A2…A5 sur votre carte arduino. C’est à ce niveau que l’on peut connecter un fil pour recevoir un signal analogique.
L'Arduino a une limite de définition, c'est à dire de résolution du signal. En effet, il ne peut transformer un signal reçu qu'en nombre compris entre 0 et 1023, soit 1024 valeurs possibles.
Nous allons réaliser un montage simple pour observer les caractéristiques d’un signal analogique.
2
Réalisez le montage ci-contre.
Les trois broches sont utilisées : l'une des extrémités au +5V, l'autre au ground, et le curseur au pin A0.
Nous voyons donc que le courant part du +5V, entre dans le potentiomètre par l'une des deux pattes d'extrémité, puis sort par le curseur vers le pin A0 de l'Arduino. La connexion au ground permet la lecture par l'Arduino de la valeur de position du curseur.
Pour récupérer la valeur de la patte centrale connectée à A0, il faut utiliser un nouveau mot-clé : analogRead() ; dont vous avez les caractéristiques dans le tableau ci-dessous.
Ecrivez puis téléversez le programme suivant.
Observez les variations des valeurs lorsque l’on tourne le potentiomètre. (Cliquez sur la petite loupe en haut à droite de l’interface : c’est le moniteur série)
Entrées analogiques analogRead()
Lit la valeur de la tension présente sur la broche spécifiée. La carte Arduino comporte 6 voies : A0, A1.. connectées à un convertisseur analogique-numérique 10 bits. Cela signifie qu'il est possible de transformer la tension d'entrée entre 0 et 5V en une valeur numérique entière comprise entre 0 et 1023.
Ceci peut être utilisé pour lire les valeurs d’un potentiomètre, d’un capteur de température, d’une photorésistance etc.
Syntaxe
analogRead(broche_analogique);
Paramètres
• broche_analogique : le numéro de la broche analogique (et non le numéro de la broche numérique) sur laquelle il faut convertir la tension analogique appliquée (0 à 5 sur la plupart des cartes Arduino)
Valeur renvoyée
valeur int (0 à 1023) correspondant au résultat de la mesure effectuée
int valPot=0; //variable pour récupérer la tension aux bornes du potentiomètre traduite par le CAN . On l’initialise à 0.
void setup() {
Serial.begin(9600); //Initialisation de la communication série avec la console }
void loop() {
valPot=analogRead(A0); //lit la tension, la convertit en valeur numérique et la stocke dans valeurPot Serial.print("Valeur lue : "); // Serial.print permet d’afficher des informations sur le moniteur série Serial.println(valPot);
}
3
Exercice 1 : clignotant à vitesse variable
Vous ajouterez au montage précédent, une LED connectée sur le pin 8 (n’oubliez pas la résistance).
La LED du montage clignote plus ou moins vite en fonction de la position du curseur du potentiomètre.
• Au plus lent, elle clignote toutes les secondes. C'est à dire qu'elle s'allume 0,5 s et s'éteint pendant 0,5 s.
• Au plus rapide, elle clignote 5 fois par seconde (5 Hz), donc elle s'allume pendant 0,1 s et s'éteint pendant 0,1 s de façon répétitive.
Le temps d'allumage est le même que le temps d'extinction.
Le tableau vous donne alors les temps d’attente correspondant en fonction du nombre de clignotement attendu par seconde.
En vous aidant du tableau ci-dessus, programmez ce nombre de
clignotement(s) pour la LED en fonction de la valeur du potentiomètre.
Montage capteur de température et LED
Le capteur de température utilisé ici est le capteur LM35, c’est un capteur linéaire fonctionnant en 5V.
Attention, ne le confondez pas avec le qui lui ressemble
beaucoup mais les pattes sont tordues sur le transistor et pas sur le capteur de température.
Lorsque vous le tenez côté plat vers vous, on le connecte de la manière suivante :
• patte de gauche : connectée au +5V ;
• patte de droite : connectée au ground ;
• patte du centre : connectée à un CAN de l'Arduino.
Afin de réaliser des mesures correctes, il est important de connaitre les
caractéristiques de ce capteur. Le datasheet (la fiche d’information du capteur) indique qu’il mesure la température entre -55 et +150 °C avec une variation de 10mV par °C.
Valeur du potentiomètre Valeur d'attente
Nombre de clignotements
Par seconde
Entre 0 et 204 1000/5/2=100ms 5
Entre 205 et 408 1000/4/2=125ms 4
Entre 409 et 613 1000/3/2=167ms 3
Entre 614 et 818 1000/2/2=250ms 2
Entre 818 et 1023 1000/1/2=500ms 1
4
Réaliser le montage décrit ci-dessus, avec la patte centrale connectée au A0.
Dans un premier temps, je vous fournis le programme qui permet de récupérer les valeurs lues en AO et de les transformer en valeur de température.
Rq. On utilise dans ce programme la fonction map.
Celle-ci possède la syntaxe suivante :
Elle fonctionne de la manière suivante :
Ré-étalonne un nombre d'une fourchette de valeur vers une autre fourchette.
Ainsi, une valeur basse source sera étalonnée en une valeur basse de destination, une valeur haute source sera étalonnée en une valeur haute de destination, une valeur entre les deux valeurs source sera étalonnée en une valeur entre les deux valeurs destinations, en respectant la proportionnalité.
Cette fonction est très utile pour effectuer des changements d'échelle automatiques.
Exercice 2
A partir du montage précédent, réaliser un indicateur lumineux de la température.
Le principe est simple. En utilisant 3 LEDS (n’oubliez pas les résistances), vous allez indiquer des seuils de température. On fixe le seuil initial à 20°C,
• Si la température est inférieure à cette température, les LEDS sont éteintes.
• Si la température est supérieure de 2°C à cette température, la 1ère LED s’allume.
• Si la température est supérieure de 4°C à cette température, la 2ème LED s’allume en plus de la 1ère.
• Si la température est supérieure de 6°C à cette température, les 3 LEDS s’allument.
int mesureBrute=0; // variable de la mesure donné par l'arduino float mesure; // variable pour donner le résultat de la température void setup() {
Serial.begin(9600);
}
void loop() {
mesureBrute=analogRead(A0); //on lit la valeur au CAN 0
mesure=map(mesureBrute,0,1023,0.0,5000.0); //on transforme la valeur lue en valeur de tension entre 0,0 et 5000,0 mV.
float temp=mesure/10; // on divise par 10 (car 10 mv par °C) // affichage du résultat
Serial.print("Mesure Brute :");
Serial.println(mesureBrute);
Serial.print(" soit : ");
Serial.print(mesure);
Serial.println(" mV ");
Serial.print(" soit : ");
Serial.print(temp);
Serial.println(" degres celsius");
delay(10000);
}
map (valeur, limite_basse_source, limite_haute_source, limit e_basse_destination, limite_haute_destination)
Paramètres
• valeur : le nombre à ré-étalonner
• limite_basse_source: la valeur de la limite inférieure de la fourchette de départ
• limite_haute_source: la valeur de la limite supérieure de la fourchette de départ
• limite_basse_destination: la valeur de la limite inférieure de la fourchette de destination
• limite_haute_destination: la valeur de la limite supérieure de la fourchette de destination
5
La photo-résistance
La photorésistance est une forme de capteur de lumière. C'est un composant très simple à mettre en œuvre et qui permet une interaction intéressante avec l'environnement.
Le principe est assez simple : plus il y a de lumière, plus la résistance est basse. L'obscurité provoque une résistance importante.
Il s’agit donc d’un capteur de variation qu’il faudra connecter à l’Arduino avec un pin analogique.
Pour pouvoir utiliser efficacement une photo-résistance, il faut la mettre en série avec une autre résistance fixe.
L’entrée analogique sera connectée au point de jonction entre les 2 résistances (la résistance fixe et la photo-résistance)
Ecrivez puis téléversez le programme suivant.
Observez ce qu’il se passe lorsque l’on approche ou éloigne une source lumineuse de la photorésistance
Exercice 3
Réaliser un capteur d’obscurité.
Lorsque l’obscurité est trop faible, cela déclenche l’allumage d’une LED (n’oubliez pas la résistance).
Celle-ci s’éteint lorsque la luminosité est suffisante.
Vous êtes libre de choisir le seuil d’allumage/extinction que vous voulez…
int pinPR=A0; //pin de connexion pour la photorésistance void setup() {
Serial.begin(9600);
}
void loop() {
int valeur=analogRead(pinPR); // on lit la valeur transmise par la photorésistance Serial.println(valeur); // on l'affiche
}