Introducción

Qué es Arduino Alvik

3-411-796-2950742771.png

Es un robot con las siguientes características :

datasheet_connectors.png

prj-00-robot-illustration.webp
prj-00-components.webp
Licencia CC-BY-NC-SA origen https://courses.arduino.cc/explore-robotics-micropython/lessons/getting-started/

Programas predefinidos

select-examples.gif

Licencia CC-BY-NC-SA origen https://courses.arduino.cc/explore-robotics-micropython/lessons/getting-started/

Cosas curiosas: A diferencia del típico sensor a distancia SR-04 que funciona por ultrasonidos, el VL53L7CX es mucho más complejo, va por luz (no realiza imágenes, sino por difracción de la luz por lo tanto respeta la privacidad) y nos proporciona muchas más distancia que las cinco que nos da la API

Instalar Micropython

Conceptos previos:
- 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

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

¿Dónde se compila Micropython?

Como puedes ver en este vídeo en 21:20 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
Fuente  vídeo Exploring the Arduino Nano ESP32 | MicroPython & IoT

¿Y a mi qué más me da?

No, para nada, si programas ESP32 con Arduino IDE o Arduino Cloud (que está basado en C++) te has cargado el compilador Python del ESP32 luego si quieres programar en Python, tienes que instalar el compilador dentro del ESP32 (y da problemas, ver Modo Bootloader)

¿Cómo meto el compilador MicroPython dentro del ESP32?

Para meter el programa compilador de MicroPython dentro del ESP32 (cuando un programa se instala en un hardware entonces se llama firmware)  tenemos que

  1. Poner la placa en modo bootloader (ver página siguiente)
  2. Instalar micropython en el ESP32 con el programa Arduino Micropython Installer de esta página https://labs.arduino.cc/en/labs/micropython-installer
MicroPython Installer

Descargamos el programa y ejecutamos teniendo conectado el ESP32 del Alvik, (no hace falta encender el robot, pues sólo trabajamos con el ESP32) lo detecta y simplemente le damos a Instalar Micropython dentro del chip

2024-07-04 19_17_33-MicroPython Installer.png

¿Y al revés pasar de Micropython a ArduinoIDE hay problemas?

Pues al revés, si  ejecutamos Arduino IDE, da error, pues el compilador microPython instalado dentro del ESP32 impide que se ejecuten los programas de Arduino IDE (sale el error No DFU capable USB device available Failed uploading: uploading error: exist status 74) se soluciona tan sencillo como volver a poner el ESP32 en modo Bootloader 

¿Y si me paso de Arduino IDE a Micropython?

Pues vuelve a 

  1. Poner la placa en modo bootloader
  2. Instalar micropython en el ESP32 con el programa Arduino Micropython Installer
¿Y con esto ya puedo crear mis programas con Micropython?

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

Arduino Lab for Micropython

El lenguaje de programación más idóneo para el Arduino Alvik es el MICROPYTHON, de momento Arduino Alvik no esta disponible en programación con bloques. Al ser hardware libre, si se convierte popular, no es de extrañar que lo incorporen los diferentes programadores de entornos de lenguaje en bloques para ser más accesible a niveles educativos de primaria.

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

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

Ahora, apagamos Arduino Alvik

robot-on.webp
Licencia CC-BY-NC-SA origen https://courses.arduino.cc/explore-robotics-micropython/lessons/getting-started/

Luego lo conectamos por cable

connecting-final.gif
Licencia CC-BY-NC-SA origen https://courses.arduino.cc/explore-robotics-micropython/lessons/getting-started/

Lo encendemos

robot-on.webp
Licencia CC-BY-NC-SA origen https://courses.arduino.cc/explore-robotics-micropython/lessons/getting-started/

Ejecutamos el programa que hemos descomprimido:

2024-07-04 10_00_12-Arduino.Lab.for.MicroPython-win_x64.png

Al ejecutar el programa, le podemos dar al botón de conectar con la placa y veremos que se comunica correctamente con el compilador instalado dentro del chip

2024-07-04 19_28_26-Editing Page Hola mundo _ Librería CATEDU.png

Modo Bootloader

¿Qué es eso del Boodloader? Es un pequeño programa que esta en el microcontrolador (Arduino, ESP32, etc...) que permite que arranque la placa y espere las instrucciones del programa del usuario, digamos que es como un "pequeño sistema operativo de arranque" por ejemplo en el Arduino, se ejecuta en un poco de tiempo cuando arranca la placa o se resetea, y espera el programa IDE por el puerto USB, si llega (él comprueba que es un IDE y no otra cosa) lo almacena en un sitio de la memoria Flash y lo ejecuta, sino, pues ejecuta el que ya esta cargado. El bootloader hace que parpadee el led 13 de un Arduino UNO y se reserva un trozo de memoria para el Bootloader (en el Arduino UNO ocupa sólo 0.5K de los 32K que tiene disponibles el micro para ello). En nuestro caso el ESP32 Nano Arduino igual pero cuando cargamos el micropython nos cargamos ese bootloader por otro que tiene el compilador microPython. Lo de "quemar" o "flashear" el bootlader nos lo podemos encontrar en los cursos de Aularagón en el Zigbee de domótica con Raspberry, o a la hora de quemar el Nano Arduino como Arduino UNO en el curso de mClon

Problema

Cuando instalamos Micropython desde un ESP32 ya formateado con Arduino IDE o al revés hay problemas

2024-07-11 20_01_25-Microsoft PowerPoint - [Presentación1].png

Mensajes que aparecen :

Solución: Resetear el Arduino Bootloader en el Nano ESP32

Al poner el ESP32 en modo Bootloader, se tiene que poner el led en color PURPURA

¿Poner la placa en modo Bootloader?

Aquí te exponemos varios métodos, por nuestra experiencia el método 3 es el que funciona

METODO 1 DOS CLIKS EN RESET

Haz dos cliks rápidos en el botón del ESP32 :2024-07-04 11_50_10-(1) dfu-util_ No DFU capable USB device available [Solved] - YouTube.png
Extraído del vídeo Cómo solucionar el error dfu-util: No DFU capable USB device available Failed uploading: uploading error: exist status 74

METODO 2 CORTOCIRCUITAR GND Y B1

Otra alternativa para ponerlo en modo bootloader es unir los pines GND con B1 (y se enciende el led RGB en verde, el porqué se pone en verde en Parpadeo led

2024-07-11 20_11_20-Exploring the Arduino Nano ESP32 _ MicroPython & IoT Cloud - YouTube.png

Fuente  vídeo Exploring the Arduino Nano ESP32 | MicroPython & IoT en el 25:12

Yo lo hago con un destornillador y toco las dos puntas, con cuidado de no tocar nada más.

Curiosidad: ¿Por qué al poner la placa en modo Bootloader o cada vez que enciendo Arduino Alvik se enciende y se apaga el led RGB de al lado con los colores Rojo y Verde? Solución en Parpadeo led

METODO 3 RESETEO BOOTLOADER

Tal y como dice en esta página :

  1. Hacer método 2 cortocircuitar B1 y GND
  2. Mientras esta cortocircuitado PULSA EL BOTÓN RESET
  3. Se queda el led en color púrpura,
    1.  si vas a instalar MicroPython, instalalo y sáltate los siguientes pasos
    2. Si vas a instalar Arduino IDE o trabajar con Arduino Cloud contínua :
  4. Abrir el programa ARDUINO IDE (cerrar otros, como el Arduino create agent que se queda en segundo plano abajo a la derecha , el MicroPython Installer....)
  5. Asegurarse que esta instalado la placa Arduino ESP32 correctamente al menos la versión 2.013 (ir a Tools-Boards-BoardManager) si hay una versión anterior, desinstalar el que hay (remove) e instalarlo de nuevo.
  6. Ir a Tools-Port y seleccionar el puerto 
  7. Ir a Tools > Board - Arduino ESP32 Boards > Arduino Nano ESP32 (o esp32 > Arduino Nano ESP32 )
  8. Poner Tools-> Programmer- seleccionar ESPTOOL
  9. Sketch > Upload Using Programmer 
  10. Cuando salga este mensaje pasar al paso 11

    Leaving...
    Hard resetting via RTS pin...
  11. Apretar el botón RESET y ya puedes o ejecutar un programa en Arduino IDE o instalar MicroPython

Capturas de pantalla :

Paso 4: Cerrar Arduino create agent
image.png

Paso 5

2024-07-11 20_23_19-Configuración.png

Pasos 6 - 7 - 8
2024-07-11 20_22_12-.png

Paso 9
2024-07-11 20_27_00-.png

Hola mundo

En el programa Arduino Lab for MicroPython ponemos este programa:

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/

Pulsamos a conectar, nos pregunta por el puerto

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

Brush up MicroPython

Brush up = repasar, refrescar. Con esta página NO se quiere realizar un curso de MicroPython pues excede de los propósitos del curso, pero sí una visión rápida de las diferentes instrucciones que se dan en el curso.
Este repaso es inspirado en el tutorial MicroPython Basics autora Francesca Sanfilippo & Karl Söderby

Lo básico

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

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:

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

Aquí se utiliza

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

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

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

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

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

Con esto ya podemos avanzar, pero si quieres

Curso completo de Python desde 0 Ver
Curso de Python desde 0 Ver
Manual de referencia Python Ver
Programación en Python Ver
Trabajando con ficheros en Python Ver
Programación orientada a objeto en Python Ver

Agradecimientos a Pere Manel http://peremanelv.com

 

Arduino Alvik API

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

alvik = ArduinoAlvik()
alvik.begin()

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

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 

FUNCION con sus Inputs Outputs
stop() para todas las funciones Alvik
is_on() true si esta encendido
false si esta apagado
is_target_reached() true si ha enviado M o R en el mensaje
get_ack() last_ack: el valor del último mensaje
stop() para todas las funciones Alvik
get_orientation() r: valor de balanceo p: valor de cabeceo y: valor de guiñada

get_accelerations()

 

ver uso en
https://libros.catedu.es/books/arduino-alvik/page/programas-de-ejemplo

ax
ay
az

get_gyros()

ver uso en
https://libros.catedu.es/books/arduino-alvik/page/programas-de-ejemplo

 

gx
by
gz
get_imu() las 6 anteriores
get_line_sensors()

left
center

right

brake() Frena el robot
get_battery_charge() battery_soc: el % de la batería
get_touch_any() touch_any es true si se ha apretado cualquier botón
get_touch_ok()
get_touch_cancel() 
get_touch_center()
get_touch_up()
get_touch_left()
get_touch_down()
get_touch_right()

touch_ok es true si se ha apretado ok etc...

 

ver ejemplos en

https://libros.catedu.es/books/arduino-alvik/page/robotica-para-infantil

y en 

https://libros.catedu.es/books/arduino-alvik/page/mensajes-a-telegram


get_color_raw()
get_color_label()
color
get_version()
print_status()

versión del firmware
para actualizarlo ver https://docs.arduino.cc/tutorials/alvik/user-manual/#how-to-upload-firmware

 

set_behaviour(behaviour: int)
rotate(angle: float, unit: str = 'deg', blocking: bool = True)
move(distance: float, unit: str = 'cm', blocking: bool = True)
get_wheels_speed(unit: str = 'rpm') left_wheel_speed: the speed value
right_wheel_speed: the speed value
set_wheels_speed(left_speed: float, right_speed: float, unit: str = 'rpm')
set_wheels_position(left_angle: float, right_angle: float, unit: str = 'deg')
get_wheels_position(unit: str = 'deg') angular_velocity
drive(linear_velocity: float, angular_velocity: float, linear_unit: str = 'cm/s',angular_unit: str = 'deg/s')
get_drive_speed(linear_unit: str = 'cm/s', angular_unit: str = 'deg/s') linear_velocity: speed of the robot.
angular_velocity: speed of the wheels.
reset_pose(x: float, y: float, theta: float, distance_unit: str = 'cm', angle_unit: str = 'deg')
get_pose(distance_unit: str = 'cm', angle_unit: str = 'deg') x
y
theta
set_servo_positions(a_position: int, b_position: int)
set_builtin_led(value: bool)
set_illuminator(value: bool)
color_calibration(background: str = 'white')

rgb2hsv(r: float, g: float, b: float)

h: hue value
s: saturation value
v: brightness value

get_color(color_format: str = 'rgb')

r or h
g or s
b or v

hsv2label(h, s, v)

color label: like "BLACK" or "GREEN", if possible, otherwise return "UNDEFINED"

get_distance(unit: str = 'cm')

lee la distancia del sensor TOF:
ver ejemplo en 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

get_distance_top(unit: str = 'cm')

top_tof: 45° to the top object distance

get_distance_bottom(unit: str = 'cm')

bottom_tof: 45° to the bottom object distance

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



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

Unidades

¿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