XVIII. Projet 10 : le potentiomètre▲
Le potentiomètre est une résistance variable. Contrairement, c'est le bouton de réglage du volume sur une radio. La plupart des potentiomètres sont soit rotatifs, soit linéaires.
Les potentiomètres sont très fréquents dans les appareils électroniques, par exemple les tables de mixage.
Voici les symboles électroniques (européens dessus et américains dessous) du potentiomètre :
Comme toute résistance, le potentiomètre modifie la tension d'un circuit. On va donc l'utiliser principalement comme entrée (input) dans une broche analogique (A0 à A5) de l'Arduino.
Les potentiomètres ont en général trois broches. Les broches extérieures se connectent sur l'alimentation +5 V et sur la terre, alors que la broche centrale envoie le signal sur la broche d'entrée analogique de l'Arduino.
XVIII-A. Circuit 12 : utiliser le potentiomètre pour faire varier la luminosité d’une LED▲
Il est temps de griller notre première LED (si cela n'est pas déjà fait) ! C'est le passage obligé de tout bon maker ! Pour ce faire, nous allons connecter une LED sur la broche OUT du potentiomètre et la mettre à la terre. Petit conseil : avant de brancher, tourner le potentiomètre au minimum, dans le sens inverse des aiguilles d'une montre.
Une fois l'Arduino branché, tourner délicatement le potentiomètre dans le sens des aiguilles d'une montre. La LED va commencer à s'illuminer, puis de plus en plus, avant de… griller.
Nous venons de le voir : varier le voltage à l'entrée d'une LED n'est pas la meilleure solution pour faire varier sa luminosité… même si la LED ne grille pas, au-delà de son voltage de fonctionnement, sa durée de vie sera fortement réduite. Mais qu'importe, puisque nous avons la fonction PWM(12). Nous allons donc coupler le potentiomètre, en entrée analogique sur A0, avec une LED en PWM sur la broche 9.
Liste des composants
- 1 LED ;
- 1 résistance de 220 Ω ;
- 1 potentiomètre de 10 kΩ ou 20 kΩ .
XVIII-B. Circuit 13 : utiliser le potentiomètre pour faire varier la luminosité d’une LED▲
Le code est très simple. Comme pour le code 17, on récupère la valeur comprise en 0 et 1023 sur A0, avant de la diviser par 4, afin de la rendre compatible avec la portée du PWM, comprise entre 0 et 255. Comme pour le code 18, on pourrait aussi imaginer un mappage au lieu de la division.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
/*
Code 19 - Edurobot.ch, destiné à l'Arduino
Objectif: Lire la valeur du potentiomètre pour faire varier la luminosité de la LED en PWM
Source: Philippe Krähenbühl
*/
int
ledPin =
9
; // On renomme la broche 9 en "ledPin"
int
analogPin =
0
; // Le potentiomètre est connecté à la broche analogue 0
int
val =
0
; // la variable qui stocke la valeur lue est mise à 0
void
setup()
{
pinMode
(ledPin, OUTPUT
);
}
void
loop()
{
val =
analogRead
(analogPin); //lecture de la valeur analogue (potentiomètre)
analogWrite
(ledPin, val /
4
); // valeur analogue lue (0 à 1023) divisée par 4 (0 à 255)
}
XVIII-C. Circuit 14 : allumer les LED d’un bargraphe à l’aide d’un potentiomètre▲
Quand on tourne le bouton pour augmenter le volume, il serait intéressant d'avoir un bargraphe qui nous indique le niveau.
On va donc réaliser un bargraphe à l'aide de 8 LED.
Liste des composants
- 8 LED ;
- 8 résistances de 220 Ω ;
- 1 potentiomètre de 10 kΩ ou 20 kΩ.
XVIII-D. Code 20 : fficher la valeur d'un potentiomètre à l'aide d'un bargraphe▲
Le cas de ce code est très intéressant. Nous savons maintenant que nous avons 1024 paliers sur l'entrée analogique de l'Arduino. Lorsque l'Arduino reçoit la valeur de 1024, 8 LED devront être allumées. Ainsi, lorsqu'il recevra la valeur de 512, 4 LED devront être allumées (512 étant naturellement la moitié de 1024).
On va donc diviser nos 1024 paliers par 8, pour obtenir l'intervalle qui allumera les LED les unes après les autres. Attention, on commence à compter à 0, pas à 1. C'est la raison pour laquelle nos 1024 paliers se terminent à 1023.
On arrive au résultat suivant :
LED1 : de 0 à 127
LED2 : de 128 à 255
LED3 : de 256 à 383
LED4 : de 384 à 511
LED5 : de 512 à 639
LED6 : de 640 à 767
LED7 : de 768 à 895
LED8 : de 769 à 1023
À partir de là, il suffit d'aller chercher la valeur reçue, qu'on va stocker dans la variable readValue, puis de la faire passer dans 8 tests à partir de if
… else
consécutifs.
Le serial.print a pour objectif d'afficher dans le moniteur la valeur reçue par l'Arduino (voir code 17).
/*
Code 20 - Edurobot.ch, destiné à l'Arduino
Objectif: Afficher la valeur d'un potentiomètre à l'aide d'un bargraphe
*/
// Information sur les LED
int
led1 =
5
;
int
led2 =
6
;
int
led3 =
7
;
int
led4 =
8
;
int
led5 =
9
;
int
led6 =
10
;
int
led7 =
11
;
int
led8 =
12
;
// Information sur le potentiomètre
int
potPin =
A0;
int
readValue;
int
writeValue;
void
setup() {
Serial
.begin(9600
);
pinMode
(led1, OUTPUT
);
pinMode
(led2, OUTPUT
);
pinMode
(led3, OUTPUT
);
pinMode
(led4, OUTPUT
);
pinMode
(led5, OUTPUT
);
pinMode
(led6, OUTPUT
);
pinMode
(led7, OUTPUT
);
pinMode
(led8, OUTPUT
);
}
void
loop() {
/*Écriture de la valeur du potentiomètre
dans la variable "readValue"
*/
readValue =
analogRead
(potPin);
/*Incription dans le moniteur série
de "Color=valeur de la variable readValue
*/
Serial
.print("
\V
al="
);
Serial
.print(readValue);
delay
(200
);
// De 0 à 127, led1
if
(readValue <
128
) {
Serial
.println("
\t
led 1"
);
digitalWrite
(led1, HIGH
);
digitalWrite
(led2, HIGH
);
digitalWrite
(led3, HIGH
);
digitalWrite
(led4, HIGH
);
digitalWrite
(led5, HIGH
);
digitalWrite
(led6, HIGH
);
digitalWrite
(led7, HIGH
);
digitalWrite
(led8, HIGH
);
}
// De 128 à 255, led 1 à 2
else
if
(readValue >=
128
&&
readValue <
256
) {
Serial
.println("
\t
led 2"
);
digitalWrite
(led1, HIGH
);
digitalWrite
(led2, HIGH
);
digitalWrite
(led3, LOW
);
digitalWrite
(led4, LOW
);
digitalWrite
(led5, LOW
);
digitalWrite
(led6, LOW
);
digitalWrite
(led7, LOW
);
digitalWrite
(led8, LOW
);
}
// De 256 à 383, led 1 à 3
else
if
(readValue >=
256
&&
readValue <
384
) {
Serial
.println("
\t
led 3"
);
digitalWrite
(led1, HIGH
);
digitalWrite
(led2, HIGH
);
digitalWrite
(led3, HIGH
);
digitalWrite
(led4, LOW
);
digitalWrite
(led5, LOW
);
digitalWrite
(led6, LOW
);
digitalWrite
(led7, LOW
);
digitalWrite
(led8, LOW
);
}
// De 384 à 511, led 4
else
if
(readValue >=
384
&&
readValue <
512
) {
Serial
.println("
\t
led 4"
);
digitalWrite
(led1, HIGH
);
digitalWrite
(led2, HIGH
);
digitalWrite
(led3, HIGH
);
digitalWrite
(led4, HIGH
);
digitalWrite
(led5, LOW
);
digitalWrite
(led6, LOW
);
digitalWrite
(led7, LOW
);
digitalWrite
(led8, LOW
);
}
// De 512 à 639, led 5
else
if
(readValue >=
512
&&
readValue <
640
) {
Serial
.println("
\t
led 5"
);
digitalWrite
(led1, HIGH
);
digitalWrite
(led2, HIGH
);
digitalWrite
(led3, HIGH
);
digitalWrite
(led4, HIGH
);
digitalWrite
(led5, HIGH
);
digitalWrite
(led6, LOW
);
digitalWrite
(led7, LOW
);
digitalWrite
(led8, LOW
);
}
// De 640 à 767, led 6
else
if
(readValue >=
640
&&
readValue <
768
) {
Serial
.println("
\t
led 6"
);
digitalWrite
(led1, HIGH
);
digitalWrite
(led2, HIGH
);
digitalWrite
(led3, HIGH
);
digitalWrite
(led4, HIGH
);
digitalWrite
(led5, HIGH
);
digitalWrite
(led6, HIGH
);
digitalWrite
(led7, LOW
);
digitalWrite
(led8, LOW
);
}
// De 768 à 895, led 7
else
if
(readValue >=
768
&&
readValue <
896
) {
Serial
.println("
\t
led 7"
);
digitalWrite
(led1, HIGH
);
digitalWrite
(led2, HIGH
);
digitalWrite
(led3, HIGH
);
digitalWrite
(led4, HIGH
);
digitalWrite
(led5, HIGH
);
digitalWrite
(led6, HIGH
);
digitalWrite
(led7, HIGH
);
digitalWrite
(led8, LOW
);
}
// De 896 à 1023, led 8
else
{
Serial
.println("
\t
led 8"
);
digitalWrite
(led1, HIGH
);
digitalWrite
(led2, HIGH
);
digitalWrite
(led3, HIGH
);
digitalWrite
(led4, HIGH
);
digitalWrite
(led5,HIGH
);
digitalWrite
(led6,HIGH
);
digitalWrite
(led7,HIGH
);
digitalWrite
(led8,HIGH
);
}
}
Variante 1 : utiliser un bargraphe 10 LED
On peut, à ce stade, utiliser un potentiomètre et afficher sa valeur à l'aide d'un bargraphe 10 LED. Il suffit pour cela de ne plus diviser 1024 par 8, mais par 10 (en arrondissant).
Variante 2 : utiliser un afficheur LED 8 digits
Voici une variante un peu plus sophistiquée. Il s'agit à nouveau d'afficher la valeur d'un potentiomètre. Mais cette fois avec un afficheur LED 8 digits. On affiche la valeur de 0 (min) à 9 (max).