Controlando 500 LEDs com PWM

26

Estou pensando em assumir um projeto que envolveria o endereçamento individual de 500 LEDs, de maneira ideal com suporte a PWM para cada um.

Estou planejando usar um Arduino já que já tenho um, mas estou aberto a sugestões se alguém achar que uma plataforma diferente seria uma combinação melhor.

Registros de turnos precisariam ser empregados. O que é um bom registro de turno para usar nessa situação? Se o PWM tornar esse projeto muito mais caro, eu posso ficar sem ele. Quero tentar gastar menos de US $ 100. Eu compraria em massa 500 LEDs no ebay.

Qual a sua opinião sobre a melhor maneira de controlar um número tão grande de LEDs? Além disso, como eu iria fornecer o poder? Eu apreciaria qualquer ajuda. Sou bastante experiente em eletrônica, nunca fiz nada em larga escala.

littlebirdceo
fonte

Respostas:

14

Sou o autor da biblioteca ShiftPWM e atualizei a documentação para incluir esquemas e informações muito mais gerais sobre LEDs normais, tiras de LED e LEDs de alta potência.

Você provavelmente já iniciou seu projeto, mas como essa página recebe muitos visitantes, eu ainda gostaria de fornecer uma resposta detalhada.

Se você deseja controlar 500 LEDs com ShiftPWM, pode obter cerca de 64 níveis de brilho por LED a 60 Hz. Você usaria 64 registros de turno. Os drivers PWM de hardware dedicados fornecerão mais níveis de brilho, mas serão um pouco mais caros. Eu acho que a principal vantagem da minha biblioteca é a facilidade de uso, porque inclui funções RGB e HSV e muitos exemplos.

Eu pessoalmente compraria o TLC5916 do TLC5917 em vez dos registros de turno normais, porque eles têm um driver de LED atual constante. Isso poupará muita solda, porque você não precisa de resistores.

No meu site ( http://www.elcojacobs.com/shiftpwm ), tenho mais informações sobre como conectar os LEDs e como lidar com a condução de fios longos de sinal com o Arduino em alta velocidade.

Se você tiver mais alguma dúvida, por favor, pergunte.

ElcoJacobs
fonte
Você já viu minha resposta abaixo? Embora a técnica que descrevo use hardware extra, a mesma abordagem provavelmente poderia ser usada para melhorar bastante a velocidade da sua biblioteca. Eu não programei o Arduino, por isso não estou familiarizado com o tempo de instruções, mas da forma mais simples, você pode reduzir o carregamento da CPU para o que for necessário para simplesmente explodir os bits do SPI (se você estiver atualmente em 5 ciclos) por bit e seu SPI leva 16 ciclos por byte, isso seria uma aceleração de 2,5x). Você pode até fazer coisas mais sofisticadas enquanto continua a executar nessa velocidade.
Supercat 09/08
Por exemplo, suponha que você deseje ter oito níveis de brilho representando: full, 1/2, 1/4, 1/8, 1/16, 1/32, 1/64, e 1/128. Se o Arduino puder executar uma operação "AND" ou "OR" em um valor buscado em um ponteiro e incrementá-lo em menos de quatro ciclos, você provavelmente poderá usar três bits por pixel para armazenar suas informações de brilho e ainda atingir uma velocidade de transferência de 16 ciclos por 8 LEDs.
Supercat 09/08
O cálculo dos valores de PWM sobrepõe a saída SPI na minha biblioteca. Eu corro o SPI a 4MHz e os cálculos demoram um pouco mais do que a saída do SPI. São necessários 43 ciclos de clock por byte, portanto, por 8 saídas. Isso é rápido o suficiente para a maioria das configurações. Você pode obter mais velocidade usando a modulação de código de bits, onde você tem 8 períodos de atualização, cada próximo período com metade da duração do anterior. Eu escrevi uma versão do BCM, mas é mais sensível ao momento em que você atualiza a configuração de brilho. Pode causar tremulação quando está desalinhado. Provavelmente vou usá-lo na versão matricial.
precisa saber é o seguinte
O BCM tem a vantagem de sua abordagem: você pode usar o tempo 1 / 2,1 / 4 ..., mas ainda usa apenas um pino por LED. Se você tem experiência em ciência da computação, pode achar interessante como os bytes SPI são calculados. Recebo o ciclo de serviço da memória (2 relógios) e faço uma comparação (1 relógio). O resultado da comparação é armazenado no transporte, para que eu possa alterá-lo para o byte com uma rotação sobre transporte (1 relógio). Fazê-lo 8 vezes coloca todos os resultados de comparação em um byte, pronto para enviar ao SPI.
ElcoJacobs
13

Basta copiar :-)

http://www.evilmadscientist.com/article.php/peggy2

Hoje, estamos lançando uma atualização para nosso projeto de Pegboard de código-fonte aberto "Peggy". A versão 2 do Peggy foi redesenhada a partir do zero. E parece ... quase exatamente o mesmo. As mudanças ocultas são substanciais, e achamos que é uma grande melhoria de várias maneiras.

Em primeiro lugar, o Peggy 2.0 ainda faz a mesma coisa: fornece energia eficiente a uma matriz 25 x 25 de locais de LED. O Peggy foi projetado para tirar parte da picada, complexidade e bagunça da brincadeira com LEDs. É um pegboard emissor de luz versátil e poderoso que permite conduzir com eficiência centenas de LEDs na configuração que desejar, sem precisar calcular um único resistor de carga. Você pode instalar de um a 625 LEDs e o Peggy os acenderá para você.


O Peggy 2.0 agora também é compatível com o Arduino: suporta programação através de um cabo USB-TTL, usando o popular ambiente de software do Arduino.

Axeman
fonte
Link maravilhoso! Marcado como favorito. Eu não estava planejando para trabalhar em um projeto como este, mas eu tenho que fazer isso agora eu vi que pequeno vídeo :-)
Wouter Simons
@NicolaeSurdu Não está quebrado. Abri agora.
Axeman
3
Embora isso possa teoricamente responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência.
6

Em que layout você deseja os LEDs? Você pode economizar muito trabalho se comprar algumas matrizes de LED. Você pode obter matrizes de 8x8 LED de cor única (64 LEDs) por um ou dois dólares .

Você não terá um PWM real com um AVR e registros de deslocamento nesses muitos LEDs, mas poderá espremer de 2 a 4 níveis de brilho. Você teria que executar os números e ver o que é possível.

A Allegro cria alguns registradores de troca de coletor de corrente constante, projetados especificamente para controlar matrizes de LEDs, para que você não precise de resistores extras, que também tornarão as coisas mais simples. Talvez você não consiga acionar os LEDs diretamente da saída do AVR se ele não fornecer energia suficiente, portanto, você precisará usar transistores. Você pode colocá-los em matrizes em um único IC , o que economiza algum trabalho também.

davr
fonte
todos muito bons pontos!
21713 Jason S
5

Não tenho idéia da faixa de PWM necessária para um LED, mas estou trabalhando em um controlador PWM de 64 canais para um aplicativo de servocontrole que pode me fornecer pulsos entre 600us e 2,4ms. Ele usa o CD74HCT238E (desmultiplexadores de 3-8 linhas) para gerar 64 canais a partir de 8 pinos de E / S em um ATMega168 e é controlável através de simples comandos seriais. Eu acho que você pode encadear várias versões de uma versão modificada deste controlador em uma linha serial e endereçar todos os 500 LEDs ... Você provavelmente poderia usar a versão ATTiny2313 do controlador, pois seus requisitos de firmware seriam mais simples.

Meu blog contém a origem da montagem, esquemas e detalhes do processo de design.

Len Holgate
fonte
5

Confira os CIs "driver de LED" na mouser / digikey. A TI, por exemplo, fabrica vários drivers com uma variedade de interfaces (I2C, SPI) que certamente atenderiam às suas necessidades. A maioria desses drivers é projetada para ser encadeada, para que a saída serial de um seja alimentada na entrada serial de outro.

Por exemplo, algo como o TLC5940 oferece controle PWM de 16 canais. Portanto, basicamente é um registro de deslocamento atual de 16 bits constante com controle PWM de escala de cinza de 12 bits. Posso recomendar esse IC em particular quando ajudei a projetar um monitor de 80x16 com ele.

David Brenner
fonte
4

A Mondomatrix fabrica algumas placas de driver LED endereçáveis ​​seriais (rs-485) e baseia-se na plataforma Arduino: http://www.displayduino.com/ Você pode montar um sistema usando esse hardware com bastante facilidade


fonte
4

Se você não deseja muitos bits de controle PWM para cada LED e deseja evitar ter que um processador se atrapalhar com 500 LEDs a cada ciclo PWM, pode controlar 8 LEDs com N bits de brilho usando N 74HC595 ou chips equivalentes . Conecte as saídas de todos os chips N e conecte os capacitadores a alguns circuitos que permitirão apenas um de cada vez no tempo adequado. Organize para que o primeiro chip seja ativado na metade do tempo, o segundo será ativado na metade do restante, etc.

Qualquer recarga dos registros de turno deve ser sincronizada com a taxa de PWM, de modo a minimizar os efeitos de serrilhado (por exemplo, se um nível de brilho alternar rapidamente entre 0111 e 1000, o ponto no ciclo de PWM em que o comutador ocorreu pode alterar momentaneamente o brilho aparente )

Embora o uso de várias saídas 74HC595 para cada LED possa ser irritante, essa abordagem é provavelmente a mais simples que pode manter diferentes níveis de brilho sem a intervenção contínua da CPU.

supercat
fonte
3

Isso não responde diretamente à pergunta, mas outro aspecto que você deve considerar é a possível variabilidade de brilho entre os LEDs no seu lote de 500. Isso é particularmente importante se esses LEDs forem montados próximos um do outro, como em uma matriz ou em displays de 7 segmentos. Consulte esta resposta para obter mais detalhes sobre como resolver esse problema, em particular, usando a correção de pontos para compensar as variações no brilho do LED.

Eu experimentei esse problema quando obtive 200 LEDs vermelhos de 1 mm para um conjunto de displays grandes de 7 segmentos que eu estava construindo. Minha solução barata para resolver o problema envolvia o seguinte:

  1. Eu construí um testador de LED em uma placa de ensaio para classificar conjuntos de leds em várias categorias de brilho
  2. Montei cada segmento usando LEDs na mesma categoria (no meu design, cada segmento consistia em 5 LEDs montados em série)
  3. Eu compensei a diferença no brilho de cada segmento usando diferentes resistores limitadores de corrente. Por exemplo, para um segmento com LEDs mais brilhantes, eu usaria um resistor de 100 ohm, enquanto, para outro segmento com LEDs mais escuros, usaria resistores de 120 ohm.
Ricardo
fonte
11
Ponto válido, mas não responde à pergunta.
Matt Young
11
@MattYoung Concordou. A questão é amplamente respondida por todas as outras respostas. Eu só queria complementar essas respostas, abordando uma questão paralela que pode afetar o design do OP.
Ricardo
1

O XMOS usa o Macroblock MBI5026 com seus kits de LEDs. Eu acho que eles são usados ​​na maioria dos outros sistemas profissionais.

Leon

Leon Heller
fonte
1

Chips de driver dedicados com interfaces seriais provavelmente serão a melhor rota. Lidar com registros de turno individuais provavelmente significará um circuito muito complexo. Pelo menos Maxim e TI fazem alguns. Não me lembro se um deles tem um modelo particularmente adequado para isso.

Ainda será preciso muito hardware.

Quanto à energia, programação e barramentos, a folha de dados de cada driver provavelmente terá mais informações necessárias.

XTL
fonte
1

Dentro da área de software, se o número de configurações distintas de brilho necessárias não for muito grande, pode ser útil armazenar os dados no formato "bit-planar" (conforme descrito em minha outra resposta baseada em hardware) e, em seguida, ter o As rotinas de saída usam operadores booleanos para atuar em 8 pixels de uma vez. Para máxima eficiência, isso exigirá ter várias rotinas de saída separadas, usadas para diferentes partes do ciclo do PWM; por exemplo, se desejar usar valores de brilho de 4 bits, use oito rotinas do formulário:

  movf bit0Comp, w; Deve ser 00 ou FF, dependendo do bit 0 do comparando (FF, se estiver claro)
  iorwf POSTINCF, w; Bit 0 de dados; sempre use IORWF
  ewf POSTINCF, w; Bit 1 de dados; use IORWF se o bit 1 do comparando estiver definido; ANDWF se claro
  ewf POSTINCF, w; Bit 2 de dados; Use IORWF se o bit 1 do comparando estiver definido; ANDWF se claro
  ewf POSTINCF, w; Bit 2 de dados; Use IORWF se o bit 1 do comparando estiver definido; ANDWF se claro
  movwf SPIREG; Armazenar byte resultante (bits definidos se> = comparando)

Um poderia usar combinações diferentes de IORWF e ANDWF, dependendo do valor do comparando. Observe que, usando essa abordagem como ilustrado, é possível atualizar os valores de brilho do pixel em qualquer ponto do ciclo do PWM sem tremulação, desde que todos os quatro bits sejam gravados entre as chamadas para a rotina de troca de exibição ou fazendo com que a rotina de atualização de pixel determine se o o próximo turno produzirá um "1" ou um "0" para o pixel, e definir ou limpar todos os bits do pixel (qualquer operação que faça o que for necessário de qualquer maneira) e, em seguida, escrever os bits cujo valor deve seja oposto. Observe também que é possível atingir escalas de brilho não lineares arbitrárias variando o tempo das atualizações do monitor ou usando alguns valores de comparação e mais de uma vez em um ciclo PWM.

supercat
fonte
1

FPGAs ou CPLDs podem ser bons para essas tarefas, pois oferecem muitos pinos de E / S. Vá para o mais simples e mais barato. Se um não for suficiente, use um casal.

Carl
fonte
Você pode nos dar mais alguns detalhes sobre por que essa é uma boa opção, agora eu sei sobre ela, mas sei quais são as opções e quais são as tecnologias sugeridas que você lista, o Origial Poster (OP) provavelmente não possui essa um plano de fundo.
Kortuk
Não tenho certeza se é a melhor opção, mas queria que ela fosse mencionada por completo. Se o controle de 500 LEDs com PWMs, de uma maneira ou de outra, no final, são necessários 500 fios controláveis ​​individualmente. É difícil encontrar um microcontrolador com tantos pinos de saída. Há muitas maneiras de contornar isso ainda usando microcontroladores, mas um ou mais CPLDs / FPGAs baratos poderiam facilmente fornecer esses pinos de saída.
Carl
1

Você quase certamente pode fazer isso facilmente usando um PSoC3 ou PSoC5 .

Os chips PSoC são microcontroladores que contêm hardware digital reconfigurável, um pouco como um FPGA ou CPLD. Isso significa que você pode fazer circuitos complexos para fazer coisas incomuns, como acionar 500 LEDs com PWM. Além disso, você provavelmente pode implementar tudo usando os blocos digitais reconfiguráveis, o que significa que a parte da CPU do chip precisa apenas gravar os brilhos de LED desejados em uma matriz.

504 LEDs se encaixam em um retângulo 21 x 24. Se você tivesse 24 canais PWM e 21 GPIO, poderia fazer isso funcionar. Adivinha? O PSoC tem mais do que isso.

Você pode configurar facilmente 24 canais PWM em um PSoC e configurar 21 outros pinos para fazer parte de um registro de turno. Em seguida, configure alguns canais DMA para bombear bytes da memória para as saídas PWM e você estará rindo. Tudo o que a CPU precisa fazer agora é gerar os gráficos. O PSoC3 possui um núcleo 8051 de 8 bits, enquanto o PSoC5 possui um ARM de 32 bits. Faça sua escolha. Os únicos ICs externos de que você precisará são alguns ULN2803s para fornecer a alta corrente do inversor para as linhas. As saídas PWM devem ter unidade de corrente suficiente para LEDs únicos.

Rocketmagnet
fonte
Isso é um exagero total na condução de LEDs. Existem drivers LED dedicados, baratos e pré-projetados, criados para encadear grandes quantidades como essa, usadas em monitores gigantescos o tempo todo. Não há necessidade de reinventar tudo isso e por um custo maior.
Nemik
@nemik - Na verdade, o custo total dos chips (da Farnell) é de apenas £ 6,80.
Rocketmagnet
0

Faça uso de economias de escala. Sites chineses como Aliexpress vendem fitas de LED baseadas em WS2811 por ~ $ 15 por 50 LEDs. Eles são endereçáveis ​​individualmente, brilhantes, geralmente à prova d'água e possuem PWM para brilho. Não há registros de solda ou turno para mexer com eles. Fazendo tudo isso sozinho, aposto que vai custar mais, levar muito mais tempo e ser muito frustrante. Além disso, você está em Oz, portanto, o transporte da China não será muito caro.

Eles são feitos para a fabricação de displays de LED gigantes, por isso tendem a ser bem baratos. Apenas certifique-se de injetar energia a cada 50 LEDs para obter o melhor desempenho.

Também existem bibliotecas do Arduino para torná-las fáceis de usar.

nemik
fonte
11
US $ 15 por 50 LEDs? Então, para 500 LEDs, isso chega a US $ 150? E você tem a coragem de me dizer que minha solução é cara? -1
Rocketmagnet
Além disso, você pode fornecer um link para isso. WS801 não Google bem, e nem transformar-se em uma pesquisa de Aliexpress
Rocketmagnet
Desculpe, eu quis dizer WS2811, como estes aliexpress.com/store/product/... ou, sem escurecimento PWM, estes aliexpress.com/store/product/...
nemik
Um sinal serial para acionar 50 LEDs com escurecimento PWM. Obrigado, é exatamente isso que estou procurando. Mas um registro de deslocamento padrão fornece um pino de "trava" para copiar dados em buffer para as saídas após a transmissão do quadro completo. Não há trava aqui, então espero um ruído perceptível a altas taxas de atualização. Os chips suportam dados de 400 Kbps com 15 bits por pixel; portanto, a tela exibirá disparates por 1,9 milissegundos enquanto o quadro é atualizado.
Nialsh