Tutoriais Displays IV : Módulo Matriz de Led 8x8
Bom, nesse tutorial irei demonstrar o uso do módulo com o CI Max7219, no qual possui uma matriz de led 8x8, onde posso utilizar para o que for necessário, portanto nesse exemplo bem básico irei exibir algumas animações além de alguns caracteres.
Circuito(Arduino UNO/Mega)
Como pode ver ele possui uma certa diferença de conexão em diferentes modelos do Arduino, devido o módulo utilizar a comunicação SPI.(MOSI/SCK) Portanto confira a tabela para usar o pino correto em seu devido Arduino:
No caso do Arduino Due e Leonardo o Padrão SPI só é acessivel pelo conector ICSP:
No entanto a configuração dos Pinos é a seguinte:
- VCC >> +5V
- GND >> Ground ou Terra
- DIN >> MOSI
- CS >> Porta Digital D10
- CLK >> SCK
Código:
https://github.com/adafruit/Adafruit-GFX-Library (Adafruit_GFX)
https://github.com/markruys/arduino-Max72xxPanel (Max72xxPanel)
Projeto em Funcionamento:
Existem várias outras bibliotecas para o Módulo porém a que achei mais simples e prática foi essa (Max72xxPanel) onde encontro várias funções gráficas acessíveis de forma bastante simples além de poder usar vários displays em conjunto muito tranquilamente.
Ola amigo não consigo fazer isso funcionar de jeito nenhum, da uma mensagem de erro no codigo (Y) was not declared in this escope.... Pode me ajudar..
ResponderExcluirGrato
Teria como me enviar o código que você, tentou fazer o upload? Baixou todas as bibliotecas?
ExcluirOlá Lucas, bom dia!
ExcluirO meu funcionou maravilha aqui. E olha que faz tempo que procuro por algum que funcione e o seu tutorial foi o único que finalmente eu consegui fazer rodar. Não entendo quase nada de programação. Porém eu não consegui colocar mais módulos para rodar juntos. Funcionou apenas com 1.
Você poderia me dizer como proceder para incluir vários módulos. Até quantos módulos eu posso ligar se a necessidade de uma fonte externa para alimenta-los?
Atenciosamente
André
/*
ResponderExcluirArduino & Eletrônica 2014
Lucas Silva Chaves
http://www.arduinoeletronica.com.br
*/
#include
#include
#include
byte x, y,x2,y2;//Variaveis de Posição
String frase = "ARDUINO ELETRONICA";//Frase a ser exibida
int CS = 10;
int espaco = 1;//Espaço entre letras
int largura= 6;//Largura das letras + espaço
// CS HorizontalDisplays VerticalDisplays
Max72xxPanel matrix = Max72xxPanel(CS,1,1);
void setup(){
matrix.setIntensity(3);// Intensidade do Módulo (0 ~~ 15)
for(int i=0;i<11;i++){
matrix.fillScreen(HIGH);//Acende todos
matrix.write();//Escreve no Módulo
delay(100);
matrix.fillScreen(LOW);//Desliga todos
matrix.write();//Escreve no Módulo
delay(100);
}
}
void loop(){
for(x=0;x<8;x++){//Contador para X
for(y=0;y<8;y++){// Contador para Y
x2 = maps(x,0);//Inversor de X para X2
y2 = maps(y,0);//Inversor de Y para Y2
matrix.fillScreen(LOW);
matrix.drawPixel(x,y,1);//Desenha Pixel (posição x, posição y, cor(0 ~ 1)[0 Apagado, 1 Ligado]
matrix.drawPixel(y,x,1);
matrix.drawPixel(x2,y,1);
matrix.drawPixel(y,x2,1);
matrix.drawPixel(y2,x,1);
matrix.drawPixel(x,y2,1);
matrix.drawPixel(x2,y2,1);
matrix.drawPixel(y2,x2,1);
matrix.write();//Escreve no Módulo
delay(50);
}
Y
for ( int i = 0 ; i < largura * frase.length() + matrix.width() - 1 - espaco; i++ ) {//Contador para letras
matrix.fillScreen(LOW);//Apaga a tela
int letra = i / largura;
int x = (matrix.width() - 1) - i % largura;//Posição da Letra X
int y = (matrix.height() - 8) / 2; //Posição da Letra Y
while ( x + largura - espaco >= 0 && letra >= 0 ) {//Contador para o vetor de char[Ou string]
if ( letra < frase.length() ) {
matrix.drawChar(x, y, frase[letra], HIGH, LOW, 1);//Escrita da Letra
}
letra--;
x -= largura;
}
matrix.write();
delay(100);
}
}
int maps(int value,boolean invers){//Funcão de Inverter 0 vale 7 e 7 vale 0 assim por diante
if(invers){
value = map(value,7,0,0,7);
return value;
}
else{
value = map(value,0,7,7,0);
return value;
}
}
Sim baixei todas as bibliotecas, achei estranho esse Y sozinho na linha e assim mesmo..
Obrigado..
Na linha 45 do código havia um Y, basta retirar(não tinha visto o mesmo mas já alterei)
ExcluirE amigo deixa pra lá, ta dando outro erro em outro lugar, vou ver se encontro outro código, mas muito obrigado pela ajuda..
ResponderExcluirQual erro está dando? Relacionado a biblioteca Robot?
ExcluirJá corrigi todos os erros possíveis do código, tente novamente.
Excluirisso..
ResponderExcluirVai na pasta libraries do Arduino e remova as bibliotecas "Robot_Control" e "Robot_Motor" elas geralmente entram em conflito com outras.
ExcluirOi amigo! Gostaria muito de entender principalmente o código (sketch) para essas Matrizes mas, tenho dificuldades; por exemplo, esse aqui é parte de um sketch de um módulo de uma matriz 64x16 vendida aqui: http://www.ebay.com/itm/Provide-Arduino-code-64x16-dot-Matrix-LED-for-diy-Sign-Light-Neon-Bright-UNO-MCU-/271303628009?pt=LH_DefaultDomain_0&hash=item3f2af4d4e9
ResponderExcluirvoid drawChar(uint16_t x, uint16_t y, byte n, byte font, boolean inverse) {
byte charbytes[16], fontrows, xover8 = x>>3;
int index;
if (0 != (x % 8)) return; // x not a multiple of 8
if ((n>9) && (n<32)) return; // invalid character
if (font==0) fontrows=16; else fontrows=8;
if ((n>=0) && (n<=9)) index=(n+16)*fontrows; else index=(n-32)*fontrows; // go to the right code for this character
// addressing start at buffer and add y (rows) * (WIDTH is 64 so WIDTH/8) is 8 plus (x / 8) is 0 to 7
byte *pDst = buffer + (y << 3) + xover8;
for (byte i=0;i> 4 | (charbytes[i] & 0x0F) << 4;
charbytes[i] = (charbytes[i] & 0xCC) >> 2 | (charbytes[i] & 0x33) << 2;
charbytes[i] = (charbytes[i] & 0xAA) >> 1 | (charbytes[i] & 0x55) << 1;
};
if (inverse) charbytes[i] = ~charbytes[i];
};
const byte *pSrc = charbytes; // point at the first set of 8 pixels
for (byte i=0; i>x)) >> (7-x))<<(pixels-x-1); };
}
}
}
};
void shiftOut(byte row) { // fast routine to shove out 8 columns into two rows via board's shift registers
for(byte column=0;column<8;column++) {
byte index = column + (row<<3);
for(byte i=0;i<8;i++) {
PORTB &=~(3<<(data_R1-8)); // data_R2 is LOW; data_R1 is LOW;
PORTB &=~(1<<(clockPin-8)); // digitalWrite(clockPin,LOW);
PORTB |= !((buffer[index]>>(7-i)) & 0x01) << (data_R1-8); // top set of rows
PORTB |= !((buffer[index+128]>>(7-i)) & 0x01) << (data_R2-8); // bottom set of rows
PORTB |= 1<<(clockPin-8); // digitalWrite(clockPin,HIGH);
};
};
};
ISR(TIMER2_COMPA_vect){
cli();
digitalWrite(en_74138, HIGH); // Turn off display
shiftOut(ScanRow); // Shift out 8 columns
digitalWrite(latchPin, LOW);
digitalWrite(latchPin, HIGH);
PORTD = (ScanRow << 3) | (PORTD & 0X87); // Highlight row: pins 3 4 5 6 (la_74138 lb_74138 lc_74138 ld_74138)
digitalWrite(en_74138, LOW); // Turn on display
ScanRow++; // Do the next pair of rows next time this routine is called
if (ScanRow==16) ScanRow=0;
sei();
};
void setup() {
// Set up Timer2 as the scanning interrupt timer
cli(); // clear interrupts
TCCR2A = 0; TCCR2B = 0; TCNT2 = 0;
TCCR2B |= (1 << CS12) | (1 << CS10); // Set 1024 prescaler
// 160Hz scan rate = 10 frames/second (16 pairs of rows)
OCR2A = 97; // 97 = (16,000,000 / (1024*160)) - 1
TCCR2A |= (1 << WGM21); TIMSK2 |= (1 << OCIE2A);
Existem regras para isso? Onde encontrar? De onde partir?
meu email: meuviolino@hotmail.com
Desde já te agradeço muito
Parabens pelo Tutorial, foi o único que funcionou legal comigo rsrsrs
ResponderExcluirFiz umas alterações e consegui por 3 matrizes, fazendo a mensagem rolar por eles :D
Posta ai....
ExcluirOi amigo! Primeiramente, obrigado pelo Tutorial; funcionou corretamente.
ResponderExcluirTenho uma pergunta que, não sei se está no seu alcance, que é a seguinte: Na tabela ASCII não está inserido os nossos caracteres (português) acentuados certo? Já existe alguma tabela com esses acentos?
Obrigado
Sim, as tabelas Unicode e UTF-8 já possuem caracteres acentuados.
ExcluirOK! E, como usar os caracteres da tabela Unicode no código de Arduino?
ResponderExcluirObrigado mais uma vez
Lucas, parabéns!!!
ResponderExcluirExemplo muito bacana e simples de aplicar. Aqui rodou 100% no Arduino Genérico da Robocore. Só tive que adicionar as bibliotecas pela IDE e rodou de primeira!
Amigo parabéns pelo post preciso fazer com 8 matriz deste mesmo jeito só gostaria de saber como faço para acrescentar mais módulo no sketch desde já agradeço sua atenção .demais apenas com 1 funciona perfeitamente bem preciso fazer rolar o texto em 8 matriz :)
ResponderExcluirReally nice blogs and sharing very useful steps know more for related issue.
ResponderExcluirLed production counter
Its wonderful, looking at the time and effort you put into your weblog and detailed information you provide. I'll bookmark your weblog and visit it weekly for your new posts.
ResponderExcluirLed video display