Entrées / Sorties Numériques

La carte Arduino Uno permet d’interagir avec son environnement et ainsi piloter des systèmes comportant des capteurs (analogiques ou numériques) et des actionneurs. Nous allons voir dans cette section comment la carte peut interagir avec des systèmes numériques.

Entrées numériques

Définir une broche en entrée numérique

Pour configurer une broche en entrée numérique, il faut utiliser la ligne suivante :

pinMode(int [broche], INPUT);

Le paramètre broche correspond au numéro de la broche que l’on souhaite configurer en entrée numérique.

Cet exemple permettra de mettre la broche 5 en entrée.

int bp = 5;
pinMode(bp, INPUT);

Lire l’état d’une entrée numérique

Pour lire l’état (0 ou 1) d’une entrée numérique, on peut utiliser le code suivant :

int a;
a = digitalRead(int [broche]);

Le paramètre broche correspond au numéro de la broche d’entrée dont on souhaite lire l’état.

Cet exemple permettra de vérifier l’état de la broche 5, si celle-ci est paramétrée en entrée et d’afficher sur le moniteur série l’état de cette broche.

int k;
k = digitalRead(5);
if(k == 1){Serial.println("Broche 5 - HIGH");}
else{Serial.println("Broche 5 - LOW");}

Astuce

Si ce type d’appel est inclus dans la fonction loop(), la lecture de l’entrée se fera à chaque passage dans cette fonction, dépendant du temps d’exécution de cette fonction.

Détecter un front (montant ou descendant)

Détection d’un niveau

Détection d’un front

Code d’exemple

int new_bp = 0, old_bp = 0;

void setup(){
   pinMode(5, INPUT);
   ...
}
void loop(){
   ...

   new_bp = digitalRead(5);
   if((new_bp != old_bp) && (new_bp == 1)){
      [ACTIONS A FAIRE SUR FRONT MONTANT]
   }
   old_bp = new_bp;
   
   ...
}  

Sorties numériques

Définir une broche en sortie numérique

Pour configurer une broche en entrée numérique, il faut utiliser la ligne suivante :

pinMode(int [broche], OUTPUT);

Le paramètre broche correspond au numéro de la broche que l’on souhaite configurer en sortie numérique.

Cet exemple permettra de mettre la broche 13 en sortie.

int led = 13;
pinMode(led, OUTPUT);

Remarque : Cette sortie est reliée à une LED déjà présente sur la carte. Elle permet de vérifier le bon fonctionnement de la carte et de la liaison entre le PC et la carte Arduino.

Mettre une broche au niveau haut ou au niveau bas

Pour mettre une broche configurée en sortie numérique au niveau haut, il faut utiliser la ligne suivante :

digitalWrite(int [broche], HIGH);

Pour mettre une broche configurée en sortie numérique au niveau bas, il faut utiliser la ligne suivante :

digitalWrite(int [broche], LOW);

Par exemple, pour mettre la sortie 13 à l’état haut pendant 1 seconde puis à l’état bas 1 seconde, on pourra écrire :

digitalWrite(int [broche], HIGH);
delay(1000);
digitalWrite(int [broche], LOW);
delay(1000);

Remarque : la fonction delay(int [ms]) permet d’attendre un temps défini en millisecondes en paramètre. Cette fonction est bloquante. Elle ne permet pas d’exécuter une autre partie du programme en parallèle de l’attente.

Utiliser la LED intégré à la carte

Une LED est déjà précablée sur la carte Arduino Uno. Elle est reliée à la broche 13 de la carte.

Ainsi, il est possible de tester la carte de développement à l’aide du programme “Blink” qui se trouve dans les exemples “Basics” du logiciel :

// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);     
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}

Ce programme active la broche 13 en sortie (fonction SETUP) puis allume la LED connectée sur la broche 13, attend pendant 1000 ms, éteint cette même LED, attend pendant 1000 ms, etc.

Utiliser une sortie externe / Exemple d’une LED

Il est possible également de cabler un composant externe, ici une LED. Le schéma de câblage est le suivant (schéma réalisé avec le logiciel Fritzing) :

Dans cette exemple, la LED rouge est cablée sur la broche 10 (cable orange). La LED est un composant polarisée, la cathode doit être dirigée vers la masse (fil noir relié à la broche GND – Ground – Masse). Une résistance est insérée en série avec la LED afin de limiter le courant passant par cette dernière, afin de ne pas la détruire.

Inverser la valeur d’une sortie

Il est possible de faire inverser la valeur d’une sortie par l’utilisation de ce code :

void setup(){
   pinMode(13, OUTPUT);
   ...
}
void loop(){
   int led_val = digitalRead(13);
   if(led_val == 1){
       digitalWrite(13, LOW);
   }
   else{
       digitalWrite(13, HIGH);
   }
   delay(100);
}  

Dans cet exemple, on fera clignoter la LED connectée sur la broche 13 à intervalle régulier (ici 200 ms de période).
On récupère la valeur de la sortie 13 dans la variable led_val. On teste ensuite cette valeur. Si elle vaut 1, on met la sortie 13 à O et inversement.
Le délai permet simplement de voir clignoter la LED. Que se passe-t-il si on l’enlève ?

Débogage / Temps d’exécution

On peut utiliser une sortie numérique pour connaître l’état d’avancement d’un programme ou pour déboguer son code, en positionnant la ligne suivante au bon endroit dans le code (si on souhaite utiliser la broche 12) :

digitalWrite(12, HIGH);

Avec cette méthode, on peut également connaître le temps d’exécution de son code ou d’un bloc d’instructions.

void loop(){
   bloc1
   digitalWrite(12, HIGH);
   bloc2 dont on veut connaitre le temps d'execution
   digitalWrite(12, LOW);
   bloc3
}

On plaçant un oscilloscope sur la broche 12, on verra alors régulièrement cette broche passée à l’état haut puis revenir à l’état bas. La mesure de la durée de l’état haut permet de connaître le temps d’exécution du bloc d’instructions noté bloc2.

Si on veut une mesure précise de ce temps, il faut également au préalable avoir mesuré le temps d’exécution de la mise à 1 de la broche 12 et de sa mise à 0. Ceci se fait par le code suivant :

void loop(){
   bloc1
   digitalWrite(12, HIGH);
   digitalWrite(12, LOW);
   bloc3
}

Le temps haut mesuré ici sera à retrancher du temps mesuré dans l’exemple d’avant.

Arduino – Entrées / Sorties Numériques