IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Arduino à l'école

Cours pour l'apprentissage des bases de l'électronique et de la programmation sur Arduino
Image non disponible


précédentsommairesuivant

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.

Image non disponible

Image non disponible

Les potentiomètres sont très fréquents dans les appareils électroniques, par exemple les tables de mixage.

Image non disponible
Table de mixage du RadioBus (http://radiobus.fm)

Voici les symboles électroniques (européens dessus et américains dessous) du potentiomètre :

Image non disponible

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.

Image non disponible

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.

Circuit 12

Image non disponible

Image non disponible

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

Circuit 13

Image non disponible

Image non disponible

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.

Code 19
Sélectionnez
1.
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Ω.

Circuit 14

Image non disponible

Image non disponible

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 ifelse 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
Sélectionnez
/*
    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("\Val=");
    Serial.print(readValue);
    delay(200);

    // De 0 à 127, led1
    if (readValue < 128) {
        Serial.println("\tled 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("\tled 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("\tled 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("\tled 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("\tled 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("\tled 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("\tled 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("\tled 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).

Image non disponible

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).

Image non disponible

précédentsommairesuivant

Ce cours est publié pour la communauté Arduino d'Edurobot.ch via son site https://arduino.education/. Il s'agit d'une ressource éducative libre, sous licence CC BY-NC-SA. L'utilisation gratuite de ce cours dans le cadre d'une formation payante est tolérée. Un avis à l'auteur est néanmoins bienvenu. Les écoles publiques, lycées, gymnases, universités, les associations et les FabLab peuvent demander gratuitement une version Word de ce document, afin de l'adapter plus aisément à leurs besoins ou celui d’élèves dys.