3 pontos por GN⁺ 2023-12-03 | 1 comentários | Compartilhar no WhatsApp
  • Protótipo de um dispositivo de exibição 3D do tamanho da palma da mão, baseado em persistência da visão (POV), que gira por inteiro uma pequena matriz de LEDs, uma placa RP2040, uma bateria LIR2450 e um motor
  • Gira uma matriz de LEDs 8x10 e lê o período com um sensor IR, exibindo o buffer volumétrico de acordo com a velocidade medida
  • Aproveita os dois núcleos do RP2040 e o controle simultâneo de GPIO: um núcleo mede o intervalo de rotação, enquanto o outro envia os dados dos LEDs ciclo a ciclo
  • Circuito de proteção da bateria, método de carga, durabilidade do suporte impresso em 3D e ausência de limitação de corrente dos LEDs são as principais restrições; no protótipo, um aviso é exibido abaixo de cerca de 3,6 V
  • Dados de fatias polares 3D e simulações de fluido e fogo foram criados no Blender, mas a câmera captura menos profundidade do que se vê ao vivo, e a próxima versão precisará de melhorias em alinhamento e resolução

Ideia da vela eletrônica giratória

  • O objetivo era criar uma vela eletrônica que parecesse uma chama tremulando de qualquer ângulo
  • Como displays comuns de persistência da visão exigem estruturas de suporte como rolamentos e anéis coletores, a escolha foi tornar motor e bateria pequenos o bastante para que todo o dispositivo girasse junto
  • A placa da matriz de LEDs foi incluída junto com outro pedido de PCBs para fabricação rápida
    • Na China, PCBs pequenas são praticamente baratas, e a entrega rápida era o fator mais importante
  • Foi usada uma máquina pick-and-place Charmhigh CHM-T36VA
    • Carregar os rolos de componentes leva tempo, mas como esta matriz de LEDs usa apenas um tipo de componente, foi possível repetir a montagem das placas rapidamente
  • Em vez de mandar fazer um stencil de verdade, foi usado um de acetato com gravação a laser
  • A matriz de LEDs foi feita em versões com componentes 0603 e 0805, e uma versão futura prevê uma PCB circular para suporte em ângulo reto

Configuração de hardware

  • O microcontrolador escolhido foi o Waveshare RP2040-tiny, considerando tamanho compacto e capacidade de flash
    • O Raspberry Pi Pico oferece dois núcleos de 125 MHz, até 16 MB de flash e baixo custo, mas a placa em si é grande demais
    • O RP2040 bare exige flash QSPI externo, cristal e capacitores auxiliares, o que torna o uso isolado inconveniente
    • O RP2040-tiny é basicamente uma versão do Pico reduzida pela metade, com porta USB e botões de reset/boot em uma placa auxiliar ligada por cabo flat flex
  • A bateria usada é uma LIR2450
    • É recarregável de íons de lítio e pode fornecer mais de 100 mA
    • Baterias Li-ion menores têm menos capacidade e menor capacidade de fornecimento de corrente
    • Como a placa RP2040 mede cerca de 29 mm na diagonal, usar uma bateria menor não deixaria o resultado final menor
  • O suporte da bateria foi impresso em 3D com PETG
    • A primeira versão tinha parede de 0,5 mm e duas peças coladas, então a linha de cola quebrava sempre que caía
    • Depois disso, foram testadas paredes de 1 mm e uma estrutura impressa em outra orientação
  • A detecção de rotação é feita com um sensor IR TCRT5000
    • A saída é analógica, mas foi ligado diretamente a um GPIO com pull-up
    • A entrada do RP2040 tem um trigger de Schmitt desativável por software, então na prática pôde ser usada como um comparador
  • O motor escolhido foi o RF-410CA
    • Motores parecidos de drives de CD/DVD variavam um pouco em diâmetro e comprimento do eixo
    • Para 30 FPS, eram necessários cerca de 1800 RPM, e a velocidade sem carga de muitos motores pequenos, entre 5000 e 10000 RPM, era alta demais
    • A abordagem foi reduzir a velocidade com PWM

Circuito e montagem do protótipo

  • A matriz de LEDs é 8x10, então usa 18 GPIOs
    • Além disso, foi preciso considerar 1 entrada do sensor, 1 controle do motor e 1 monitoramento da tensão da bateria
  • O LED WS2812 da placa estava ligado ao GPIO16; para liberar GPIOs para a matriz, o LED foi removido e fios esmaltados foram soldados
  • Para controlar o motor, foram adicionados um pequeno MOSFET SOT-23 e um diodo flyback em montagem dead-bug
  • O LED IR foi ligado diretamente à linha de alimentação
    • O ideal seria controlá-lo por software para economizar energia quando não estiver girando, mas isso foi omitido no protótipo para poupar GPIOs
  • A matriz de LEDs foi ligada diretamente aos GPIOs, sem resistores limitadores de corrente nem transistores de acionamento
    • A corrente total de source/sink dos GPIOs do RP2040 é de cerca de 50 mA
    • A ideia é depender da resistência interna dos GPIOs e da limitação do duty cycle do PWM; se o chip travar e a matriz ficar acesa fixa, os LEDs podem ser sobrecarregados
  • O polo positivo da bateria foi ligado diretamente ao VBUS da placa
    • Nesse arranjo, conectar um cabo USB pode aplicar 5 V nos terminais da bateria, então isso é quase uma gambiarra temporária de fase de protótipo
  • Foi feito um pequeno furo na parte de trás para remover a bateria, e depois que o plástico quebrou, a bateria passou a ser presa com um elástico

Software de controle da exibição

  • O software monitora o sensor IR e usa o tempo entre disparos para definir a velocidade de exibição da matriz
  • Uma vantagem do RP2040 é poder configurar ou ler todos os pinos GPIO no mesmo ciclo de clock
    • No STM32, embora o processador seja de 32 bits, o IO fica agrupado em registradores de 16 bits e há problemas de contenção de barramento ao tentar mudar tudo ao mesmo tempo
  • Os dados de saída necessários para os GPIOs são pré-processados e então enviados em sequência de forma proporcional à velocidade de rotação medida
  • Os dois núcleos ARM Cortex-M0 foram usados em loops de espera ativa em vez de interrupções
    • O primeiro núcleo monitora o sensor IR e usa o SysTick para medir o número de ciclos entre disparos
    • O segundo núcleo espera o sinal de sincronização e então percorre o buffer volumétrico com precisão de ciclo usando seu próprio SysTick
  • O controle do motor começou com uma lógica simples
    • Se o RPM estiver abaixo de 1200, o motor roda com 90% de potência
    • Caso contrário, cai para 60%
    • Graças à inércia e à resistência do ar, esse controle simples funciona bem no protótipo atual
  • A matriz é varrida por coluna
    • Vista de cima, cada linha radial vira uma espiral leve, mas isso é mais fácil de corrigir do que se a imagem inteira virasse uma hélice
    • O duty cycle dos LEDs centrais é reduzido proporcionalmente em relação aos da periferia

Monitoramento da tensão da bateria e carregamento

  • A célula LIR2450 bare não tem circuito de proteção, então tensão baixa demais pode causar dano permanente
    • Abaixo de 3 V o problema se torna sério, e o limite real fica em torno de 2,7 V, dependendo da célula
  • O monitoramento de tensão usa um divisor com dois resistores de 100K ligado ao último GPIO disponível
  • No RP2040-tiny, a tensão de referência do ADC era variável
    • Se a referência do ADC for a tensão de alimentação, fica difícil detectar bem a queda da tensão da bateria quando a própria alimentação cai
    • O LDO RT9193-33 de 3,3 V tem dropout de 220 mV a 300 mA, então quando a bateria chega a 3,52 V a alimentação do RP2040 também começa a cair
    • No protótipo, o aviso foi configurado para aparecer abaixo de cerca de 3,6 V
    • Na próxima versão, há plano de adicionar uma tensão de referência
  • No início, a bateria era removida e colocada em um carregador independente, mas o carregador novo quebrou no primeiro uso
  • Depois disso, uma fonte de bancada foi ajustada para limite de corrente de 50 mA e 4,2 V em tensão constante para carregar a célula Li-ion única
    • Como não estava claro se a capacidade da bateria era 120 mAh ou 60 mAh, foi escolhida uma corrente de carga mais conservadora que 1C
  • Para facilitar o desenvolvimento, foi criada uma placa intermediária USB entre o PC e a placa de programação do RP2040-tiny
    • A linha de 5 V foi separada e os pinos da bateria foram expostos, permitindo conectar a fonte sem remover a bateria
    • As linhas de dados continuaram ligadas, então era possível programar com a bateria instalada
  • Mais tarde, um CI carregador Li-ion BQ21040DBVR foi adicionado no meio dessa placa intermediária USB
    • Assim, a bateria pode ser carregada com o cabo de programação conectado
    • O protótipo não desliga completamente e continua consumindo cerca de 9 mA só no LED IR, com corrente total em espera em torno de 15 mA, então não chega à condição de término de carga completa
    • Por causa da queda de tensão no cabo, a bateria talvez nem passe de 4,1 V

Criando dados volumétricos no Blender

  • Os dados de exibição precisam ser gerados no formato polar 3D r, theta, z
  • O primeiro teste foi feito com um cubo em wireframe
    • Foi aplicado o modificador wireframe ao cubo padrão do Blender
    • O cubo foi girado 45 graus no eixo x e atan(1/sqrt(2)) no eixo y para que as arestas apontassem para cima
  • Para gerar as fatias, outro cubo foi deformado como uma lâmina fina e usado com o modificador boolean
    • A câmera e a fatia foram parentadas a um Empty, e a rotação em Z do Empty foi animada
    • A câmera foi configurada como orthographic e a resolução ajustada para 8x10
    • O fundo foi definido como preto, o material do cubo como emissivo, e o colour ramp do compositor foi usado para definir o limiar
  • O display atual usa apenas voxels de 1 bit
    • Cada voxel só pode estar ligado ou desligado
    • No Blender, o limiar foi ajustado visualmente para escolher um cutoff adequado
  • Render animation gerou 24 imagens de fatias do cubo em wireframe, e um script Python as converteu em um arquivo de cabeçalho incluído no código
  • Drivers do Blender foram usados para controlar a rotação da câmera e do cubo com fórmulas baseadas em frames
    • Para a rotação da câmera, foi usado (frame/24)*2*pi
    • Para a rotação em y do cubo, foi usado floor(frame/24)*pi/24, fazendo-o girar um pouco a cada volta
    • A intenção era manter cada frame de dados de forma discreta para poder ajustar a velocidade de reprodução conforme o RPM do motor

Simulação de fluido e fogo

  • A simulação de fluidos do Blender é fácil de começar, mas os muitos parâmetros dificultam obter exatamente o resultado desejado
  • A simulação de líquido é relativamente fácil de converter em mesh de partículas, o que facilita levá-la a um display volumétrico
  • Houve tentativa de simular em velocidade de 1/24 e depois extrair os dados volumétricos polares da mesma forma, mas a escala de tempo muito lenta gerava instabilidade e não foi encontrado um jeito simples de desacelerar a reprodução
  • Os recursos Multi-view ou Stereoscopy também foram considerados
    • É possível adicionar várias câmeras e renderizar múltiplos pontos de vista ao mesmo tempo
    • Mas não ficou claro como girar rapidamente 24 câmeras de forma uniforme, e ainda seria preciso renderizar junto o modificador boolean das fatias
  • Também foi tentado o atalho de renderizar uma fatia fina da cena usando a clipping distance da câmera
    • O problema era que o interior do objeto cortado não ficava preenchido, e só a superfície era desenhada
    • Houve experimentos para ver se um material volumétrico poderia preencher parte disso, mas sem sucesso
  • No fim, foi usado um script Python do Blender para renderizar 24 vezes
    • A rotação em Z do Empty foi alterada para 24 ângulos diferentes, e em cada ângulo a animação inteira foi renderizada novamente
    • Assim foi possível manter a simulação de fluidos em tempo real e obter as fatias em cada direção de rotação
  • A simulação de fogo foi bakeada em OpenVDB e depois reimportada para o Blender
    • O modificador Volume to Mesh foi usado para aplicar um limiar aos dados volumétricos
    • Depois foram aplicados a fatia da câmera e o modificador boolean, e o mesmo script foi executado novamente

Qualidade da exibição e próxima versão

  • O dispositivo real tem profundidade mais forte do que fotos ou vídeos conseguem mostrar
  • Erros de alinhamento dos LEDs podem ser corrigidos por software
    • A posição da fatia boolean pode ser ligeiramente deslocada do centro para coincidir com o centro real de rotação
    • Em vez de um cubo alongado, também poderia ser usada uma forma um pouco curvada para compensar o padrão de varredura da matriz
    • Na resolução atual, essas melhorias talvez não sejam tão perceptíveis
  • A condição mais importante é que cada voxel individual da periferia pareça um único ponto de qualquer ângulo
    • Se o alinhamento estiver errado, um voxel pode parecer acender duas vezes e ficar alongado
  • O caractere central m foi renderizado separadamente para ser legível de todas as direções
    • O texto é rolado de forma que possa ser lido tanto de frente quanto por trás
  • O próximo protótipo deve melhorar alinhamento e resolução
  • Como não havia uma chave deslizante pequena, não foi incluída uma função para desligar sem remover a bateria, mas isso foi resolvido inserindo um pequeno pedaço de acetato entre a bateria e o contato
  • Como já existe um sensor IR, parece possível adicionar um controle remoto, embora o sensor atual não seja do tipo demodulado
  • O código-fonte está disponível no GitHub: source code on github

1 comentários

 
GN⁺ 2023-12-03
Opiniões no Hacker News
  • Tenho algumas ideias de melhoria. Se houver um motor igual sobrando, dá para desmontar dois e usar as escovas dos dois conjuntos para criar um dispositivo de transmissão de energia rotativa
    É preciso sacrificar dois motores por dispositivo, mas o encaixe fica perfeito e muito estável; com um capacitor e um retificador, você não precisa mais se preocupar com a bateria
    O retificador também fornece um sinal de que o conjunto completou uma volta, então dá para manter a estabilização da imagem com base na posição real, sem precisar estimar o ciclo
    Também pode ser possível transmitir energia por indução, mas não consegui transferir com eficiência suficiente, então era preciso elevar demais a tensão de entrada, e fiquei preocupado com risco de incêndio
    Esse conselho vem de um projeto de arte do Burning Man de 2001. Uma foto do protótipo inicial, bem desastroso, está aqui: https://github.com/sowbug/tqw/blob/master/photos/side.jpg. A instalação final funcionou muito bem

    • Tudo isso está certo, mas também gostei da solução que usa um sensor IR para sincronização. O jeito de girar o display mudando a posição do dedo ficou muito legal e também não exigia estimativas
    • É uma ideia bem boa. As escovas provavelmente vão durar bastante. Felizmente, carregamento sem fio de celular já se popularizou, então dá para comprar kits como [1] ou [2]
      Fico curioso também sobre como as empresas de LIDAR lidam com algo assim
      1: https://www.adafruit.com/product/1407
      2: https://www.adafruit.com/product/2162
    • Outra ideia: que tal colocar um pequeno display TFT em cima do motor? Dá para encontrar modelos baratos no aliexpress
    • Que tal deixar o motor como está e usar um segundo motor como gerador?
    • Se o motor de acionamento for um motor assíncrono, talvez dê para alimentar a eletrônica rotativa pela bobina de indução do rotor, mas a diferença de fase pode ficar bem extrema
  • É uma daquelas ideias geniais que parecem óbvias depois que a gente vê
    Se o resultado fica tão convincente mesmo montando manualmente componentes discretos relativamente primitivos, fico pensando por que não surgiria uma versão colorida de alta resolução em alguma marca dropshipping aleatória de 7 letras na Amazon até o próximo Natal

    • Não é uma ideia nova; isso é chamado de display volumétrico de volume varrido e existe há muito tempo [1]
      Mas a maioria é praticamente só brinquedo. Se só dá para ter superfícies transparentes brilhantes e nem dá para tocar, não há muita coisa útil para fazer
      Também dá para ver versões muito maiores e não rotativas feitas com LEDs pendurados em cabos [2], e elas são muito legais, mas a novidade passa rápido e você percebe que não é um display para uso produtivo
      Se a ideia é ter visualização 3D de verdade, capaz de renderizar qualquer coisa com alta qualidade e permitir interação, headsets de VR/AR parecem ser o caminho certo. Também existem novos monitores 3D que não precisam de óculos, mas ainda não há muita gente que tenha visto um pessoalmente
      Talvez dê para fazer um brinquedo vendável na Amazon, mas não sei bem se existe um killer app para esse tipo de coisa
      [1] https://en.wikipedia.org/wiki/Volumetric_display#Swept-volum...
      [2] https://www.ledpulse.com/
    • Para um display de 32 polegadas, acho que o motor teria que girar a uma velocidade absurda numa área de pi*32^2
  • É um projetinho realmente muito legal. Vale muito ver os outros projetos também. Alguns já apareceram no HN antes
    https://mitxela.com/projects/hardware
    Pessoalmente, o meu favorito é o apito deslizante MIDI

    • O projeto do amplificador de fones de ouvido[0] me lembrou um pouco o livro Schiit Happened
      [0] https://mitxela.com/projects/headphone_amps
    • Verdade, também havia aquele projeto de converter HDMI para um display OLED, que era uma loucura
  • Criativo. Talvez eu tenha a persistência e o interesse para levar algo assim até o fim, mas me falta a imaginação para pensar em um projeto tão legal
    Felizmente existe a internet, então dá para ver as coisas impressionantes que as pessoas criam

    • É um método que o Tom 7 mencionou em um de seus vídeos: manter uma lista de ideias e anotar tudo o que vier à cabeça, mesmo que pareça idiota. A filtragem fica para depois
      Assim, quando você tiver energia para fazer um projeto, não precisa desperdiçá-la tentando ter ideias
      Isso muda bastante a quantidade de side projects que você consegue realmente concluir. É bem provável que você tenha mais ideias interessantes do que imagina. Só que, se o momento em que a ideia surge não coincide com o momento em que você tem tempo e energia para executá-la ou desenvolvê-la, ela acaba desaparecendo
    • Tenho o problema exatamente oposto. Ideias criativas continuam aparecendo, e, quando estou fazendo o protótipo v1 ou v2 da ideia A, surge a ideia B e atrapalha levar a A até o fim
      Mesmo quando se ganha persistência e disciplina, aí aparecem as contas para pagar, então a distração deixa de ser a ideia B e vira simplesmente trabalho comum
    • Criatividade também pode ser treinada, como qualquer outra habilidade :)
      Concordo em registrar as coisas. Como na maioria das atividades, se você praticar com seriedade, melhora
      O que frequentemente é ignorado é (1) conhecimento técnico, (2) invenção sistemática, (3) motivação
      Conhecimento técnico permite saber quais projetos são possíveis, ou economicamente viáveis, e desenhar os obstáculos no caminho. Invenções impossíveis não têm muita utilidade
      Invenção sistemática é olhar para as coisas de modo estruturado, em vez de depender de ideias aleatórias. Por exemplo, analisar (a) quero criar um display volumétrico, (b) quero dar vida a objetos 3D virtuais. Há uma diferença sutil entre os dois
      Um display volumétrico (a) pode ir de displays de campo de luz, com uma base teórica elegante, até displays volumétricos por persistência de visão como o mostrado aqui. Ao investigar a fundo o domínio do problema, é bem provável que você acabe chegando às soluções possíveis
      Dar vida a objetos 3D (b) pode significar um domínio de problema muito mais amplo, incluindo fabricação digital, óculos de VR, interação tátil, robôs etc.
      Motivação também é realmente importante. Entender por que você inventa e o que quer tornar real também tem muito valor. Coisas como querer alegrar as pessoas, ou ser simplesmente muito legal, ou ser um dispositivo médico útil que pode salvar vidas
      Também dá para estudar como focar em temas valiosos, e isso melhora muito sua capacidade de inventar. Claro, criar só porque gostamos também é importante e válido :)
      Pessoalmente, a parte mais importante é se divertir no processo
  • Isso é muito parecido com o modo como um ventilador holográfico funciona. Toda a eletrônica fica dentro da parte que gira
    Esses ventiladores frequentemente usam transferência de energia sem fio para alimentar a placa de cima
    https://youtu.be/bT716nyK0AY

  • Se você estiver em Londres ou for visitar, esse tipo de tecnologia é usado com frequência em exposições de arte na 180 Studios [1]
    Vale a pena visitar se você se interessa por arte e tecnologia
    [1] https://www.180studios.com/

    • Interessante. Será que existem museus de tecnologia x arte nos EUA?
  • É um ótimo canal do YouTube se você gosta desse tipo de coisa
    Fico curioso se seria possível atualizar displays OLED baratos com rapidez suficiente para obter uma resolução muito maior. Talvez seja possível, mas é provável que o espaço entre os segmentos radiais fique muito maior que o espaçamento entre pixels, então talvez acabe parecendo pior

  • Acho que o problema de centralização poderia ser resolvido colocando duas placas de LED em cima, costas com costas
    Uma placa deslocaria os LEDs pela metade para criar um efeito interlaced e, ao mesmo tempo, talvez dobrasse a resolução

    • Ou simplesmente não centralizar e mudar a matemática para refletir que o LED não está no centro
    • Com certeza deve haver uma forma de trocar a estrutura que gira a fileira de LEDs por algo mais leve. Espelhos ou uma matriz de light pipes de acrílico, talvez?
  • Eu pagaria mais de 200 dólares por uma versão RGB robusta, maior, de algo como 50x50, que pudesse exibir imagens diferentes sem precisar programar

  • Há também outro ótimo projeto de display volumétrico, publicado recentemente mas que não recebeu muita atenção
    https://news.ycombinator.com/item?id=38406824