💡 Entrées / Sorties numériques Arduino

Contrôlez LED, boutons et relais avec pinMode(), digitalWrite() et digitalRead()

Les broches numériques de l'Arduino Uno

L'Arduino Uno possède 14 broches numériques (D0 à D13). Chaque broche peut être configurée individuellement comme entrée (INPUT) ou sortie (OUTPUT). En sortie, une broche délivre soit 0V (LOW) soit 5V (HIGH). En entrée, elle lit l'état logique du signal appliqué (LOW si < 1.5V, HIGH si > 3V).

💡 Remarques importantes : Les broches D0 et D1 sont partagées avec la communication série (TX/RX). Évitez de les utiliser pour d'autres composants si vous utilisez Serial. Les broches marquées ~ (3, 5, 6, 9, 10, 11) supportent le PWM via analogWrite().

⚙️ pinMode() — Configurer une broche

Avant d'utiliser une broche, vous devez définir sa direction avec pinMode() dans la fonction setup() :

pinMode(13, OUTPUT);       // Broche 13 en SORTIE
pinMode(2, INPUT);          // Broche 2 en ENTRÉE
pinMode(4, INPUT_PULLUP);   // Broche 4 en ENTRÉE avec résistance pull-up interne

Les trois modes

✍️ digitalWrite() — Écrire sur une sortie

La fonction digitalWrite() met une broche de sortie à l'état haut (5V) ou bas (0V) :

digitalWrite(13, HIGH);  // Broche 13 = 5V → LED allumée
digitalWrite(13, LOW);   // Broche 13 = 0V → LED éteinte

Exemple complet : Clignotement LED externe

// LED externe sur broche 8 avec résistance 220Ω
const int LED_PIN = 8;

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

void loop() {
    digitalWrite(LED_PIN, HIGH);
    delay(500);
    digitalWrite(LED_PIN, LOW);
    delay(500);
}

La LED clignote à 1 Hz (500 ms allumée + 500 ms éteinte = 1 seconde de période).

📖 digitalRead() — Lire une entrée

La fonction digitalRead() lit l'état logique d'une broche configurée en entrée :

int etat = digitalRead(2);  // Lit l'état de la broche 2
// etat vaut HIGH (1) ou LOW (0)

Exemple : Bouton qui allume une LED

// Bouton sur broche 2 (INPUT_PULLUP), LED sur broche 13
const int BTN_PIN = 2;
const int LED_PIN = 13;

void setup() {
    pinMode(BTN_PIN, INPUT_PULLUP);  // Pull-up interne activé
    pinMode(LED_PIN, OUTPUT);
}

void loop() {
    if (digitalRead(BTN_PIN) == LOW) {  // Bouton pressé (logique inversée)
        digitalWrite(LED_PIN, HIGH);       // Allumer la LED
    } else {
        digitalWrite(LED_PIN, LOW);        // Éteindre la LED
    }
}

ℹ️ Logique inversée avec INPUT_PULLUP : Quand le bouton n'est pas pressé, la résistance pull-up interne maintient la broche à HIGH. Quand le bouton est pressé, il connecte la broche à GND → la broche passe à LOW. C'est pourquoi on teste == LOW pour détecter un appui.

🔧 Anti-rebond (Debounce)

Un bouton mécanique ne produit pas un signal propre. Quand vous appuyez, le contact rebondit mécaniquement pendant quelques millisecondes, générant plusieurs transitions rapides HIGH/LOW. C'est le phénomène d'anti-rebond (bounce).

Pour éviter les faux déclenchements, on implémente un debounce logiciel :

const int BTN = 2;
const int LED = 13;
bool ledState = false;
bool lastBtn = HIGH;
unsigned long lastDebounce = 0;
const int DEBOUNCE_DELAY = 50;  // 50 ms

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

void loop() {
    bool reading = digitalRead(BTN);

    if (reading != lastBtn) {
        lastDebounce = millis();
    }

    if ((millis() - lastDebounce) > DEBOUNCE_DELAY) {
        if (reading == LOW && lastBtn == HIGH) {
            ledState = !ledState;  // Toggle LED
            digitalWrite(LED, ledState);
        }
    }
    lastBtn = reading;
}

Ce code utilise millis() au lieu de delay(), ce qui est la méthode recommandée car elle ne bloque pas le programme.

⚡ Courant de sortie et limitations

Chaque broche GPIO de l'ATmega328P peut fournir un courant maximum de 40 mA (20 mA recommandé). Le courant total sur l'ensemble des broches ne doit pas dépasser 200 mA. Pour piloter des charges plus gourmandes (moteurs, relais puissants, rubans LED), utilisez un transistor (MOSFET ou NPN) ou un module driver (L298N, ULN2003).

Pour une LED standard, une résistance de 220Ω donne un courant d'environ 14 mA — parfaitement dans les limites.

📌 Comparaison avec les PIC

Si vous venez de nos tutoriels PIC, voici l'équivalence :

ArduinoPIC12F683Commentaire
pinMode(0, OUTPUT)TRISIO &= ~(1<<0)Configurer GP0 en sortie
digitalWrite(0, HIGH)GPIO |= (1<<0)Mettre GP0 à l'état haut
digitalRead(3)(GPIO >> 3) & 1Lire l'état de GP3

Arduino simplifie considérablement la syntaxe, mais en coulisses, le framework fait exactement les mêmes manipulations de registres.