M5stickc Primeros Pasos

Ya tenia Ganas de Probar el entorno de desarollo M5Stack.
Aqui presento una toma de contacto.
Con un microcontrolador M5Stick y un Modulo sensor de entorno.
Haremos una estacion meteorologica con capacidad de enviar los datos a un Servidor IOT (cloud).

En proximos articulos lo convertiremos en una Estacion IOT o en un termostato inteligente que nos permitira controlar la calefaccion desde el movil.




- Foto del Prototipo Ya Operativo

Como se ve en la imagen.
Tenemos el M5Stick conectado a un sensor de ambiente.
Que nos da en tiempo real: Temperatura presion y humedad.

Foto M5Stick Mas adelante le añadiremos (siguiente articulo) posibilidades IOT/Cloud. Para poderlo usar como termostato inteligente. Y poder controlar por ejemplo la calefaccion de casa desde el movil.
Su bajo consumo y Las capacidades Bluetooth, IR/infrarojos, wifi , Lorawan…
Le dan la posibilidad de utilizarlo como sensor/actuador remoto sin apenas instalacion.

El unico problema es que el M5Stick No viene con el firmware cargado para poder utilizarlo con UiFlow.




Para los impacientes:

Puedes Visitar la web http://flow.m5stack.com y simular que tienes un prototipo poniendo la APIKEY 12345678
Cargar un ejemplo y cacharrear un poco con la Interfaz.
Y si lo consideras interesante Puedes seguir leyendo este articulo.

M5Stack Impacientes




Indice:




1) Descripcion del entorno UIFlow

El entorno de programacion UIFlow es una interfaz web ( http://flow.m5stack.com/ ) Mediante la cual podremos programar nuestro modulo M5Stack Sin tener que conectarlo al equipo y sin tener que instalar nada en nuestro equipo.
Gracias a sus capacidades wifi de los Modulos M5Stack.
y a la plataforma web http://flow.m5stack.com/

Pantalla entorno UIFlow En la imagen se puede apreciar que la interfaz es bastante sencilla.
Asi que no me voy a entretener mucho.

Para mas informacion Visita: http://forum.m5stack.com/topic/569/lesson-15-1-uiflow-it-s-easy




2) Flaseado/Carga del Firmware para poder utilizar el M5Stick con el entorno UIFlow

Como ya hemos comentado Para poder utilizar el M5Stick con UIFlow
Necesitamos tener cargado el firmware correspondiente.
Aunque Grabar/Flasear estos equipos no es dificil.
Puede resultar un poco complicado si es la primera vez que lo hacemos:

  • A) Nos descargamos la aplicacion M5Burner: Windows / Mac / Linux Nota:Aunque a mi no me ha funcionado puedes probar el Nuevo IDE
    (con todo integrado).

  • B) Descomprimimos y Arrancamos la utilidad.

  • C) Una vez arrancada La aplicacion:

    • 1 Descargamos El firmware UIFlow-V1.3.2
    • 2 Seleccionamios el puerto serie
    • 3 Seleccionamos el modelo de nuestra placa.
    • 4 Y le damos a Burn (Quemar/Grabar) M5Burner1

Y si todo ha ido bien deberiamos ver algo parecido a esto:

M5Burner2

Esta seria la salida de texto al completo.

Command:
/M5Burner/tools/esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 750000 --before default_reset --after no_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size detect 0x10000 application_0x10000.bin 0x1000 bootloader_0x1000.bin 0x1f0000 fatfsImg_0x1f0000.img 0x8000 partitions_0x8000.bin
===================================================
esptool.py v2.5.0
Serial port /dev/ttyUSB0
Connecting......
Chip is ESP32-PICO-D4 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, Embedded Flash, VRef calibration in efuse
MAC: d8:a0:1d:49:6a:e4
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 750000
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 1857936 bytes to 1315975...

Writing at 0x00010000... (1 %)
Writing at 0x00020000... (5 %)
Writing at 0x00034000... (10 %)
Writing at 0x00060000... (20 %)
Writing at 0x00074000... (30 %)
Writing at 0x000a0000... (40 %)
Writing at 0x000b0000... (50 %)
Writing at 0x000d0000... (60 %)
Writing at 0x000f0000... (70 %)
Writing at 0x00130000... (90 %)
Writing at 0x00150000... (100 %)
Wrote 1857936 bytes (1315975 compressed) at 0x00010000 in 24.0 seconds (effective 618.2 kbit/s)...
Hash of data verified.
Compressed 22464 bytes to 14066...

Writing at 0x00001000... (100 %)
Wrote 22464 bytes (14066 compressed) at 0x00001000 in 0.2 seconds (effective 748.7 kbit/s)...
Hash of data verified.
Compressed 2162688 bytes to 128819...

Writing at 0x001f0000... (12 %)
Writing at 0x001f4000... (25 %)
Writing at 0x001f8000... (37 %)
Writing at 0x001fc000... (50 %)
Writing at 0x00200000... (62 %)
Writing at 0x00204000... (75 %)
Writing at 0x00208000... (87 %)
Writing at 0x0020c000... (100 %)
Wrote 2162688 bytes (128819 compressed) at 0x001f0000 in 3.7 seconds (effective 4621.0 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 124...

Writing at 0x00008000... (100 %)
Wrote 3072 bytes (124 compressed) at 0x00008000 in 0.0 seconds (effective 2912.6 kbit/s)...
Hash of data verified.

Leaving...
Staying in bootloader.

Para mas informacion puedes ojear la Documentacion Original:
https://docs.m5stack.com/#/en/quick_start/m5stickc/m5stickc_quick_start_with_uiflow
https://docs.m5stack.com/#/en/related_documents/M5Burner

Si la deteccion del puerto serie te de problemas. (aunque no suele darlos.) Echa un ojo al apendice2




3) Configuracion de la conexion WIFI

Para que nuestro “Aparato” sea accesible. Tiene que estar conectado a internet.
Luego la primera vez que lo encendemos veremos algo asi:

uiflow 1a Conexion WIFI

Al cabo de unos segundos podremos observar que ha aparecido una red wifi M5-6ae4 en nuestro alcance.
- Usuarios avanzados: !!!Como… Este trasto tiene capacidades de router/repetidor Wifi¡¡¡. La respuesta es SI

  • A) Conectarnos a la red wifi indicada en la pantalla. (sin password)
  • B) Abrir el navegador y escribir la siguiente url http://192.168.4.1 uiflow 1a Conexion WIFI 2

  • C) Seleccionar Nuestra conexion Wifi e Introducir el password. uiflow 1a Conexion WIFI 3

  • D) Boton Configurar. Una vez aue hagamos esto. el dispositivo se reiniciara,
    la wifi M5-6ae4 desaparecera.
    Y veremos como intenta conectarse al wifi Seleccionado.
    uiflow 1a Conexion WIFI 4




4) Enlace del M5Stick con el entorno UIFlow

  • A) Una Vez que el aparato se conecte a internet y acceda al cloud (nuve),
    nos mostrara en pantalla un APIKEY (llave de acceso)
    Y cuando se conecte al servidor de UIflow el globo se pondra verde.
    M5Stick Key Enlace IDE uiflow

  • B) Abrimos la Url http://flow.m5stack.com/ y Introducimos los siguientes parametros:

    • Api Key. (llave de acceso: el que aparece en lapantalla del dispositivo).
    • Idioma
    • Dispositivo. (en nuestro caso Stick-C)

uiflow web pruebas 1

  • C) A programar….



5) Programa de pruebas “Hello Word”

Vamos a ver un ejemplo de como se programa y se ejecuta codigo en el micro. Vamos ha hacer un programa que muestre algo en pantalla y que al pulsar los botones enciende y apague un led.

hello word m5stack




6) Codigo Estacion Meteorologica.

Aqui os dejo el codigo de la estacion Meteorologica. (42Bloques <50L Jaja)

UiFlow Codigo Est Meteorologica




Apendice1: Elementos de la interfaz de programacion

Indagando un poco. Se ve es un Blockly adaptado a un MicroPython para el chip ESP32.
Con lo que se consigue una interfaz muy amigable y sencilla de programar estilo Scratch para microcontroladores. a la vez bastante potente y flexible.

Otros entornos parecidos son:




Apendice2: Flaseado/Carga del Firmware
(Mas en detalle)

La herramienta oficial para grabar estos dispositivos es M5Burner. (Internamente lleva una utilidad llamada esptool que hemos visto en este articulo Martin-Ger esp_wifi_repeater y en el articulo micropython

El Driver Oficial para la interfaz serie CP210X
https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers




Apendice3 Acceder el Interprete MicroPython del UIFlow

Se puede Acceder directamente a la interfaz MicroPython del entorno UIFlow de la siguiente forma:

  • A) Conectar el M5Stick al puerto USB

  • B) Averiguar el puerto serie del dispositivo.

    jejo@em50l:~/Descargas/UIFlowIDE$ dmesg |tail -n5
    [54439.099618] usb 1-5: Manufacturer: Kongou Hikari
    [54439.099619] usb 1-5: SerialNumber: 1234567890
    [54439.100156] ftdi_sio 1-5:1.0: FTDI USB Serial Device converter detected
    [54439.100194] usb 1-5: Detected FT232BM
    [54439.100513] usb 1-5: FTDI USB Serial Device converter now attached to ttyUSB1
    
  • C) Lanzar terminal serie. (vale cualquier programa no tiene por que se screen)
    jejo@em50l:~/Descargas/UIFlowIDE$ screen /dev/ttyUSB1 115200
    
  • D) Reiniciar Dispositivo (Pulsacion 6Seg Apagar + Pulsacion 2Seg arrancar)
    I (9) boot: ESP-IDF v3.3-beta1-270-g6ffef3bc1 2nd stage bootloader
    I (9) boot: compile time 09:26:17
    I (9) boot: Enabling RNG early entropy source...
    I (14) boot: SPI Speed      : 80MHz
    I (18) boot: SPI Mode       : DIO
    I (22) boot: SPI Flash Size : 4MB
    I (26) boot: Partition Table:
    I (29) boot: ## Label            Usage          Type ST Offset   Length
    I (37) boot:  0 nvs              WiFi data        01 02 00009000 00006000
    I (44) boot:  1 phy_init         RF data          01 0
    >>> I (9) boot: ESP-IDF v3.3-beta1-270-g6ffef3bc1 2nd stage bootloader
    I (9) boot: compile time 09:26:17
    I (9) boot: Enabling RNG early entropy source...
    I (14) boot: SPI Speed      : 80MHz
    I (18) boot: SPI Mode       : DIO
    I (22) boot: SPI Flash Size : 4MB
    I (26) boot: Partition Table:
    I (29) boot: ## Label            Usage          Type ST Offset   Length
    I (37) boot:  0 nvs              WiFi data        01 02 00009000 00006000
    I (44) boot:  1 phy_init         RF data          01 01 0000f000 00001000
    I (52) boot:  2 factory          factory app      00 00 00010000 001e0000
    I (59) boot:  3 internalfs       Unknown data     01 81 001f0000 00210000
    I (52) boot:  2 factory          factory app      00 00 00010000 001e0000
    I (59) boot:  3 internalfs       Unknown data     01 81 001f0000 00210000
    I (67) boot: End of partition table
    I (71) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0xdad24 (896292) map
    I (337) esp_image: segment 1: paddr=0x000ead4c vaddr=0x3ffb0000 size=0x02e9c ( 11932) load
    I (341) esp_image: segment 2: paddr=0x000edbf0 vaddr=0x40080000 size=0x00400 (  1024) load
    I (344) esp_image: segment 3: paddr=0x000edff8 vaddr=0x40080400 size=0x02018 (  8216) load
    I (355) esp_image: segment 4: paddr=0x000f0018 vaddr=0x400d0018 size=0xd3a10 (866832) map
    I (611) esp_image: segment 5: paddr=0x001c3a30 vaddr=0x40082418 size=0x116c0 ( 71360) load
    I (634) esp_image: segment 6: paddr=0x001d50f8 vaddr=0x400c0000 size=0x00064 (   100) load
    I (635) esp_image: segment 7: paddr=0x001d5164 vaddr=0x50000000 size=0x00808 (  2056) load
    I (654) boot: Loaded app from partition at offset 0x10000
    I (654) boot: Disabling RNG early entropy source...
    I (655) cpu_start: Pro cpu up.
    I (659) cpu_start: Application information:
    I (664) cpu_start: Compile time:     09:26:24
    I (669) cpu_start: Compile date:     Jun 10 2019
    I (674) cpu_start: ESP-IDF:          v3.3-beta1-270-g6ffef3bc1
    I (680) cpu_start: Starting app cpu, entry point is 0x400831f4
    I (0) cpu_start: App cpu up.
    I (691) heap_init: Initializing. RAM available for dynamic allocation:
    I (698) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
    I (704) heap_init: At 3FFB9970 len 00026690 (153 KiB): DRAM
    I (710) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
    I (716) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
    I (723) heap_init: At 40093AD8 len 0000C528 (49 KiB): IRAM
    I (729) cpu_start: Pro cpu start user code
    I (75) cpu_start: Starting scheduler on PRO CPU.
    I (0) cpu_start: Starting scheduler on APP CPU.
    Internal FS (FatFS): Mounted on partition 'internalfs' [size: 2162688; Flash address: 0x1F0000]
    ----------------
    Filesystem size: 2101248 B
               Used: 503808 B
               Free: 1597440 B
    ----------------
    I (388) [TFTSPI]: attached display device, speed=8000000
    I (388) [TFTSPI]: bus uses native pins: false
    [ M5 ] node id:1234567890ab, api key:12345678
    I (4344) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE
    I (4344) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE
    I (4432) phy: phy_version: 4007, 1234567, Jan 11 2019, 16:45:07, 0, 0
    I (4436) modsocket: Initializing
    Connect Wi-Fi: SSID:Miwifi PASSWD:Mipass network...
    ..................
    Connected. Network config: ('192.168.43.185', '255.255.255.0', '192.168.43.1', '192.168.43.1')
    M5Cloud connected.
    m5cloud thread begin .....
    
  • E) una vez que ha terminado de arrancar pulsamos 2 o 3 veces ctrl+c para interrumpir el programa principal.
    Veremos Lo siquiente:
    Unhandled exception in thread started by <bound_method>
    Traceback (most recent call last):
      File "flowlib/lib/time_ex.py", line 56, in timeCb
    KeyboardInterrupt: 
    Unhandled exception in thread started by <bound_method>
    Traceback (most recent call last):
      File "flowlib/m5cloud.py", line 187, in _daemonTask
      File "flowlib/lib/time_ex.py", line 56, in timeCb
    KeyboardInterrupt: 
    Traceback (most recent call last):
      File "flow.py", line 43, in <module>
      File "flowlib/m5cloud.py", line 224, in run
      File "flowlib/m5cloud.py", line 199, in _backend
      File "flowlib/m5cloud.py", line 187, in _daemonTask
      File "flowlib/lib/time_ex.py", line 56, in timeCb
    KeyboardInterrupt: 
    
  • F) y ya tenemos el interfaz repl de MicroPython
    MicroPython v1.10-273-g4616ff72f-dirty on 2019-06-10; ESP32 module with ESP32
    Type "help()" for more information.
    >>> 
    

    >>> help()
    Welcome to MicroPython on the ESP32!

    For generic online docs please visit http://docs.micropython.org/

    For access to the hardware use the 'machine' module:

    import machine pin12 = machine.Pin(12, machine.Pin.OUT) pin12.value(1) pin13 = machine.Pin(13, machine.Pin.IN, machine.Pin.PULL_UP) print(pin13.value()) i2c = machine.I2C(scl=machine.Pin(21), sda=machine.Pin(22)) i2c.scan() i2c.writeto(addr, b'1234') i2c.readfrom(addr, 4)

    Basic WiFi configuration:

    import network sta_if = network.WLAN(network.STA_IF); sta_if.active(True) sta_if.scan() # Scan for available access points sta_if.connect("<AP_name>", "<password>") # Connect to an AP sta_if.isconnected() # Check for successful connection

    Control commands: CTRL-A – on a blank line, enter raw REPL mode CTRL-B – on a blank line, enter normal REPL mode CTRL-C – interrupt a running program CTRL-D – on a blank line, do a soft reset of the board CTRL-E – on a blank line, enter paste mode

    For further help on a specific object, type help(obj) For a list of available modules, type help('modules') >>>




    Notas:

    Un trasto compacto y flexible.

    • + Me ha gustado la respuesta ante cortes de corriente y agotamiento de la bateria. El equipo se levanta como si nada. Despues de habersele agotado la bateria.
    • + Ideal junto con un panel solar.
    • + Varios sensores internos y circuiteria añadida. (Acelerometro, RTC, gestion de la bateria, pantalla LCD, Lorawan)
    • + Posibilidad de crear tus propios modulos
    • + Varias demos accesibles facilmente (- Solo para el Modulo CORE)
    • + Posibilidd de saltar a python (se podria terminar el programa en modo texto)
    • + Posibilidad de enracarlo en DIN-RAIL (contadores armarios de automatas ETC)
    • + Modulos industriales. RS485 Can-Bus DAC0-10…
    • - En interfaz de programacion se me ha quedado pillado (alguna vez no programa a la primera)
    • - Ante un corte gordo (agotamiento total de la bateria) la interfaz arranca en modo programacion a esar de haber grabado el codigo. (supongo que para algo permanente habra que grabarlo en micropyton)
    • - No he podido acceder/ver los sensores HALL y de temperatura internos del ESP32
    • - No he podido controlar un servo. (que no sea el de la unidad) (tendre que hacer mas pruebas)
    • - Echo de menos Poder usar las capacidades tactiles del ESP32 Aunque siempre puedo programar mi propio modulo.
    • - El modulo Core me parece un poco Caro. Comparandolo con una RaspberryPi A



    Referencias