Contrôler les pins GPIO

Les fonctions à utiliser sont les mêmes qu’avec une Arduino. On utilise donc la fonction pinMode() pour configurer un pin en entrée ou en sortie numérique, la fonction digitalWrite() pour imposer une tension de 0V ou 3.3V en sortie et la fonction digitalRead() pour lire un niveau logique (soit 0V ou 3.3V) en entrée.

Note

Les numéros des pins sont ceux indiqués dans l’encart gris « GPIO » sur le pinout de la carte. Même s’il existe une correspondance entre le numéro des pins GPIO de l’ESP32 et ceux habituellement utilisés sur l’Arduino, il est préférable pour éviter de s’emmêler les pinceaux de ne pas les utiliser et d’utiliser exclusivement le numéro des pins natif de l’ESP32. Il faut donc éviter d’utiliser A0, MOSI, SCK, SDA …

../../_images/full_pinout_Wroom_rev21.png

Pinout de la carte uPesy ESP32 Wroom Devkit

Configuration des pins en entrée ou en sortie

  • Configuration du pin GPIO2 en sortie:

    pinMode(2, OUTPUT);
    
  • Configuration du pin GPIO15 en entrée:

    pinMode(15, INPUT);
    

Rappel sur les résistances pullup et pulldown :

Si l’on mesure une tension d’un pin qui n’est relié ni à la masse ni à une tension non nulle, alors la valeur mesurée est aléatoire. Cela est dû au bruit électrique généré par plusieurs facteurs (le fil se comporte notamment comme une antenne). L’exemple le plus concret est lorsque l’on utilise un bouton poussoir.

Deux méthodes permettent d’éliminer le bruit et d’avoir des mesures fiables :
  • Résistance Pullup:
    ../../_images/boutonPullUp.png

    Utilisation d’une résistance pullup avec un bouton poussoir

    Ce circuit permet de n’avoir que 2 tensions possibles : 0V quand on appuie sur le bouton sinon +3.3V

    • Quand l’interrupteur est ouvert (bouton relaché), le +3.3V nourrit le pin de l’ESP32, la valeur mesurée du pin donnera HIGH (ou 1).

    • Lorsque l’interrupteur est fermé (bouton pressé), le +3.3V et le pin sont absorbés par la masse, la mesure du pin donnera LOW (ou 0).

  • Résistance Pulldown:
    ../../_images/boutonPullDown.png

    Utilisation d’une résistance pulldown avec un bouton poussoir

    Ce circuit permet de n’avoir que 2 tensions possibles : +3.3V quand on appuie sur le bouton sinon 0V

    • Si le bouton poussoir est pressé, le courant va du +3.3V au pin de l’ESP32. Il ne prendra pas le chemin de la masse car le courant circule toujours par le chemin le moins résistif. Le pin de l’ESP32 recevra du +3.3V et indiquera HIGH (ou 1).

    • Si le bouton poussoir est laché, le circuit est ouvert. Le très faible courant résiduel sera absorbé par la masse, le pin sera donc bien en LOW (ou 0).

Tous les pins GPIO (sauf les pins GPIO36, GPIO39, GPIO34, GPIO35) ont ces 2 circuits « en miniature », en interne dans l’ESP32.

  • Configuration du pin GPIO15 en entrée avec la résistance pullup interne :

    pinMode(15, INPUT_PULLUP);
    

Note

Contrairement à l’Arduino, sur les ESP32 il y a des résistances pulldown internes en plus.

  • Configuration du pin GPIO15 en entrée avec la résistance pulldown interne :

    pinMode(15, INPUT_PULLDOWN);
    

Imposer ou lire une tension

  • Pour imposer une tension de 3.3V en sortie du pin 2 de l’ESP32 :

    pinMode(2, OUTPUT); //Il faut déclarer le pin en sortie
    digitalWrite(2, HIGH);
    

Note

La tension en sortie des pins est de 3.3V (et non pas de 5V comme sur Arduino)

  • Pour lire une tension d’un niveau logique de 0V ou 3.3V en entrée du pin 15 de l’ESP32 :

    pinMode(15, INPUT); //Il faut déclarer le pin en entrée
    digitalRead(15);
    

Mini Projet

Pour montrer comment utiliser les entrées / sorties numériques de l’ESP32, nous allons faire un projet très simple qui allume la led lorsque l’on appuie sur un bouton.

../../_images/led_pushbutton.png

Descriptif du projet

Schéma électrique

On va utiliser les résistances pullup internes pour simplifier le schéma électrique

../../_images/projet0_circuit.png

Circuit électrique

../../_images/mini_projet_0.jpg

Essayez d’écrire le programme par vous-même !

Solution

const int buttonPin = 32;
const int ledPin =  23;

// Etat du bouton poussoir
int buttonState = 0;

void setup() {
    Serial.begin(115200);

    //Configuration du pin en entrée pullup
    pinMode(buttonPin, INPUT_PULLUP);
    pinMode(ledPin, OUTPUT);
}

void loop() {

    buttonState = digitalRead(buttonPin);
    Serial.println(buttonState);

    if (buttonState == LOW) {
        // Allume la led
        digitalWrite(ledPin, HIGH);
    } else {
        // Eteins la led
        digitalWrite(ledPin, LOW);
    }
}