quinta-feira, julho 09, 2009

Controlando MUITOS Leds

Nos projetos que eu apresentei até agora, cada LED era ligado diretamente a um pino do microcontrolador. Embora este tipo de conexão seja bastante simples, esbarramos logo no limite de pinos de E/S do microcontrolador.

Além dos LEDs comuns, muita vezes queremos conectar displays de 7 segmentos (que correspondem a 7 LEDs por dígito) ou matrizes de LED (por exemplo com 5x7 LEDs para cada caracter).


Uma primeira maneira de expandir a capacidade de I/O do microcontrolador é usar registradores de entrada serial e saída paralela. Um exemplo é o 74HC595, que recebe bits serialmente e os armazena em um shift register de 8 bits que pode ser copiado para um registrador de saída. Um 74HC595 isolado requer pelo menos 3 I/Os (dado, clock do shift register e clock para cópia para a saída). Podemos cascatear vários CIs para gerar um registrador de mais bits, mas é óbvio que a escalabilidade desta solução é limitada.

A solução mais utilizada é baseada no mesmo princípio usado no Spoke-o-dometer, a persistência de visão. Ao invés de controlar todos os LEDs ao mesmo tempo, organizamos os LEDs em uma matriz de linhas e colunas e controlamos uma linha de cada vez. Enquanto uma linha está sendo controlada as demais ficam apagadas. Fazendo isto bem rápido, não se percebe que os LEDs estão piscando. Este método é chamado de multiplexação.

O diagrama abaixo mostra o circuito básico, com duas linhas de duas colunas:

No diagrama acima as linhas estão conectadas aos catodos dos LEDs. Um LED é aceso quando a linha correspondente está em "0" e a coluna em "1". Uma solução simétrica pode ser feita com os LEDs conectados de forma contrária.

Somente uma linha fica ativa de cada vez, é preciso fazer a varredura das linhas. No circuito acima um pino seleciona qual das duas linhas está ativa. Em um circuito mais genérico, n pinos do microcontrolador são decodificadas em 2n linhas. Por exemplo, podem ser usados o 74HC138 (3 para 8) ou 74HC154 (4 para 16). Uma outra alternativa para varrer as linhas é usar um shift register externo (como o 74HC164).

O problema no circuito acima é a corrente nas linhas. Cada coluna aciona no máximo um LED por vez, portanto equivale a ter um único LED. Uma linha, entretanto, pode estar recebendo a corrente de múltiplos LEDs (considerando o que a linha está conectada aos catodos dos LEDs), o que pode ultrapassar a capacidade de um pino do microcontrolador.

A solução é controlar as linhas por um transistor, por sua vez controlado pelo pino do microcontrolador. A corrente de cada LED é controlada por um resistor na coluna. Este tipo de solução (usar um transistor para aumentar a capacidade de corrente de um pino de E/S) é tão comum que existem CIs com um "vetor" de transistores. É o caso do ULN2003 e do ULN2803.

Existem CIs dedicados ao controle de LEDs que além de controlar correntes altas permitem que esta corrente seja determinada por um único resistor externo. O CI STP16CP05 (que infelizmente não achei para venda aqui no Brasil) é uma solução bastante completa. Ele recebe 16 bits serialmente e os coloca em uma saída paralela de corrente constante determinada por um resistor.

O "topo de linha" é talvez o MAX7221 (que também não achei por aqui). Além da entrada serial e do driver de corrente constante, ele possui uma memória interna de 8 bytes, executando ele próprio a varredura das linhas. O "espertinho" é capaz até de acionar os segmentos corretos para representar os valores 0 a F em um display de 7 segmentos.

Para encerrar, algumas referências a projetos com um microcontrolador controlando uma quantidade grande de LEDs:
  • PEGGY2: um display com até 625 LEDs.
  • MeggyJr: a irmã menor da PEGGY, um circuito portátil com uma matriz de 8x8 LEDs RGB.
  • Mignonette: um jogo miniatura, com uma tela composta por uma matriz de 5x7 LEDs bicolores.
Estou com algumas idéias de projetos relacionados a LEDs na cabeça; se tudo correr bem veremos alguns deles por aqui nos próximos meses.

Um comentário:

jweyrich disse...

Bacana! Essa semana mesmo eu estava vendo alguns projetos com led.

3d LED cubes:
- http://www.youtube.com/watch?v=lFDcdN47V5s
- http://www.youtube.com/watch?v=Aj3_v7xCyJ0

properller clocks:
- http://www.youtube.com/watch?v=no2_M_b059
- http://www.youtube.com/watch?v=l4F8UbM-1t4

Durante a explicação no primeiro vídeo, o cara cita a multiplexação.