Esp32 y Micropython
Hoy voy a probar MicroPyton en el Chip Esp32
Es la evolucion del esp8266. Un chip perfecto para iot.
Vamos a cargarle el ultimo firmware de MicroPyton y vamos ha ejecutar unos comandos con el interprete REPL.
De momento obtendremos la temperatura del chip leeremos el sensor hall y algunas patillas Tactiles/Touch.
La version Esp32 tiene doble nucleo. Resolviendo un pequeño fallo del esp8266 que a veces se saturaba y no podia atender a todos los eventos wifi. Lo que daba una sensacion de inestabilidad

Necesitaras los siguientes porgramas:
* python
* esptool
* wget
* screen , putty minicom o similar.
1) Deteccion del hardware
ejecuto dmesg | tail
justo despues de pinchar la placa al usb y deberia ver algo parecido a esto:
jejo@em50l:~$ dmesg |tail -n5 [ 3779.894636] usb 1-2: Product: CP2102 USB to UART Bridge Controller [ 3779.894641] usb 1-2: Manufacturer: Silicon Labs [ 3779.894646] usb 1-2: SerialNumber: 0001 [ 3779.905250] cp210x 1-2:1.0: cp210x converter detected [ 3779.907501] usb 1-2: cp210x converter now attached to ttyUSB0
Importante. apunta ttyUSB0
(dispositivo detectado) para el siguiente comando.
2) Deteccion de la version del chip
- Con
esptool.py --port /dev/ttyUSB0 flash_id
deberia ver algo asi.
jejo@em50l:~$ esptool.py --port /dev/ttyUSB0 flash_id em50l@jejo.es:~$ esptool.py --port /dev/ttyUSB0 flash_id esptool.py v2.6 Serial port /dev/ttyUSB0 Connecting........__ Detecting chip type... ESP32 Chip is ESP32D0WDQ6 (revision 1) Features: WiFi, BT, Dual Core, Coding Scheme None MAC: 30:ae:a4:19:aa:40 Uploading stub... Running stub... Stub running... Manufacturer: c8 Device: 4016 Detected flash size: 4MB Hard resetting via RTS pin...
nota: si tu placa no se ha detectado como USB0 y todavia te lias con los nombres hardware prueba con el siguiente comando: (copiar-pegar-ejecutar)
esptool.py --port $(dmesg|tail -n5|awk 'match($0,/tty.*/){print "/dev/"substr($0,RSTART,RLENGTH)}') flash_id
3) Descarga y flaseo del firmware.
Para diferentes/futuras versioness consulta la web:
http://micropython.org/download#esp32
wget http://micropython.org/resources/firmware/esp32-20190125-v1.10.bin
esptool.py --port /dev/ttyUSB0 erase_flash
esptool.py --port /dev/ttyUSB0 flash_id
esptool.py --baud 115200 --chip esp32 --port /dev/ttyUSB0 write_flash -z 0x1000 esp32-20190125-v1.10.bin
Deberiamos ver algo asi en la consola de comandos.
nota: he omitido algunas lineas no relevantes con (…) para hacer las legible la salida)
em50l@medion:~$ wget http://micropython.org/resources/firmware/esp32-20190125-v1.10.bin
...
esp32-20190125-v1.10.bin 100%[=================================================>] 1,04M 299KB/s en 3,6s
2019-05-25 12:23:37 (294 KB/s) - “esp32-20190125-v1.10.bin” guardado [1087456/1087456]
em50l@medion:~$ esptool.py --port /dev/ttyUSB0 erase_flash
...
Erasing flash (this may take a while)...
Chip erase completed successfully in 6.1s
Hard resetting via RTS pin...
em50l@medion:~$ esptool.py --baud 115200 --chip esp32 --port /dev/ttyUSB0 write_flash -z 0x1000 esp32-20190125-v1.10.binesptool.py v2.6
...
Chip is ESP32D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, Coding Scheme None
...
Auto-detected Flash size: 4MB
...
Wrote 1087456 bytes (687409 compressed) at 0x00001000 in 61.0 seconds (effective 142.6 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...
em50l@medion:~$
4) Conexion con la placa y primeros comandos.
si todo ha ido bien ahora nos podremos conectar a la placa.
screen /dev/ttyUSB0 115200
la reseteamos y veremos como arranca.
apareceran los mensajes tipicos de arranque y luego el simbolo >>>
Ya estamos listos para interactuar con la placa.
Lanzamos unos pocos comandos:
import machine
import esp32
esp32.hall_sensor()
esp32.raw_temperature()
machine.TouchPad( machine.Pin(14) ).read()
machine.ADC(machine.Pin(32)).read()
machine.Pin(4, machine.Pin.OUT)
machine.Pin(4).value()
machine.Pin(4).value(1)
machine.Pin(4).value()
Y la salida por pantalla seria esta:
MicroPython v1.10 on 2019-01-25; ESP32 module with ESP32
Type "help()" for more information.
>>>
>>> import machine
>>> import esp32
>>>
>>> #si pulso tabular vere las librerias cargadas
__class__ __name__ esp32 gc
machine uos bdev
>>>
>>> esp32. #tecleando esp32.<tabular> vere las clases de la libreria esp32
__class__ __name__ ULP WAKEUP_ALL_LOW
WAKEUP_ANY_HIGH hall_sensor raw_temperature
wake_on_ext0 wake_on_ext1 wake_on_touch
>>> esp32.hall_sensor()
88
>>> esp32.hall_sensor()
83
>>> esp32.raw_temperature()
129
>>> machine.TouchPad( machine.Pin(14) ).read()
845
>>> machine.TouchPad( machine.Pin(14) ).read()
85
>>> machine.ADC(machine.Pin(32)).read()
437
>>> machine.Pin(4, machine.Pin.OUT)
Pin(4)
>>> machine.Pin(4).value()
0
>>> machine.Pin(4).value(1)
>>> machine.Pin(4).value()
1
Para mas informacion de como manejarte por la interfaz Python REPL.
https://docs.micropython.org/en/latest/esp8266/tutorial/repl.html
5) Activacion del WIFI (Modo AP)
import network
network.WLAN(network.AP_IF).active(True)
>>> import network
>>> network.WLAN(network.AP_IF).active(True)
I (350075) wifi: wifi driver task: 3ffcada0, prio:23, stack:3584, core=0
I (350075) wifi: wifi firmware version: 7aac1f9
...
I (350295) phy: phy_version: 3960, 5211945, Jul 18 2018, 10:40:07, 0, 2
I (350305) wifi: mode : softAP (30:ae:a4:aa:bb:cc)
True
>>> I (350305) network: event 13
>>> I (375665) wifi: n:1 1, o:1 0, ap:1 1, sta:255 255, prof:1
I (375665) wifi: station: aa:bb:cc:dd:ee:ff join, AID=1, bgn, 40U
Explicacion de los comandos.
import machine
importa la libreria machine.
- teclear
machine.
mas tecla<tabular>
para ver el listado de funciones.
entre sus funciones cabe destacar.
machine.ADC
Conversor-Analogico-Digital
machine.DAC
Conversor-Digital-Analogico
machine.I2C
Control Bus I2C
machine.Pin
Control patillas Genericas del chip
machine.PWM
Control PWM (Modulacion por anchura de pulso)
machine.RTC
Control de Rlog Real Time Controler
machine.SPI
Control Bus SPI
machine.Timer
Control de los Temporizadores
machine.TouchPad
Control de las patillas con activacion tactil.
machine.UART
Control puertos Serie
import esp32
importa libreria especifica del chip esp32
- teclear
esp32.
mas tecla<tabular>
para ver el listado de funciones.
entre sus funciones cabe destacar.
esp32.hall_sensor()
Lectura del sensor de campos magneticos.
esp32.raw_temperature()
Lectura del sensor de temperatura interno. (nota: no os hagais ilusiones no es muy preciso.)
wake_on_???
capacidades de “despertar el chip ante determinados eventos.
machine.TouchPad( machine.Pin(14) ).read()
Lectura del pin 14 moto touch
machine.ADC(machine.Pin(32)).read()
Lectura valor analogico del pin 32
Lectura de los sensores internos del chip
machine.Pin
configura los pins GPIO
ejemplos:
machine.Pin(4,machine.Pin.OUT)
machine.Pin(4).on()
machine.Pin(4).off()
machine.Pin(4).value()
machine.Pin(4).value(1)
machine.Pin(4).value()
Pone la patilla GPIO 4 como salida y modifica su valor entre 0 y 1
Conclusion:
No hemos ni rozado el maximo potencial de este chip. Que son sus capacidades IOT y su amplia variedad de sensores y buses.
Tampoco hemos rozado las capacidades de MicroPython como la ejecucion automatica de scripts , el uso de librerias.
Pero ya es suficiente como toma de contacto con el chip. ya que si no este articulo se haria muy extenso de leer y de escribir.
Enlaces:
- https://docs.micropython.org/en/latest/esp32/quickref.html
- https://micropython.org/download#esp32
- https://docs.micropython.org/en/latest/esp8266/tutorial/index.html
- https://github.com/espressif/esptool
- https://en.wikipedia.org/wiki/Wget
otros comandos utiles
putty -serial /dev/ttyUSB0 -sercfg 115200
putty -serial comxx -sercfg 115200
screen $(dmesg|tail -n5|awk 'match($0,/tty.*/){print "/dev/"substr($0,RSTART,RLENGTH)}') 115200
Algunos trucos MicroPython y REPL
https://randomnerdtutorials.com/esp32-esp8266-micropython-web-server/
https://docs.micropython.org/en/latest/esp32/quickref.html
http://micropython.org/webrepl/
Sistema de archivos.
- boot.py cuando arranca
- may.py programa principal
Mostrar un archivo
open('boot.py','r').read()
f=open('boot.py','a') f.write('print(); \n') f.write('print("boot.py"); \n') f.close()
-
La salida seria:
# This file is executed on every boot (including wake-boot from deepsleep)\n #import esp\n #esp.osdebug(None)\n import uos, machine\n #uos.dupterm(None, 1) # disable REPL on UART(0)\n import gc\n #import webrepl\n #webrepl.start()\n gc.collect()\n
Restaurar boot original:
f=open('boot.py','w') f.write('# This file is executed on every boot(wake-boot from deepsleep)\n#import esp\n#esp.osdebug(None)\nimport uos, machine\n#uos.dupterm(None, 1) # disable REPL on UART(0)\nimport gc\n#import webrepl\n#webrepl.start()\ngc.collect()\nprint(); \nprint("boot.py");') f.close()
ver archivo boot.py = cat boot.py
open('boot.py','r').read()
Crear main.py
f=open('main.py','w') f.write('print();\n\rprint("main.py");\n import machine,network,esp;\n') f.close() f=open('main.py','w');f.write('print();\nprint("main.py");\nimport machine,network,esp,time;\n');f.close();import main
ver archivo main.py
open('main.py','r').read()
testear main.py
import main.py
Comprobar
print(esp.check_fw());
Codigo ap.py (arranca en modo punto de acceso y arranca la consola REPL via web ).
print("ap.py"); import machine,network,esp,time; ap_if=network.WLAN(network.AP_IF); ap_if.config(essid='esp8266',authmode=network.AUTH_OPEN); ap_if.active(True); print(ap_if.ifconfig()); import webrepl; webrepl.start();
crear el archivo ap.py
desde la consola
f=open('ap.py','w')
f.write('print("ap.py"); ')
f.write('import machine,network,esp,time; ')
f.write('ap_if=network.WLAN(network.AP_IF); ')
f.write('ap_if.config(essid='esp8266',authmode=network.AUTH_OPEN); ')
f.write('ap_if.active(True); ')
f.write('print(ap_if.ifconfig()); ')
f.write('import webrepl; ')
f.write('webrepl.start(); ')
f.close()
Para mostrar el archivo desde la consola:
open('ap.py','r').read()
Para probar el archivo
import ap
Codigo sta.py (arranca en modo cliente(station) y arranca la consola REPL via web )
print("sta.py");
import network;
sta_if=network.WLAN(network.STA_IF);
sta_if.active(True);
sta_if.scan();
sta_if.connect("Honor 6X","polkawifi");
import webrepl;
webrepl.start();
crear el archivo sta.py
desde la consola
f=open('sta.py','w')
f.write('print("ap.py"); ')
f.write('import network; ')
f.write('sta_if=network.WLAN(network.STA_IF); ')
f.write('sta_if.active(True); ')
f.write('sta_if.scan(); ')
f.write('sta_if.connect("Honor 6X","polkawifi"); ')
f.write('import webrepl; ')
f.write('webrepl.start(); ')
f.close()
machine.reset()
import sta
https://www.instructables.com/id/MicroPython-on-an-ESP32-Board-With-Integrated-SSD1/
https://github.com/adafruit/micropython-adafruit-ssd1306
wget https://raw.githubusercontent.com/adafruit/micropython-adafruit-ssd1306/master/ssd1306.py
compruebo bus i2c
#import machine
i2c = machine.I2C(scl=machine.Pin(4), sda=machine.Pin(5))
i2c.scan()
deveria ver: (en el terminal)
MicroPython v1.10 on 2019-01-25; ESP32 module with ESP32 Type “help()” for more information. >>> i2c = machine.I2C(scl=machine.Pin(4), sda=machine.Pin(5)) >>> i2c.scan() [60] >>>Lo que quire decir que hay un dispositivo i2c en la direccion 60
compruebo pantalla oled
i2c = machine.I2C(scl=machine.Pin(4), sda=machine.Pin(5))
i2c.scan()
import ssd1306
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
oled.fill(0)
oled.text('MicroPython Em50L', 0, 0)
oled.show()