Bases utilisation GPIO avec les ESP
GPIO
Il existe une LED onboard sur la GPIO 2 :
>>> from machine import Pin
>>> led=Pin(2,Pin.OUT)
>>> led.on()
>>> led.off()
Sur une brohce externe, çà donne :
from machine import Timer, Pin
led=Pin(15, Pin.OUT)
led.on()
led.offf()
PWM
from machine import PWM
pwm=PWM(Pin(15))
pwm.freq(1000)
pwm.duty(1000) # 0-1023
pwm.duty(100)
ADC
https://docs.micropython.org/en/latest/esp32/quickref.html#adc-analog-to-digital-conversion
La mesure analogique est disponible sur les broches 32 à 39 avec MicroPython (noté que l'ESP fournit bien plus de broches ADC que çà...), mais 8 broches ADC, c'est déjà pas mal. Les broches sont en 12 bits (par défaut) configurables. La mesure est renvoyée sur une échelle 0-4095 (=12 bits).
Point particulier : les broches disposent d'un atténuateur / amplificateur de niveau de tension. Par défaut, à 0dB, la mesure se fait sur 0-1V (et pas 3.3V !!). Pour avoir l'échelle en 3.3V, il faut utiliser l'amplification 11dB.
Le constructeur ADC se base sur une broche Pin(xx) où xx est le numéro de la broche GPxx utilisée.
>>> from machine import ADC, Pin
>>> sensor=ADC(Pin(32))
>>> sensor.read() # echelle 0-1v par defaut
0
>>> sensor.read()
3919
>>> sensor.atten(ADC.ATTN_11DB) # pour echelle 0-3.3V
>>> sensor.read()
442
>>> sensor.read()
4095
Note
L'ESP 32 disposent de 2 modules ESP 32, ADC1 et ADC2. Si le wifi est utilisé, alors ADC2 n'est pas utilisable. C'est pourquoi Micropython n'implémente pas ADC2 par défaut. On a donc seulement 4 broches analogiques. Si on a besoin de plus, il est facile d'ajouter un multiplexeur analogique ou bien un module analogique i2C. La limitation est la même en C / Arduino car liée à l'ESP 32 lui-même.
Voir : https://github.com/micropython/micropython/issues/6219
Timer
Timer 0 à 3 disponibles : le constructeur nécessite de fournir un index de timer.
from machine import Timer, Pin
led=Pin(15, Pin.OUT)
timer=Timer(0)
def loop(timer):
if led.value():led.off()
else:led.on()
timer.init(freq=10, callback=loop)
SPI
ESP 8266
Attention, la configuration est un peu spécifique : on ne précise pas les broches et l'indice doit être 1 (0 correspondant à la Flash)
https://docs.micropython.org/en/latest/esp8266/quickref.html?highlight=spi#hardware-spi-bus
>>> sp=SPI(1) # MISO=GPIO12 MOSI=GPIO13 et SCK=GPIO14 - SPI 0 = flash !
ESP 32
https://docs.micropython.org/en/latest/esp32/quickref.html#hardware-spi-bus
RTC
from machine import RTC
rtc.datetime()
rtc=RTC()
rtc.datetime()
(2000, 1, 1, 5, 1, 11, 49, 170430)
RMT
https://docs.micropython.org/en/latest/esp32/quickref.html#rmt
Fonctions spécifiques ESP 32
voir ici : https://docs.micropython.org/en/latest/library/esp32.html
Communication WebREPL
Une chose très intéressante avec les ESP 32 est la possibilité de communiquer en mode interpréteur via le réseau wifi sur lequel il se trouve.
Pour cela, il suffit d'activer le serveur REPL sur l'ESP 32 (intégré par défaut dans la version Micropython des ESP)
>>> import network
>>> wifi=network.WLAN(network.STA_IF)
>>> wifi.isconnected()
False
>>> wifi.active(True)
True
>>> wifi.connect("dlink","")
>>> wifi.isconnected()
True
>>> wifi.ifconfig()
('192.168.0.101', '255.255.255.0', '192.168.0.1', '0.0.0.0')
>>> import webrepl
>>> webrepl.start()
WebREPL daemon started on ws://192.168.0.101:8266
Started webrepl in normal mode
>>>
On peut mettre çà dans une fonction dans le boot.py aussi.
+/- Configuration
>>> import webrepl_setup
WebREPL daemon auto-start status: enabled
Would you like to (E)nable or (D)isable it running on boot?
(Empty line to quit)
> E
Would you like to change WebREPL password? (y/n) n
No further action required
>>> import webrepl
>>> webrepl.start()
Started webrepl in normal mode
*https://www.techcoil.com/blog/how-to-setup-micropython-webrepl-on-your-esp32-development-board/
Le client webrepl
C'est une appli web qui utilise websocket :
Installer localement.
Lancer serveur avec n'importe quel serveur de fichier statique de son choix :
php -S 127.0.0.1:8000
Se connecter sur :
http://127.0.0.1:8000/webrepl.html
Le terminal est inactif dans mon cas bien que la connexion semble se faire correctement.