# Micropython

# Preparar ALVIK para MicroPython: Actualizar el firmware de Alvik

{{@13342}}

# Instalar Micropython

<p class="callout info"><span style="color: rgb(22, 145, 121);">**Conceptos previos:**</span>  
- Los **lenguajes de alto nivel**, es decir el **código**, que es entendible por los humanos (C++, Java, Python...) son textos que se tienen que traducir al lenguaje entendible por el procesador **MCU** (Micro Controler Unit). Este **lenguaje de bajo nivel** que está escrito en **binario** es difícil de entender para los humanos  
- El **Compilador** es un programa que **Interpreta** este texto de lenguaje de alto nivel, y lo convierte en lenguaje de bajo nivel  
- El Arduino Alvik se puede programar con Arduino IDE como con Micropytno, los dos son de alto nivel</p>

<p class="callout success">Tanto Micropython como Arduino IDE son lenguajes de tipo CODIGO por lo tanto sólo se aconseja EN SECUNDARIA  
Cuando permita lenguaje tipo BLOQUES como Scratch, ya será adecuado para PRIMARIA</p>

##### <span style="color: rgb(22, 145, 121);">**¿Dónde se compila Micropython?**</span>

Como puedes ver [en este vídeo en 21:20 ](https://youtu.be/R51tf66es9w?t=1286)Python se compila **dentro del microcontrolador** es decir, dentro del ESP32. A diferencia con otros lenguajes, como el C++, el ordenador tiene el compilador, y se lo da ya en binario.  
[![2024-07-04 18_44_27-(1) Exploring the Arduino Nano ESP32 _ MicroPython & IoT Cloud - YouTube.png](https://libros.catedu.es/uploads/images/gallery/2024-07/scaled-1680-/2024-07-04-18-44-27-1-exploring-the-arduino-nano-esp32-micropython-iot-cloud-youtube.png)](https://libros.catedu.es/uploads/images/gallery/2024-07/2024-07-04-18-44-27-1-exploring-the-arduino-nano-esp32-micropython-iot-cloud-youtube.png)  
<span style="color: rgb(0, 0, 0);">[Fuente vídeo Exploring the Arduino Nano ESP32 | MicroPython &amp; IoT](https://youtu.be/R51tf66es9w?t=1512)</span>

##### <span style="color: rgb(22, 145, 121);">**¿Y a mi qué más me da?**</span>

Pues sí que importa....

<p class="callout danger">Si programas ESP32 con Arduino IDE o Arduino Cloud o con Steamakersblock (que está basado en C++) **te has cargado el compilador Python que has puesto en** ["Actualizar firmware"](https://libros.catedu.es/books/arduino-alvik/page/preparar-alvik-para-micropython-actualizar-el-firmware-de-alvik) del ESP32 luego si quieres programar en Python, tienes que volver a  ["Actualizar firmware"](https://libros.catedu.es/books/arduino-alvik/page/preparar-alvik-para-micropython-actualizar-el-firmware-de-alvik)   
O sea, si pasas de \[ArduiIDE\] o \[Arduino Cloud\] o \[Steamakersblok\] a Micropytho **tienes que volver a instalar el compilador Micropython**</p>

##### <span style="color: rgb(22, 145, 121);">**¿Y con esto ya puedo crear mis programas con Micropython?**</span>

<span style="color: rgb(0, 0, 0);">No, con esto tienes el compilador interpretador dentro del chip, pero necesitas un editor en tu PC y que se comunique con el Micropython del chip</span>

##### <span style="color: rgb(22, 145, 121);">**Arduino Lab for Micropython**</span>

Tal y como dice la página [https://docs.arduino.cc/micropython/](https://docs.arduino.cc/micropython/) hay dos editores para cargar MicroPython en el Arduino Alvik

- **Arduino Lab for Micropython** [https://labs.arduino.cc/en/labs/micropython](https://labs.arduino.cc/en/labs/micropython)
- **OpenMW** [https://openmv.io/pages/download](https://openmv.io/pages/download)

Nosotros en este curso elegimos **Arduino Lab for Micropython** por su sencillez y adaptación al Arduino Alvik

Tal y como dice aquí **ES UN PROGRAMA PORTABLE**, es decir, no hay que instalarlo, simplemente descomprimir y ejecutar

[![2024-07-04 09_56_30-Arduino Labs.png](https://libros.catedu.es/uploads/images/gallery/2024-07/scaled-1680-/2024-07-04-09-56-30-arduino-labs.png)](https://libros.catedu.es/uploads/images/gallery/2024-07/2024-07-04-09-56-30-arduino-labs.png)

<p class="callout info">Ejecutamos el programa en el lugar donde lo hemos descomprimido (o donde quieras llevarte la carpeta) :</p>

[![2024-07-04 10_00_12-Arduino.Lab.for.MicroPython-win_x64.png](https://libros.catedu.es/uploads/images/gallery/2024-07/scaled-1680-/2024-07-04-10-00-12-arduino-lab-for-micropython-win-x64.png)](https://libros.catedu.es/uploads/images/gallery/2024-07/2024-07-04-10-00-12-arduino-lab-for-micropython-win-x64.png)

<p class="callout warning">{{@13342#bkmrk-%7B%7B%4012238%23bkmrk-%257b%257}}</p>

Al ejecutar el programa, vemos:

1. Botón para conectar la placa
2. Ejecutar o para el programa
3. Gestor de fichero
4. Donde escribimos el programa
5. Ventana de estado

[![IDEOverview.png](https://libros.catedu.es/uploads/images/gallery/2025-03/scaled-1680-/ideoverview.png)](https://libros.catedu.es/uploads/images/gallery/2025-03/ideoverview.png)  
*Licencia CC-BYSA Fuente [https://docs.arduino.cc/micropython/environment/code-editor/](https://docs.arduino.cc/micropython/environment/code-editor/)*

En el gestor de ficheros encontramos

1. **Los archivos que hay en la placa**: Puedes ver y administrar scripts o datos guardados directamente en la placa.
2. **Los archivos que hay en tu equipo**: lo que le permite seleccionar y administrar archivos para cargar o descargar.
3. D**escargar/Subir archivos**: Utiliza esta opción para transferir archivos entre su equipo y la placa. Puedea cargar nuevos scripts o descargar registros de datos de su placa.
4. **Crear archivo/carpeta:** Esta opción le permite crear nuevos archivos o carpetas directamente en la placa o en el directorio de su proyecto, lo que facilita la organización de su código y recursos.

[![IDEFileManager.png](https://libros.catedu.es/uploads/images/gallery/2025-03/scaled-1680-/idefilemanager.png)](https://libros.catedu.es/uploads/images/gallery/2025-03/idefilemanager.png)*Licencia CC-BYSA Fuente [https://docs.arduino.cc/micropython/environment/code-editor/](https://docs.arduino.cc/micropython/environment/code-editor/)*

# Hola mundo

Vamos a comenzar con nuestro primer programa en Arduino Lab for MicroPython, el clásico Hola mundo ponemos este programa:

```python
from time import sleep

print("Hola mundo, soy un robot que me gusta chatear, ¿cual es tu nombre? ")
student_name = input("Tu nombre : ")
print("Mucho gusto , " + student_name + "! ¿ Cómo quieres llamarme?")
robot_name = input("Mi nombre ? : ")

print(f"{robot_name} es un fantástico nombre. Ya me siento un poco más humano.")

sleep(2) # Use sleep() to make interaction feel more natural
print(f"Okay, {student_name}, voy a ponerte a prueba:")
sleep(2)
print("¿ Has oido hablar que puedo nadar ?")
sleep(4)
print("Je je, es broma..... :D")
sleep(5)
```

Adaptado de [https://courses.arduino.cc/explore-robotics-micropython/lessons/getting-started/](https://courses.arduino.cc/explore-robotics-micropython/lessons/getting-started/)

Pulsamos a conectar, nos pregunta por el puerto

[![2024-06-14 23_20_41-Arduino Lab for MicroPython.png](https://libros.catedu.es/uploads/images/gallery/2024-06/scaled-1680-/2024-06-14-23-20-41-arduino-lab-for-micropython.png)](https://libros.catedu.es/uploads/images/gallery/2024-06/2024-06-14-23-20-41-arduino-lab-for-micropython.png)

Runeamos y vamos contestando a sus preguntas

[![2024-06-14 23_22_58-Arduino Lab for MicroPython.png](https://libros.catedu.es/uploads/images/gallery/2024-06/scaled-1680-/2024-06-14-23-22-58-arduino-lab-for-micropython.png)](https://libros.catedu.es/uploads/images/gallery/2024-06/2024-06-14-23-22-58-arduino-lab-for-micropython.png)

<p class="callout warning">**ATENCIÓN** si quieres que se ejecute en el Alvik SIN necesidad de darle al "play" del programa, entonces lo tienes que grabar como main.py en el Alvik entonces se ejecuta automáticamente</p>

# Empezando MicroPython de Alvik

<p class="callout success"><span style="color: rgb(0, 0, 0);">Inspirado en el esquema del [tutorial MicroPython Basics ](https://docs.arduino.cc/micropython/basics/micropython-basics/)autora Francesca Sanfilippo &amp; Karl Söderby</span></p>

Hemos visto la función **print** visualiza un mensaje en la cónsola :

```python
print('Hola mundo !')
```

Podemos introducir una **variable**, frase que contenga el texto, la función **time.sleep(**segundos) que hace una pausa, (para utilizar esta función se necesita importar la librería time con **import time** ) y dentro de un **bucle while** que se ejecuta mientras sea verdadero lo que le sigue, en este caso while True se ejecutará siempre:

```python
import time    
frase = "Hola mundo !!"
 
while True:
   print(frase)   
   time.sleep(1)
```

Aquí se utiliza

- una **función** con **def** una variable contador que en la función se declara **global** de esta manera se puede utilizar dentro de cualquier función del programa (en este caso el programa principal la funcion\_contar().
- Vemos la típica operación de cuenta contador = contador + 1
- print visualiza dos cosas, la frase y el contador

```python
import time

frase = "Hola mundo "
contador = 0

def funcion_contar():
    global contador
    contador = contador + 1

while True:
    funcion_contar()
    print(frase, contador)
    time.sleep(1)
```

El resultado:

[![2024-06-15 07_32_00-Arduino Lab for MicroPython.png](https://libros.catedu.es/uploads/images/gallery/2024-06/scaled-1680-/2024-06-15-07-32-00-arduino-lab-for-micropython.png)](https://libros.catedu.es/uploads/images/gallery/2024-06/2024-06-15-07-32-00-arduino-lab-for-micropython.png)

Aquí utilizamos el **condicional if**  con su auxiliar  **else** y la función **exit** para acabar el programa:

```python
import time

frase = "Hola mundo "
contador = 0
maximo = 20

def funcion_contar():
    global contador
    contador = contador + 1

while True:
    funcion_contar()
    if contador>20 :
      exit
    else :
      print(frase, contador)
      time.sleep(1)
```

Lo que provoca que a los 20 finalice

[![2024-06-15 07_44_37-Arduino Lab for MicroPython.png](https://libros.catedu.es/uploads/images/gallery/2024-06/scaled-1680-/2024-06-15-07-44-37-arduino-lab-for-micropython.png)](https://libros.catedu.es/uploads/images/gallery/2024-06/2024-06-15-07-44-37-arduino-lab-for-micropython.png)

Podemos usar en vez de variables numéricas, variables tipo **array** para los bucles :

```python
Catedu = ['Javier', 'Santiago', 'Silvia', 'Berta', 'Cristina', 'Nacho', 'Arturo', 'Chefo', 'Vladi', 'Ruben', 'Pablo', 'JuanFran']

def printCatedus():
    for persona in Catedu:
        print(persona)

printCatedus()
```

[![2024-06-15 07_51_00-Arduino Lab for MicroPython.png](https://libros.catedu.es/uploads/images/gallery/2024-06/scaled-1680-/2024-06-15-07-51-00-arduino-lab-for-micropython.png)](https://libros.catedu.es/uploads/images/gallery/2024-06/2024-06-15-07-51-00-arduino-lab-for-micropython.png)

Con esto ya podemos avanzar, pero si quieres[   ](https://drive.google.com/file/d/1pUxzeBBbpskfIHHtlH68zrOPEIFKR_vE/view?usp=sharing)

# Introducción al Python

{{@12327}}

# Arduino Alvik API

<p class="callout warning">Estas instrucciones son específicas del ARDUINO ALVIK </p>

Para acceder a las funciones de Arduino Alvik API tenemos que ejecutar las instrucciones:

```python
alvik = ArduinoAlvik()
alvik.begin()
```

Entonces ya podemos usar las siguientes: (extraido de [https://docs.arduino.cc/tutorials/alvik/api-overview/](https://docs.arduino.cc/tutorials/alvik/api-overview/) )

<p class="callout success">Luego veremos en el apartado de programación del Arduino Alvik con código Arduino IDE que utilizaremos una biblioteca #include "Arduino\_Alvik.h" que importa prácticamente las mismas funciones, ver [https://libros.catedu.es/books/arduino-alvik/page/programas-arduino-ide-sin-iot](https://libros.catedu.es/books/arduino-alvik/page/arduino-ide-sin-iot-un-pequena-danza) </p>

<table border="1" id="bkmrk-funcion-salida-stop%28" style="border-collapse: collapse; width: 100%; height: 313.598px;"><colgroup><col style="width: 53.8625%;"></col><col style="width: 46.2434%;"></col></colgroup><tbody><tr><td>**FUNCION con sus Inputs**</td><td>**Outputs**</td></tr><tr><td style="height: 29.6806px;">stop()</td><td style="height: 29.6806px;">para todas las funciones Alvik</td></tr><tr style="height: 46.4722px;"><td style="height: 46.4722px;">is\_on()</td><td style="height: 46.4722px;">true si esta encendido  
false si esta apagado</td></tr><tr style="height: 29.6806px;"><td style="height: 29.6806px;">is\_target\_reached()</td><td style="height: 29.6806px;">true si ha enviado M o R en el mensaje</td></tr><tr><td>get\_ack()</td><td>last\_ack: el valor del último mensaje</td></tr><tr style="height: 29.6806px;"><td style="height: 29.6806px;">stop()</td><td style="height: 29.6806px;">para todas las funciones Alvik</td></tr><tr style="height: 29.6806px;"><td style="height: 29.6806px;">get\_orientation()</td><td style="height: 29.6806px;">r: valor de balanceo p: valor de cabeceo y: valor de guiñada</td></tr><tr style="height: 29.6806px;"><td style="height: 29.6806px;">get\_accelerations()

ver uso en   
[https://libros.catedu.es/books/arduino-alvik/page/programas-de-ejemplo](https://libros.catedu.es/books/arduino-alvik/page/programas-de-test)

</td><td style="height: 29.6806px;">ax  
ay  
az</td></tr><tr style="height: 29.6806px;"><td style="height: 29.6806px;">get\_gyros()  
  
ver uso en   
[https://libros.catedu.es/books/arduino-alvik/page/programas-de-ejemplo](https://libros.catedu.es/books/arduino-alvik/page/programas-de-test)

</td><td style="height: 29.6806px;">gx  
by  
gz</td></tr><tr style="height: 29.6806px;"><td style="height: 29.6806px;">get\_imu()</td><td style="height: 29.6806px;">las 6 anteriores</td></tr><tr style="height: 29.6806px;"><td style="height: 29.6806px;">get\_line\_sensors()</td><td style="height: 29.6806px;">left  
center

right

</td></tr><tr style="height: 29.6806px;"><td style="height: 29.6806px;">brake()</td><td style="height: 29.6806px;">Frena el robot</td></tr><tr><td>get\_battery\_charge()</td><td>battery\_soc: el % de la batería</td></tr><tr><td>get\_touch\_any()</td><td>touch\_any es true si se ha apretado cualquier botón</td></tr><tr><td>get\_touch\_ok()   
get\_touch\_cancel()   
get\_touch\_center()  
get\_touch\_up()  
get\_touch\_left()  
get\_touch\_down()  
get\_touch\_right()  
</td><td>touch\_ok es true si se ha apretado ok etc...

ver ejemplos en

[https://libros.catedu.es/books/arduino-alvik/page/robotica-para-infantil](https://libros.catedu.es/books/arduino-alvik/page/robotica-para-infantil)

y en

[https://libros.catedu.es/books/arduino-alvik/page/mensajes-a-telegram](https://libros.catedu.es/books/arduino-alvik/page/mensajes-a-telegram)

</td></tr><tr><td>get\_color\_raw()  
get\_color\_label()  
</td><td>color</td></tr><tr><td>get\_version()  
print\_status()  
</td><td>versión del firmware  
para actualizarlo ver [https://docs.arduino.cc/tutorials/alvik/user-manual/#how-to-upload-firmware](https://docs.arduino.cc/tutorials/alvik/user-manual/#how-to-upload-firmware)

</td></tr><tr><td>set\_behaviour(behaviour: int)</td><td>  
</td></tr><tr><td>rotate(angle: float, unit: str = 'deg', blocking: bool = True)</td><td>  
</td></tr><tr><td>move(distance: float, unit: str = 'cm', blocking: bool = True)</td><td>  
</td></tr><tr><td>get\_wheels\_speed(unit: str = 'rpm')</td><td>left\_wheel\_speed: the speed value  
right\_wheel\_speed: the speed value</td></tr><tr><td>set\_wheels\_speed(left\_speed: float, right\_speed: float, unit: str = 'rpm')</td><td>  
</td></tr><tr><td>set\_wheels\_position(left\_angle: float, right\_angle: float, unit: str = 'deg')</td><td>  
</td></tr><tr><td>get\_wheels\_position(unit: str = 'deg')</td><td>angular\_velocity</td></tr><tr><td>drive(linear\_velocity: float, angular\_velocity: float, linear\_unit: str = 'cm/s',angular\_unit: str = 'deg/s')</td><td>  
</td></tr><tr><td>get\_drive\_speed(linear\_unit: str = 'cm/s', angular\_unit: str = 'deg/s')</td><td>linear\_velocity: speed of the robot.  
angular\_velocity: speed of the wheels.</td></tr><tr><td>reset\_pose(x: float, y: float, theta: float, distance\_unit: str = 'cm', angle\_unit: str = 'deg')</td><td>  
</td></tr><tr><td>get\_pose(distance\_unit: str = 'cm', angle\_unit: str = 'deg')</td><td>x  
y  
theta</td></tr><tr><td>set\_servo\_positions(a\_position: int, b\_position: int)</td><td>  
</td></tr><tr><td>set\_builtin\_led(value: bool)</td><td>  
</td></tr><tr><td>set\_illuminator(value: bool)</td><td>  
</td></tr><tr><td>color\_calibration(background: str = 'white')</td><td>  
</td></tr><tr><td>rgb2hsv(r: float, g: float, b: float)

</td><td>h: hue value  
s: saturation value  
v: brightness value</td></tr><tr><td>get\_color(color\_format: str = 'rgb')

</td><td>r or h  
g or s  
b or v</td></tr><tr><td>hsv2label(h, s, v)

</td><td>color label: like "BLACK" or "GREEN", if possible, otherwise return "UNDEFINED"  
</td></tr><tr><td>get\_distance(unit: str = 'cm')

</td><td>lee la distancia del sensor TOF:  
ver ejemplo en [https://libros.catedu.es/books/arduino-alvik/page/evita-obstaculos](https://libros.catedu.es/books/arduino-alvik/page/evita-obstaculos)  
  
left\_tof: 45° to the left object distance  
center\_left\_tof: 22° to the left object distance  
center\_tof: center object distance  
center\_right\_tof: 22° to the right object distance  
right\_tof: 45° to the right object distance  
</td></tr><tr><td>get\_distance\_top(unit: str = 'cm')

</td><td>top\_tof: 45° to the top object distance  
</td></tr><tr><td>get\_distance\_bottom(unit: str = 'cm')

</td><td>bottom\_tof: 45° to the bottom object distance  
</td></tr><tr><td>on\_touch\_ok\_pressed(callback: callable, args: tuple = ())

on\_touch\_cancel\_pressed(callback: callable, args: tuple = ())

on\_touch\_center\_pressed(callback: callable, args: tuple = ())

on\_touch\_up\_pressed(callback: callable, args: tuple = ())

on\_touch\_left\_pressed(callback: callable, args: tuple = ())

on\_touch\_down\_pressed(callback: callable, args: tuple = ())

on\_touch\_right\_pressed(callback: callable, args: tuple = ())

</td><td>He intentado hacer programas con estas instrucciones, pero una vez pulsado la tecla, sigue llamando a callback continuamente

No veo su utilidad teniendo get\_touch

</td></tr></tbody></table>

##### <span style="color: rgb(22, 145, 121);">**Unidades**</span>

- m: centimeters  
    mm: millimeters  
    m: meters  
    inch: inch, 2.54 cm  
    in: inch, 2.54 cm
- deg: degrees, example: 1.0 as reference for the other unit. 1 degree is 1/360 of a circle.  
    rad: radiant, example: 1 radiant is 180/pi deg.  
    rev: revolution, example: 1 rev is 360 deg.  
    revolution: same as rev  
    perc: percentage, example 1 perc is 3.6 deg.  
    %: same as perc
- 'cm/s': centimeters per second  
    'mm/s': millimeters per second  
    'm/s': meters per second  
    'inch/s': inch per second  
    'in/s': inch per second
- 'rpm': revolutions per minute, example: 1.0 as reference for the other unit.  
    'deg/s': degrees per second, example: 1.0 deg/s is 60.0 deg/min that is 1/6 rpm.  
    'rad/s': radiant per second, example: 1.0 rad/s is 60.0 rad/min that is 9.55 rpm.  
    'rev/s': revolution per second, example: 1.0 rev/s is 60.0 rev/min that is 60.0 rpm.

<p class="callout info">¿Qué es eso de **bloking**?  
Por ejemplo en rotate(angle: float, unit: str = 'deg', blocking: bool = True)  
  
Si es true, todos los eventos no influyen, es decir el microprocesador esta centrado en esa instrucción  
Si es falso, el microprocesador es libre de hacer otra cosa a la vez  
  
Utiliza true si quieres precisión o no quieres que nada interaccione con la acción que estas ejecutando</p>