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

Animacion: Animacion esp32  micropython



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
>>> 
&gt;&gt;&gt; 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
&gt;&gt;&gt; esp32.hall_sensor()
88
&gt;&gt;&gt; esp32.hall_sensor()
83
&gt;&gt;&gt; esp32.raw_temperature()
129
&gt;&gt;&gt; machine.TouchPad( machine.Pin(14) ).read()
845
&gt;&gt;&gt; machine.TouchPad( machine.Pin(14) ).read()
85
&gt;&gt;&gt; machine.ADC(machine.Pin(32)).read()
437

&gt;&gt;&gt; machine.Pin(4, machine.Pin.OUT)
Pin(4)
&gt;&gt;&gt; machine.Pin(4).value()
0
&gt;&gt;&gt; machine.Pin(4).value(1)
&gt;&gt;&gt; machine.Pin(4).value()
1
Ver seccion: explicacion de los comandos para mas detalles.
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)

&gt;&gt;&gt; import network
&gt;&gt;&gt; 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
Cuando alguien se conecte deberiamos ver:
&gt;&gt;&gt; I (350305) network: event 13
&gt;&gt;&gt; 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:


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()

Referencias