Skip to topic | Skip to bottom
www.postcogito.org
          ...sine propero notiones
Kiko
Você está aqui: Kiko > SistemasEmbutidos > PdCMostradorMatrizDeLeds Imprimível | fim do tópico


Start of topic | Skip to actions
Versão em Português

O protótipo em ação. O filme é melhor; clique
para vê-lo.

Esquema mostrando a simplicidade visceral do
projeto. Clique para ampliar.

Prova de Conceito do Mostrador Matricial de Leds

Um circuito visceralmente simples de 'mensagem rolante' com um único ATtiny2313 controlando quatro mostradores de LED matriciais 5x7.

Projeto do Hardware

Conceito Básico

O ATtiny2313 tem 20 pinos, 18 dos quais são usáveis como E/S genérico se progamarmos o bit RSTDISBL para fazer com que o pino de /RESET funcione como PA2. Isso significa perder a programação direta no circuito (ISP ou "in-system programming"), mas isso pode ser contornado usando-se um bootloader serial.

O mostrador de LEDs de 5x7 Para-Light Para-Light C/A-2570x tem 12 pinos: 7 para as linhas, mais 5 para as colunas. Usando a multiplexação clássica (a única que podemos usar, porque a ligação interna dos LEDs no mostrador é feita pra isso), podemos fazer com que um único ATtiny2313 controle dois displays: 7 pinos para as linhas, mais 2*5=10 pinos para as colunas, totalizando 17 pinos. Podemos usar o décimo oitavo pino para receber comandos via serial.

Para duplicar isso, tudo que precisamos fazer é alternar mostradores de anodo comum com de catodo comum. Uma vz que cada porta do microcontroloador tem três estados ('alto' ou 'fornecendo corrente'; 'baixo' ou 'consumindo corrente'; e 'alta impedância' ou 'desconectado'), podemos controlar o fluxo de corrente em cada fileira de LEDs e com isso controlá-los individualmente.

Incidentalmente, o ATtiny2313 parece ser o único AVR de 20 pinos onde esse truque é possível: de acordo com a tabela paramétrica da família AVR no site da Atmel, todos os outros AVRs de 20 pinos oferecem menos de 17 pinos usáveis para E/S.

Um outro detalhe arrojado é omitir os resistores limitadores de corrente tradicionalmente usados em conjunto com os LEDs. Vamos lidar com isso em software pulsando os LEDs bem rapidamente: desde que não excedamos uns 250 microssegundos, eles não sobreaquecem o suficiente a ponto de pifar.

Algumas complicações

A porta de saída típica do AVR é capaz de fornecer/consumir cerca de 20 a 30mA de corrente. Isso é suficiente para um LED ou dois, mas, quando ligamos vários em paralelo, o brilho decai perceptivelmente. Novamente, isso é compensado pelo software: variamos o tempo que cada LED permanece ligado de acordo com quantos LEDs estiverem acesos naquele instante: se for só um, nós o deixamos aceso por apenas 30 microssegundos. Se forem sete, nós o deixamos ligados por uns 200 microssegundos. A persistência da visão humana integra isso tudo, provendo a ilusão de brilho constante.

Outro problema é a porta PA2: devido ao fato de ser compartilhada com o sinal /RESET, ela aguenta muito menos corrente. Não podemos usar o PD0 para cuidar dos LEDs porque vamos precisar dele para comunicação serial -- ele é o pino RXD da USART. A solução é, novamente, compensar em software: tornamos os períodos de 'ligado' e 'desligado' bem mais longos quando estivermos usando PA2. De fato, esses períodos tem de ser bem mais longos, a ponto de se tornarem mais de 70% do tempo total de cada quadro.

O circuito

O circuito é visceralmente simples: em essência, os pinos do microcontrolador são conectados diretamente os mostradores. Há apenas um único resistor de pullup para evitar que o ruído de comutação seja captado pela UART quando o dispositivo estiver sendo usado em modo solitário (isto é, sem estar conectado à porta serial do PC).

As ligações foram projetadas de forma a fazer com que quando o microcontrolador fosse montado do outro lado da placa, quase todos seus pinos se alinhassem exatamente com os pinos de alguns dos displays, facilitando sobremaneira a montagem (especialmente na placa universal), às custas de uma mecânica de bit mais complicada no firmware.

O pino PD1/TXD é usado para controlar alguns dos LEDs quanto a aplicação principal está rodando, mas volta a ser o TXD da UART quando estiver rodando o bootloader serial (compatível com o protocolo AVR910) que permite a atualização do firmware direto no circuito.

Não há regulador de voltagem; você deve prover entre 3 a 5V regulados nos pinos apropriados do conector.

Os dois conectores são porque eu pretendo ligar vários deles em um único barramento de dados/força para fazer displays sucessivamente maiores.

Software

Atualizando o firmware

Se você usa o avrdude e o usbasp como eu, verifique que os caminhos no Makefile fazem sentido no seu sistema e então digite:

make upload_boot

para subir o bootloader e, em seguida:

make fuses

para definir os fusíveis. Não faça isso sem antes subir o bootloader, pois as configuração desabilitação a função /RESET e com ela a programação via ISP/SPI. Além do bootloader, a única outra maneira de atualizar o firmware é se você tiver um programador de alta voltagem tal como o STK-500 da Atmel.

Em seguida, conecte o circuito na serial do seu PC, abra seu emulador de terminal, configure-o a 19200 8N1 e ligue o circuito. Deve aparecer a mensagem de saudação do bootloader ("AVR910, ESC quits"). Para testar se a comunicação está ok, tecle ENTER; o bootloader deve responder com '?' ("Comando não reconhecido").

Feche então seu emulador de terminal e digite:

make upload_serial

Por fim, volte ao seu emulador de terminal e digite ESC para sair do bootloader e dar partida na aplicação principal. A mensagem rolante deve aparecer no display.

Quando você quiser interromper a aplicação e voltar ao bootloader, pressione CTRL-C no emulador de terminal. A mensagem de saudação do bootloader deve aparecer novamente.

Comandos

A aplicação aceita alguns comandos pela porta serial:

  • CTRL-C: Vai para o bootloader
  • CTRL-S: Ativa/desativa o modo pixel-a-pixel
  • SPACE: Rola um pixel
  • ENTER: Move o pontinho de teste

Estendendo o Conceito

Em princípio, essa técnica pode ser estendida a outros controladores da linha AVR:

  • um ATmega8 pode controlar seis mostradores 5x7: 7 linhas mais 3 grupos anodo-comum/catodo-comum vezes 5 colunas é igual a 22 pinos. Acrescentando um para comunicação serial, temos um total de 23 pinos -- exatamente a quantidade de portas de E/S usáveis do ATmega8. Ainda teríamos de usar o /RESET como PC6.
  • um ATmega8515 poderia controlar dez mostradores 5x7: 7+5*5=32 pinos, de sorte que ainda sobrariam três! (O ATMega8535 tem 35 portas de E/S usáveis).

Contudo, usar chips maiores não necessariamente torna as coisas nem mais fáceis, nem mais baratas. Eis uma análise de custo rasteira:

  Pinos Preço Unitário Núm. de Pinos Pinos Preço por Display
MCU de E/S 1 25 displays usados restantes 1 25
ATmega8515 35 5.27 3.31 10 32 3 0.53 0.33
ATtiny2313 18 2.26 1.42 4 17 1 0.57 0.36
ATmega164P 32 4.82 3.56 10 32 0 0.48 0.36
ATmega853 35 5.70 3.58 10 32 3 0.57 0.36
ATmega8 23 3.66 2.30 6 22 1 0.61 0.38
ATmega16 32 6.56 4.12 10 32 0 0.66 0.41
ATmega162 35 6.77 4.25 10 32 3 0.68 0.43

As colunas '1' e '25' são os preços das MCUs em unidades ou lotes de 25, em dólares americanos, tirados do site da Digikey em jun/07.

Apesar da solução com 10 displays e um ATmega8515 vir em primeiro lugar no critério de custo por mostrador, minha intuição é que multiplexar tantas colunas vai acabar resultando em uma perda de brilho que não vai ficar legal. Não fiz essa conta, mas acho também que os custos devidos à a área extra na placa de circuito impresso necessária para interconectar todos os pinos vai acabar sobrepujando os três centavos de economia. Também tenho um problema psicológico com essa solução: ela me soa um desperdício de um microcontrolador bastante capaz. Mas pode valer a pena experimentar.

O ATtiny2313 vem em segundo lugar em termos de custo por display. No geral, acho que ele é a melhor relação custo/benefício, até porque 4 é um bom número para se fazer múltiplos e o número de displays/MCUs sai melhor para se obter descontos de quantidade até mesmo para hobbyistas como eu que não pretendem fazer muitas cópias desse circuito.

Licença e Downloads

Este projeto é disponibilizado sob a licença 'Atribuição-Uso / Não-Comercial / Compatilhamento pela mesma licença' versão 2.5 do Creative Commons:

O bootloader foi adaptado do projeto Atmex da LadyAda e é licenciado nos termos da Licença Pública Geral GNU v2:

Comentários, Sugestões, etc.

Se você construir um dispositivo desses, eu gostaria de saber. Da mesma forma, se você tiver sugestões, críticas ou comentários, não hesite em me mandar um email:
topo


Você está aqui: Kiko > SistemasEmbutidos > PdCMostradorMatrizDeLeds

topo

Creative Commons License   O conteúdo deste site está disponibilizado nos termos de uma Licença Creative Commons, exceto onde dito em contrário.
  The content of this site is made available under the terms of a Creative Commons License, except where otherwise noted.