Las pequeñas pantallas de diodos emisores de luz orgánicos (OLED) se utilizan comúnmente en dispositivos integrados. Esto se debe a que los OLED generalmente cuestan lo mismo que los LCD de caracteres, pero cuentan con una mejor interfaz de usuario (UI) y experiencia de usuario (UX).
Normalmente, las pantallas OLED integradas se utilizan para mostrar mensajes de texto, pero ¿qué pasa con los vídeos? Por ejemplo, ¿es posible reproducir un vídeo en un OLED pequeño de 0,96 ″?
Esto no es un problema para un OLED, que ofrece pocas limitaciones en su pantalla. El desafío aquí está en el microcontrolador. Los microcontroladores están diseñados para tareas sencillas que no incluyen el procesamiento de vídeo. Por lo tanto, mostrar un videoclip corto en un OLED de 0,96 ″ requiere un truco del oficio.
Para ser claros, los microcontroladores no se pueden programar para procesar formatos de video. Sin embargo, es posible extraer suficientes fotogramas de un clip de vídeo y convertirlos en código ejecutable. Cuando los fotogramas se muestran en secuencia, parecerá como si el mismo clip de vídeo se estuviera reproduciendo a través del microcontrolador.
Para este proyecto, prepararemos y reproduciremos un videoclip en un SSD1306 OLED monocromático.
Elige tu microcontrolador
Es importante tener en cuenta que no todos los microcontroladores estarán a la altura de la tarea de mostrar fotogramas selectivos de un clip de vídeo, incluso si esos fotogramas duran sólo uno o dos segundos.
Por ejemplo, la memoria flash máxima en las placas Arduino suele ser de 256 Kb. Esto es insuficiente para almacenar el código de cinco o más fotogramas de vídeo con dimensiones de 128×64. Entonces, para este proyecto necesitaremos un microcontrolador con una gran memoria flash.
ESP32 es una opción adecuada para la reproducción de vídeo ya que su memoria oscila entre 4 y 16 MB, suficiente para almacenar el código de varios fotogramas. Para garantizar la confiabilidad, cortaremos un videoclip de 12 segundos en 36 fotogramas para que el ESP32 pueda reproducirlos fácilmente.
Interfaz OLED SSD1306 con ESP32
Primero, necesitamos conectar el OLED con nuestro microcontrolador. Aquí estamos utilizando un SSD1306 OLED monocromático de 0,96 ″ y ESP32. Un módulo OLED de 7 pines se conecta al ESP32 a través de una interfaz SPI.
El SSD1306 OLED y ESP32 tienen las siguientes conexiones de circuito...
El SSD1306 OLED, interconectado con ESP32, tiene este diagrama de circuito:
El vídeo musical
Puedes grabar cualquier videoclip que dure unos segundos. En este proyecto, seleccionamos uno que dura aproximadamente 12 segundos. Este clip tiene una resolución de 1920×1080 y una velocidad de fotogramas de 30 fps.
Preparando el vídeo
El vídeo musical es un vídeo RGB, pero lo reproduciremos en un OLED monocromático, lo que significa que debería estar en escala de grises. Es fácil convertir el clip a video en escala de grises usando un editor de video en línea. Usamos MovieMakerOnline.
Si utiliza la misma herramienta, simplemente navegue hasta moviemakeronline.com y cargue el archivo de video de destino haciendo clic en el ícono "Agregar archivo".
Después de cargar el archivo, haga clic en el botón "Efectos".
Luego haga clic en el botón "Agregar efecto".
Elija la opción "Umbral" en los efectos.
Haga clic en el botón "Crear video" y espere a que el video termine de procesarse.
Después de procesar el video, haga clic en el ícono "Ver película".
Cuando se reproduzca el video en escala de grises, haga clic derecho y seleccione "Guardar video como..."
Asegúrese de guardar el video en escala de grises con un nombre diferente.
El nuevo vídeo en escala de grises seguirá mostrando una resolución de 1920x1080 y una velocidad de fotogramas de 30 fps.
El vídeo en escala de grises se ve así...
Recortar el vídeo al tamaño correcto
Nuestra pantalla OLED tiene una resolución de 128×64, que no se corresponde con el tamaño del cuadro de vídeo. Por lo tanto, debemos ajustar la resolución del vídeo en escala de grises para asegurarnos de que los marcos encajen en la pantalla OLED para una visualización adecuada. También es necesario reducir la velocidad de fotogramas.
Para hacer esto, use un editor de video profesional. Usamos el reproductor multimedia VLC, que es un reproductor multimedia multiplataforma gratuito y de código abierto. Se puede descargar para Microsoft Windows, macOS y Linux.
Abra el reproductor multimedia VLC y navegue hasta Medios->Convertir/Guardar.
En la ventana emergente, haga clic en "Agregar".
Luego seleccione el video en escala de grises de destino y haga clic en el botón "Convertir/Guardar".
En la siguiente ventana, haga clic en el botón "Crear un nuevo perfil".
Luego seleccione la pestaña "AVI" en "Encapsulación".
Ahora, cambie el códec a "MPEG-4" y establezca la velocidad de fotogramas en 5 fps en la pestaña "Parámetros de codificación" de "Códec de vídeo".
Asegúrese de que la escala esté configurada en "2", ya que el SSD1306 tiene una relación de resolución de 2:1 (128:64). Además, establezca el ancho del tamaño del fotograma en 128 y el alto en 64 en la pestaña "Resolución" de "Códec de vídeo".
Luego configure el nombre del perfil en SSD1306.
Haga clic en el botón "Crear" y volverá a la ventana de conversión. En la ventana de conversión, seleccione el perfil "SSD1306" y busque una ubicación para guardar el video convertido.
Haga clic en "Iniciar" para finalizar la conversión.
Ahora tenemos un vídeo en escala de grises con una resolución de 128×64 y la velocidad de fotogramas se reduce a 5 fps.
(Enlace al vídeo de muestra-BWC)
Extrayendo los marcos
A continuación, debemos extraer los fotogramas del vídeo en escala de grises a 5 fps. Querrás utilizar un editor de vídeo profesional para esto, como el reproductor multimedia VLC.
Ejecute el reproductor multimedia VLC como administrador.
Haga clic en el botón de opción "Todos" en "Mostrar configuración".
Vaya a Vídeo->Filtros.
Seleccione "Filtro de escena" y configure el formato de imagen en "jpg", el prefijo del nombre del archivo en "Marco" y la relación de aspecto de grabación en "5". Seleccione una ruta de destino para guardar los fotogramas extraídos navegando hasta "Prefijo de ruta del directorio". Luego haga clic en "Guardar".
Una vez más, abra "Preferencias" y elija la opción "Filtro de escena de video" navegando a Video->Filtros. Asegúrese de hacer clic en "Guardar".
Cierre el reproductor multimedia VLC y ejecute el administrador nuevamente. Abra y reproduzca el video en escala de grises de 5 fps. Los fotogramas de vídeo se extraerán en la carpeta definida en "Prefijo de ruta del directorio".
Convirtiendo los marcos
Selecciona los fotogramas en escala de grises del vídeo original a una resolución de 128×64 (la resolución de nuestro OLED). A continuación, debe convertir los fotogramas a formato binario. Para hacer esto, primero debemos convertir los fotogramas a matrices C usando cualquier conversor de imágenes en línea/fuera de línea.
Usamos LGVL, que está disponible aquí.
Lo ideal sería poder cargar todos los fotogramas simultáneamente en este conversor online.
Cargue los marcos y seleccione el formato de color para "CF_INDEXED_1_BIT". Luego haga clic en el botón "Convertir".
A cambio, recibiremos archivos .c que contienen una matriz C para cada cuadro. Solo copiaremos la matriz hexadecimal de 64 x 16 de cada archivo.
las bibliotecas
Para instalar las bibliotecas necesarias, abra el IDE de Arduino e instale Adafruit_GFX.h y Adafruit_SSD1306.h navegando a Herramientas->Administrar bibliotecas. Usamos ESP32-Dev-kit-V1 para este proyecto, por lo que se selecciona “DOIT ESP32 DEVKIT V1” navegando a Herramientas->Tablero->ESP32.
El puerto se selecciona navegando a Herramientas->Puerto.
Código
El boceto comienza importando SPI.h, Wire.h, Adafruit_GFX.h y Adafruit_SSD1306.h. Estas bibliotecas son necesarias para el OLED SSD1306. Se definen variables para almacenar el ancho y alto del OLED. También se definen variables para las conexiones del circuito del OLED para usar con ESP32.
Se crea una instancia de un objeto de "visualización" de la clase Adafruit_SSD1306. Las matrices C para cada cuadro se almacenan en PROGMEM de la siguiente manera...
Las matrices C para todos los fotogramas se enumeran en otra matriz: epd_bitmap_allArray.
En la función de configuración, el SSD1306 OLED se inicia llamando al método display.begin(SSD1306_SWITCHCAPVCC).
En la función de bucle, se ejecuta un “bucle for” para borrar la pantalla, mostrando la matriz de mapa de bits para cada cuadro y proporcionando un retraso de 200 ms. Todos los cuadros de video se reproducen mientras el bucle "for" completa la navegación a través de la matriz epd_bitmap_allArray. Finalmente, se agrega un retraso de un segundo para proporcionar una pausa en la reproducción.
Resultados