Orejas que se prenden con la magia

En los parques Disney hay zonas (especialmente durante shows nocturnos y desfiles) donde se emiten beacons Bluetooth Low Energy que las orejas oficiales "Made With Magic" usan para sincronizar colores con la música y los fuegos artificiales. Es una experiencia inmersiva muy bien lograda.

Orejas con NeoPixel iluminadas durante un show nocturno en un parque Disney

Con una placa ESP32 S3 puedes escanear esos beacons por tu cuenta y replicar el efecto en tus propias orejas usando un anillo NeoPixel de 7 LEDs por lado. Sin pagar las oficiales y con la libertad de hackear los colores, los patrones y los disparadores. El proyecto original de Adafruit suma además un control remoto opcional armado sobre una placa CLUE con nRF52840, un segundo dispositivo que dispara animaciones a distancia. Para empezar no lo necesitas: las orejas funcionan solas escuchando los beacons del parque.

Orejas terminadas con los anillos NeoPixel montados y el control remoto azul a un costado

Cómo funcionan los beacons

Los beacons BLE transmiten paquetes de advertisement periódicos (típicamente cada 100 a 1000 ms) con un payload corto. Disney usa códigos que identifican la zona y el "evento" actual. Tu hardware solo necesita:

  1. Estar en modo scanner BLE pasivo (no se conecta, solo escucha).
  2. Filtrar los advertisements por UUID conocido o por manufacturer data.
  3. Mapear el contenido del paquete a un patrón de color.

Materiales

El corazón del montaje es la placa QT Py ESP32 S3, una placa diminuta con BLE y conector USB C que cabe perfecto dentro del cintillo.

Placa QT Py ESP32 S3 con conector USB C y pads castellados

  • Placa ESP32 S3 con BLE (QT Py ESP32 S3 o ESP32 C3 SuperMini)
  • 2 anillos NeoPixel de 7 LEDs tipo Jewel (uno por oreja)
  • Batería LiPo 3.7V de 500 a 1200 mAh
  • Módulo cargador LiPo con conector JST (si tu placa no integra carga)
  • Cable plano flexible de 4 hilos (1 metro) para llevar la señal a las orejas
  • Headers macho 2.54mm cortos
  • Diadema con orejas o cintillo (la base mecánica)
  • Hilo conductor, aguja, silicona caliente

El anillo NeoPixel Jewel trae los 7 LEDs RGB direccionables que dan el efecto. Cada LED se controla de forma individual, así que un solo pin de datos basta para animar los 7 colores.

Anillo NeoPixel Jewel de 7 LEDs RGB encendido con colores arcoíris

Esquema

Código
ESP32 S3  =>  GPIO5  =>  Datos NeoPixel oreja izquierda (7 LED)
ESP32 S3  =>  GPIO6  =>  Datos NeoPixel oreja derecha (7 LED)
GND y 3.3V compartidos entre ambos anillos
Bateria LiPo conectada al JST de la placa

Una sola placa controla las dos orejas. El cable plano de 4 hilos lleva VCC, GND, DATA izquierda y DATA derecha por debajo del cintillo. Justamente ese cable de silicona flexible es el que mejor resiste el movimiento constante de la cabeza sin fatigarse.

Cable plano flexible de 4 hilos enrollado, listo para pasar por el cintillo

Código (scanner BLE más animación)

Python
import time
import board
import neopixel
from adafruit_ble import BLERadio
from adafruit_ble.advertising import Advertisement

izq = neopixel.NeoPixel(board.D5, 7, brightness=0.5, auto_write=False)
der = neopixel.NeoPixel(board.D6, 7, brightness=0.5, auto_write=False)

ble = BLERadio()

UUID_DISNEY = b"\xfd\x6f"  # placeholder, depende del beacon

def pintar(color):
    izq.fill(color)
    der.fill(color)
    izq.show()
    der.show()

while True:
    found = False
    for adv in ble.start_scan(Advertisement, timeout=1):
        # Si el manufacturer data contiene tu UUID conocido
        if UUID_DISNEY in (adv.manufacturer_specific_data or b""):
            # Decodifica el byte de "escena" del payload
            escena = adv.manufacturer_specific_data[-1]
            if escena % 3 == 0:
                pintar((255, 0, 0))
            elif escena % 3 == 1:
                pintar((0, 255, 0))
            else:
                pintar((0, 0, 255))
            found = True
            break
    ble.stop_scan()
    if not found:
        pintar((20, 20, 60))  # color por defecto: azul tenue
    time.sleep(0.1)

Nota legal: este proyecto es para uso personal y educativo. Los UUIDs y los formatos exactos de los beacons no se publican de forma oficial; este código es un esqueleto que tendrás que adaptar observando el tráfico BLE con apps como nRF Connect.

Montaje en el cintillo

  1. Cose una bolsita en la parte trasera del cintillo para la placa y la batería. Que el switch de encendido quede accesible.
  2. Esconde el cable plano corriéndolo por dentro del forro del cintillo hasta cada oreja.
  3. Pega los anillos NeoPixel detrás de un círculo de tela traslúcida o de filamento PETG blanco que difunda la luz.
  4. Sella las soldaduras con silicona caliente para que no se cortocircuiten al moverse.

Modo sin beacons

Para que las orejas se vean bien también fuera del parque, programa varios modos seleccionables con un botón corto:

  • Modo arcoíris.
  • Modo respiración (fade suave de brillo).
  • Modo música (reactivo a un micrófono, si lo agregas).
  • Modo beacons (el principal).

Variantes y mejoras

  • Control remoto a distancia: el proyecto original suma una placa CLUE con nRF52840 como mando que dispara las animaciones por BLE. Si quieres ese control aparte, replica el firmware del remoto en una segunda placa.
  • Reactivo al sonido: agrega un micrófono I2S y mapea el nivel de audio al brillo para que las orejas "bailen" con la música del show.
  • Más LEDs por oreja: si reemplazas el Jewel de 7 por un anillo de 12 o 16 LEDs, vas a ganar resolución para animaciones más finas. Recuerda subir la capacidad de la batería, porque el consumo crece con cada LED.

Personalización para Chile

En MechatronicStore consigues los componentes principales con stock local:

  • Placa QT Py ESP32 S3 (SKU GS1-3): la placa con BLE que escucha los beacons.
  • Cable paralelo flexible 24 AWG (SKU V-109_5): para llevar la señal hasta cada oreja.
  • Headers macho 2.54mm (SKU GI5-3): para las conexiones del anillo y la placa.

El anillo NeoPixel Jewel de 7 LEDs y la batería LiPo se consiguen según disponibilidad; revisa la tienda para ver el stock vigente. Si el tutorial original usa una placa Adafruit específica, la QT Py ESP32 S3 del catálogo cumple la misma función de scanner BLE.

Autonomía

Con escaneo BLE constante y los 14 LEDs encendidos al 50% de brillo, una LiPo de 1200 mAh dura unas 4 a 5 horas. Suficiente para un show más un desfile. Es un wearable BLE con utilidad real para los fanáticos del parque.

Recursos

Versión chilena con componentes en stock local en MechatronicStore.