Como uma coisa que parece simples pode ser tão complicada.... neste post vou registrar minha experiência para conectar um display de pontos (dot / led matrix) ao arduino.
Na maior parte dos sites ( assim como no arduino.cc) ou a conexão é direta nas portas digitais ou usando o chip MAX 7219/7221 que já tem até uma biblioteca na IDE do Arduino. O problema é que não achei matriz de leds de 8x8 em lugar nehum... logo resolvi usar os de 5x7 mesmo que são fáceis de achar e baratos, os shift registers 74HC595 que eu já tinha então resolvi trabalhar com eles
A matriz que está no vídeo é bem grande e vermelha ( 11 cm x 17,5 cm com pontos de 1 cm) e divertida de trabalhar porque o efeito é mais interessante mas o preço é alto, R$ 20,00. Nomalmente as´pequenas não custam mais que R$ 2,00.
Segue a lista de produtos para montar esta experiência:
1 x Matrix de pontos 5 x7 ( ou outra com até 8 linhas x 8 colunas)
5 x BC548 NPN transistors
2 x 74HC595 ( um para as linhas e outro para as colunas)
1 x arduino
Fios para conexão
Resistores para proteger os leds ( na minha não usei porque minha matriz é 5v como o arduino) pois a voltagem do arduino é alta para a maioria das matrizes
1 x breadboard
http://tronixstuff.wordpress.com/2010/06/06/getting-started-with-arduino-%e2%80%93-chapter-nine/
A matriz de pontos que usei é esta BM-40657ND (datasheet):
Segue esquema de montagem:
Como você vai ver nos exemplos por ai, as matrizes de 8x8 tem conexões bem simples, um pino para cada linha ou coluna, isto torna o trabalho mais fácil. Em uma matriz de 5 x7 existem pinos duplicados e a sequência dos pinos é bem chata de entender. Na parte inferior da esquerda para a direita estão os pinos 1 a 7 e na parte superior da direita para a esquerda estão os pinos 8 a 14.
Note ainda que cada led ou diodo tem um polo negativo e um positivo, na ilustração acima cada seta com uma barra no topo representa um led, ( este é o símbolo eletrônico do diodo) a ponta da seta com a barra é a parte negativa ou terra e a base da seta a parte positiva. Veja que os negativos são todos conectados nas colunas e os positivos nas linhas. Por isso trata-se de uma matriz com colunas catodo (negativo) comum.
Na ilustração acima você pode ver que a terceira linha de baixo para cima é ativada pelo pino 1, a segunda linha de baixo para cima é ativada pelo pino 7... e assim por diante. Note que existem dois pinos que não estão representados na ilustração, os pinos 5 e 12 sao relativos a quarta linha de baixo para cima e os pinos 4 e 11 são relativos a terceira coluna. Confuso não é? Em minha montagem descobri que não é necessário conectar todos os pinos... escolha um para a linha (5 ou 12) e um para a coluna (4 ou 11) e pronto.... funciona assim mesmo.
1. Os shift registers 74HC595 recebem os dados da arduino em forma decimal usando o comando ShiftOut e transformam em bytes, no caso da matriz com 5 x7 eu envio no máximo 31 para as linhas (00011111) e no máximo 127 para as colunas (01111111) isso ligaria todos os pontos da matriz:
digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, 31); // para as linhas: catodos : negativo/terra
shiftOut(datapin,clockpin, MSBFIRST, 127); // para as colunas: anodos : positivo
digitalWrite(latchpin, HIGH);
3. O shift register 1 está conectado nas linhas (positivo/anodo) e o 2 nas colunas (negativo/catodo), quando o shift register 1 é ativado ele permite a passagem de corrente para os pinos positivos da matriz.2. Os shit register não podem dar saída para o terra eles simplesmente ligam ou desligam as portas com 5v, é ai que entram os transistores, quando o transistor recebe uma voltagem no pino base ele conecta o pino coletor ao emissor. Como o pino coletor está conectado na matriz e o emissor no terra ( e o base nos pinos do shift register) , quando o shif register 2 é ativado ele conecta as colunas ao terra.
4. Desta forma se fecha o circuito e qualquer que seja a combinação de leds obtida com a combinação das portas dos shift registers ativados ... se acende.
Leve em consideração que o shift register 1 controla as linhas que terão corrente e o 2 as colunas que serão conectadas ao terra e isto não permite que você desenhe caracteres ou números... o máximo que você consegue são pontos ou conjuntos de pontos como linhas ou quadrados ... para desenhar os caracteres é necessário fazer uma varredura rápida das colunas e linhas uma por vez, de forma que nosso olho não perceba quando se apagam ou acendem, isto se chama de persistência de visão.
Quando os caracteres estão em movimento isso é bem claro... quando se trata de um número ou letra parado é mais difícil de entender mas o princípio é o mesmo. Esta "jogada" de acender e apagar os leds em colunas individuais em squencia rápida é feita no momento da programação e não tem nada a ver com a montagem física. O comando shiftOut é alimentado com os parâmetros necessários por meio de loops, eu demorei um bocado para entender, tomara que você seja mais rápido(a).
Neste link você encontra uma tabela que usei como exemplo para calcular o desenho das letras e números.
Segue o código para a animação do vídeo nesta página:
--------------------------------------------------------------------------------------------------------
/* Claudio Miklos 25/07/2010 baseado em : http://tronixstuff.com/tutorials > Chapter 9 */ int latchpin = 8; // connect to pin 12 on the '595 int clockpin = 7; // connect to pin 11 on the '595 int datapin = 10; // connect to pin 14 on the '595 int seq[] = {0,0,0,0,0, // VAZIO 127,73,73,73,65, // E 0,0,126,1,1,1,126, // U 0,0,60,66,33,66,60, // CORACAO 0,0,63,68,68,68,63, // A 0,0,127,72,76,74,49, // R 0,0,127,65,65,65,62, // D 0,0,126,1,1,1,126, // U 0,0,65,127,65, // I 0,0,127,16,8,4,127, // N 0,0,62,65,65,65,62, // O 0,0,0,33,127,1, // 1 0,0,0,33,67,69,73,49, // 2 0,0,34,65,73,73,54, // 3 0,0,64,32,16,8,4,2,1, // ONDA DESCE 2,4,8,16,32,64,0,0, // ONDA SOBE 127,62,28,8, // SETA DIREITA 0,0,0,0,0}; // VAZIO void setup() { Serial.begin(9600); pinMode(latchpin, OUTPUT); pinMode(clockpin, OUTPUT); pinMode(datapin, OUTPUT); } void movealienfromleft(int duration) { int colbin=0; for (int xx=0; xx<=113; xx++) { for (int dd=0; dd-------------------------------------------------------------------------------------------------------------------for (int q=0; q<5; q++) { colbin=(xx*1)+q; columndisplay(seq[colbin], q,0); } } } } void columndisplay(int coldata, int column, int holdtime) { int matrixcolumn[5] = { 1,2,4,8,16}; digitalWrite(latchpin, LOW); shiftOut(datapin, clockpin, MSBFIRST, matrixcolumn[column]); shiftOut(datapin, clockpin, MSBFIRST, coldata); digitalWrite(latchpin, HIGH); delay(holdtime); } void loop() { movealienfromleft(30); }
Pesquisa:
http://www.datasheetcatalog.org/datasheet/fairchild/BC548.pdf
marrom, preto, vermelho, dourado.
560 ohm, 1/4 watt resistor
verde, azul, marrom, dourado.
74HC595
http://forum.sparkfun.com/viewtopic.php?t=14212&start=15
http://www.thebox.myzen.co.uk/Tutorial/Power_Examples.html
http://www.sparkfun.com/commerce/product_info.php?products_id=733
http://www.sparkfun.com/commerce/product_info.php?products_id=312
http://members.ziggo.nl/electro1/avr/dotmatrix.htm
relogio:
http://www.maxim-ic.com/datasheet/index.mvp/id/4984termometro:
http://www.nozebac.net/index.php?page=thermometer#expand2