Nós bombeamos a Ikea: como transformar músicas leves em Big Brother


Introdução


A Ikea é uma loja curiosa. Mesmo se você entrar nele com a intenção de comprar uma coisa específica e não se distrair com o resto do lixo, você sairá comprando três vezes mais que o necessário. Para nós, hackers, esse efeito é especialmente evidente no departamento da Ikea com cabos de energia ou baterias.

Para mim, o último caso de tal insanidade ocorreu na Holanda. Eu estava em uma viagem planejada, planejando passar apenas algumas semanas no país. No entanto, isso foi no início de 2020 e o desastre com o COVID-19 ... tive que ficar longe do meu laboratório por muito mais tempo.

E quando vi a linha de produtos eletrônicos da Frekevens na Ikea , não pude evitar e comprei tudo.

Para quem não sabe: a linha Ikea Frekvens deve se tornar um análogo moderno do aparelho HiFi da velha escola, mais o aparelho de música leve hexagonal, que parece estar na casa de metade dos adolescentes dos anos 90. Nesse caso, a linha de dispositivos conectados um ao outro consiste em um alto-falante Bluetooth para saída de som e um projetor de LED (complementado por vários bicos) que piscam ao ritmo da música, bem como uma exibição de cubo de LED que pode exibir animações que também se movem para a música. A Ikea se orgulha de que esta linha foi desenvolvida em conjunto com a Teenage Engineering, conhecida por sua série Pocket Operator de sintetizadores portáteis de "brinquedos".


Como mostrado no vídeo promocional da Ikea, a compra final de dezenas de dispositivos deve parecer um carnaval insuportável, que meu adolescente de 15 anos não se importaria de arrumar em seu quarto.

Eu estava particularmente interessado no display de cubo LED: é um dispositivo integrado de alta qualidade que funciona na rede elétrica. No painel frontal, há uma matriz de 16 linhas e 16 colunas de LEDs brancos muito brilhantes, ou seja, um total de 256 LEDs. As animações incorporadas ao dispositivo eram bastante simples, mas me levaram à ideia de que o ferro pode realmente controlar cada LED individualmente. No entanto, por causa disso, a pequena caixa era muito cara: meu bolso estava vazio por cerca de 40 euros. Para esse valor, você recebe uma caixa com LEDs e um cabo de alimentação. Como se supõe que você deve comprar este produto junto com outros produtos da Frekvens, também recebe elementos de conexão adicionais: um cabo de extensão para fornecer energia de ponta a ponta da rede elétrica para outras caixas,bem como um conjunto de parafusos e apoios de plástico com os quais você pode prender mecanicamente o alojamento um ao outro.

Assim que cheguei em casa, conectei o dispositivo e ... para ser sincero, fiquei um pouco decepcionado com o que eles fizeram com o ferro. O dispositivo possui várias animações que podem ser selecionadas pressionando um botão na parte traseira do gabinete; um pequeno microfone é instalado no gabinete - toda vez que reconhece ruído, o quadro da animação muda. As animações não são muito interessantes: elas consistem em apenas quatro a cinco quadros, e os quadros em si são apenas preto e branco, sem tons de cinza. Se você estiver curioso, gravei um pequeno vídeo com todas as animações.

Obviamente, isso não combina comigo. Vamos invadir o dispositivo - vamos ver o que o faz funcionar e é possível tornar seu comportamento um pouco mais interessante.

Autópsia


Para desmontar Frekvens, basta uma chave de fenda para uma fenda em forma de cruz e, possivelmente, uma faca. Você também precisará de uma parcela sólida de perseverança, porque o dispositivo não é fácil de desmontar: o design é complicado e alguns elementos são preenchidos com silicone, provavelmente para se livrar da vibração e simplificar a fabricação.


A desmontagem do caso Frekvens começa por trás. A carcaça possui orifícios de parafuso em todos os lados, com exceção da frente; graças ao conjunto de parafusos e tampas do kit do dispositivo, ele pode ser conectado a outros gadgets da Frekvens. No entanto, os orifícios traseiros dos parafusos são um pouco mais profundos e, embaixo deles, existem parafusos que prendem o gabinete.


Depois de remover a tampa traseira, vemos que todos os orifícios dos parafusos têm inserções metálicas rosqueadas nas quais os parafusos podem ser parafusados. Uau! Isso deve fornecer aos orifícios uma margem de segurança suficiente. É possível que isso complique bastante a produção ou desmontagem; o último é complicado pelo fato de precisarmos primeiro cortar as gotas do composto de silicone endurecido.


As inserções são presas com outras inserções de plástico; eles precisam ser removidos primeiro.

Não tenho outras fotos do processo de desmontagem, mas após esse estágio você verá quatro parafusos que precisam ser desaparafusados ​​e, em seguida, o processo continua como antes. Entenda qual peça de plástico mantém tudo o mais unido, corte o composto de silicone, remova os elementos de fixação de plástico. Continue até poder retirar a placa de circuito.


Aqui está: o verso da placa de circuito. Como se viu, ele é montado a partir de duas placas de circuito impresso: a branca tem dois lados - na parte traseira existem todos os drivers de LEDs (e outra placa está conectada a ela) e na frente os próprios LEDs.

A placa de circuito branca foi projetada muito bem: em vez de uma matriz de LEDs, existem 16 drivers de LED SCT2024trabalhando a partir de uma corrente contínua. Esses drivers de LED têm 16 canais, ou seja, cada LED é controlado diretamente. Os drivers de LED podem ligar ou desligar totalmente os LEDs; os próprios drivers não têm suporte nativo em escala de cinza. De fato, eles realizam a troca de registros usando saídas controladas por corrente e todos alternam sequencialmente; A interface de conexão verde da PCB consiste em seu barramento e dados de sincronização, uma linha de ativação instantânea, uma linha de saída, terra e ativação da energia.

Nesta placa verde, está o minúsculo cérebro do dispositivo: um microcontrolador, cujo artigo não pode ser encontrado no Google, e um amplificador operacional para o microfone. Curiosamente, há dicas de que o dispositivo deve ter mais recursos: existe um lugar para, presumivelmente, o I2C EEPROM 24Cxx e uma dica de que no projeto original havia um receptor de infravermelho no painel frontal. Talvez fosse suposto que o dispositivo fosse fornecido com um controle remoto que permite criar seus próprios padrões? Isso pode explicar que as animações existentes parecem tão monótonas.


Na frente do quadro branco estão todos os LEDs. Um pequeno microfone plano também é soldado a ele. No começo, pensei que estava soldado ao quadro verde e se destacava pelo buraco no quadro branco, mas na verdade é apenas plano.


Todos os outros eletrônicos estão localizados na parte de trás do quadro. Não é suficiente: apenas uma fonte de alimentação da marca Ikea, emitindo 4 V. Sob a fonte de alimentação, há uma pequena placa de circuito impresso na qual existem duas chaves táteis para botões na parte traseira do gabinete.

Portanto, se queremos "otimizar" o design, temos uma fraqueza óbvia: é melhor substituir um pequeno cartão verde por um processador por algo mais poderoso.

Nós modificamos o ferro


Eu pensei que seria possível substituir o equipamento por uma ESP-Cam. Esta é uma placa muito barata (cerca de 10 euros) com um chip ESP32 WiFi / BT, vários megabytes de PSRAM e um módulo de câmera. Não estou muito interessado em música leve, queria que o dispositivo respondesse a algo visual. Como já havia um orifício na parte frontal do receptor, pensei em usá-lo sob a câmera. Também precisarei fazer um furo no quadro branco onde o microfone está localizado; felizmente, além dessas faixas de microfone agora inúteis, isso destruirá apenas uma faixa do LED. Furei um buraco e restaurei a pista. Colocando a placa temporariamente de volta no lugar e ligando o cubo, verifiquei se todos os LEDs ainda estavam funcionando.


Agora eu tinha uma placa com um orifício aberto e só podia conectar e conectar mecanicamente a ESP-Cam. Os designers gentilmente indicaram o objetivo de todas as almofadas na serigrafia do quadro verde, então eu quase tive que adivinhar nada. Como a fonte de alimentação fornece apenas 4 V, eu a conectei diretamente à entrada de 3,3 V do chip ESP-CAM. Eu tive que fazer isso, porque quando o conectei ao pino Vin 5V, o chip não quis iniciar ... Muito provavelmente, o regulador LDO tem uma queda de tensão um pouco alta. Voltando, agora acho que valeu a pena tentar conectar o diodo em série com uma fonte de 4 V para obter 3,3-3,4 V, mas minha solução funcionou; O ESP32 é bastante despretensioso.


Soldando todos os conectores, tive que lidar com a mecânica de qualquer maneira. Era um projeto "rápido e sujo", e eu já havia soldado os conectores ESP-Cam antes, portanto, para alinhar a câmera com o orifício, você poderia fazer com várias juntas e muito epóxi.


Após esta operação, o último problema permaneceu: os LEDs próximos à câmera brilharam na janela do quadro, causando todos os tipos de artefatos estranhos. Antes de tudo, para eliminá-los, cortei um pequeno painel de uma fita de alumínio para proteger a câmera da luz direta.


O segundo passo foi a aplicação de tinta acrílica. Este é um inserto de plástico no qual estão localizados todos os difusores, através dos quais os LEDs brilham. Eu já ampliei o orifício existente no microfone para criar uma janela de quadro mais ampla para a câmera, mas isso levou a outro problema - o orifício era muito perceptível e muita luz difusa caiu sobre a câmera. Uma mancha de tinta acrílica preta se saiu muito bem nas duas questões; a câmera ainda recebia bastante luz dos LEDs, mas agora não a inundou completamente.

Assim, o transplante cerebral está completo e o corpo está pronto para a montagem. Você pode iniciar o software.

Programas


Vamos para o software. Primeiro de tudo, precisamos obter controle sobre os drivers de LED. Isso não é difícil: os sinais do driver são quase diretamente consistentes com a interface periférica SPI do chip ESP32: o painel CLK na placa se conecta à interface CLK periférica SPI, o painel DA na placa se conecta ao MOSI do sinal SPI. Isso permitirá que você sincronize 256 bits com uma cadeia de drivers de LED: cada bit sincronizado controla a ativação ou desativação do LED correspondente. Além disso, há uma entrada do LAK. Se o sinal estiver baixo, o LED manterá seu valor anterior, independentemente do que foi transferido para os registros de turno; se o sinal estiver alto, todos eles mudarão simultaneamente para os valores que estão atualmente no registrador de turnos. Finalmente, há uma entrada EN que liga ou desliga todos os LEDs;Eu não o conectei ao GPIO e sempre acendi os LEDs programaticamente.

Assim, agora posso ligar e desligar os LEDs individuais, obtendo uma tela em preto e branco. No entanto, preciso de outra coisa. Com energia computacional suficiente, a tela também deve ser capaz de exibir tons de cinza - para isso, basta ligar / desligar os LEDs mais rapidamente do que os olhos vêem.

Para implementar isso com um único LED, geralmente uso o PWM, mas no caso de 256 LEDs, isso ocupará uma parte significativa do processador ESP32. Então, em vez disso, decidi usar a Modulação de Código Binário (também chamada de Modulação de Ângulo de Bit). Essa é uma técnica que permite obter tons de cinza com menos energia da CPU. Eu já o usei com sucesso em outros projetos , por isso tinha certeza de que funcionaria.


E funcionou. Também adicionei uma tabela de pesquisa para converter a luminosidade CIE em PWM , porque o olho responde essencialmente ao brilho dos LEDs de forma não linear; tabela de pesquisa corrige esse problema. No final, consegui obter uma quantidade suficiente de tons de cinza e escala linear do brilho óptico de acordo com o valor de pixel definido por mim.

Não foi difícil implementar o projeto da câmera: existe um componente ESP-IDF que pode ser adicionado ao projeto; ele cuidará da configuração da câmera e da troca de dados com ela, basta especificar os parâmetros necessários e solicitar o bitmap que a câmera vê. A única coisa que não pude usar na configuração padrão foi que o alinhamento automático e a exposição automática foram ativados por padrão, e isso interferiu bastante na minha maneira de controlar os LEDs: dependendo de qual parte da sequência de Modulação de código binário a imagem foi criada, a câmera aumentou aleatoriamente ou diminuiu o alinhamento e a exposição. Corrigi o problema mudando a câmera para o alinhamento manual e a velocidade do obturador; o próprio código examina a imagem e determina se esses parâmetros precisam de compensação.Graças a esse processamento manual, também consegui excluir pixels que olhavam diretamente para os LEDs para removê-los completamente da equação. Isso também ajudou muito na obtenção de uma imagem estável.

Agora eu tenho uma câmera e uma tela de 16x16 em tons de cinza. O que devo fazer com eles? Tive uma ideia: na época dos primeiros computadores Macintosh, havia uma extensão popular que adicionava apenas alguns olhos de desenho animado à barra de menus. Esses olhos simplesmente seguiram o cursor. (Ainda existe uma variação desse tema para Linux / Unix chamada "xeyes".) E se eu tentar repeti-lo na vida real?


Para começar, eu precisava de algumas imagens dos olhos. Não achei que pudesse desenhar algo que valesse a pena; então, decidi usar meus próprios olhos como figuras básicas; assista a um pequeno vídeo em que assisto e pisco em todas as direções. Vale a pena considerar que, devido à situação atual, eu tinha muito poucas ferramentas profissionais: deito no chão para maximizar a iluminação que cai das lâmpadas fluorescentes do teto e obter uma imagem legível; Todo o vídeo foi filmado no smartphone que eu seguro em minhas mãos.

Como os dados iniciais eram bastante desleixados, tive que trabalhar duro no pós-processamento. Comecei cortando um fragmento que estava aproximadamente ao redor do meu olho direito. Depois converti cada quadro do vídeo em uma imagem e apaguei todas as imagens redundantes; no final, tive uma boa seleção de imagens minhas olhando em direções diferentes, bem como alguns quadros com um piscar de olhos. No entanto, como usei um celular para gravar, o vídeo ficou um pouco instável e as imagens saltaram. Para corrigir isso, passei um conjunto de imagens pelo programa de cola de imagem Huginque geralmente é usado para panoramas e imagens HDR; na saída, tirei fotos idealmente centralizadas nessa parte do meu rosto. Agora eu só conseguia marcar em qual direção estava olhando e se eu pisquei. Fiz isso convertendo todas as imagens em tons de cinza e depois enviando-as para o Gimp . Em cada imagem, usei um ponto vermelho para indicar a localização do centro da pupila, além de um ponto vermelho no canto esquerdo ou direito para indicar se eu pisquei e, se piscar, meu olho está meio aberto ou fechado.


Depois de marcar cada imagem dessa maneira, ficou muito simples escrever um script para obter a localização do aluno e o estado de piscar. O script também dimensionou as imagens para 16x16 e as salvou como dados binários brutos, prontos para serem gravados no firmware do módulo ESP-CAM. No final, obtive um conjunto de imagens e um índice de onde a pupila está e em que estado do piscar de olhos.

A ESP-Cam possui um componente de biblioteca de câmeras bastante fácil de usar para o ESP-IDF, portanto, foi fácil obter imagens. Configurei capturando imagens de 120x160 em tons de cinza, porque são mais fáceis de processar e não precisava de muita resolução, porque o resultado final deve ser exibido em uma tela de 16x16. No entanto, eu ainda tinha um problema de hardware: a câmera ainda está muito próxima dos LEDs.


No começo, tentei resolvê-lo por calibração: quando o dispositivo é iniciado, são tiradas duas fotos: uma com um LED próximo à lente da câmera e outra apenas com um LED localizado longe da câmera. Subtraindo uma imagem de outra, você pode entender quais pixels são afetados pelos LEDs. Esses pixels são armazenados na máscara; os pixels marcados na máscara são posteriormente ignorados. A imagem acima mostra duas fotos e uma máscara.

Com uma imagem mais limpa, eu poderia passar para o reconhecimento de movimento. Eu o implementei obtendo um quadro da câmera e subtraindo o quadro anterior. Pude calcular a quantidade de movimento adicionando todos os pixels resultantes. Além disso, foi possível calcular a localização da concentração de movimento, tomando a média das coordenadas de todos os pixels ponderados pela diferença de quadros nesse pixel. No final, a mágica de filtragem é executada para que o dispositivo não pareça mexer como um macaco Russell Terrier com TDAH: para atrair sua atenção, os objetos devem se mover de maneira mais uniforme ou suficientemente longe.

Havia apenas um problema: quando estava muito escuro, o algoritmo de reconhecimento de movimento às vezes trabalhava no reflexo dos LEDs em objetos brilhantes na sala: se o olho piscava, prestava atenção ao seu próprio reflexo. Não era exatamente isso que eu queria, então contornei esse problema tornando o algoritmo de reconhecimento de movimento “cego” ao alterar a imagem nos LEDs; então eu parei esse comportamento. Além disso, também é um pouco mais realista: quando você pisca, não pode ver.

O firmware possui vários modos de depuração que demonstram todo o processo. Aqui está um pequeno vídeo ilustrando isso:


Conclusão


Então agora eu tenho um dispositivo que está me seguindo ... não é realmente útil, eu concordo. Mas foi interessante para mim criá-lo e, se algum dia encontrar algo mais útil que possa ser implementado em uma tela de LED 16x16, posso fazê-lo, porque já tenho um código de controle. Falando em código: você pode baixar livremente o meu resultado bruto a partir daqui . Espero que tenha gostado e tenha cuidado.


All Articles