Obtendo um grande número de (~ 100) sinais de saída digital do Arduino

19

Eu gostaria de poder controlar cerca de 100 LEDs independentes usando um Arduino. O problema é que o Arduino não possui pinos suficientes o suficiente para isso. Qual seria uma maneira de resolver esse problema? Existe um chip que pode desmembrar um sinal mais complexo do Arduino que pode controlar os LEDs? Ou há outra solução?

Alexis K
fonte
quais são seus requisitos de taxa de atualização? quanta corrente consumida por LED?
vicatcu
taxa de atualização de cerca de 1 segundo. pensando em torno de 8ma por LED. Seria alimentado por adaptador externo - e não o Arduino
Alexis K
Existem muitas soluções de desmultiplexação. Mas considere a complexidade da sua tarefa; o algoritmo de que você precisa para gerar os dados se ajusta dentro das restrições do mcu do Arduino? Algumas tarefas serão, outras não serão ou apenas serão ajustadas por meio de designs de criação que podem ser bastante satisfatórios para criar, mas podem tornar a manutenção do código um desafio.
Chris Stratton

Respostas:

22

Primeiro, um Arduino não pode acionar diretamente 100 LEDs, pois a corrente combinada que o dispositivo deve fornecer ou afundar excederá em muito o microcontrolador e o regulador de tensão na placa Arduino. Um Arduino Shield personalizado, com sua própria fonte de energia e regulamentação, pode ser adequado.

Existem várias abordagens fáceis, a abordagem mais simples é detalhada abaixo:


  • Driver de LED de corrente constante TLC5940 em configuração em cascata:

O TLC5940 aciona 16 LEDs por IC, controlados por entrada serial através de uma ligeira variante de uma interface SPI. Até 40 dispositivos TLC5940 podem ser conectados em cascata, mas 7 deles serão suficientes para acionar os 100 LEDs na questão.

Existem pelo menos algumas bibliotecas do Arduino ( 1 , 2 ) para o TLC5940.

Taxas de relógio sugeridas para envio do Arduino e taxa de atualização correspondente:

  • GSClk de 1 MHz usando o código neste encadeamento .
  • SCLK de 330 KHz (relógio de dados seriais)
  • Assim, a taxa de atualização de dados de LED 244 Hz

Isso é baseado nas fórmulas da folha de dados:

f (GSCLK) = 4096 * f (atualização)
f (SCLK) = 193 * f (atualização) * n
onde:
f (GSCLK): frequência mínima necessária para GSCLK
f (SCLK): frequência mínima necessária para SCLK e SIN
f ( update): taxa de atualização de todo o sistema em cascata
n: número em cascata de dispositivos TLC5940

O TLC5940 é um coletor de corrente constante ; portanto, os ânodos dos LEDs são ligados a uma voltagem dois volts maior que o LED Vf, ou cerca de 7 volts, o que for menor, alimentado independentemente dos pinos de energia do Arduino. Essa fonte de voltagem precisa ser capaz de fornecer 100 * (qualquer que seja a corrente em que os LEDs sejam executados), mas pode ser uma fonte não regulamentada.

Os cátodos de LED vão para as linhas de acionamento dos respectivos CIs TLC5940.

O próprio TLC5940 consome até Icc = 60 mA por dispositivo durante a gravação de dados, portanto, ligar 7 deles do Arduino não funcionará, será necessário fornecer um Vcc regulado de 3,3 a 5 volts independente, idealmente o mesmo valor que o Vcc do Arduino sendo usado, e os rastreamentos de terra precisam se conectar de volta ao solo do Arduino, é claro. Operar as peças do TLC em uma voltagem diferente da do Arduino traria a necessidade de conversão de nível do sinal serial, portanto, é melhor evitar.

Vários vídeos do YouTube demonstram o uso do Arduino com ICs TLC5940 em cascata.


Embora esses CIs tenham sido projetados para acionar displays LED numéricos de 7 segmentos, eles fornecem controle individual de LEDs, portanto, podem ser usados ​​para até 64 LEDs por IC. Dois deles podem ser conectados em cascata para acionar os 100 LEDs necessários. A página 13 da folha de dados mostra uma configuração em cascata.

Os LEDs precisariam ser conectados eletricamente como grupos de até 8 LEDs, cada um compartilhando uma linha de cátodo (cátodo comum), para esse projeto.

O MAX7219 / 7221 são drivers de LED multiplexadores; portanto, o brilho máximo dos LEDs será menor do que para um driver de LED estático, como na seção anterior.

Aqui está uma biblioteca e guia útil de matrizes de LED usando o MAX7219.

Alguns vídeos relevantes do YouTube ( 1 , 2 ) podem ser interessantes.


Novamente, esses ICs foram projetados para acionar displays LED numéricos de 7 segmentos; eles fornecem controle individual de LEDs; portanto, podem ser usados ​​para até 40/64 LEDs por IC. Dois / três deles podem ser conectados a um barramento Arduino SPI para acionar os 100 LEDs necessários.

As notas de design permanecem as mesmas da seção anterior. Além disso, o brilho máximo individual do LED seria menor do que no design multiplex direto do MAX7219.

Existem alguns vídeos do YouTube que podem ser interessantes.


  • Projetos de componentes discretos, registros de turnos, expansores de E / S, tiras de LED cortáveis ​​com controladores individuais e muito mais ...

Essas são todas as abordagens que foram usadas com diferentes níveis de simplicidade e sucesso. São implementações mais complexas do que as três abordagens acima, portanto, não são mais detalhadas. A pesquisa na web produziria guias úteis para essas abordagens, se necessário.

Um dos principais fatores irritantes desses projetos é a necessidade de resistores de controle de corrente em cada LED ou string de LEDs. Os dispositivos projetados especificamente para a condução por LED normalmente não precisam disso.

Não tenho experiência pessoal com este último conjunto de opções, portanto não posso ajudar muito.


Nota de rodapé: Depois de responder a esta pergunta, encontrei uma pergunta mais antiga , com respostas que detalham e discutem várias das abordagens na minha última seção. Essa discussão torna interessante "leitura adicional como lição de casa".


Anindo Ghosh
fonte
1
Registros de turnos baratos como 74HC595?
Thomas E
Além disso, como o Max5951 fornece "controle individual de LED" - ele parece ter apenas 7 segmentos de controle (8 pinos para 8 dígitos), não?
Thomas E
Sim, esses também. Precisa de muitos resistores para proteger os LEDs e, em seguida, o complexo da fiação em comparação com os CIs criados para esse fim.
Anindo Ghosh
@ThomasE No: "O MAX6950 aciona até cinco dígitos de 7 segmentos ou 40 LEDs discretos. O MAX6951 aciona até oito dígitos de 7 segmentos ou 64 LEDs discretos.". Um apenas conecta grupos de 8 LEDs cada a uma linha de cátodo, conforme descrito na seção MAX7219 da minha resposta.
Anindo Ghosh
2
@starblue Overkill v / s Facilidade de implementação de bricolage : para um esforço único ou hobby, o TLC5940 (US $ 3,78 em quantidades únicas na DigiKey) não continuaria sendo a solução mais simples , devido às bibliotecas do Arduino e ao suporte ativo na comunidade do Arduino? A menos que haja outras partes igualmente bem suportadas, como você apontou, que os fóruns do Arduino adoram.
Anindo Ghosh