Reachy Mini × Control de Movimiento con Pantalla XIAO
Combina el robot Reachy Mini con la pantalla táctil XIAO ESP32-S3 Plus: usando el sensor IMU integrado (LSM6DS3), al inclinar la pantalla se controla el balanceo del cuerpo del robot, el giro de la cabeza (yaw) y la inclinación de la cabeza (pitch).

Demostración
| Acción | Respuesta del robot | Pantalla |
|---|---|---|
| Inclinar la pantalla a la izquierda/derecha | Balanceo del cuerpo + giro de la cabeza (izquierda/derecha) | El kaomoji se inclina con la dirección |
| Inclinar la pantalla hacia adelante/atrás | Inclinación de la cabeza (asentir arriba/abajo) | — |
| Pantalla mantenida quieta | El robot permanece quieto (disparo manual) | El kaomoji vuelve al centro |
La pantalla muestra un kaomoji ≧∇≦, girado 90° en posición vertical, que se balancea con la dirección de inclinación. El patrón de visualización de la pantalla XIAO se puede personalizar: consulta el tutorial 1.47 inch Touch Display Getting Started para compilar y flashear tu propio patrón.
Hardware
| Hardware | Descripción |
|---|---|
| Reachy Mini Wireless Kit | Conectado por USB al PC |
| 1.47 inch Touch Display — XIAO ESP32-S3 Plus | Sensor IMU LSM6DS3 integrado |
| PC (Windows) | Python 3.11+ |
| Cables USB-C ×2 | Uno para la pantalla, otro para el robot |
Configuración de Software
Paso 1. Instalar Arduino CLI
Descarga e instala desde Arduino CLI Releases.
Paso 2. Instalar Soporte de Placa ESP32
arduino-cli config init
Edita ~/.arduino15/arduino-cli.yaml y añade la URL de la placa ESP32 bajo board_manager.additional_urls:
board_manager:
additional_urls:
- https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
Instala el core de ESP32:
arduino-cli core install esp32:esp32
Selecciona XIAO_ESP32S3_Plus como la placa objetivo (fqbn) para la pantalla.
Paso 3. Instalar la Biblioteca Seeed GFX
La visualización en pantalla depende de la biblioteca Seeed_GFX. Instálala desde GitHub en tu directorio de bibliotecas de Arduino.
Paso 4. Instalar Dependencias de Python
pip install reachy-mini pyserial numpy
Paso 1: Obtener el Código del Proyecto
git clone https://github.com/Genie-INSPIRE/reachy-mini-sway-screen.git
cd reachy-mini-sway-screen
Contenido del proyecto:
| Archivo | Propósito |
|---|---|
reachy_sway_screen/reachy_sway_screen.ino | Firmware de la pantalla: lee la IMU + salida serie + dibuja el kaomoji |
reachy_sync/sway_follow.py | Programa de control principal: lee el puerto serie + controla el robot |
reachy_sync/start_daemon.py | Lanzador del daemon de Reachy Mini |
Paso 2: Flashear el Firmware de la Pantalla
1. Encontrar el Puerto COM de la Pantalla
Conecta la pantalla por USB, abre el Administrador de dispositivos y encuentra el puerto COM USB-Serial/JTAG (VID 0x303A).
La pantalla se detecta automáticamente por VID, por lo que los cambios en el número de puerto COM no importan.
2. Compilar y Flashear
arduino-cli compile --fqbn esp32:esp32:XIAO_ESP32S3_Plus -u -p COM9 --warnings none reachy_sway_screen
Sustituye COM9 por el puerto COM real de tu pantalla.
3. Calibrar la Posición Neutra
- Coloca la pantalla plana sobre una mesa (mantenla nivelada)
- Espera 2 segundos (la pantalla muestra
hold neutral) - Se auto-muestrea durante 0.5 segundos, guarda la posición neutra en la NVS (persiste tras apagar)
- Para recalibrar: envía la letra
ca la pantalla mediante una herramienta serie (115200 baudios)
Debes calibrar la posición neutra en el primer uso o al cambiar de pantalla, de lo contrario los ángulos de inclinación serán incorrectos.
Paso 3: Iniciar el Daemon del Robot
1. Encontrar el Puerto COM del Robot
Conecta el robot por USB, encuentra el puerto COM del chip CH343 en el Administrador de dispositivos (VID 0x1A86).
2. Configurar el Puerto COM
Edita reachy_sync/start_daemon.py y cambia COM14 por el puerto COM real de tu robot:
# Open start_daemon.py in an editor, change COM14 to your actual port
3. Iniciar
cd reachy_sync
python -u start_daemon.py
Deberías ver Uvicorn running on http://127.0.0.1:8000 — ¡éxito!
Abre http://127.0.0.1:8000/ en un navegador para confirmar que el daemon está en ejecución.
Paso 4: Ejecutar el Programa de Control Principal
cd reachy_sync
python -u sway_follow.py
Deberías ver:
screen connected on COMx
connected
ready: L/R tilt -> body sway + head yaw. F/B tilt -> head pitch.
Inclina la pantalla y el robot seguirá el movimiento.
Cómo Funciona
Flujo de Datos
Screen IMU (LSM6DS3)
ax = left/right tilt, ay = forward/back tilt
tilt = -asinf(ax), pitch = -asinf(ay)
deadband filter + gain + low-pass filter
Serial output: "sway <value> pitch <value> rad" (115200 baud)
↓
Python (sway_follow.py)
Reads serial data
Two-stage low-pass filter (0.22)
Computes body_yaw, head yaw, head pitch
↓
Reachy Mini Daemon (port 8000)
set_target(body_yaw, antennas, head)
↓
Robot motors execute
Parámetros del Firmware de la Pantalla
| Parámetro | Valor | Descripción |
|---|---|---|
GAIN | 6.0 | Factor de amplificación de inclinación — más alto = más sensible |
FILT | 0.25 | Coeficiente de filtro paso bajo — más bajo = más suave pero más lento |
AMP | 0.7 | Amplitud máxima de salida (rad), ~40° |
deadband | 0.008 | Zona muerta (rad), ignora inclinaciones por debajo de 0.5° |
Parámetros del Lado del Robot
| Parámetro | Valor | Descripción |
|---|---|---|
HEAD_K | 0.40 | Ganancia de giro de cabeza (izquierda/derecha) |
HEAD_PITCH_K | 0.65 | Ganancia de inclinación de cabeza (arriba/abajo) |
| Coeficientes de filtro | 0.22 / 0.22 | Filtro paso bajo de dos etapas — más bajo = más suave |
Espejado de Antenas
Los dos motores de antena en Reachy Mini están montados en espejo:
- Antena derecha (índice 0): positivo = se inclina a la izquierda, negativo = se inclina a la derecha
- Antena izquierda (índice 1): positivo = se inclina a la derecha, negativo = se inclina a la izquierda
Para que ambas antenas se inclinen en la misma dirección, usa signos opuestos: resta para la derecha, suma para la izquierda.
Ajuste de Parámetros
Demasiado Lento en Responder
- Aumenta
FILTen la pantalla (p. ej. 0.25 → 0.30): filtrado más fuerte en el lado de la pantalla - Disminuye el coeficiente de filtro del lado del robot (p. ej. 0.22 → 0.15): respuesta más suave pero más lenta
Demasiado Lento / Requiere Grandes Inclinaciones
- Aumenta
GAINen la pantalla (p. ej. 6.0 → 8.0): pequeñas inclinaciones provocan movimientos mayores - Aumenta el coeficiente de filtro del lado del robot (p. ej. 0.22 → 0.30): respuesta más rápida
Dirección de la Cabeza Invertida
| Problema | Solución |
|---|---|
| Izquierda/derecha invertidas | Invierte el signo de tilt (tilt = -asinf(ax) en .ino) |
| Arriba/abajo invertidos | Invierte el signo de pitch (pt = -asinf(ay) en .ino) |
Dirección del Kaomoji Incorrecta
| Problema | Solución |
|---|---|
| Ángulo de rotación | Modifica drawFigure(dyn + 1.5708f) — 1.5708 = 90° |
| Dirección de inclinación invertida | Cambia dyn = kaoDev * 2.0f a dyn = -kaoDev * 2.0f |
Preguntas Frecuentes (FAQ)
P: ¿Qué hacer después de un corte de energía?
R: Reinicia el daemon (python start_daemon.py) y luego inicia sway_follow.py. El firmware de la pantalla y la calibración neutra se guardan en la NVS y no se perderán.
P: ¿El número de puerto COM cambió?
R: La pantalla se detecta automáticamente por VID (0x303A), no se necesita ningún cambio. Actualiza el puerto COM del robot en start_daemon.py.
P: ¿El robot no se mueve?
R: Comprueba si el daemon se está ejecutando en el puerto 8000 (abre http://127.0.0.1:8000/ en el navegador). Si no, reinicia el daemon.
P: ¿La pantalla no muestra nada o no envía datos?
R: Comprueba el cable USB, vuelve a flashear el firmware, usa una herramienta serie (115200 baudios) para verificar la salida sway ... pitch ... rad.
P: ¿La dirección de la cabeza está invertida?
R: Izquierda/derecha invertidas → invierte el signo en tilt = -asinf(ax) en el archivo .ino. Arriba/abajo invertidos → invierte el signo en pt = -asinf(ay).
Soporte Técnico
- Repositorio del Proyecto: GitHub
- Enviar Incidencia: Issues
- Foro: Seeed Studio Forum
- Comprar: Reachy Mini | XIAO 1.47'' Touch Display