Saltar al contenido principal

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 de Control de Movimiento con Pantalla Reachy Mini × XIAO

PlatformControllerSensorLanguage


Demostración​

AcciónRespuesta del robotPantalla
Inclinar la pantalla a la izquierda/derechaBalanceo del cuerpo + giro de la cabeza (izquierda/derecha)El kaomoji se inclina con la dirección
Inclinar la pantalla hacia adelante/atrásInclinación de la cabeza (asentir arriba/abajo)—
Pantalla mantenida quietaEl 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​

HardwareDescripción
Reachy Mini Wireless KitConectado por USB al PC
1.47 inch Touch Display — XIAO ESP32-S3 PlusSensor IMU LSM6DS3 integrado
PC (Windows)Python 3.11+
Cables USB-C ×2Uno 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
tip

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:

ArchivoPropósito
reachy_sway_screen/reachy_sway_screen.inoFirmware de la pantalla: lee la IMU + salida serie + dibuja el kaomoji
reachy_sync/sway_follow.pyPrograma de control principal: lee el puerto serie + controla el robot
reachy_sync/start_daemon.pyLanzador 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).

nota

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​

  1. Coloca la pantalla plana sobre una mesa (mantenla nivelada)
  2. Espera 2 segundos (la pantalla muestra hold neutral)
  3. Se auto-muestrea durante 0.5 segundos, guarda la posición neutra en la NVS (persiste tras apagar)
  4. Para recalibrar: envía la letra c a la pantalla mediante una herramienta serie (115200 baudios)
precaución

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!

tip

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ámetroValorDescripción
GAIN6.0Factor de amplificación de inclinación — más alto = más sensible
FILT0.25Coeficiente de filtro paso bajo — más bajo = más suave pero más lento
AMP0.7Amplitud máxima de salida (rad), ~40°
deadband0.008Zona muerta (rad), ignora inclinaciones por debajo de 0.5°

Parámetros del Lado del Robot​

ParámetroValorDescripción
HEAD_K0.40Ganancia de giro de cabeza (izquierda/derecha)
HEAD_PITCH_K0.65Ganancia de inclinación de cabeza (arriba/abajo)
Coeficientes de filtro0.22 / 0.22Filtro 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 FILT en 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 GAIN en 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​

ProblemaSolución
Izquierda/derecha invertidasInvierte el signo de tilt (tilt = -asinf(ax) en .ino)
Arriba/abajo invertidosInvierte el signo de pitch (pt = -asinf(ay) en .ino)

Dirección del Kaomoji Incorrecta​

ProblemaSolución
Ángulo de rotaciónModifica drawFigure(dyn + 1.5708f) — 1.5708 = 90°
Dirección de inclinación invertidaCambia 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​


Referencias​

Loading Comments...