La fonction digitalRead() sur Arduino : lecture des entrées numériques
Contraitement à la fonction digitalWrite() qui nous permet d'écrire un état logique sur une sortie numérique, avec Arduino, la fonction digitalRead() vous permet sur une carte Arduino de lire l’état logique d’une sortie numérique soit :
- l'état HIGH pour la valeur de la tension reçue de 5V ou 3.3V sur la broche, ou
- l'état LOW pour la valeur de la tension reçue de 0V sur la broche.
Autrement, la boche entrée/sortie est configurée en une entrée numérique, elle ne fournit pas de courant mais elle mesure uniquement la tension reçue. Ainsi, cette fonction transforme une information électrique en une valeur numérique exploitable par notre programme Arduino.
En robotique, cette fonction est utilisée pour détecter une action d’un bouton-poussoir, lire l’état d’un interrupteur ou tout autre signal électrique envoyé par un capteur numérique externe. Pour pouvoir lire l'état logique, soit la valeur binaire, sur l'éntrée numérique concernée, cette entrée doit être configurée autant qu'une entrée numérique à l’aide de la fonction pinMode() dans la section setup().
Syntaxe de la fonction readWrite()
Comme nous vous l'avons expliqué ci-dessous, cette fonction permet de lire l'état logique d'une entrée numérique de notre carte. Pour l'écrire dans notre programme, il est nécessaire de respecter une syntaxe exacte, d'après le framework Arduino, et ce-ci est comme suit :
digitalRead(pin);
tels que le seul paramètre à indiquer pour cette fonction est :
- pin : numéro du port, appelée aussi broche, pin ou entrée numérique à lire.
Le résultat lu à partir de cette fonction nous indique l'état logique à l'entrée de cette broche numérique. Ce résultat ne peut prendre que deux valeurs possibles tels que :
- LOW : l'entrée numérique ne reçoit aucun signal électrique ; soit donc la valeur de 0V (absence totale de tension à notre entrée), ce qui correspond à la valeur 0 logique, et,
- HIGH : lorqu'une valeur de 3.3V ou 5V est reçue à l'entrée de notre broche (une tension est détectée à cette entrée), ce qui définit le niveau logique haut, soit donc la valeur logique 1.
Il est à noter que cette fonction ne fonctionne que si la broche a été configurée en mode INPUT à travers la fonction pinMode().
A ne pas faire
Lorsique nous utilisons cette fonction, nous devons faire attention à ne pas faire certaines erreurs, quand on débute dans le codage des solutions Aruino, dont les plus répondues :
La entrée n'est pas configurée
Si le mode de l'entrée/sortie de notre carte n’est pas configuré à une sortie à l’aide de la fonction pinMode() dans la partie setup(), le programme ne sera pas conforme à ce que nous attendons et il ne fonctionnera pas. Par défaut, les entrées/sorties E/S d'une carte Arduino à base d'un microcontrôleur ATmega328P sont prédéfinies à entrée (appelées aussi INPUT d'après le framework Arduino) dès que le microcontrôleur fonctionne.
Ainsi, si la broche n'est pas définie à une entrée, le code ci-dessous peut ne pas fonctionner correctement et reste incomplet :
void setup() {
// placez ici votre code d'initialisation, à exécuter une seule fois.
}
void loop() {
int vbin = digitalRead(8);
}
Pour compléter ce code correctement, il est recommendé de déclarer la broche 8 à une entrée dans la fonction setup() comme suit :
void setup() {
pinMode(8, INPUT); // définir la broche 8 à une entrée numérique
}
La sortie est mal configurée
Lorsque vous déclarez une E/S au sein de la fonction loop(), son exécution ralentira l'exécution de votre programme. Définir la sortie à une INPUT sera donc répété infiniment. L'exemple ci-dessous est donc à éviter :
int vbin;
void setup() {
// placez ici votre code d'initialisation, à exécuter une seule fois.
}
void loop() {
pinMode(9, INPUT); // Cette ligne doit être déclarée dans la fonction setup()
vbin = digitalRead(8);
}
Nous vous rappelons donc que la bonne pratique est de placer la fonction pinMode() à l'intérieur de la fonction setup().
Exemples pratiques avec la fonction digitalRead()
Lecture simple d’un bouton
Pour lire la valeur logique d'une entrée E/S de notre carte programmable Arduino, il est nécessaire de définir l'entrée à une INPUT à l'intérieur de la fonction setup() puis lire la valeur du port via la fonction digitalRead(). Le code ci-dessous nous présente un exemple :
const int entryPin = 9;
void setup()
{
pinMode(entryPin, INPUT);
}
void loop()
{
int state = digitalRead(entryPin);
}
Dans ce programme, la variable "state" prend la valeur HIGH ou LOW en fonction de l’état logique reçu du bouton via le entrée/sortie numéro 9. Et pour lire plusieurs entrées, nous pouvons faire évoluer le précedent code comme suit :
const int entryPin1 = 9;
const int entryPin2 = 10;
void setup()
{
pinMode(entryPin1, INPUT);
pinMode(entryPin2, INPUT);
}
void loop()
{
int state1 = digitalRead(entryPin1);
int state2 = digitalRead(entryPin2);
}
Allumer une LED avec un bouton
Pour piloter une diode LED à partir d'un bouton-poussoir, il nous est nécessaire de lire la valeur logique du bouton pour l'allumer ou l'éteindre en lisant la valeur de l'entrée numérique à l'aide de la fonction digitalRead() pour allumer la diode en envoyant la valeur logique HIGH via la fonction digitalWrite(). Le code ci-dessous nous présente un code type :
int LedPin = 13;
int entryPin = 8;
int vbin = 0;
void setup() {
pinMode(LedPin, OUTPUT);
pinMode(entryPin, INPUT);
}
void loop() {
vbin = digitalRead(entryPin);
digitalWrite(LedPin, vbin);
}
Ainsi, ce programme permet d'allumer la diode LED tant que le bouton poussoir est appuyé.
Protéger son entrée contre les variations rapides
Problème des entrées flottantes
Lorsque vous utilisez un bouton poussoir pour écrire une valeur logique dans un système numérique ou directement vers une entrée Arduino, il est nécessaire de protéger le système contre les variations rapides. Afin de garantir un état logique stable et surtout assurer la fiabilité de vos valeurs mesurées à l'entrée de votre carte, il est nécessaire d'ajouter une résistance de pull-up, qui vous permet de maintenir l’entrée à un niveau logique haut lorsque aucun signal ne la force à un autre état. Le montage ci-dessous est une solution :

Pour ce phénomère, Arduino a intégrer une solution pour stabiliser les entrées en ajoutant une résistance interne très pratique que vous pouvez l'activer logiciellement à la demande afin d'éviter les valeurs instables appelées entrées flottantes.
Il est à noter également que cette résistance est utile pour tous sortes de capteurs que vous installez dans vos conceptions et que vous connectez aux différentes broches numériques.
Activation de la résistance pull-up
Pour éliminer toute variation rapide possible, vous pouvez activer la résistance interne de l'entrée numérique de votre carte. Cette résistance intégrée de rappel nous permet de figer l'état d'une entrée numérique lorsque elle n'est pas reliée ainsi élimer toute oscillation reçue indésirables. Pour cela, la solution est très simple et se présente comme suit :
pinMode(2, INPUT_PULLUP);
Comme vous le constatez, les cartes Arduino propose de substituer le paramètre INPUT par le paramètre INPUT_PULLUP pour activer une résistance interne lors de la déclaration du port comme une entrée numérique. Ce qui permet de réaliser :
- la connection de la broche en interne à la valeur HIGH, et
- relier le bouton à la broche à la valeur LOW lorsqu’il est pressé.
Exemple pratique
Pour mieux comprendre comment fonctionne ce paramètre, nous vous proposons l'exemple ci-dessous qui vous permet de réaliser la fonction NON logique telle que :
- le bouton poussoir non activé, la diode LED s'allume,
- le bouton poussoir est appuyé, la diode LED s'éteint.
Ce qui nous permet de réaliser la table de vérité ci-dessous :
| A (bouton poussoir) | S (état de la diode LED) |
| 0 | 1 |
| 1 | 0 |
Regardons maintenant le code que nous pouvons écrire pour réaliser cette fonction ci-dessous :
const int btn = 8;
const int led = 13;
void setup() {
pinMode(btn, INPUT_PULLUP);
pinMode(led, OUTPUT);
}
void loop() {
if (digitalRead(btn) == HIGH)
{
digitalWrite(led, LOW);
}
else
{
digitalWrite(led, HIGH);
}
}
Les conditions avec la fonction digitalRead()
Comme vous l'avez constaté, la fonction digitalRead() a été utilisée dans une structure conditionnelle. Pour tester l'état de l'entrée numérique, soit elle est à LOW ou à HIGH, un test par rapport à la valeur reçue est requis. Par exemple, si vous souhaitez tester que l'entrée 7 est égale à la valeur logique 1, nous pouvons écrire le code ci-dessous :
if (digitalRead(7) == HIGH)
{
// action à réaliser
}
Comme nous le constatons, si la borche 7 de la carte reçoit la valeur logique 1, la condition est valide et l'action est ensuite exécutée.
Les bonnes pratiques
Et pour conclure, nous vous listons ci-dessous quelques bonnes pratiques essentielles afin de les appliquer dans vos prochaines activités et conceptions :
- il est obligatoire de configurer les entrées dans setup(),
- protégez vos entrées en mettant en place le montage de la résistance pull-up,
- sinon utilisez le paramètre INPUT_PULLUP avec digitalRead() si vous utilisez des boutons simples,
- stockez la valeur à lire dans une variable correctement nommée, et,
- utiliser des structures conditionnelles pour exploiter la lecture de vos entrées.
Voir aussi
Pour renforcer vos connaissances et améliorer vos capacités en programmation Arduino, nous vous invitons à consulter les autres cours que nous avons publiés :
- setup() : la fonction d’initialisation exécutée une seule fois au démarrage d'un programme Arduino,
- loop() : la fonction principale exécutée en boucle et de manière répétitive lors de l'exécution d'un programme Arduino, et,
- pinMode() : la fonction principale pour configurer le mode de fonctionnement d’une broche numérique; soit en mode INPUT, OUTPUT ou INPUT_PULLUP.
- digitalWrite() : pour écrire un état logique LOW ou HIGH vers une sortie numérique (appelée aussi broche ou pin).
Référence
Pour approfondir les notions abordées dans ce cours et accéder à des informations complémentaires, nous vous invitons à consulter le site officiel d’Arduino, accessible via le lien ci-dessous :