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


Physical Computing & Electronic Sketching"Physical (or embedded) computing, in the broadest sense, means building interactive physical systems by the use of software and hardware that can sense and respond to the analog world... a creative framework for understanding human beings' relationship to the digital world. In practical use, the term most often describes handmade art, design or DIY hobby projects that use sensors and microcontrollers to translate analog input to a software system, and/or control electro-mechanical devices such as motors, servos, lighting or other hardware." Wikipedia


Este blog trata de  um novo conceito de computação que permite sair da frente do computador e interagir com o mundo real e que tem me proporcionado muitas horas de diversão e descobertas. Criar objetos eletrônicos que  percebam o mundo ao redor, o movimento, as luzes, as cores  e criar interações e reações com e para tudo isso. Este conceito é chamado de Physical Computing. Estou documentando estas experiências e estudos como uma forma de criar um arquivo de  referência, espero que este arquivo seja útil para você também. (ao lado meu robô La*Ta)

PLATAFORMA ARDUÍNO
"Arduino can sense the environment by receiving input from a variety of sensors and can affect its surroundings by controlling lights, motors, and other actuators. The microcontroller on the board is programmed using the Arduino programming language (based on Wiring) and the Arduino development environment (based on Processing). Arduino projects can be stand-alone or they can communicate with software on running on a computer"  (e.g. Flash, Processing, Max/MSP).


 





A  plataforma microprocessada que estou utilizando é chamada de Arduíno, é uma concepção de designers Italianos e inclui a parte física (placa de circuito) a a parte lógica (softwares) utilizando uma versão simplificada da linguagem C chamada de Wiring, desenvolvida específicamente para utilização em eletronic sketching (mais ou menos - rabiscar com eletrônica).

Este conjunto de hardware e software foi criado para tirar o uso dos microprocessadores dos corredores das indústrias e universidades e colocá-lo a disposição de pessoas como eu e você, designers , artistas, curiosos, hobistas e muitos outros com vontade de aprender criar e se divertir.

Com esta plataforma e muitas outras você pode criar desde um conjunto de luzes de natal que acendem e apagam como você desejar até um robot  que evite paredes e objetos, só depende da sua vontade e de um pouco de dinheiro, lógicamente.

Você deve estar pensando agora, ok mas e dai? o que é esse tal microprocessador e o que ele faz e como eu posso fazer tudo isso?

Um microprocessador é um computador dentro de um chip, todos (todos mesmo) os produtos que você tem em casa, desde sua televisão até sua máquina de lavar roupa, usam microprocessadores para executar as funções a que se destinam. Por exemplo, todas as vezes que você muda o canal de sua televisão um sinal infravermelho (IR) é emitido pelo controle remoto e transmitido para um receptor na tv. Este receptor passa o sinal para o microcontrolador dentro da tv e este envia os comando necessários para que a parte eletrônica ( transistores, switches, e mil outras coisas) mudem seus estados de tensão elétrica e a mudança de canal aconteça.

Dentro do microprocessador existe um software (assim como no hd do seu pc) que roda em um pequeno espaço de memória (chip especial chamado eprom - memória permanente) e que controla tudo isso.

A idéia aqui é que você possa fazer a mesma coisa (não uma TV!) controlando com seu próprio software e hardware os equipemntos que quizer e conseguindo que eles façam o que vc desejar. Di
vertido não é?

Veja alguns exemplos:

SITE INSTRUCTABLES - Criações de pessoas de todo o mundo


A plataforma arduíno tem muitos modelos diferentes de placas e microprocessadores e é uma plataforma aberta que pode ser montada e vendida por qualquer um (existem mil tipos e nomes: freeduino, robotduino...) , atualmente o microprocessador utilizado é o ATMEGA328 (arduino duemilenove).

Veja um esquema da placa da arduino duemilenove :






















O microprocessador é montado em uma placa de circuito que dá acesso a suas portas (como as portas de um PC , usb, serial...) mas, com funções bem mais simples como enviar pulsos elétricos aos motores ou receber estes pulsos e sinais de sensores para ler o mundo a volta.

Vamos ver mais de perto:

























Para conseguir usar estas plataformas não é necessário conhecer a fundo como funciona o microprocessador (apesar de que você certamente vai querer saber), tudo é pensado para que os conceitos mais complexos fiquem atrás da linguagem Wiring. Porém não se trata de uma interface gráfica bonitinha (apesar de existirem ) , é uma linguagem de programação que tem que ser aprendida.

Um exemplo da linguagem Wiring aonde se lê sinais de sensores de luz para fazer um robot ir atrás da luz ou evitá-la:

---------------------------------------------------------------

void loop()

{

digitalWrite(ledPin, HIGH); // sets the LED on

sensor_left = analogRead(0); // reads the value of the left photoresistor (value between 0 and 1023)

sensor_right = analogRead(1); // reads the value of the right photoresistor (value between 0 and 1023)

-----------------------------------------------------------------

O mais importante é aprender os conceitos de utilização dos equipamentos que podem ser ligados a ela e como utiliza-los e controlar a linguagem para conseguir realizar as idéias que você tem.

Como existem centenas de tipos de sensores, motores e outros tipos de equipamentos que é possível utilizar, o caminho é longo e a cada passo um novo desafio aparece.

É isto mesmo que eu estou fazendo agora, experimentando, aprendendo e me divertindo. Espero que as informações do meu blog ajudem um pouco e que você também participe.

claudio@miklos.com.br




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