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 musica 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 ademas 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

Como funcionan los beacons

Los beacons BLE transmiten paquetes de advertisement periodicos (tipicamente cada 100 a 1000 ms) con un payload corto. Disney usa codigos 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 patron de color.

Materiales

El corazon 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)
  • Bateria LiPo 3.7V de 500 a 1200 mAh
  • Modulo cargador LiPo con conector JST (si tu placa no integra carga)
  • Cable plano flexible de 4 hilos (1 metro) para llevar la senal a las orejas
  • Headers macho 2.54mm cortos
  • Diadema con orejas o cintillo (la base mecanica)
  • 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, asi que un solo pin de datos basta para animar los 7 colores.

Anillo NeoPixel Jewel de 7 LEDs RGB encendido con colores arcoiris

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

Codigo (scanner BLE mas animacion)

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 codigo es un esqueleto que tendras que adaptar observando el trafico 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 bateria. Que el switch de encendido quede accesible.
  2. Esconde el cable plano corriendolo por dentro del forro del cintillo hasta cada oreja.
  3. Pega los anillos NeoPixel detras de un circulo de tela traslucida 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 tambien fuera del parque, programa varios modos seleccionables con un boton corto:

  • Modo arcoiris.
  • Modo respiracion (fade suave de brillo).
  • Modo musica (reactivo a un microfono, 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 microfono I2S y mapea el nivel de audio al brillo para que las orejas "bailen" con la musica del show.
  • Mas LEDs por oreja: si reemplazas el Jewel de 7 por un anillo de 12 o 16 LEDs, vas a ganar resolucion para animaciones mas finas. Recuerda subir la capacidad de la bateria, porque el consumo crece con cada LED.

Personalizacion 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 senal 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 bateria LiPo se consiguen segun disponibilidad; revisa la tienda para ver el stock vigente. Si el tutorial original usa una placa Adafruit especifica, la QT Py ESP32 S3 del catalogo cumple la misma funcion de scanner BLE.

Autonomia

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 mas un desfile. Es un wearable BLE con utilidad real para los fanaticos del parque.

Recursos

Version chilena con componentes en stock local en MechatronicStore.