Como posso controlar muitos LEDs com apenas alguns pinos no meu micro?
Estou usando um Atmel ATtiny13 que possui uma E / S de 6 pinos. Gostaria de controlar cerca de 15 LEDs, mas não tenho certeza de como conectar tudo. Sem multiplexação de qualquer tipo, parece que eu seria capaz de controlar apenas 6 LEDs por vez. Estou limitado a apenas 6 LEDs devido ao tamanho do microcontrolador?
microcontroller led multiplexer
Eu não vi. Possivelmente duplicado: electronics.stackexchange.com/questions/9860/…
Não se esqueça de comparar suas opções com o custo de comprar um microcontrolador um pouco mais exigente. Também preste atenção aos limites de corrente por porta e total.
— joeforker
Quando comecei a trabalhar com micros há um tempo, era uma pergunta que gostaria de ter sido fácil de encontrar com respostas claras. Consegui aprender sobre charlieplexing e implementá-lo com sucesso, mas queria recriar a pergunta aqui com a excelente qualidade das respostas da comunidade SE.
— perfil completo de JYelton
@joeforker Você está certo, o custo de um micro com mais pinos foi mínimo, considerando que meu projeto foi único. A certa altura, pensei em usar um micro com cerca de 20 pinos de E / S para realizar o trabalho, mas um dos meus objetivos era uma pegada de placa de circuito muito pequena. Além disso, impressionante adjetivo pinnier !
Duplicar: electronics.stackexchange.com/questions/1609/…
— mjh2007
Existem vários métodos que podem ser usados ​​para direcionar um grande número de LEDs de alguns pinos de E / S.
O mais simples é a multiplexação padrão de exibição de linha / coluna. Com esta técnica, você pode conduzir LEDs com n pinos de E / S. Matematicamente, o ciclo de trabalho é:( n / 2 )2(n/2)2nn
1 1m i n i m u m ( padrões de linhas exclusivos, padrões de colunas exclusivos )1 1mEunEumvocêm(padrões de linha exclusivos, padrões de coluna exclusivos)
Isso significa que essa técnica tem um ciclo de trabalho de 100% quando todos os LEDs estão acesos (ou todas as linhas ou colunas são idênticas) e um ciclo de trabalho de quando uma linha diagonal precisa ser acesa (ou todas as linhas são diferentes ) Você tem apenas 100% de ciclo de funcionamento garantido ao acender todos os LEDs ou um LED (ou zero LEDs, mas isso não conta muito).1 / n1 1/n
Um pouco mais complexo é o Charlieplexing . Com esta técnica, você pode acionar LEDs com n pinos de E / S. Somente n - 1 LEDs podem acender simultaneamente com esta técnica. Matematicamente, o ciclo de trabalho é:n2- nn2-nnnn - 1n-1 1
1 1conjuntos simultâneos mínimos1 1conjuntos simultâneos mínimos
onde um conjunto simultâneo é um grupo único de LEDs que possui um ânodo ou cátodo comum. (Isso não foi provado, é exatamente o que eu cheguei depois de refletir sobre o problema por um minuto. Se o ciclo de trabalho é importante para você, você vai querer aprofundar isso.) Esse é um cálculo muito mais complexo, tanto intelectualmente e computacionalmente que o cálculo equivalente para multiplexação padrão. Efetivamente, você obtém um ciclo de trabalho de quando todos os LEDs estão acesos, mas alguns (apenas alguns) padrões de n-1 ou menos LEDs podem ter um ciclo de trabalho de 100%. Você tem apenas 100% de ciclo de funcionamento garantido ao acender 1 LED.1 / n1 1/n
O último método que mencionarei é usar um registrador de deslocamento ou expansor de E / S. Com dois pinos (interface de dados / relógio brutos, I2C ou SPI unidirecional), você pode controlar um número arbitrariamente grande de LEDs. O ciclo de serviço para qualquer padrão é 100%, mas a taxa de atualização é inversamente proporcional ao número de LEDs. Este é o método mais caro. Para 15 LEDs, provavelmente será mais barato apenas atualizar para um micro com tantos pinos de E / S.
+1 para explicar um pouco sobre o aspecto do ciclo de serviço. Na segunda frase sobre Charlieplexing, você quis dizer "conduzir n ^ 2-n LEDs com n pinos de IO?"
— JYelton 4/11/11
O Charlieplexing pode ser feito de maneira muito semelhante à multiplexagem, se simplesmente omitir uma luz de cada linha. Na verdade, pode ser possível "recuperar" essa luz adicionando um diodo, embora, a menos que os drivers da coluna sejam saídas de corrente constante, seja difícil o brilho dos outros.
n × ( n - 1 )n×(n-1 1)nn
Seis LEDs em 3 pinos:
PINS        LEDS
0 1 2   1 2 3 4 5 6
0 0 0   0 0 0 0 0 0
0 1 Z   1 0 0 0 0 0
1 0 Z   0 1 0 0 0 0
Z 0 1   0 0 1 0 0 0
Z 1 0   0 0 0 1 0 0
0 Z 1   0 0 0 0 1 0
1 Z 0   0 0 0 0 0 1
0 0 1   0 0 1 0 1 0
0 1 0   1 0 0 1 0 0
0 1 1   1 0 0 0 1 0
1 0 0   0 1 0 0 0 1
1 0 1   0 1 1 0 0 0
1 1 0   0 0 0 1 0 1
1 1 1   0 0 0 0 0 0
Obrigado pelo conjunto de dados do pino de saída e por um esquema útil.
Outra maneira de desenhar o esquema é como uma grade NxN, mas direcionando apenas as colunas e substituindo a diagonal principal por curtos de coluna de linha.
— Super8
significa que não posso ligar todos eles de uma só vez? Isso significa que, se eu quiser ligar todos eles de uma só vez, tenho que dedicar bastante tempo para enganar os olhos?
— MaNyYaCk
@MaNyYaCk Sim. Você está certo.
— 22818 Daniel Grillo
Sem multiplexação (unidade direta), você está limitado a 6 LEDs.
Com o charlieplexing, você pode direcionar n * (n-1) LEDs de n pinos.
Com expansores de E / S ou registradores de deslocamento, você pode acionar um número praticamente ilimitado de LEDs.
Exemplo: MCP23008 Expansor de E / S I2C de 8 bits
Você pode elaborar quais seriam os expansores de E / S?
Um expansor de E / S é um chip externo que contém pinos e registros de E / S. Você pode usar o barramento de comunicação padrão como I2C ou SPI para se comunicar com eles.
+1 Você pode controlar muitos LEDs com o TLC594 da TI ( focus.ti.com/lit/ds/symlink/tlc5940.pdf ), mas pode ser um exagero para muitos trabalhos. search.digikey.com/scripts/DkSearch/…
Obrigado - devo projetar um projeto que use expansores de E / S para forçar meu aprendizado sobre o uso deles.
Como @ mjh2007 sugeriu com um expansor I2C. Mas existem outros especificamente para acionar LEDs que evitarão a necessidade de resistores externos de limitação de corrente.
Aqui está um exemplo de charlieplexing que eu criei.
É um simulador de feixe de farol e usa uma série de 12 LEDs conectados em charlieplex a 4 GPIOs para varrer um feixe de luz ao redor de um disco. Há um vídeo dele aqui .
O projeto é baseado em PIC, eu uso um PIC12f683 que também é um uP de 8 pinos e pode ser considerado comparável aos AVRs de 8 pinos.
A intensidade do LED é acionada por uma interrupção que fornece um PWM de 32 etapas em torno de 60Hz. Apenas dois LEDs podem acender a qualquer momento, dando uma taxa de 50% para cada LED, pois era tudo o que eu precisava. Ele também oferece uma boa compensação da taxa de atualização do PWM em relação à resolução.
A codificação para o uso do charlieplexing é realmente bastante simples se você seguir o método "clássico" de acender apenas um único LED em qualquer ponto no tempo e com uma taxa de atualização muito rápida. Elaboro primeiro o PORT e o TRIS (registros específicos da foto) necessários no papel e, em seguida, armazeno os resultados em uma matriz estática. Para acender o LED x, o PIC precisa apenas procurar o valor no índice da matriz [x] e gravá-lo diretamente no PORT (com um pouco de máscara para preservar o estado dos outros pinos não utilizados no charliplex)
Meu projeto tem apenas 12 LED e não 15 ou o máximo de 20 a 5 GPIO permitirá, pois eu queria manter um GPIO de reposição para desenvolvimento futuro.
Enfim ... Eu apenas pensei que seria útil ter um exemplo de trabalho semelhante ao seu pedido.
O código-fonte completo e os esquemas estão disponíveis no meu blog.
— Matt Casey
Outra opção seria usar os LEDs Neopixel. Eles têm um IC de controle embutido e você só precisa de um pino para controlar quantos LEDs desejar. É claro que você precisará de uma fonte de energia LED separada adequada.