Sommaire
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.
Attention : la déclaration LED1 dans le code correspond à LD2 sur la carte Nucléo.
#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_us(200000); // Attente de 200 ms = 200 000 us led = 0; // La LED est allumée wait_us(200000); // Attente de 200 ms = 200 000 us } }
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_us(200000); // Attente de 200 ms = 200 000 us } }
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.
Dans le cas des cartes Nucléo, la tension VDD est égale à 3,3V.
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}}$$
Tutoriel lié
- Deboguer son programme et utiliser l’affichage série
- Régler la luminosité d’une LED
- Piloter une LED de puissance
MInE Prototyper Prototyper avec Nucleo et MBED