Comment piloter une LED ?

NIVEAU 1 – Notion obligatoire pour la suite

Objectifs

  • Utiliser une sortie numérique pour piloter un composant externe
  • Câbler une LED pour afficher une information binaire

Pré-requis

Sorties numériques

Bon, c’est bien beau tout ça, mais comment spécifier dans le compilateur que je veux utiliser telle broche en sortie sur le microcontrôleur ?

Rappel

La tension d’alimentation de la carte (via la prise USB) et donc du microcontroleur est de 3.3V. On retrouve cette alimentation sur le connecteur Arduino : entre la broche notée GND (masse) et la broche notée 3V3.

Une sortie numérique permet d’imposer un potentiel numérique (‘0’=0V ou ‘1’=3.3V) provenant de l’intérieur du composant vers l’extérieur.

Déclaration

L’ensemble des classes et des fonctions permettant de réaliser des opérations sur les entrées/sorties de la carte se trouvent dans la bibliothèque “mbed.h (ou “mbed-os.h“). Il est donc indispensable d’avoir au préalable inclut cette bibliothèque :

#include "mbed.h"

La première étape est la déclaration au compilateur de cette broche en sortie. Il faut la placer après la déclaration des ressources externes (bibliothèques) et avant toute définition de fonction (voir tutoriel Tester ma première application sur Nucléo – Code d’exemple /* Déclaration des entrées/sorties */).

DigitalOut myled(D13);

Dans l’exemple précédent, on configure la broche D13 (du connecteur Arduino) en sortie numérique (ou digital en anglais). Dans ce code, il y a trois notions importantes :

  • DigitalOut‘, la classe qui définit le type de la broche, ici une sortie numérique
  • myled‘, le nom de la variable qui va être associée au port donné dans les parenthèses
  • D13‘, le nom de la broche que l’on va associer sur le composant

Cette déclaration est correcte, mais présente un inconvénient : elle ne donne pas de valeur initiale à la sortie. Donc au début du programme, la sortie myled peut aussi bien être à ‘1’ qu’à ‘0’. Pour éviter cela, il est intéressant de déclarer la valeur de la sortie de cette manière :

DigitalOut myled(D13,1);

Le second paramètre du constructeur de la classe DigitalOut permet de spécifier si la broche doit être à 0 ou à 1. Dans l’exemple précédent, la sortie D13 sera mise à 1 à l’initialisation du composant.

Utilisation

L’intérêt d’utiliser une sortie numérique est de pouvoir imposer un potentiel vers l’extérieur à l’aide de son programme. Par la suite, ce potentiel pourra devenir des informations utiles à transmettre.

Pour pouvoir utiliser les sorties déclarées précédemment sur la carte, on passe par les variables qu’on a associé à chacune de ces sorties.

Par exemple, on peut utiliser le code suivant :

myled = 1;   // POUR FORCER LE POTENTIEL A 3.3 V
myled = 0;   // POUR FORCER LE POTENTIEL A 0 V

Exemple

Voici un exemple un peu plus complet d’utilisation d’une sortie numérique.

#include "mbed.h"

DigitalOut led(LED1); // Déclaration de la led comme sortie numérique

int main() { 
  while(1) {
    led = 1;    // La LED est allumée
    wait(0.2);  // Attente de 200 ms
    led = 0;    // La LED est allumée
    wait(0.2);  // Attente de 200 ms
  }
}

Remarque :
Il est possible d’écrire le même code de façon beaucoup plus compacte.
Pour cela il suffit de remarquer que la LED a toujours un état (‘0’ ou ‘1’) qui est le contraire de celui d’avant. Cela se transcrit en C par la ligne 8 du code ci-dessous.

#include "mbed.h"

DigitalOut led(LED1);

int main()
{
    while(1) {
        led = !led;
        wait(0.2);
    }
}

Connexion d’une LED

Il est également possible de déclarer des broches des différents connecteurs de la carte en sortie et de les relier à des composants externes. Nous allons voir ici comment connecter une LED à cette carte sur la broche D10 par exemple de la carte.

Schéma de cablage

Pour cela, nous allons utiliser l’un des schémas suivants :

Rappel : les LEDs standard de 5 mm de diamètre (toutes les couleurs) ont des courants directs admissibles de l’ordre de 30 mA.

Calcul de la résistance de protection

Lorsqu’elle est passante, une diode se comporte comme une source de tension quasi-parfaite. La tension à ses bornes est alors égale à la tension seuil (notée \(V_{seuil}\)). Cette donnée intrinsèque aux LEDs est donnée par le constructeur.

Une LED est une diode qui, en plus, émet des photons lorsqu’elle est parcourue par un courant dans son sens direct. Pour qu’une LED soit allumée (i.e. passante), il faut que la tension à ses bornes soit supérieure à la tension seuil. Mais dans ce cas, il n’y a plus de limitation en courant (source de tension). Or les diodes ont des courants maximaux admissibles (notés souvent \(I_{FMAX}\), F pour forward ou direct) Il est donc indispensable de placer dans la branche de la diode une résistance de protection (ici nommée \(R_{LED}\)).

La relation qui va nous servir est la loi d’Ohms aux bornes de la résistance \(R_{LED}\) (cas du montage 1) :

  • lorsque la LED est bloquée, la tension présente aux bornes de cette résistance est 0V. Il n’y a pas passage de courant.
  • lorsque la LED est passante, on a vu précédemment que la tension à ses bornes était la tension seuil (environ 2~V pour une LED rouge). Ainsi, la tension restante aux bornes de la résistance est de \(V_{OUT} – V_{seuil}\) (où \(V_{OUT}\) est la tension de sortie de la carte)

On sait également par la loi d’Ohms, que la tension aux bornes d’une résistance est égale à \(U_{R} = R \cdot I\).

Ainsi, il est possible de calculer la résistance \(R_{LED}\) minimale à placer dans le circuit par la relation suivante :
$$R_{LED} = \frac{V_{OUT} – V_{seuil}}{I_{FMAX}}$$

Connexion d’un bandeau de LEDs classique (12V)

Principe de fonctionnement

Les bandeaux de LED sont constitués de LEDs trichromes dont on peut séparément contrôler le rouge, le vert et le bleu. Ces bandeaux doivent être alimentés sous une tension de 12V et consomment, à pleine puissance, 7W/m (pour des versions trichromes – il existe aussi des bandeaux monochromes).

Elles sont conçues selon le schéma suivant. Les résistances de limitation du courant sont déjà intégrées au bandeau.

Câblage

La tension des cartes Nucléo est de 3.3V. Il est donc impossible d’alimenter chacune des voies de ces bandeaux sans ajouter un étage de puissance.
Cet étage est constitué d’un transistor permettant d’adapter le niveau de tension mais également d’amplifier le courant.

Ce type de transistor (appelé MOSFET) est commandé en tension. Lorsqu’une tension est appliquée entre les broches G (grille) et S (source), il y a passage de courant possible entre les broches D (Drain) et S (Source). Lorsque cette tension est nulle, il n’y a pas de courant qui passe entre ces broches. On parle alors de commutation du transistor qui se comporte alors comme un interrupteur commandé en tension.

Il faudra faire attention à prendre un transistor dont la tension maximale \(V_{DS}\) est supérieure à la tension d’alimentation du bandeau et un courant maximal \(I_{D}\) (courant transitant dans le bandeau) supérieur au courant maximal consommé par chacune des voies du bandeau. Il faut également que la tension minimale de commande \(V_{GS}\) soit inférieure à la tension de sortie des cartes Nucléo (ici 3.3V). On pourra par exemple s’intéresser aux transistors BS170 ou IRL540.

Tutoriel lié

MInE Prototyper Prototyper avec Nucleo et MBED

Nucleo – Piloter une LED