Les exercices de l'Atelier des Outils Pour le Numérique

Un vu-mètre à intensité variable

Cet exercice est une évolution du vu-mètre que nous avons traité plus tôt.

Cette fois, l'objectif est de faire varier l'intensité de chaque LED du vu-mètre sur la partie de l'intervalle qu'elle représente. Par exemple, la première LED, au lieu de rester éteinte jusqu'à son seuil (qui était de 256 dans l'exercice précédent), verra son intensité varier graduellement de éteinte pour 0 jusqu'à complètement allumée pour des valeurs supérieures ou égales à 256.

En terme d'apprentissage, rien de bien nouveau côté Arduino. Par contre, c'est à l'algorithme général de résolution de ce problème auquel vous devez porter le plus d'attention.

Matériel nécessaire

Pour cet exercice vous devez disposer du matériel ci-dessous.

TypeQuantité
Platine Arduino1
Plaque à essais1
Fil de câblage9
Résistance de 330 Ω4
LED (couleurs variées)4
Potentiomètre1

Le montage à réaliser est le suivant :

Un vu-mètre.

Correction et commentaires

/**
 * Un vu-mètre à intensité variable
 */
#define POT A0

int potVal ;
int pas, sens ;

// chaque LED est branchée sur une sortie PWM
byte leds[4] = {3, 5, 6, 9} ;

int seuils[5] = {0, 250, 500, 750, 1000} ;
int correction[256] ;

void setup() {
  for (pas = 1 ; pas < 257 ; pas++) {
    pinMode(leds[pas], OUTPUT) ;
  }

  // On utilise la même correction que pour le signal en dents de scie
  for (pas = 1 ; pas < 257 ; pas++) {
    correction[256 - pas] = (int)(255 - 255 * log(pas) / log(256)) ;
  }
}

void loop() {
  potVal = analogRead(POT) ;

  if ( potVal <= seuils[1] ) {
    pas = map(potVal, seuils[0], seuils[1], 0, 255) ;
    analogWrite(leds[0], correction[pas]) ;
    analogWrite(leds[1], 0) ;
    analogWrite(leds[2], 0) ;
    analogWrite(leds[3], 0) ;
  } else if ( potVal <= seuils[2] ) {
    pas = map(potVal, seuils[1]+1, seuils[2], 0, 255) ;
    analogWrite(leds[0], correction[255]) ;
    analogWrite(leds[1], correction[pas]) ;
    analogWrite(leds[2], 0) ;
    analogWrite(leds[3], 0) ;
  } else if ( potVal <= seuils[3] ) {
    pas = map(potVal, seuils[2]+1, seuils[3], 0, 255) ;
    analogWrite(leds[0], correction[255]) ;
    analogWrite(leds[1], correction[255]) ;
    analogWrite(leds[2], correction[pas]) ;
    analogWrite(leds[3], 0) ;
  } else if ( potVal <= seuils[4] ) {
    pas = map(potVal, seuils[3]+1, seuils[4], 0, 255) ;
    analogWrite(leds[0], correction[255]) ;
    analogWrite(leds[1], correction[255]) ;
    analogWrite(leds[2], correction[255]) ;
    analogWrite(leds[3], correction[pas]) ;
  } else {
    analogWrite(leds[0], correction[255]) ;
    analogWrite(leds[1], correction[255]) ;
    analogWrite(leds[2], correction[255]) ;
    analogWrite(leds[3], correction[255]) ;
  }
}
				
Exemple de code pour réaliser un vu-mètre à intensité variable.

Ce programme étant une évolution du vu-mètre, il va lui ressembler fortement. Nous ajoutons simplement dans l'initialisation la correction qui a été vue pour le signal en dents de scies.

Nous en profitons pour utiliser deux tableaux pour simplifier l'écriture :

  1. un tableau pour stocker les pins sur lesquelles les LED sont branchées (ce sont des pins où le PWM est possible) ;
  2. un tableau pour stocker les valeurs des seuils associées à chaque LED.

La suite est globalement semblable, à cela près que nous ne pouvons plus réagir à une valeur « supérieure ou égale » au seuil. En effet, nous sommes à présent intéressés par toutes les valeurs inférieures au seuil. Il faut donc inverser les conditions.

De plus, il faut contrôler toutes les LED à chaque étape, pour chaque intervalle de notre vu-mètre. Pour chacun de ces intervalles, il y a une LED à piloter finement et les autres à allumer ou éteindre intégralement. Celle qui est pilotée finement doit recevoir une valeur comprise entre 0 et 255. Pour obtenir cette valeur, nous utilisons la fonction map() qui prend en intervalle de départ l'intervalle du vu-mètre affecté à la LED et en intervalle de sortie la plage [0;255].

Tout ça dans la boucle loop() permet à notre vu-mètre de fonctionner correctement.

Pour le besoin de l'exercice nous pilotons le vu-mètre au travers d'un potentiomètre, mais il est bien entendu possible de brancher n'importe quel dispositif analogique qui aurait des valeurs de sortie variant de 0 à 5 Volts. Un thermomètre par exemple ...