Accueil > MICROPYTHON > MicroPython : Commande des sorties logiques (esp8266 & esp32)
lundi 20 avril 2020, par
Le firmware Micropython ne tient pas compte des noms des broches notées sur les cartes mais de la numérotation au niveau du microprocesseur (GPIO = General Purpose Input Output).
Brochage des cartes :
Les cartes Wemos D1 mini, NodeMCU ou esp32 Devkit sont en général équipées d’une led reliée à la broche GPIO2.
On va importer la bibliothèque qui permet de gérer les broches puis on crée un objet brocheLed en configurant la broche GPIO 2 en sortie.
Remarque : la led s’allume lorsque la broche 2 est à 0
>>> from machine import Pin >>> brocheLed = Pin(2,Pin.OUT)
Pour modifier l’état de sortie, on peut utiliser les méthodes on() et off() :
>>> brocheLed.on() >>> brocheLed.off()
On peut aussi utiliser la méthode value() :
>>> brocheLed.value(1) >>> brocheLed.value(0)
Pour cela, nous avons besoin d’utiliser la bibliothèque utime (ou time ) qui va nous fournir des temporisations.
Pour faire clignoter indéfiniment la led à une fréquence de 1hz, on aura l’algorithme suivant :
Tant que (1) :
Allumer Led broche 2
Attendre 500 ms
Eteindre Led broche 2
Attendre 500 ms
Fin Tant Que
Le module utime de micropython propose 3 temporisations :
instruction | rôle |
---|---|
utime.sleep(valeur) | Attendre valeur secondes |
utime.sleep_ms(valeur) | Attendre valeur millisecondes |
utime.sleep_us(valeur) | Attendre valeur microsecondes |
Le programme python sera le suivant :
from machine import Pin import utime brocheLed = Pin(2,Pin.OUT) while (True) : brocheLed.on() utime.sleep_ms(500) brocheLed.off() utime.sleep_ms(500)
On peut aussi utiliser la console REPL pour communiquer les informations (cependant, on va légèrement perturber le timing des tempos en prenant le temps de communiquer les infos sur la liaison série) :
from machine import Pin import utime brocheLed = Pin(2,Pin.OUT) while (True) : brocheLed.on() print("Led éteinte") utime.sleep_ms(500) brocheLed.off() print("Led allumée") utime.sleep_ms(500)
Le problème du programme précédent c’est que l’on bloque le fonctionnement du microprocesseur pendant les temporisations. On peut améliorer ce programme :
EtatLed ← False
start ← instant en ms
Tant que (1)
instant ← instant en ms
Si (instant - start) >= 500
EtatLed ← not (EtatLed)
Mettre broche GPIO à la valeur EtatLed
start ← instant
Fin Si
Fin Tant Que
Ce qui donne en python :
from machine import Pin import utime brocheLed = Pin(2,Pin.OUT) EtatLed = False start = utime.ticks_ms() while (True) : instant = utime.ticks_ms() if (instant - start) >= 500 : EtatLed = not(EtatLed) print("Etat led =",EtatLed) brocheLed.value(EtatLed) start = instant
La biblothèque utime permet de faire automatiquement la soustraction utime.ticks_diff(ticks1,ticks2) :
from machine import Pin import utime brocheLed = Pin(2,Pin.OUT) EtatLed = False start = utime.ticks_ms() while (True) : if utime.ticks_diff(utime.ticks_ms(),start) >= 500 : EtatLed = not(EtatLed) print("Etat led =",EtatLed) brocheLed.value(EtatLed) start = utime.ticks_ms()