Bombeamos Ikea: cómo convertir música ligera en Big Brother


Introducción


Ikea es una tienda curiosa. Incluso si entró con la intención de comprar una cosa específica y no distraerse con el resto de la basura, entonces saldrá comprando tres veces más de lo necesario. Para nosotros, los hackers, este efecto es especialmente evidente en el departamento de Ikea con cables de alimentación o baterías.

Para mí, el último caso de tal locura ocurrió en los Países Bajos. Estaba en un viaje planeado, planeando pasar solo unas pocas semanas en el país. Sin embargo, esto fue a principios de 2020 y el desastre con COVID-19 ... tuve que permanecer lejos de mi laboratorio mucho más tiempo.

Y cuando vi la línea de productos electrónicos de Frekevens en Ikea , no pude evitarlo y lo compré todo.

Para aquellos que no saben: la línea Ikea Frekvens debería convertirse en un análogo moderno del equipo de alta fidelidad de la vieja escuela más el equipo de música de luz hexagonal, que parece estar en los hogares de la mitad de los adolescentes de los 90. En este caso, la línea de dispositivos conectados entre sí consiste en un altavoz Bluetooth para salida de sonido y un proyector LED (complementado por varias boquillas) que parpadean al ritmo de la música, así como una pantalla de cubo LED que puede mostrar animaciones que también se mueven a la música. Ikea se jacta de que esta línea se desarrolló en conjunto con Teenage Engineering, conocida por su serie Pocket Operator de sintetizadores portátiles de "juguete".


Como se muestra en el video promocional de Ikea, la compra finalizada de docenas de dispositivos debería verse como un insoportable carnaval parpadeante, que a mi adolescente de 15 años no le importaría organizar en su habitación.

Estaba particularmente interesado en la pantalla LED de cubo: es un dispositivo integrado de alta calidad que funciona en la red eléctrica. En el panel frontal hay una matriz de 16 filas y 16 columnas de LED blancos muy brillantes, es decir, un total de 256 LED. Las animaciones integradas en el dispositivo eran bastante simples, pero me llevaron a la idea de que el hierro puede controlar cada LED de forma individual. Sin embargo, debido a esto, la caja pequeña era bastante cara: mi bolsillo estaba vacío por unos 40 euros. Por esta cantidad, obtienes una caja con LED y un cable de alimentación. Dado que se supone que debe comprar este producto junto con otros productos Frekvens, también recibirá elementos de conexión adicionales: un cable de alimentación de extensión para el suministro de energía de extremo a extremo de la red a otras cajas,así como un conjunto de tornillos y almohadillas de plástico con los que puede sujetar mecánicamente la carcasa entre sí.

Tan pronto como llegué a casa, conecté el dispositivo y ... para ser honesto, me decepcionó un poco lo que hicieron con la plancha. El dispositivo tenía varias animaciones que podían seleccionarse presionando un botón en la parte posterior de la carcasa; se instala un pequeño micrófono en la carcasa; cada vez que reconoce el ruido, cambia el marco de la animación. Las animaciones no son muy interesantes: consisten en solo cuatro o cinco cuadros, y los cuadros en sí son solo en blanco y negro, sin sombras de gris. Si tienes curiosidad, grabé un video corto con todas las animaciones.

Obviamente, esto no me convenía. Pirateemos el dispositivo: veamos qué lo hace funcionar y si es posible hacer que su comportamiento sea un poco más interesante.

Autopsia


Para desmontar Frekvens, un destornillador para una ranura en forma de cruz y, posiblemente, un cuchillo serán suficientes. También necesitará una parte sólida de perseverancia, porque el dispositivo no es fácil de entender: el diseño es complicado y algunos elementos están llenos de silicona, probablemente para eliminar las vibraciones y simplificar la fabricación.


El desmontaje del caso Frekvens comienza desde atrás. La carcasa tiene orificios para tornillos en todos los lados, a excepción del frente; Gracias al juego de tornillos y cubiertas del kit del dispositivo, se puede conectar a otros dispositivos Frekvens. Sin embargo, los agujeros traseros para los tornillos son un poco más profundos y debajo de ellos hay tornillos que aseguran la carcasa.


Después de quitar la tapa posterior, vemos que todos los orificios de los tornillos tienen insertos metálicos roscados en los que se pueden atornillar los tornillos. ¡Guauu! Esto debería proporcionar a los agujeros un margen de seguridad suficiente. Es posible que esto complique en gran medida la producción o el desmontaje; esto último se complica por el hecho de que primero necesitamos cortar las gotas de compuesto de silicona endurecido.


Los insertos están realmente sujetos con otros insertos de plástico; necesitan ser removidos primero.

No tengo otras fotos del proceso de desmontaje, pero después de esta etapa verá cuatro tornillos que deben desenroscarse, y luego el proceso continúa como antes. Comprenda qué pieza de plástico mantiene unido todo lo demás, corte el compuesto de silicona, retire los sujetadores de plástico. Continúe hasta que pueda sacar la placa de circuito.


Aquí está: el reverso de la placa de circuito. Resultó que está ensamblado a partir de dos placas de circuito impreso: la blanca tiene dos lados: en la parte posterior están todos los controladores de LED (y otra placa está unida a ella), y en la parte frontal están los LED.

La placa de circuito blanca está diseñada bastante bien: en lugar de una matriz de LED, hay 16 controladores de LED SCT2024trabajando desde una corriente continua. Estos controladores LED tienen 16 canales, es decir, cada LED se controla directamente. Los controladores de LED solo pueden encender o apagar completamente los LED; los controladores en sí no tienen soporte nativo en escala de grises. De hecho, realizan el cambio de registro utilizando salidas controladas por corriente, y todos cambian secuencialmente; La interfaz de conexión de PCB verde consta de su bus de sincronización y datos, una línea de habilitación instantánea, una línea de habilitación de salida, tierra y alimentación.

En este tablero verde está el pequeño cerebro del dispositivo: un microcontrolador, cuyo artículo no se puede encontrar en Google, y un amplificador operacional para el micrófono. Curiosamente, hay indicios de que el dispositivo debería tener más funciones: hay un lugar para, presumiblemente, I2C EEPROM 24Cxx y una sugerencia de que en el proyecto original había un receptor IR en el panel frontal. ¿Quizás se suponía que el dispositivo vendría con un control remoto que le permite crear sus propios patrones? Esto puede explicar que las animaciones existentes se vean tan aburridas.


En la parte frontal de la pizarra están todos los LED. También se suelda un pequeño micrófono plano. Al principio pensé que estaba soldado al tablero verde y sobresale por el agujero en el tablero blanco, pero de hecho es plano.


Todos los demás componentes electrónicos se encuentran en la parte posterior del tablero. No es suficiente allí: solo una fuente de alimentación bajo la marca Ikea, emitiendo 4 V. Debajo de la fuente de alimentación hay una pequeña placa de circuito impreso en la que hay dos interruptores táctiles para los botones en la parte posterior de la caja.

Entonces, si queremos "optimizar" el diseño, entonces tenemos una debilidad obvia: es mejor reemplazar una pequeña tarjeta verde con un procesador con algo más potente.

Modificamos hierro


Pensé que podría ser posible reemplazar el equipo con una ESP-Cam. Esta es una placa muy barata (más o menos 10 euros) con un chip ESP32 WiFi / BT, varios megabytes de PSRAM y un módulo de cámara. No estoy muy interesado en la música ligera, quería que el dispositivo respondiera a algo visual. Como ya había un agujero en la parte frontal del receptor, pensé que podría usarlo debajo de la cámara. También tendré que hacer un agujero en la pizarra donde se encuentra el micrófono; Afortunadamente, además de estas pistas de micrófono ahora inútiles, esto destruirá solo una pista del LED. Perforé un agujero y restauré la pista. Temporalmente volviendo a colocar la placa en su lugar y encendiendo el cubo, me aseguré de que todos los LED sigan funcionando.


Ahora tenía una placa con un agujero perforado, y solo podía conectar y conectar mecánicamente la ESP-Cam. Los diseñadores indicaron amablemente el propósito de todas las almohadillas en la serigrafía del tablero verde, por lo que casi no tuve que adivinar nada. Como la fuente de alimentación suministra solo 4 V, la conecté directamente a la entrada de 3,3 V del chip ESP-CAM. Tenía que hacer esto, porque cuando lo conecté al pin Vin 5V, el chip no quería comenzar ... Lo más probable es que el regulador LDO tenga una caída de voltaje ligeramente alta. Volviendo atrás, ahora creo que valió la pena intentar conectar el diodo en serie con una fuente de 4 V para obtener 3.3-3.4 V, pero mi solución funcionó; ESP32 es bastante modesto.


Soldando todos los conectores, tuve que lidiar con la mecánica de todos modos. Fue un proyecto "rápido y sucio", y ya había soldado los conectores ESP-Cam antes, así que para alinear la cámara con el orificio, podría hacerlo con varias juntas y mucho epóxico.


Después de esta operación, el último problema persistía: los LED junto a la cámara brillaban en su ventana de marco, causando todo tipo de artefactos extraños. En primer lugar, para eliminarlos, corté un pequeño bisel de una cinta de aluminio para proteger la cámara de la luz directa.


El segundo paso fue la aplicación de pintura acrílica. Este es un inserto de plástico en el que se encuentran todos los difusores, a través del cual brillan los LED. Ya agrandé el orificio que tenía para el micrófono para crear una ventana de marco más amplio para la cámara, pero esto condujo a otro problema: el orificio era demasiado notable y demasiada luz difusa cayó sobre la cámara. Una mancha de pintura acrílica negra funcionó bastante bien en ambos temas; la cámara aún recibía mucha luz de los LED, pero ahora no la inundaba por completo.

Entonces, el trasplante de cerebro está completo y el cuerpo está listo para el ensamblaje. Puedes iniciar el software.

Software


Pasemos al software. En primer lugar, necesitamos controlar los controladores LED. Esto no es difícil: las señales del controlador son casi directamente consistentes con la interfaz periférica SPI del chip ESP32: la almohadilla CLK en la placa se conecta a la interfaz CLK periférica SPI, la almohadilla DA en la placa se conecta al MOSI de la señal SPI. Esto le permitirá sincronizar 256 bits con una cadena de controladores LED: cada bit sincronizado controla el encendido o apagado del LED correspondiente. Además, hay una entrada LAK. Si la señal es baja, entonces el LED conserva su valor anterior, independientemente de lo que se transfirió a los registros de desplazamiento; Si la señal es alta, todos ellos cambian simultáneamente a los valores que están actualmente en el registro de desplazamiento. Finalmente, hay una entrada EN que enciende o apaga todos los LED;No lo conecté a GPIO y siempre enciendo los LED mediante programación.

Por lo tanto, ahora puedo encender y apagar LED individuales, obteniendo una pantalla en blanco y negro. Sin embargo, necesito algo más. Con suficiente potencia informática, la pantalla también debe ser capaz de mostrar tonos de gris; para esto, solo necesita encender / apagar los LED más rápido de lo que el ojo ve.

Para implementar esto con un solo LED, generalmente uso PWM, pero en el caso de 256 LED, esto ocupará una parte significativa de la potencia del procesador ESP32. Entonces, en cambio, decidí usar la Modulación de Código Binario (también llamada Modulación de ángulo de bit). Esta es una técnica que le permite obtener tonos de gris con menos potencia de CPU. Ya lo he usado con éxito en otros proyectos , así que estaba seguro de que funcionaría.


Y funcionó. También agregué una tabla de búsqueda para convertir la claridad CIE a PWM , porque el ojo responde esencialmente al brillo de los LED de forma no lineal; La tabla de búsqueda soluciona este problema. Al final, logré lograr una cantidad suficiente de tonos de gris y escala lineal del brillo óptico de acuerdo con el valor de píxel establecido por mí.

No fue difícil implementar el proyecto de la cámara: hay un componente ESP-IDF que se puede agregar al proyecto; él se encargará de configurar la cámara e intercambiar datos con ella, solo necesita especificar los parámetros que necesita y luego solicitar el mapa de bits que ve la cámara. Lo único que no pude usar en la configuración estándar fue que la alineación automática y la exposición automática estaban activadas de manera predeterminada, y esto interfirió bastante con mi forma de controlar los LED: dependiendo de qué parte de la secuencia de Modulación del Código Binario se creó la imagen, la cámara aumentó o disminuyó la alineación y la exposición al azar. Solucioné el problema cambiando la cámara a alineación manual y velocidad de obturación; El código mismo examina la imagen y determina si estos parámetros necesitan compensación.Gracias a dicho procesamiento manual, también logré excluir píxeles que miraban directamente a los LED para eliminarlos por completo de la ecuación. Esto también ayudó mucho a obtener una imagen estable.

Ahora tengo una cámara y un lienzo de 16x16 en tonos de gris. ¿Qué debo hacer con ellos? Tengo una idea: en el momento de las primeras computadoras Macintosh, había una extensión popular que solo agregaba un par de ojos de dibujos animados a la barra de menú. Estos ojos simplemente siguieron el cursor. (Todavía existe una variación de este tema para Linux / Unix llamada "xeyes"). ¿Qué sucede si trato de repetirlo en la vida real?


Para empezar, necesitaba algunas imágenes de los ojos. No pensé que podría dibujar algo que valiera la pena, así que decidí usar mis propios ojos como imágenes básicas; Miro un video corto en el que miro y parpadeo en todas las direcciones. Vale la pena considerar que, debido a la situación actual, tenía muy pocas herramientas profesionales: me recuesto en el piso para maximizar la iluminación que cae de las lámparas fluorescentes del techo y obtener una imagen legible; Todo el video fue filmado en el teléfono inteligente que tengo en mis manos.

Como los datos iniciales eran bastante descuidados, tuve que trabajar duro en el postprocesamiento. Comencé cortando un fragmento que estaba aproximadamente alrededor de mi ojo derecho. Luego convertí cada fotograma del video en una imagen y eliminé todas las imágenes redundantes; al final tuve una buena selección de imágenes mías mirando en diferentes direcciones, así como algunos cuadros con un parpadeo. Sin embargo, como utilicé un teléfono móvil para grabar, el video salió un poco tembloroso y las imágenes se saltaron. Para solucionar esto, pasé un conjunto de imágenes a través del programa Hugin Image Glue.que generalmente se usa para panoramas e imágenes HDR; a la salida, obtuve imágenes idealmente centradas en esta parte de mi cara. Ahora solo podía marcar en qué dirección miraba y si parpadeaba. Hice esto al convertir primero todas las imágenes a tonos de gris y luego subirlas a Gimp . En cada imagen, utilicé un punto rojo para indicar la ubicación del centro de la pupila, más un punto rojo en la esquina izquierda o derecha para indicar si parpadeo, y si parpadeo, entonces mi ojo está medio abierto o cerrado.


Después de marcar cada imagen de esta manera, se hizo muy simple escribir un guión para obtener la ubicación del alumno, así como el estado del parpadeo. El script también escaló las imágenes a 16x16 y las guardó como datos binarios sin procesar, listos para ser escritos en el firmware del módulo ESP-CAM. Al final, obtuve un conjunto de imágenes y un índice de dónde está la pupila y en qué estado parpadea el ojo.

La ESP-Cam tiene un componente de biblioteca de cámara bastante fácil de usar para la ESP-IDF, por lo que obtener imágenes fue fácil. Configuré capturar imágenes de 120x160 en tonos de gris, porque son más fáciles de procesar, y no necesitaba mucha resolución, porque el resultado final debería mostrarse en una pantalla de 16x16. Sin embargo, todavía tenía un problema de hardware: la cámara todavía estaba demasiado cerca de los LED.


Al principio, traté de resolverlo calibrando: cuando el dispositivo se inicia, toma dos fotos: una con un LED cerca de la lente de la cámara y otra solo con un LED ubicado lejos de la cámara. Restando una imagen de otra, puede comprender qué píxeles se ven afectados por los LED. Estos píxeles se almacenan en la máscara; Los píxeles marcados en la máscara se ignoran posteriormente. La imagen de arriba muestra dos disparos y una máscara.

Con una imagen más limpia, podría pasar al reconocimiento de movimiento. Lo implementé obteniendo un cuadro de la cámara y restando el cuadro anterior. Luego pude calcular la cantidad de movimiento sumando todos los píxeles resultantes. Además, fue posible calcular la ubicación de la concentración de movimiento tomando el promedio de las coordenadas de todos los píxeles ponderados por la diferencia de cuadros en este píxel. Al final, la magia de filtrado se realiza para que el dispositivo no se vea sacudido como un Jack Russell Terrier con TDAH: para atraer su atención, los objetos deben moverse de manera más uniforme o lo suficientemente lejos.

Solo había un problema: cuando estaba muy oscuro, el algoritmo de reconocimiento de movimiento a veces funcionaba en el reflejo de los LED en objetos brillantes en la habitación: si el ojo parpadeaba, preste atención a su propio reflejo. Esto no es exactamente lo que quería, así que evité este problema al hacer que el algoritmo de reconocimiento de movimiento fuera "ciego" al cambiar la imagen en los LED; Así que detuve este comportamiento. Además, también es un poco más realista: cuando parpadeas, no puedes ver.

El firmware tiene varios modos de depuración que demuestran todo el proceso. Aquí hay un breve video que ilustra esto:


Conclusión


Así que ahora tengo un dispositivo que me sigue ... no es realmente útil, estoy de acuerdo. Pero fue interesante para mí crearlo, y si alguna vez encuentro algo más útil que pueda implementarse en una pantalla LED de 16x16, entonces puedo hacerlo, porque ya tengo un código de control. Hablando de código: puedes descargar libremente mi resultado en bruto desde aquí . Espero que lo hayas disfrutado y cuídate.


All Articles