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

Faire varier l'intensité d'une LED

L'objectif de cet exercice est d'introduire la notion de PWM. C'est un moyen de simuler un mécanisme dont ne sont pas dotés nos Arduinos, la conversion numérique → analogique. En effet, ces petits micro-contrôleurs disposent d'un convertisseur analogique → numérique, mais pas du dispositif inverse.

Matériel nécessaire

Le matériel nécessaire est le même que pour l'exercice sur le clignotement :

TypeQuantité
Platine Arduino1
Plaque à essais1
Fil de câblage2
Résistance de 330 Ω1
LED (couleur au choix)1

Le montage à effectuer est celui de la figure ci-dessous :

Faire pulser une LED.

Correction et commentaires

/**
 * Faire pulser une LED
 */

#define LED 9

int i ;

void setup() {
  pinMode(LED, OUTPUT) ;
}

void loop() {
  for ( i=0 ; i<255 ; i++ ) {
    analogWrite(LED,i) ;
    delay(20) ;
  }
  for ( ; i>=0 ; i-- ) {
    analogWrite(LED,i) ;
    delay(20) ;
  }
}
Exemple de code pour faire varier l'intensité d'une LED.

Pour faire varier l'intensité d'une LED, il faut lui appliquer une tension qui soit dans la zone de sa courbe représentative où cette dernière commence à se "lever". Comme précisé en introduction de cet exercice, notre micro-contrôleur ne dispose pas de convertisseur numérique → analogique qui serait pourtant idéalement adapté à cette tâche. Il faut donc trouver une solution de remplacement. Celle-ci vient sous la forme d'une technique particulière que l'on peut voir comme une synthèse de signal analogique. C'est un peu léger de le nommer comme cela, mais dans notre cas, c'est pratiquement ce qui est fait. Cette technique se nomme PWM et permet de générer une pseudo valeur analogique sur 255 niveaux. C'est à dire, générer un voltage qui sera compris entre 0 V et 5 V par pas d'environ 20 mV. La fréquence de ce PWM est d'environ 20 kHz, ce qui donne au final une bonne illusion de signal analogique.

L'utilisation du PWM sur les platines Arduino (en fait, sur les micro-contrôleurs utilisés sur ces platines), ne peut se faire que sur certains ports numériques. Ce sont les ports dont le numéros est précédé d'un ~, à savoir, les ports 3, 5, 6, 9 , 10 et 11.

Une fois votre dispositif branché sur l'un de ces ports, vous pouvez utiliser la fonction analogWrite(port, N)port sera le numéro de port sur lequel vous voulez activer la fonctionnalité et N une valeur dans l'intervalle [0;255] correspondant au niveau du voltage de sortie désiré (N×5÷255).

Il suffit à présent de créer une boucle qui va faire varier son compteur de 0 à 255 et d'appeler à chaque tour, la fonction analogWrite(). Une seconde boucle suivra, qui fera décroitre le compteur de 255 à 0, pour éteindre doucement la LED. Nous ajoutons un petit délai entre chaque tour de boucle pour que l'effet ne soit pas trop rapide.

Le tout, mis dans le fonction loop() permettra d'obtenir un effet de pulse des plus convaincant.

Nous pouvons remarquer enfin, que la façon dont l'intensité varie n'est pas tout à fait linéaire. Pourtant, dans notre code, la variation de notre compteur est tout à faire linéraire. Le biais vient en fait de notre œil qui lui n'a pas une perception linéaire. Une solution pour résoudre ce problème est proposée dans la dernière partie de l'exercice suivant : Piloter la vitesse de clignotement d'une LED avec un potentiomètre.