Fala Pessoal! 😉
Como prometido alguns vídeos atrás, hoje venho comentar finalmente (ainda creio que esse assunto vai se estender por ser interessante demais e por apresentar resultados “visuais” fantásticos! :)) sobre o Módulo (chamado de shield normalmente) de Matriz de LEDs 8×8 (8 linhas por 8 colunas) que aqui iremos conectar diretamente a placa do nosso Arduino UNO por intermédio de alguns pinos: alimentação (VCC e GND) e também alguns pinos digitais (PWM) da placa do Arduino.
Ω Observação Importante!
O circuito integrado utilizado em nosso módulo 8×8 LED MATRIX é o MAX7219. Digo isso porque este CI faz toda a diferença neste nosso caso específico, pelo menos! 😉
O lance é que este circuito integrado – MAX7219, pode controlar até 8 displays de 7 segmentos por Circuito Integrado! 😮É isso mesmo pessoal (recomendo consultarem o “datasheet” – folha de dados, oficial do componente eletrônico MAX7219), e com todas as informações diretamente do fabricante, então, muito mais será possível testar, experimentar e realizar. E só para deixar como “destaque” pra vocês: o MAX7219 é “tão poderoso” que é possível controlar até 8 displays de 7 segmentos por CI, e podemos ligar ATÉ 8 Circuitos Integrados MAX7219 em Série, ou seja, podemos utilizar o Arduino para controlar ATÉ 64 displays.
💡 Para aqueles que ainda estão se perguntando “o por que” de utilizar uma matriz de LEDs em seus circuitos e/ou projetos, bom, essas matrizes (como a utilizada aqui) possibilitam a montagem de “painéis” elaborados, painéis por exemplo, daqueles do tipo onde, podemos exibir números, letras e/ou desenhos, e lembrando que dependendo da configuração da matriz, dependendo do tipo da matriz utilizada, etc., poderemos mostrar tudo isso e mais, em várias formas, tamanhos e cores!
PS: Digo isso, porque neste post utilizo apenas uma 8×8 Matrix de LEDs vermelhos, e que não reproduz outras cores.
Ao conseguir obter um destes módulos em suas próprias mãos, e poder conferir “de fato“, tanto o nome, quanto a função, de cada um dos pinos da 8×8 LED MATRIX, preste atenção ao “lado esquerdo” (claro que isso depende do seu ponto de vista), pois neste mesmo lado, o esquerdo do módulo, estão os pinos de entrada, nomeados como: VCC, GND, DIN, CS e CLK.
Os pinos do lado direito do módulo da MATRIZ de LEDs 8×8, nomeados como: VCC, GND, DOUT, CS e CLK serão utilizados para interligar os outros módulos semelhantes (módulos do mesmo tipo e características do módulo principal MAX7219 do projeto).
Aprenderemos como interligar este módulo ao Arduino UNO e depois, vou tentar mostrar alguns caracteres variados na Matriz de LEDs, mãos à obra! 😀
➡ Pessoal, o esquemático está na primeira imagem deste post – lá no cabeçalho! |
COMO CONTROLAR A MATRIZ DE LEDs COM O ARDUINO? CONFIRA!
Para tentar deixar mais fácil o processo de desenvolvimento do programa (sketch no Arduino) e o próprio controle da Matriz de LEDs, deixo aqui uma biblioteca que você só precisa baixar e instalar na pasta libraries da sua IDE Arduino. O nome da biblioteca é LedControl. Para instalar a biblioteca siga estes passos:
- Clique aqui para baixar a biblioteca LedControl . (Você obterá uma pasta .zip em seus downloads)
- Descompacte o arquivo .zip em uma pasta. Você deve obter uma pasta de nome “LedControl-master“
- Renomeie a pasta de
LedControl-masterpara LedControl
- Mova a pasta LedControl para a pasta “bibliotecas” (libraries) da IDE Arduino para completar a instalação
- Finalmente, reabra a IDE do seu Arduino.
UTILIZANDO AS FUNÇÕES DA BIBLIOTECA “LedControl“:
A maneira mais fácil de se exibir algo na matriz de LEDs, é utilizando as funções setled () , setRow () ou SetColumn () . Estas funções permitem controlar um único LED, uma linha ou uma coluna de cada vez.
Aqui estão os parâmetros para cada função:
setled (addr, linha, col, estado), onde:
- addr é o endereço da sua matriz, por exemplo, se você tem apenas uma matriz, o endereço int será zero.
- linha é a linha onde o LED está localizado.
- Col é a coluna onde o LED está localizado.
- Estado
- VERDADEIRO ou 1 se você quiser ligar o LED
- FALSO ou 0 se quiser desligá-lo
setRow (addr, linha, valor)
setCol (addr, coluna, valor)
INDEX – USANDO VISÃO DE RAIO-X NA MATRIZ DE LEDs 8×8:
Como já sabemos, nossa matriz tem 8 linhas e 8 colunas. Cada LED é indexado/numerado de 0 a 7. Segue uma figura para melhor compreensão do que estamos falando sobre:
Para exibir algo na matriz, só precisamos agora identificar qual LED (olhando a imagem acima Linha X Coluna), para então LIGAR ou DESLIGÁ-LO.
No nosso exemplo, se você deseja exibir um “Smile Face”, segue abaixo o que você precisa fazer:
O CÓDIGO DO PROGRAMA (SKETCH):
Abaixo segue um esboço simples de código, que exibe três tipos de faces: uma face triste, uma neutra e uma face feliz.
Faça o upload do código abaixo para sua placa Arduino e observe o resultado final!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
/* Created by Rui Santos http://randomnerdtutorials.com/ --------------------------------- Modificado por Rodrigo Costa https://eletronicaparatodos.com/ Em: 14/03/2017 --------------------------------------------------------------------------- INSTRUCOES PARA INTERFACE DOS PINOS DA MATRIZ COM OS PINOS DO ARDUINO UNO: --------------------------------------------------------------------------- DIN se conecta ao pino 12 CLK se conecta ao pino 11 CS se conecta ao pino 10 */ #include "LedControl.h" #include "binary.h" LedControl lc = LedControl(12,11,10,1); // tempo de delay entre as faces: //------------------------------- unsigned long delaytime=1000; // face feliz: //------------ byte ff[8]= {B00111100,B01000010,B10100101,B10000001,B10100101,B10011001,B01000010,B00111100}; // face neutra: //------------- byte fn[8]={B00111100, B01000010,B10100101,B10000001,B10111101,B10000001,B01000010,B00111100}; // face triste: //------------- byte ft[8]= {B00111100,B01000010,B10100101,B10000001,B10011001,B10100101,B01000010,B00111100}; void setup() { lc.shutdown(0,false); // seta o brilho para um valor mediano: //------------------------------------- lc.setIntensity(0,8); // limpa o display: //----------------- lc.clearDisplay(0); } void desenhaFaces(){ // Mostra a face triste: //---------------------- lc.setRow(0,0,ft[0]); lc.setRow(0,1,ft[1]); lc.setRow(0,2,ft[2]); lc.setRow(0,3,ft[3]); lc.setRow(0,4,ft[4]); lc.setRow(0,5,ft[5]); lc.setRow(0,6,ft[6]); lc.setRow(0,7,ft[7]); delay(delaytime); // Mostra a face neutra: //---------------------- lc.setRow(0,0,fn[0]); lc.setRow(0,1,fn[1]); lc.setRow(0,2,fn[2]); lc.setRow(0,3,fn[3]); lc.setRow(0,4,fn[4]); lc.setRow(0,5,fn[5]); lc.setRow(0,6,fn[6]); lc.setRow(0,7,fn[7]); delay(delaytime); // Mostra a face feliz: //--------------------- lc.setRow(0,0,ff[0]); lc.setRow(0,1,ff[1]); lc.setRow(0,2,ff[2]); lc.setRow(0,3,ff[3]); lc.setRow(0,4,ff[4]); lc.setRow(0,5,ff[5]); lc.setRow(0,6,ff[6]); lc.setRow(0,7,ff[7]); delay(delaytime); } void loop(){ desenhaFaces(); } |
Após realizar todos os passos descritos acima e finalizado o upload do código para a placa do Arduino, a nossa Matriz de LEDs 8×8 vai se comportar como no vídeo gravado abaixo, vejam:
E aí, gostaram? 😀
Se sim, assistam o pequeno video abaixo (2 minutinhos contando com a vinheta, risos) e vejam o que mais é possível realizar utilizando a mesma Matriz de LEDs 8×8! 💡
Ahh, e mais! Gostaram do video acima? Então não percam o fechamento deste posto logo abaixo! 💡
VAMOS JOGAR “PONG” NA MATRIZ DE LEDs 8×8 MAX7219:
O jogo pong que vocês estão prestes a jogar, não foi criado por mim, mas sim, por: Alessandro Pasotti.
Para o jogo pong, você só precisa adicionar um potenciômetro ohm 1k ao esquema (eu utilizei um de 5k e tive que realizar pequenas alterações no código/sketch (então, se seu potênciometro tem valor diferente, pode ser que seja necessário alterar alguns argumentos de algumas funções no código do programa). Depois disso, montamos o novo circuito como mostrado abaixo:
CÓDIGO/SKETCH PARA COMPLETAR A “ALMA” DO JOGO/GAME:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 |
/* * Play pong on an 8x8 matrix - project from itopen.it */ #include "LedControl.h" #include "Timer.h" #define POTPIN A5 // Potentiometer #define PADSIZE 3 #define BALL_DELAY 200 #define GAME_DELAY 10 #define BOUNCE_VERTICAL 1 #define BOUNCE_HORIZONTAL -1 #define NEW_GAME_ANIMATION_SPEED 50 #define HIT_NONE 0 #define HIT_CENTER 1 #define HIT_LEFT 2 #define HIT_RIGHT 3 //#define DEBUG 1 byte sad[] = { B00000000, B01000100, B00010000, B00010000, B00000000, B00111000, B01000100, B00000000 }; byte smile[] = { B00000000, B01000100, B00010000, B00010000, B00010000, B01000100, B00111000, B00000000 }; Timer timer; LedControl lc = LedControl(12,11,10,1); byte direction; // Wind rose, 0 is north int xball; int yball; int yball_prev; byte xpad; int ball_timer; void setSprite(byte *sprite){ for(int r = 0; r < 8; r++){ lc.setRow(0, r, sprite[r]); } } void newGame() { lc.clearDisplay(0); // initial position xball = random(1, 7); yball = 1; direction = random(3, 6); // Go south for(int r = 0; r < 8; r++){ for(int c = 0; c < 8; c++){ lc.setLed(0, r, c, HIGH); delay(NEW_GAME_ANIMATION_SPEED); } } setSprite(smile); delay(1500); lc.clearDisplay(0); } void setPad() { xpad = map(analogRead(POTPIN), 0, 1020, 8 - PADSIZE, 0); } void debug(const char* desc){ #ifdef DEBUG Serial.print(desc); Serial.print(" XY: "); Serial.print(xball); Serial.print(", "); Serial.print(yball); Serial.print(" XPAD: "); Serial.print(xpad); Serial.print(" DIR: "); Serial.println(direction); #endif } int checkBounce() { if(!xball || !yball || xball == 7 || yball == 6){ int bounce = (yball == 0 || yball == 6) ? BOUNCE_HORIZONTAL : BOUNCE_VERTICAL; #ifdef DEBUG debug(bounce == BOUNCE_HORIZONTAL ? "HORIZONTAL" : "VERTICAL"); #endif return bounce; } return 0; } int getHit() { if(yball != 6 || xball < xpad || xball > xpad + PADSIZE){ return HIT_NONE; } if(xball == xpad + PADSIZE / 2){ return HIT_CENTER; } return xball < xpad + PADSIZE / 2 ? HIT_LEFT : HIT_RIGHT; } bool checkLoose() { return yball == 6 && getHit() == HIT_NONE; } void moveBall() { debug("MOVE"); int bounce = checkBounce(); if(bounce) { switch(direction){ case 0: direction = 4; break; case 1: direction = (bounce == BOUNCE_VERTICAL) ? 7 : 3; break; case 2: direction = 6; break; case 6: direction = 2; break; case 7: direction = (bounce == BOUNCE_VERTICAL) ? 1 : 5; break; case 5: direction = (bounce == BOUNCE_VERTICAL) ? 3 : 7; break; case 3: direction = (bounce == BOUNCE_VERTICAL) ? 5 : 1; break; case 4: direction = 0; break; } debug("->"); } // Check hit: modify direction is left or right switch(getHit()){ case HIT_LEFT: if(direction == 0){ direction = 7; } else if (direction == 1){ direction = 0; } break; case HIT_RIGHT: if(direction == 0){ direction = 1; } else if(direction == 7){ direction = 0; } break; } // Check orthogonal directions and borders ... if((direction == 0 && xball == 0) || (direction == 4 && xball == 7)){ direction++; } if(direction == 0 && xball == 7){ direction = 7; } if(direction == 4 && xball == 0){ direction = 3; } if(direction == 2 && yball == 0){ direction = 3; } if(direction == 2 && yball == 6){ direction = 1; } if(direction == 6 && yball == 0){ direction = 5; } if(direction == 6 && yball == 6){ direction = 7; } // "Corner" case if(xball == 0 && yball == 0){ direction = 3; } if(xball == 0 && yball == 6){ direction = 1; } if(xball == 7 && yball == 6){ direction = 7; } if(xball == 7 && yball == 0){ direction = 5; } yball_prev = yball; if(2 < direction && direction < 6) { yball++; } else if(direction != 6 && direction != 2) { yball--; } if(0 < direction && direction < 4) { xball++; } else if(direction != 0 && direction != 4) { xball--; } xball = max(0, min(7, xball)); yball = max(0, min(6, yball)); debug("AFTER MOVE"); } void gameOver() { setSprite(sad); delay(1500); lc.clearDisplay(0); } void drawGame() { if(yball_prev != yball){ lc.setRow(0, yball_prev, 0); } lc.setRow(0, yball, byte(1 << (xball))); byte padmap = byte(0xFF >> (8 - PADSIZE) << xpad) ; #ifdef DEBUG //Serial.println(padmap, BIN); #endif lc.setRow(0, 7, padmap); } void setup() { // The MAX72XX is in power-saving mode on startup, // we have to do a wakeup call pinMode(POTPIN, INPUT); lc.shutdown(0,false); // Set the brightness to a medium values lc.setIntensity(0, 8); // and clear the display lc.clearDisplay(0); randomSeed(analogRead(0)); #ifdef DEBUG Serial.begin(9600); Serial.println("Pong"); #endif newGame(); ball_timer = timer.every(BALL_DELAY, moveBall); } void loop() { timer.update(); // Move pad setPad(); #ifdef DEBUG Serial.println(xpad); #endif // Update screen drawGame(); if(checkLoose()) { debug("LOOSE"); gameOver(); newGame(); } delay(GAME_DELAY); } |
VÍDEO DEMONSTRANDO MEU “GAME” EM FUNCIONAMENTO:
Pessoal, se tiverem alguma dúvida no meio do processo, por favor, deixem seus comentários aqui embaixo que vou tentar responder a todos bem rápido! Abração! 😉
- Medindo e Monitorando a Temperatura com Arduino (Sensor LM35) - 5 de setembro de 2021
- Controle de Cargas através de Entrada Analógica com Arduino - 30 de agosto de 2021
- REVIEW E DICAS – ALICATE AMPERÍMETRO (UNI-T UT210E PRO) - 28 de agosto de 2021
Bom dia
Rodrigo
Vi um vídeo onde uma pessoa construiu uma matriz 8×8, ele tmbm utilizou um integrado, queria construir uma tmbm, mas não sei como ligar ao integrado, o integrado deve ser o mesmo do seu artigo!!
Tem como??
Valeu!!
Fala Rodrigo! Tudo Bom?!
Seja muito bem-vindo ao nosso Blog! 🙂
Rapaz, se entendi direito o que você perguntou, vou lhe dizer que é possível sim desenvolver “do zero” algo como você deseja.
O CI que você menciona provavelmente é o MAX7219 da Maxim.
Vou deixar pra você um link abaixo onde você pode ver exatamente COMO LIGAR este circuito integrado a matriz de LEDs.
Veja: https://www.instructables.com/id/Arduino-Dot-Matrix-Game-Console/
PS: Você postou 2x a mesma questão aqui no post, então para não excluir o segundo, vou postar esta mesma resposta nos dois. 🙂
Espero que seja de algum Auxílio!
Um Abraço,
Rodrigo Costa do Blog, Fanpage e Instagram,
https://EletronicaParaTodos.com
https://facebook.com/EletronicaParaTodosBR
https://instagram.com/EletronicaParaTodosBrasil
Bom dia
Vi um vídeo em que uma pessoa monta uma matriz de 8×8, ele usa tmbm pelo que vi um
Integrado, então quero construir tmbm uma matriz, mas só que eu não sei como ligar esta matriz ao integrado que pode ser este integrado que é citado no seu artigo!!
Tem como???
Valeu!!!
Rodrigo
Fala Rodrigo! Tudo Bom?!
Seja muito bem-vindo ao nosso Blog! 🙂
Rapaz, se entendi direito o que você perguntou, vou lhe dizer que é possível sim desenvolver “do zero” algo como você deseja.
O CI que você menciona provavelmente é o MAX7219 da Maxim.
Vou deixar pra você um link abaixo onde você pode ver exatamente COMO LIGAR este circuito integrado a matriz de LEDs.
Veja: https://www.instructables.com/id/Arduino-Dot-Matrix-Game-Console/
PS: Você postou 2x a mesma questão aqui no post, então para não excluir o segundo, vou postar esta mesma resposta nos dois. 🙂
Espero que seja de algum Auxílio!
Um Abraço,
Rodrigo Costa do Blog, Fanpage e Instagram,
https://EletronicaParaTodos.com
https://facebook.com/EletronicaParaTodosBR
https://instagram.com/EletronicaParaTodosBrasil
Tentei fazer o ping pong e deu erro.
Vc pode me ajudar a resolver este erro.
Esta foi a mensagem de erro que apareceu.
Arduino: 1.8.5 (Windows 10), Placa:”Arduino/Genuino Uno”
C:\Users\rodem\Documents\Arduino\ping-pong\ping-pong.ino:7:19: fatal error: Timer.h: No such file or directory
#include “Timer.h”
^
compilation terminated.
exit status 1
Erro compilando para a placa Arduino/Genuino Uno
Este relatório teria mais informações com
“Mostrar a saida detalhada durante a compilação”
opção pode ser ativada em “Arquivo -> Preferências”
Fala Rodrigão! Tudo Bom Xará?! 🙂
Primeiramente seja muito bem-vindo ao Blog!
Rapaz, pela mensagem de ERRO que você recebeu na hora de compilar na sua IDE Arduino, eu acredito que o problema tenha sido e NA REALIDADE é o problema pelo qual você está passando (recebendo essa mensagem de erro), é simplesmente pela FALTA/AUSÊNCIA da Biblioteca que tenha o arquivo Timer.h! o.O
Sendo assim, acabei de realizar o “upload” desta Biblioteca que contenha o arquivo (Timer.h) para que você e quem mais desejar e necessitar, possa realizar o download desta biblioteca sem ter que procurar na internet e finalmente conseguir “rodar” o código fonte do “ping-pong“! 🙂
Pode realizar o download da biblioteca TIMER diretamente: https://eletronicaparatodos.com/download/2803/
Espero que a partir daí você e Todos que desejarem consigam “rodar” o joguinho! 🙂
Todo o Sucesso!
Forte Abraço,
Rodrigo Costa do Canal Youtube,
https://youtube.com/EletronicaParaTodos
Parabéns pelo trabalho, estou com uma matriz de led do mesmo modelo so que RGB tem como fazer o endereçamento usando o Max7219 se sim teria como mandar diagrama de conexões, desde já agradeço.
Fala Emerson! Tudo Bom?!
Primeiramente agradeço sua visita, mensagem e elogio! Gratidão imensa saber que estamos ajudando. 🙂
Rapaz, por aqui nunca utilizamos essa Matriz de LEDs do tipo RGB, então não posso lhe ajudar muito, MAS, encontrei um link, onde acredito que você possa conseguir resolver o problema de endereçamento dos LEDs da sua Matriz.
Veja a imagem abaixo se lhe auxilia em algo:
Você também pode acessar diretamente este LINK para acessar um artigo não nosso, mas que acredito vai lhe auxiliar em algo ou no mínimo ser útil! 🙂
Desejo Sucesso!
Um Abraço,
Rodrigo Costa do Canal Youtube,
https://youtube.com/EletronicaParaTodos
Meu código não funciona , da erro na hora de complar
Fala João! Tudo Bom?!
Primeiramente agradeço sua mensagem! 🙂
Rapaz, olha só, fica MUITO difícil poder tentar lhe ajudar apenas com essa explicação que você deu, infelizmente. 🙁
Se possível, tenta mostrar a mensagem de erro aqui de forma bem específica, como copiar+colar, pois aí podemos pelo menos tenta “ler” mais detalhes sobre o ERRO, por exemplo se é problema de configuração da placa, tipo de programador, falta de inclusão de bibliotecas no código ou até mesmo no diretório e por aí vai…!
É isso, se puder dar mais detalhes, estamos aqui! 😉
Um Abraço,
Rodrigo Costa do Canal,
https://www.youtube.com/EletronicaParaTodos