Como reproduzir um vídeo em um OLED SSD1306

Como reproduzir um vídeo em um OLED SSD1306

Pequenos displays de diodo orgânico emissor de luz (OLED) são comumente usados ​​em dispositivos embarcados. Isso ocorre porque os OLEDs geralmente custam o mesmo que os LCDs de caracteres, mas apresentam uma interface de usuário (UI) e experiência de usuário (UX) melhores.

Normalmente, telas OLED incorporadas são usadas para exibir mensagens de texto, mas e os vídeos? Por exemplo, é possível reproduzir um vídeo em um pequeno OLED de 0,96″?

Isso não é problema para um OLED, que oferece poucas limitações em sua exibição. O desafio aqui reside no microcontrolador. Os microcontroladores são projetados para tarefas simples que não incluem processamento de vídeo. Portanto, exibir um pequeno videoclipe em um OLED de 0,96 ″ requer um truque do comércio.

Para ser claro, os microcontroladores não podem ser programados para processar formatos de vídeo. Entretanto, é possível extrair quadros suficientes de um videoclipe e convertê-los em código executável. Quando os quadros são exibidos em sequência, parecerá que o mesmo videoclipe está sendo executado através do microcontrolador.

Para este projeto, prepararemos e reproduziremos um videoclipe em um OLED SSD1306 monocromático.

Escolha seu microcontrolador
É importante observar que nem todos os microcontroladores estarão à altura da tarefa de exibir quadros seletivos de um videoclipe – mesmo que esses quadros tenham apenas um ou dois segundos de duração.

Por exemplo, a memória flash máxima nas placas Arduino é normalmente de 256 Kb. Isto é insuficiente para armazenar o código de cinco ou mais quadros de vídeo com dimensão de 128×64. Portanto, para este projeto, precisaremos de um microcontrolador com grande memória flash.

ESP32 é uma opção adequada para reprodução de vídeo, pois sua memória varia de 4 a 16 MB, o que é suficiente para armazenar o código de vários frames. Para garantir a confiabilidade, cortaremos um videoclipe de 12 segundos em 36 quadros para que o ESP32 possa reproduzir os quadros com facilidade.

Interface SSD1306 OLED com ESP32
Primeiro, é necessário fazer a interface do OLED com o nosso microcontrolador. Aqui, estamos usando um OLED SSD1306 monocromático de 0,96 ″ e ESP32. Um módulo OLED de 7 pinos se conecta ao ESP32 por meio de uma interface SPI.

O SSD1306 OLED e ESP32 possuem as seguintes conexões de circuito…

O SSD1306 OLED, com interface com ESP32, possui este diagrama de circuito:

O videoclipe
Você pode gravar qualquer videoclipe com alguns segundos de duração. Neste projeto, selecionamos um com cerca de 12 segundos de duração. Este clipe tem resolução de 1920×1080 e taxa de quadros de 30 fps.

Preparando o vídeo
O videoclipe é um vídeo RGB, mas iremos reproduzi-lo em um OLED monocromático, o que significa que deve estar em tons de cinza. É fácil converter o clipe em vídeo em escala de cinza usando um editor de vídeo online. Usamos o MovieMakerOnline.

Se você usar a mesma ferramenta, basta navegar até moviemakeronline.com e enviar o arquivo de vídeo de destino clicando no ícone “Adicionar arquivo”.

Após o upload do arquivo, clique no botão “Efeitos”.

Em seguida, clique no botão “Adicionar efeito”.

Escolha a opção “Limiar” nos efeitos.

Clique no botão “Criar Vídeo” e aguarde o processamento do vídeo terminar.

Após o processamento do vídeo, clique no ícone “Assistir ao Filme”.

Quando o vídeo em tons de cinza for reproduzido, clique com o botão direito e selecione “Salvar vídeo como…”

Certifique-se de salvar o vídeo em tons de cinza com um nome diferente.

O novo vídeo em escala de cinza ainda exibirá uma resolução de 1920×1080 e uma taxa de quadros de 30 fps.

O vídeo em escala de cinza fica assim…

Cortando o vídeo no tamanho certo
Nosso display OLED tem resolução de 128×64, o que não corresponde ao tamanho do quadro do vídeo. Portanto, devemos ajustar a resolução do vídeo em escala de cinza para garantir que os quadros caibam na tela OLED para uma visualização adequada. Também é necessário reduzir a taxa de quadros.

Para fazer isso, use um editor de vídeo profissional. Usamos o reprodutor de mídia VLC, que é um reprodutor multimídia multiplataforma gratuito e de código aberto. Ele pode ser baixado para Microsoft Windows, macOS e Linux.

Abra o reprodutor de mídia VLC e navegue até Mídia-> Converter/Salvar.

Na janela pop-up, clique em “Adicionar”.

Em seguida, selecione o vídeo em escala de cinza alvo e clique no botão “Converter/Salvar”.

Na próxima janela, clique no botão “Criar um novo perfil”.

Em seguida, selecione a guia “AVI” em “Encapsulamento”.

Agora, mude o Codec para “MPEG-4″ e defina a taxa de quadros para 5 fps na guia “Parâmetros de codificação” de “Codec de vídeo”.

Certifique-se de que a escala esteja definida como “2”, pois o SSD1306 tem uma proporção de resolução de 2:1 (128:64). Além disso, defina a largura do tamanho do quadro para 128 e a altura para 64 na guia “Resolução” de “Codec de vídeo”.

Em seguida, defina o nome do perfil como SSD1306.

Clique no botão “Criar” e você retornará à janela de conversão. Na janela de conversão, selecione o perfil “SSD1306” e procure um local para salvar o vídeo convertido.

Clique em “Iniciar” para finalizar a conversão.

Agora, temos um vídeo em tons de cinza com resolução de 128×64 e a taxa de quadros é reduzida para 5 fps.

(Link para amostra de vídeo-BWC)

Extraindo os quadros
A seguir, devemos extrair os frames do vídeo em escala de cinza de 5 fps. Você vai querer usar um editor de vídeo profissional para isso, como o reprodutor de mídia VLC.

Execute o reprodutor de mídia VLC como administrador.

Clique no botão de opção “Todos” em “Mostrar configurações”.

Navegue até Vídeo->Filtros.

Selecione “Filtro de cena” e defina o formato da imagem para “jpg”, o prefixo do nome do arquivo para “Quadro” e a proporção de gravação para “5”. Selecione um caminho de destino para salvar os quadros extraídos navegando no “Prefixo do caminho do diretório”. Em seguida, clique em “Salvar”.

Mais uma vez, abra “Preferências” e escolha a opção “Filtro de Cena de Vídeo” navegando até Vídeo->Filtros. Certifique-se de clicar em “Salvar”.

Feche o reprodutor de mídia VLC e execute novamente o administrador. Abra e reproduza o vídeo em escala de cinza de 5 fps. Os quadros de vídeo serão extraídos na pasta definida em “Prefixo do caminho do diretório”.

Convertendo os quadros
Selecione os quadros em tons de cinza do vídeo original com resolução 128×64 (a resolução do nosso OLED). Em seguida, é necessário converter os frames para o formato binário. Para fazer isso, devemos primeiro converter os quadros em arrays C usando qualquer conversor de imagem online/offline.

Usamos LGVL, que está disponível aqui.

O ideal é que seja possível fazer upload de todos os frames simultaneamente para este conversor online.

Faça upload dos quadros e selecione o formato de cor para “CF_INDEXED_1_BIT”. Em seguida, clique no botão “Converter”.

Em troca, receberemos os arquivos .c contendo um array C para cada quadro. Copiaremos apenas o array hexadecimal 64 x 16 de cada arquivo.

As bibliotecas
Para instalar as bibliotecas necessárias, abra o Arduino IDE e instale Adafruit_GFX.h e Adafruit_SSD1306.h navegando até Ferramentas->Gerenciar Bibliotecas. Usamos ESP32-Dev-kit-V1 para este projeto, então “DOIT ESP32 DEVKIT V1” é selecionado navegando até Ferramentas->Placa->ESP32.

A porta é selecionada navegando até Ferramentas->Porta.

O código
O esboço começa importando SPI.h, Wire.h, Adafruit_GFX.h e Adafruit_SSD1306.h. Essas bibliotecas são necessárias para o OLED SSD1306. As variáveis ​​são definidas para armazenar a largura e altura do OLED. As variáveis ​​também são definidas para as conexões do circuito do OLED para uso com ESP32.

Um objeto “display” da classe Adafruit_SSD1306 é instanciado. Os arrays C para cada quadro são armazenados no PROGMEM da seguinte forma…

Os arrays C para todos os frames são enumerados em outro array: epd_bitmap_allArray .

Na função de configuração, o OLED SSD1306 é iniciado chamando o método display.begin(SSD1306_SWITCHCAPVCC).

Na função loop , um “loop for” é executado para limpar a tela, mostrando a matriz de bitmap para cada quadro e fornecendo um atraso de 200 ms. Todos os quadros de vídeo são reproduzidos conforme o “loop for” conclui a navegação pelo array epd_bitmap_allArray . Finalmente, um atraso de um segundo é adicionado para fornecer uma pausa na reprodução.

Resultados

Conteúdo Relacionado

Voltar para o blog

Deixe um comentário

Os comentários precisam ser aprovados antes da publicação.