Ceci est une ancienne révision du document !
MicroPython - Entrées, Sorties (GPIO)
[Mise à jour le : 19/5/2023] En cours de rédaction
- Ressources
- Lectures connexes
1. Généralités
« Dans un système à base de microcontrôleur, on appelle entrées-sorties les échanges d'informations entre le processeur et les périphériques qui lui sont associés. De la sorte, le système peut réagir à des modifications de son environnement, voire le contrôler. Elles sont parfois désignées par l'acronyme I/O, issu de l'anglais Input/Output ou encore E/S pour entrées/sorties. » Wikipédia
Pour éviter de faire référence à des valeurs électriques (tension ou intensité), on définit souvent l’état d’un signal numérique en utilisant la logique booléenne.
- true (« 1 » logique) correspondra par exemple à 5V ou 3,3V
- false (« 0 » logique) correspondra à 0V.
2. Entrées, sorties numériques
2.1 Sortie numérique
- Matériels : ESP32 Feather Huzzah ou Raspberry Pi Pico
2.1.1 Présentation
Une sortie numérique délivre très peu de puissance (quelques centaines de mW). Il n’est donc pas possible de la relier directement à un actionneur (moteur). Il est nécessaire de placer une interface de puissance (hacheur, relais) entre elle et l’actionneur à commander.
2.1.2 Exemples de code
- Ressources sur Micropython.org.
Exemple de code pour un Raspberry Pi Pico
- *.py
# Faire clignoter la led de la carte Raspberry Pi Pico # Bibliothèques à installer from machine import Pin import time # Configuration de la broche associée à la led de la carte led = Pin('LED',Pin.OUT) # 'LED' <=> 25 (GPIO25) while (True): led.on() time.sleep(0.5) # Attente 0,5s led.off() time.sleep(0.5)
- Ressources sur Micropython.org.
Exemple de code pour un ESP32 Feather Huzzah
- *.py
# Faire clignoter la led de la carte ESP32 # Bibliothèques à installer from machine import Pin import time # Configuration de la broche associée à la led de la carte led = Pin(13, Pin.OUT) while (True): led.on() time.sleep(1) # Attente 1s led.off() time.sleep(1)
2.2 Entrée numérique
2.2.1 Présentation
Une entrée numérique utilisée dans un programme ne doit pas être laissée “en l’air” (non connectée) car elle prendra alors un état logique aléatoirement et le comportement du programme deviendra imprévisible.
2.2.2 Exemples de code
- Ressources sur Micropython.org.
Exemple de code pour un Raspberry Pi Pico
- *.py
# Configuration (en entrée) des broches connectées à deux boutons-poussoirs # Bibliothèques à installer from machine import Pin # Configuration (en entrée) des broches connectées à deux boutons-poussoirs button_min = Pin(20, Pin.IN) button_hr = Pin(21, Pin.IN) ...
- Ressources sur Micropython.org.
Exemple de code pour un ESP32 Feather Huzzah
- *.py
# Configuration (en entrée) des broches connectées à deux boutons-poussoirs button_min = Pin(25, Pin.IN) button_hr = Pin(26, Pin.IN) ...
2.3 Interruption
2.3.1 Présentation
Une interruption est un arrêt temporaire de l'exécution normale d'un programme par le processeur afin d'exécuter un autre programme (appelé service d'interruption).
L’interruption est provoquée par une cause externe (action sur un bouton-poussoir, mesure réalisée par un capteur, horloge temps réel, etc.).
On utilise les interruptions afin de permettre des communications non bloquantes avec des périphériques externes.
Une interruption tient compte de l’état logique présent sur une broche. Couramment, on la déclenchera sur le front montant, le front descendant, ou chacun des fronts d’un signal logique.
2.3.2 Configuration
La configuration en entrée de la broche destinée à recevoir un évènement est identique à celle du paragraphe précédent.
2.3.3 Evènement et gestionnaire d'évènement
Un évènement est attaché à un gestionnaire (service d'interruption) .
2.3.4 Exemples de code
- Ressource : Quick reference for ESP32, GPIO Pins, External interrupts sur Micropython.org.
Exemple de code pour un ESP32 Feather Huzzah
- *.py
# Code partiel du programme HORLOGE # Réglage de l'heure à la mise sous tension time_offset=12*3600+0*60+0 # hh+mm+ss # Routines de service d'interruption (ISR) def handle_interrupt_min(pin): global time_offset time_offset+=60 time.sleep(.2) def handle_interrupt_hr(pin): global time_offset time_offset+=3600 time.sleep(.2) # Réglage des minutes # Ajout de 60s à l'heure initiale button_min = Pin(25, Pin.IN) # Gestionnaire d'interruption button_min.irq(trigger=Pin.IRQ_RISING,handler=handle_interrupt_min) # Réglage des heures # Ajout de 3600s à l'heure initiale button_hr = Pin(26, Pin.IN) # Gestionnaire d'interruption button_hr.irq(trigger=Pin.IRQ_RISING,handler=handle_interrupt_hr) {{ :python:micropython:materiel:thonny.png?nolink&70|}}
3. Entrées analogiques
- Ressource
- Quick reference for the RP2, Pins and GPIO sur Micropython.org., potentiomètre 10kOhm.
3.1 Présentation
- Ressource
- Un signal analogique : petits rappels sur le site Zeste de savoir.
3.2 Exemples de code
- Ressource
- ADC (analog to digital conversion) sur Micropython.org.
Exemple de code pour un Raspberry Pi Pico
- Ressource
- ADC (analog to digital conversion) sur Micropython.org.
Exemple de code pour un ESP32 Feather Huzzah
- *.py
# ADC accessibles en Python sur la carte ESP32 Feather Huzzah : # ADC:GPIO # A2 : 34 # A3 : 39 # A4 : 36 # A7 : 32 # A9 : 33 from machine import ADC, Pin # Le potentiomètre 10kOhm est connecté à l'entrée analogique A2 de l'ESP32. # Configuration adc = ADC(Pin(34)) # Sur une entrée analogique, la tension doit # être comprise entre 0 - 3,3V (3,6V max !) adc.atten(ADC.ATTN_11DB) # voir doc # Mesure value = adc.read() print(value) # affichage dans la console