ARDUINO + 5 X 7 DOT MATRIX DISPLAY




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

Para esta montagem eu usei o  exemplo de um dos melhores sites instrutivos sobre o arduino:

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.


Basicamente o esquema funciona da seguinte forma:

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; ddfor (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.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1266267785
http://dotmatrixdesign.tumblr.com/
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1267391793/7
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1203747843/22
http://forum.sparkfun.com/viewtopic.php?t=3811amp;sid=48fda56bd551ee455954a7c2ea44320e
http://www.bryanchung.net/?p=177
http://www.instructables.com/id/The-74HC164-Shift-Register-and-your-Arduino/step8/Project-3pt-2-2-Wire-4x4-led-matrix-display/

Documentação:

http://www.paralight.us/uploads/pdf/A-5570SR.pdf
http://www.paralight.us/products/details.php?g=cGNfaWQlM0QyMyUyNnBfaWQlM0Q4Mg==

Montagem:

http://tronixstuff.wordpress.com/2010/07/09/review-maxim-max7219-led-display-driver-ic/
http://www.digisoft.com.pk/Projects/5-x-7-dotmatrix-led-display
http://tronixstuff.wordpress.com/2010/06/06/getting-started-with-arduino-%e2%80%93-chapter-nine/

Material:

http://datasheets.ru/datasheets/572326/data-BM-40657ND.html
http://www.datasheetcatalog.org/datasheet/fairchild/BC548.pdf

1K ohm, 1/4 watt resistor
marrom, preto, vermelho, dourado.
560 ohm, 1/4 watt resistor
verde, azul, marrom, dourado.
470 ohm, 1/4 watt resistor
amarelo, violeta, marrom, dourado
BC548 NPN transistors
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
http://www.bitartist.org/2009/02/led-flower-vase-supplementary-note.html
http://kennethfinnegan.blogspot.com/2010/02/dot-matrix-arduino-clock.html
http://www.bitartist.org/2008/06/gif2led-released-and-with-my-led-egg.html
http://www.jacobpierce.com/blog/2009/10/11/arduino-hello-world-with-384-leds/
http://kalshagar.wikispaces.com/Arduino+and+a+Dot+Matrix
http://blog.bsoares.com.br/tag/arduino
http://www.arduino.cc/playground/Main/DirectDriveLEDMatrix
http://www.instructables.com/id/LED-Dot-Matrix-Display/
http://www.best-microcontroller-projects.com/led-dot-matrix-display.html
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1271447565
http://www.arduino.cc/playground/Main/MAX72XXHardware#WiringLedMatrix
http://forums.parallax.com/forums/default.aspx?f=25&m=453532

relogio:
http://www.maxim-ic.com/datasheet/index.mvp/id/4984
termometro:
http://www.nozebac.net/index.php?page=thermometer#expand2

10 comentários:

  1. gostaria de saber quais as mudansas q devo fazer para q eu possa usar duas matrizes de 5x7 e espandir o letreiro

    ResponderExcluir
  2. Olá Anônimo, você pode conectar mais chips 74HC595 diretamente uns aos outros por meio dos pinos 9/14 ( como foi feito com os dois iniciais.

    Depois a tarefa é adaptar o script para enviar os dados para os chips na ordem correta

    ResponderExcluir
  3. olá estou tentando usar o CI 4067,que acredito serequivalente a esse mas com 16 euntradas ou saidas para controlar 16 reles,minha duvida é como faço para deixar os 16 acesos ao mesmo tempo?muito bom seu projeto.

    ResponderExcluir
  4. Olá Murilo, neste projeto cada coluna tem uma saida para terra e eu só ativo as linhas coincidindo com a coluna correta. Na verdade não estão sendo ativadas independentemente as portas como um todo. O ground é comum.

    Obrigado pelo comentário.

    ResponderExcluir
  5. oi amigo por favor vc teria um programa dese, para mandar para mim... com apalavra , [ cuidado] ou palavra [ atençao] e para meu tcc... obrigado... envia pra meu email .. forregueiro_sp@hotmail.com

    ResponderExcluir
  6. Olá Claudi,mas seira possivel acender 16 relés pelo arduino usando poucos canais!sem usar a persistência de visão(que até funciona mas quando encontra um delay de outra parte do skech perde a função!consegui com o multiplexador cd4056 mas eu fico preso a esse loop,quando vai executar outra coisa ele se perde!se puder me ajudar a entender iso?obrigado e parabéns!

    ResponderExcluir
  7. Muito bom exemplo, vai me ajudar aqui :)

    Tem algum problema em usar as saídas do shift-register como terra? Eu estou usando em um projeto o 595 com displays de anodo comum simplesmente invertendo os bits e funciona perfeitamente.

    ResponderExcluir
  8. Boa noite tentei compilar o seu código fonte porem da erro nesta linha=for (int dd=0; ddfor (int q=0; q<5; q++)
    gostaria de o porque.....se na sua compilação funcionou então ta faltando algo neste código fonte.....espero resposta um abraço....

    ResponderExcluir
  9. Claudio, tem 35 anos que não nos falamos. Te achei por acaso, procurando coisas sobre arduino. Como você está? Voltei pra SP. Vamos encontrar? Joao

    ResponderExcluir
  10. Olá João! Nossa que bom saber de você! vamos nos encontrar sim, me passe os seus contatos no email claudio@miklos.com.br que eu te ligo...não coloco meu cel aqui por razões óbvias. Grande abraço!

    ResponderExcluir

Faça seu comentário.

Internet of Things

LUX com arduino GPRS shield e sensor LDR.

/*
Graph: Feed 38642, Datastream lux
*/

Laboratórios, Lojas e Produtos

Blogs, Comunidades e Revistas