Pantalla volumétrica pequeña
(mitxela.com)- Es un prototipo de dispositivo de visualización 3D del tamaño de la palma de la mano basado en el efecto de persistencia de visión (POV), que hace girar por completo una pequeña matriz LED, una placa RP2040, una batería LIR2450 y un motor
- Hace girar una matriz LED de 8x10 y lee el periodo con un sensor IR para mostrar un búfer volumétrico ajustado a la velocidad medida
- Aprovecha los dos núcleos del RP2040 y el control simultáneo de GPIO: un núcleo mide los intervalos de rotación y el otro envía los datos LED ciclo por ciclo
- Las principales limitaciones son el circuito de protección de la batería, el método de carga, la durabilidad del soporte impreso en 3D y la falta de limitación de corriente para los LED; en el prototipo se muestra una advertencia por debajo de unos 3.6 V
- Con Blender se generaron cortes en coordenadas polares 3D y datos de simulación de fluidos y fuego, pero la cámara capta menos sensación de volumen que la real y en la próxima versión hará falta mejorar la alineación y la resolución
La idea de una vela electrónica giratoria
- El objetivo era crear una vela electrónica que pareciera una llama parpadeante vista desde cualquier ángulo
- Como las pantallas habituales de persistencia de visión necesitan estructuras de soporte como rodamientos y anillos rozantes, se optó por hacer el motor y la batería lo bastante pequeños para que todo el dispositivo gire junto
- La placa de la matriz LED se fabricó rápidamente incluyéndola en otro pedido de PCB
- En China, las PCB pequeñas son prácticamente baratas, y el envío rápido era el factor más importante
- Se usó una máquina pick-and-place Charmhigh CHM-T36VA
- Cargar los reels de componentes toma tiempo, pero esta matriz LED solo tenía un tipo de componente, así que fue posible repetir rápidamente el ensamblaje de las placas
- En lugar de encargar un stencil formal, se usó acetato con grabado láser
- La matriz LED se hizo con componentes 0603 y 0805 respectivamente, y para una versión posterior se planteó una PCB circular de soporte en ángulo recto
Configuración de hardware
- Como microcontrolador se eligió el Waveshare RP2040-tiny, considerando su tamaño pequeño y capacidad de flash
- La Raspberry Pi Pico tiene como ventajas dos núcleos a 125 MHz, hasta 16 MB de flash y bajo precio, pero la placa en sí es demasiado grande
- Usar el RP2040 bare requiere flash QSPI externa, cristal y capacitores auxiliares, entre otros, lo que vuelve incómodo usarlo por separado
- El RP2040-tiny es básicamente un Pico reducido a la mitad, y el puerto USB y los botones reset/boot están en una placa auxiliar conectada por un cable flex plano
- Se usó una batería LIR2450
- Es recargable de ion de litio y puede entregar más de 100 mA
- Las baterías Li-ion más pequeñas reducen la capacidad y la corriente que pueden suministrar
- Como la placa RP2040 mide unos 29 mm en diagonal, usar una batería más pequeña no haría más pequeño el resultado
- El portabatería se imprimió en 3D con PETG
- La primera versión tenía paredes de 0.5 mm y una estructura de dos piezas pegadas, por lo que cada caída rompía la línea de pegamento
- Después se experimentó con paredes de 1 mm y una estructura impresa en otra orientación
- La detección de rotación se manejó con un sensor IR TCRT5000
- La salida es analógica, pero se conectó directamente a un GPIO con pull-up
- Las entradas del RP2040 tienen un disparador Schmitt que puede desactivarse por software, por lo que en la práctica se pudo usar casi como comparador
- Se eligió un motor RF-410CA
- Motores similares de unidades de CD/DVD diferían ligeramente en diámetro y longitud del eje
- Para 30 FPS hacían falta alrededor de 1800 RPM, y la velocidad en vacío de muchos motores pequeños, de 5000 a 10000 RPM, era demasiado alta
- El enfoque fue reducir la velocidad mediante PWM
Circuito y ensamblaje del prototipo
- La matriz LED tiene una estructura de 8x10, por lo que usa 18 GPIO
- Además se consideraron 1 entrada de sensor, 1 control de motor y 1 monitoreo de voltaje de batería
- El LED WS2812 de la placa estaba conectado a GPIO16, y para liberar un GPIO para la matriz se retiró el LED y se soldó alambre esmaltado
- Para el control del motor se añadieron un pequeño MOSFET SOT-23 y un diodo flyback en montaje dead-bug
- El LED IR se conectó directamente a la línea de alimentación
- Lo ideal sería controlarlo por software para ahorrar energía cuando no está girando, pero en el prototipo se omitió para ahorrar GPIO
- La matriz LED se conectó directamente a los GPIO, sin resistencias limitadoras de corriente ni transistores driver
- La corriente total source/sink de los GPIO del RP2040 es de unos 50 mA
- El método depende de la resistencia en conducción de los GPIO y de limitar el ciclo de trabajo del PWM; si el chip se detiene y la matriz queda encendida fija, los LED podrían sobreexcitarse
- El polo positivo de la batería se conectó directamente a VBUS de la placa
- En esta estructura, si se conecta un cable USB pueden aparecer 5 V en los terminales de la batería, así que es más bien un hack temporal de etapa de prototipo
- Para retirar la batería se hizo un pequeño agujero en la parte trasera, y después de que se rompiera el plástico se fijó la batería con una liga
Software de control de visualización
- El software vigila el sensor IR y usa el tiempo entre disparos para determinar la velocidad de visualización de la matriz
- Una ventaja aprovechada del RP2040 es que puede configurar o leer todos los pines GPIO en el mismo ciclo de reloj
- En STM32, aunque sea un procesador de 32 bits, los IO están agrupados en registros de 16 bits y hay problemas de contención de bus al intentar cambiarlos simultáneamente
- Los datos de salida GPIO necesarios se preprocesan y luego se envían secuencialmente en proporción a la velocidad de rotación medida
- Los dos núcleos ARM Cortex-M0 se usan con bucles busy-wait en lugar de interrupciones
- El primer núcleo vigila el sensor IR y mide con SysTick la cantidad de ciclos entre disparos
- El segundo núcleo espera la señal de iluminación y luego recorre el búfer volumétrico con precisión de ciclos usando su propio SysTick
- El control del motor empezó con una lógica simple
- Si las RPM están por debajo de 1200, el motor se acciona al 90% de potencia
- De lo contrario se baja al 60%
- Gracias a la inercia y la resistencia del aire, en el prototipo actual este control simple funciona suficientemente bien
- La matriz se escanea por columnas
- Vista desde arriba, cada línea radial se vuelve ligeramente espiralada, pero es más fácil de corregir que si todo se convirtiera en una hélice
- El ciclo de trabajo de los LED del centro se reduce proporcionalmente respecto de los de la periferia
Monitoreo del voltaje de batería y carga
- La celda bare LIR2450 no tiene circuito de protección, por lo que puede sufrir daño permanente si el voltaje baja demasiado
- Si cae muy por debajo de 3 V hay problemas, y el límite real depende de la celda, alrededor de 2.7 V
- El voltaje se monitorea con un divisor formado por dos resistencias de 100 K conectado al último GPIO disponible
- En el RP2040-tiny, el voltaje de referencia del ADC era una variable
- Si la referencia del ADC es el voltaje de alimentación, cuando cae la alimentación se vuelve difícil detectar bien la caída de voltaje de la batería
- El LDO RT9193-33 de 3.3 V tiene un dropout de 220 mV a 300 mA, así que cuando la batería llega a 3.52 V también empieza a caer el voltaje de alimentación del RP2040
- En el prototipo se configuró para mostrar una advertencia por debajo de unos 3.6 V
- En la siguiente versión se planea agregar un voltaje de referencia
- Al principio se retiraba la batería y se colocaba en un cargador independiente, pero el cargador nuevo se averió en el primer uso
- Después se cargó la celda individual de ion de litio configurando una fuente de banco con límite de corriente de 50 mA y voltaje constante de 4.2 V
- Como no estaba claro si la capacidad de la batería era de 120 mAh o 60 mAh, se eligió una corriente de carga más conservadora que 1C
- Para facilitar el desarrollo, se creó una placa interceptora USB que se coloca entre la PC y la placa de programación del RP2040-tiny
- Se separa la línea de 5 V y se exponen los pines de la batería, lo que permite conectar la fuente de alimentación sin retirar la batería
- Las líneas de datos siguen conectadas, así que se puede programar con la batería instalada
- Más adelante se añadió un IC cargador de ion de litio BQ21040DBVR en medio de la placa interceptora USB
- Permite cargar la batería mientras el cable de programación está conectado
- El prototipo no se apaga y solo el LED IR consume unos 9 mA de forma continua; la corriente total en espera también es de unos 15 mA, por lo que no llega a la condición de fin de carga completa
- Debido a la caída de voltaje del cable, el voltaje de la batería quizá tampoco suba por encima de 4.1 V
Crear datos volumétricos con Blender
- Los datos de visualización deben generarse en forma de coordenadas polares 3D r, theta, z
- La primera prueba se hizo con un cubo en wireframe
- Se aplicó el modifier wireframe al cubo predeterminado de Blender
- Se rotó el cubo 45 grados sobre el eje x y
atan(1/sqrt(2))sobre el eje y, para que una arista apuntara hacia arriba
- Para generar los cortes, se deformó otro cubo como una sección delgada y se usó un boolean modifier
- La cámara y el corte se agruparon como parent de un Empty, y se animó la rotación Z del Empty
- La cámara se configuró como orthographic y la resolución se ajustó a 8x10
- El fondo se configuró en negro, el material del cubo como emissive y se definió el umbral con el colour ramp del compositor
- La pantalla actual solo usa voxels de 1 bit
- Cada voxel está encendido o apagado, nada más
- En Blender se ajustó el umbral para elegir visualmente un cutoff adecuado
Render animationgenera 24 imágenes de cortes del cubo en wireframe, y un script de Python las convierte en un archivo header para incluirlas en el código- Se usaron drivers de Blender para controlar la rotación de la cámara y del cubo con fórmulas basadas en frames
- Para la rotación de la cámara se usa
(frame/24)*2*pi - Para la rotación y del cubo se usa
floor(frame/24)*pi/24, de modo que gire un poco en cada vuelta - Se buscó mantener discreto cada frame de datos para poder ajustar la velocidad de reproducción según las RPM del motor
- Para la rotación de la cámara se usa
Simulación de fluidos y fuego
- La simulación de fluidos de Blender es fácil de iniciar, pero por la gran cantidad de parámetros resultó difícil ajustar el resultado deseado
- La simulación de líquidos es relativamente fácil de trasladar a una pantalla volumétrica porque las partículas de fluido se pueden convertir en mesh
- Se intentó simular a 1/24 de la velocidad y luego extraer datos volumétricos polares del mismo modo, pero una escala temporal muy lenta generó inestabilidades y no se encontró una forma simple de ralentizar la reproducción
- También se revisaron las funciones Multi-view o Stereoscopy
- Permiten agregar varias cámaras y renderizar simultáneamente desde varios puntos de vista
- Sin embargo, no estaba claro cómo rotar 24 cámaras de manera uniforme rápidamente, y también estaba el problema de tener que renderizar junto con el boolean modifier para los cortes
- También se probó una alternativa de renderizar una sección delgada de la escena con la clipping distance de la cámara
- Había un problema: el interior de los objetos cortados no se rellenaba y solo se dibujaba la superficie
- Se experimentó si podía rellenarse parcialmente con volumetric material, pero no hubo resultados
- Finalmente se renderizó 24 veces con un script de Python para Blender
- Se cambió la rotación Z del Empty a 24 ángulos y en cada ángulo se volvió a renderizar toda la animación
- Así se obtuvieron los cortes de cada dirección de rotación manteniendo la simulación de fluidos en tiempo real
- La simulación de fuego se bakeó como OpenVDB y luego se volvió a importar en Blender para procesarla
- Los datos de volumen se umbralizaron con el modifier Volume to Mesh
- Luego se aplicaron los cortes de cámara y el boolean modifier, y se volvió a ejecutar el mismo script
Calidad de visualización y próxima versión
- El dispositivo real muestra una sensación de volumen más fuerte que en fotos o videos
- Los errores de alineación de los LED también podrían corregirse por software
- La posición del boolean slice puede desplazarse un poco desde el centro para alinearla con el centro real de rotación
- Para corregir el patrón de escaneo de la matriz, también podría usarse una forma ligeramente curvada en vez de un cubo estirado
- Con la resolución actual, quizá estas mejoras no sean perceptibles
- La condición más importante es que cada voxel de la periferia se vea como un solo punto desde cualquier ángulo
- Si la alineación se desvía, un voxel puede verse alargado, como si se hubiera encendido dos veces
- La letra central
mse renderiza con un método separado para que pueda leerse desde todas las direcciones- Se hace que el texto se desplace en una dirección legible tanto visto desde adelante como desde atrás
- En el próximo prototipo se planea mejorar la alineación y la resolución
- No se pudo incluir una función para apagarlo sin retirar la batería porque no había un interruptor deslizante pequeño, pero se resolvió insertando un pequeño trozo de acetato entre la batería y el contacto
- Como ya hay un sensor IR, también parece posible agregar un control remoto, aunque el sensor actual no es de tipo demodulado
- El código fuente está publicado en GitHub: source code on github
1 comentarios
Opiniones de Hacker News
Tengo algunas ideas de mejora. Si tienes un motor igual de repuesto, podrías desarmar dos y usar las escobillas de ambos conjuntos para crear un mecanismo de transferencia de energía rotativo.
Habría que sacrificar dos motores por cada dispositivo, pero encajan perfecto y son muy estables; si agregas un capacitor y un rectificador, ya no tendrías que preocuparte por la batería.
El rectificador también da una señal de que el conjunto completó una vuelta, así que podrías mantener la estabilización de la imagen según la posición real, sin tener que adivinar el período.
También podría ser posible enviar energía por inducción, pero no logré transferirla con suficiente eficiencia y tenía que subir demasiado el voltaje de entrada, lo que me preocupaba por riesgo de incendio.
Este consejo viene de un proyecto de arte de Burning Man de 2001. Aquí hay una foto de un prototipo inicial bastante desastroso: https://github.com/sowbug/tqw/blob/master/photos/side.jpg. La instalación final funcionó muy bien.
También me da curiosidad cómo manejan esto las empresas de LIDAR.
1: https://www.adafruit.com/product/1407
2: https://www.adafruit.com/product/2162
Es una de esas ideas ingeniosas que después parecen obvias.
Si el resultado es tan convincente incluso ensamblando a mano componentes individuales relativamente primitivos, me pregunto qué impediría que para la próxima Navidad alguna marca cualquiera de dropshipping de 7 letras en Amazon saque una versión a todo color y de alta resolución.
Pero la mayoría son básicamente juguetes. Si solo puedes tener una superficie transparente que brilla y ni siquiera puedes tocarla, no hay mucho que realmente puedas hacer.
También se pueden ver versiones mucho más grandes y no rotativas hechas con LEDs colgados de cables [2], y son muy vistosas, pero la novedad se pasa rápido y te das cuenta de que no es una pantalla para usos productivos.
Si quieres visualización 3D real con la que puedas renderizar cualquier cosa en alta calidad e interactuar, parece que lo adecuado son los headsets de VR/AR. También existen nuevos monitores 3D que no requieren lentes, aunque todavía no mucha gente los ha visto en persona.
Quizá se pueda hacer un juguete vendible en Amazon, pero no estoy muy seguro de que exista una killer app para este tipo de cosas.
[1] https://en.wikipedia.org/wiki/Volumetric_display#Swept-volum...
[2] https://www.ledpulse.com/
Es un proyectito realmente genial. También vale la pena ver sus otros proyectos. Algunos ya aparecieron antes en HN.
https://mitxela.com/projects/hardware
Personalmente, el silbato deslizante MIDI es mi favorito.
[0] https://mitxela.com/projects/headphone_amps
Creativo. Probablemente sí tenga la perseverancia y el interés para llevar algo así hasta el final, pero me falta la imaginación para concebir un proyecto tan genial
Por suerte existe internet, así que puedo ver las cosas impresionantes que crea la gente
Así, cuando tienes energía para hacer un proyecto, no la desperdicias tratando de pensar en una idea
Cambia muchísimo la cantidad de proyectos paralelos que realmente puedes terminar. Es probable que tengas más ideas interesantes de las que crees. Solo que, si el momento en que se te ocurre la idea no coincide con el momento en que tienes el tiempo y la energía para ejecutarla o ampliarla, se esfuma
Incluso si desarrollo perseverancia y disciplina, ahora tengo cuentas que pagar, así que la distracción ya no es la idea B, sino simplemente trabajo común y corriente
Estoy de acuerdo con llevar registro de las cosas. Como con la mayoría de las cosas, uno mejora si practica en serio
Lo que a menudo se pasa por alto es (1) conocimiento técnico, (2) invención sistemática, (3) motivación
El conocimiento técnico te permite saber qué proyectos son posibles, o económicamente viables, y visualizar los obstáculos en el camino. Los inventos imposibles no sirven de mucho
La invención sistemática consiste en observar las cosas de forma sistemática en lugar de generar ideas al azar. Por ejemplo, analizar (a) quiero crear una pantalla volumétrica, (b) quiero dar vida a objetos 3D virtuales. Hay una diferencia sutil entre ambas
Una pantalla volumétrica (a) puede ir desde pantallas de campo de luz con una base teórica elegante hasta la pantalla volumétrica de persistencia visual que se ve aquí. Si investigas a fondo el espacio del problema, es muy probable que acabes llegando a posibles soluciones
Dar vida a objetos 3D (b) puede implicar un espacio de problemas mucho más amplio: fabricación digital, lentes de VR, interacción háptica, robots, etc.
La motivación también importa mucho. Entender por qué inventas y qué quieres hacer realidad también tiene mucho sentido. Cosas como si quieres darle alegría a la gente, si simplemente es algo muy genial o si es un dispositivo médico útil que puede salvar vidas
También puedes estudiar cómo enfocarte en temas valiosos, y eso mejora mucho tu capacidad de inventar. Por supuesto, hacer cosas simplemente porque nos gustan también es importante y válido :)
Personalmente, lo más importante es disfrutar el proceso
Esto es muy parecido a cómo funcionan los ventiladores holográficos. Toda la electrónica está dentro de la parte giratoria
Esos ventiladores suelen usar transferencia inalámbrica de energía para alimentar la placa superior
https://youtu.be/bT716nyK0AY
Si estás en Londres o de visita, en las exposiciones de 180 Studios [1] usan con frecuencia este tipo de tecnología en muestras de arte
Si te interesa el arte y la tecnología, vale la pena ir
[1] https://www.180studios.com/
Es un excelente canal de YouTube si te gustan este tipo de cosas
Me pregunto si se podría actualizar una pantalla OLED barata lo suficientemente rápido como para obtener una resolución mucho mayor. Tal vez sea posible, pero es probable que el espacio entre los segmentos radiales sea mucho mayor que el espaciado entre píxeles, así que quizá termine viéndose peor
Creo que el problema de centrado podría resolverse poniendo dos placas LED arriba, espalda con espalda
Una placa desplazaría los LED media distancia para crear un efecto de entrelazado y, al mismo tiempo, también podría duplicar la resolución
Si hubiera una versión RGB robusta, más grande, de alrededor de 50x50, y pudiera mostrar distintas imágenes sin programar, estaría dispuesto a pagar más de 200 dólares
Hay otro excelente proyecto de pantalla volumétrica que se publicó hace poco, pero no recibió mucha atención
https://news.ycombinator.com/item?id=38406824