Índice:
- Etapa 1: modulação de largura de pulso para misturar cores
- Etapa 2: Conversando com registros de deslocamento e LEDs
- Etapa 3: esquemático
- Etapa 4: Código-fonte C ++
- Etapa 5: Gadget concluído
- Etapa 6: Aplicativo: Monitor de carga da CPU para Linux usando Perl
- Etapa 7: Aplicação: Conversando com outros módulos usando I²C
- Etapa 8: Aplicativo: "Game Cube":-)
- Etapa 9: Exibição de imagens / animações na matriz - hack rápido
- Etapa 10: controle interativo de animações armazenadas
- Etapa 11: Mostrar vídeo ao vivo
- Etapa 12: Mais luz quase de graça
2025 Autor: John Day | [email protected]. Última modificação: 2025-01-13 06:58
Este display é baseado em uma matriz LED RGB 8x8. Para fins de teste, ele foi conectado a uma placa Arduino padrão (Diecimila) usando 4 registradores de deslocamento. Depois de colocá-lo para funcionar, eu o permatizei em um PCB fabricado. Os registradores de deslocamento têm largura de 8 bits e têm interface fácil com o protocolo SPI. A modulação de largura de pulso é usada para misturar as cores, mais sobre isso mais tarde. Parte da RAM do MCU é usada como um framebuffer para manter a imagem. A RAM de vídeo é analisada por uma rotina de interrupção em segundo plano, para que o usuário possa fazer outras coisas úteis, como falar com um PC, ler botões e potenciômetros. Mais informações sobre "Arduino": www.arduino.cc
Etapa 1: modulação de largura de pulso para misturar cores
Modulação de largura de pulso - O QUÊ? A modulação de largura de pulso essencialmente liga e desliga a energia fornecida a um dispositivo elétrico muito rapidamente. A potência utilizável resulta da média matemática da função de onda quadrada obtida no intervalo de um período. Quanto mais tempo a função permanece na posição ON, mais potência você obtém. O PWM tem o mesmo efeito no brilho dos LEDs que um dimmer nas luzes AC. A tarefa a seguir é controlar individualmente o brilho de 64 LEDS RGB (= 192 LEDs individuais!) De maneira fácil e barata, para que se possa obter o todo espectro de cores. De preferência, não deve haver cintilação ou outros efeitos perturbadores. A percepção não linear de brilho exibida pelo olho humano não será levada em consideração aqui (por exemplo, a diferença entre 10% e 20% de brilho parece "maior" do que entre 90% e 100%). A imagem (1) ilustra o princípio de funcionamento de o algoritmo PWM. Digamos que o código receba um valor 7 para o brilho do LED (0, 0). Além disso, ele sabe que há um máximo de N passos no brilho. O código executa N loops para todos os níveis possíveis de brilho e todos os loops necessários para atender a todos os LEDs em todas as linhas. Caso o contador de loop x no loop de brilho seja menor que 7, o LED é ligado. Se for maior que 7, o LED está desligado. Fazendo isso muito rapidamente para todos os LEDs, níveis de brilho e cores básicas (RGB), cada LED pode ser ajustado individualmente para mostrar a cor desejada. As medições com um osciloscópio mostram que o código de atualização da tela leva cerca de 50% do tempo de CPU. O resto pode ser usado para fazer comunicação serial com um PC, ler botões, falar com um leitor RFID, enviar I2Dados C para outros módulos …
Etapa 2: Conversando com registros de deslocamento e LEDs
Um registrador de deslocamento é um dispositivo que permite o carregamento de dados em série e uma saída paralela. A operação oposta também é possível com o chip apropriado. Há um bom tutorial sobre registradores de deslocamento no site do arduino. Os LEDs são acionados por registradores de deslocamento de 8 bits do tipo 74HC595. Cada porta pode fornecer ou absorver cerca de 25mA de corrente. A corrente total por chip afundado ou originado não deve exceder 70mA. Esses chips são extremamente baratos, então não pague mais do que cerca de 40 centavos por peça. Como os LEDs têm uma característica exponencial de corrente / tensão, é necessário que haja resistores limitadores de corrente. Usando a lei de Ohm: R = (V - Vf) / IR = resistor limitador, V = 5V, Vf = tensão direta do LED, I = corrente desejada LEDs vermelhos tem uma tensão direta de cerca de 1,8 V, faixa azul e verde de 2,5 V a 3,5 V. Use um multímetro simples para determinar isso. Para uma reprodução adequada das cores, deve-se levar em consideração alguns aspectos: sensibilidade espectral do olho humano (vermelho / azul: ruim, verde: bom), eficiência do LED em um determinado comprimento de onda e corrente. Na prática, basta pegar 3 potenciômetros e ajustá-los até que o LED mostre a luz branca adequada. Claro que a corrente máxima do LED não deve ser excedida. O que também é importante aqui é que o registro de deslocamento que conduz as linhas deve fornecer corrente para 3x8 LEDs, portanto, é melhor não aumentar muito a corrente. Tive sucesso com resistores de limitação de 270 ohm para todos os LEDs, mas isso depende da marca da matriz de LED, é claro. Os registradores de deslocamento têm interface com SPI serial. SPI = Interface Periférica Serial (Imagem (1)). Oposta às portas seriais dos PCs (assíncrona, sem sinal de clock), a SPI precisa de uma linha de clock (SRCLK). Em seguida, há uma linha de sinal informando ao dispositivo quando os dados são válidos (seleção de chip / trava / RCLK). Finalmente, existem duas linhas de dados, uma é chamada MOSI (master out slave in), a outra é chamada MISO (master in slave out). SPI é usado para fazer a interface de circuitos integrados, assim como eu2C. Este projeto precisa de MOSI, SRCLK e RCLK. Além disso, a linha de habilitação (G) também é usada. Um ciclo SPI é iniciado puxando a linha RCLK para BAIXO (Imagem (2)). O MCU envia seus dados na linha MOSI. O estado lógico disso é amostrado pelo registrador de deslocamento na borda ascendente da linha SRCLK. O ciclo é encerrado puxando a linha RCLK de volta para HIGH. Agora os dados estão disponíveis nas saídas.
Etapa 3: esquemático
A imagem (1) mostra como os registradores de deslocamento são conectados. Eles são encadeados em série, então os dados podem ser transferidos para esta cadeia e também através dela. Portanto, adicionar mais registradores de deslocamento é fácil.
A imagem (2) mostra o resto do esquema com o MCU, conectores, quartzo … O arquivo PDF anexado contém todas as obras, melhores para impressão.
Etapa 4: Código-fonte C ++
Em C / C ++ geralmente é necessário criar um protótipo de funções antes de codificá-las. # Include int main (void); void do_something (void); int main (void) {do_something ();} void do_something (void) {/ * comentário * / } O IDE do Arduino não requer essa etapa, pois os protótipos das funções são gerados automaticamente. Portanto, protótipos de função não aparecerão no código mostrado aqui. Image (1): setup () functionImage (2): função spi_transfer () usando hardware SPI do chip ATmega168 (roda mais rápido) Image (3): código de framebuffer usando uma interrupção de estouro de timer1. Partes do código que têm uma aparência ligeiramente enigmática para iniciantes, por exemplo enquanto (! (SPSR & (1 << SPIF))) {} usa os registradores do MCU diretamente. Este exemplo em palavras: "enquanto o bit SPIF no registro SPSR não estiver definido, não faça nada". Eu só quero enfatizar que para projetos padrão não é realmente necessário lidar com essas coisas tão intimamente relacionadas ao hardware. Iniciantes não devem se assustar com isso.
Etapa 5: Gadget concluído
Depois de resolver todos os problemas e colocar o código em execução, eu só tive que criar um layout de PCB e enviá-lo para uma fábrica. Parece muito mais limpo:-) Imagem (1): placa controladora totalmente preenchida Imagem (2): parte frontal do PCBImage nu (2): lado traseiro Existem conectores saindo PORTC e PORTD do chip ATmega168 / 328 e 5V / GND. Essas portas contêm as linhas seriais RX, TX, o I2Linhas C, linhas I / O digitais e 7 linhas ADC. Destina-se a empilhar escudos na parte traseira da placa. O espaçamento é adequado para usar o perfboard (0,1 pol.). O bootloader pode ser atualizado usando o cabeçalho ICSP (funciona com USBtinyISP da adafruit). Assim que terminar, basta usar um adaptador serial FTDI USB / TTL padrão ou similar. Também adicionei um jumper de desabilitação de reinicialização automática. Eu também preparei um pequeno script Perl (veja meu blog), que permite a reinicialização automática com cabos FTDI que geralmente não funcionam fora da caixa (RTS vs. linha DTR). Isso funciona no Linux, talvez no MAC. Placas de circuito impressas e alguns kits DIY estão disponíveis no meu blog. Requer solda SMD! Consulte os arquivos PDF para obter instruções de construção e fontes para matrizes de LED.
Etapa 6: Aplicativo: Monitor de carga da CPU para Linux usando Perl
Este é um monitor de carga muito básico com um gráfico de histórico. É baseado em um script Perl que reúne a "média de carga" do sistema a cada 1s usando iostat. Os dados são armazenados em uma matriz que é alterada a cada atualização. Novos dados são adicionados no topo da lista, a entrada mais antiga é eliminada. Informações mais detalhadas e downloads (código…) estão disponíveis no meu blog.
Etapa 7: Aplicação: Conversando com outros módulos usando I²C
Esta é apenas uma prova de princípio e de longe não é a solução mais simples para este trabalho.2C permite endereçar diretamente até 127 placas "escravas". Aqui, a placa do lado direito do vídeo é a "master" (que inicia todas as transferências), a placa da esquerda é a escrava (aguardando os dados). eu2C precisa de 2 linhas de sinal e as linhas de alimentação usuais (+, -, SDA, SCL). Por se tratar de um barramento, todos os dispositivos são conectados a ele em paralelo.
Etapa 8: Aplicativo: "Game Cube":-)
Apenas um pensamento estranho. Este também se encaixa em uma caixa de madeira mostrada na página de introdução. Tem 5 botões na parte traseira que podem ser usados para jogar um jogo simples. O FIM?
Etapa 9: Exibição de imagens / animações na matriz - hack rápido
Portanto, ele tem apenas 8x8 pixels e algumas cores disponíveis. Primeiro use algo como o Gimp para reduzir sua imagem favorita para exatamente 8x8 pixels e salve-a no formato bruto ".ppm" (não ASCII). PPM é fácil de ler e processar em um script Perl. Usar o ImageMagick e a ferramenta de linha de comando "convert" não funcionará corretamente. Carregue o novo código do arduino e, em seguida, use o script Perl para fazer o upload para o controlador. A cintilação é apenas uma incompatibilidade entre a atualização do LED e a taxa de quadros da minha câmera. Depois de atualizar um pouco o código, ele fica bastante zippy. Todas as imagens são transferidas ao vivo em série conforme você as vê. As animações mais longas podem ser armazenadas em uma EEPROM externa, como é feito em vários painéis spoke-pov.
Etapa 10: controle interativo de animações armazenadas
Por que deixar o microcontrolador ter toda a diversão? O culto do Arduino tem tudo a ver com computação física e interação, então basta adicionar um potenciômetro e assumir o controle! Usar uma das 8 entradas do conversor analógico para digital torna isso muito simples.
Etapa 11: Mostrar vídeo ao vivo
Usar um script Perl e alguns módulos torna muito fácil mostrar vídeo quase ao vivo em sistemas X11. Ele foi codificado em Linux e pode funcionar em MACs também. Funciona assim: - coloque a posição do cursor do mouse - capture uma caixa de pixel NxN centralizado no cursor - dimensione a imagem para 8x8 pixels - envie para a placa de LED - repetir
Etapa 12: Mais luz quase de graça
Com apenas duas etapas, o brilho pode ser aumentado um pouco. Substitua os resistores de 270Ω por 169Ω e acrescente outro registrador de deslocamento 74HC595 ao IC5.