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:

Nesse tutorial foram utilizadas as seguintes bibliotecas:
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.

20 comentários:

  1. 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..
    Grato

    ResponderExcluir
    Respostas
    1. Teria como me enviar o código que você, tentou fazer o upload? Baixou todas as bibliotecas?

      Excluir
    2. Olá Lucas, bom dia!

      O 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é

      Excluir
  2. /*
    Arduino & 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..

    ResponderExcluir
    Respostas
    1. Na linha 45 do código havia um Y, basta retirar(não tinha visto o mesmo mas já alterei)

      Excluir
  3. E amigo deixa pra lá, ta dando outro erro em outro lugar, vou ver se encontro outro código, mas muito obrigado pela ajuda..

    ResponderExcluir
    Respostas
    1. Qual erro está dando? Relacionado a biblioteca Robot?

      Excluir
    2. Já corrigi todos os erros possíveis do código, tente novamente.

      Excluir
  4. Respostas
    1. Vai na pasta libraries do Arduino e remova as bibliotecas "Robot_Control" e "Robot_Motor" elas geralmente entram em conflito com outras.

      Excluir
  5. Oi 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

    void 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

    ResponderExcluir
  6. Parabens pelo Tutorial, foi o único que funcionou legal comigo rsrsrs
    Fiz umas alterações e consegui por 3 matrizes, fazendo a mensagem rolar por eles :D

    ResponderExcluir
  7. Oi amigo! Primeiramente, obrigado pelo Tutorial; funcionou corretamente.
    Tenho 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

    ResponderExcluir
    Respostas
    1. Sim, as tabelas Unicode e UTF-8 já possuem caracteres acentuados.

      Excluir
  8. OK! E, como usar os caracteres da tabela Unicode no código de Arduino?
    Obrigado mais uma vez

    ResponderExcluir
  9. Lucas, parabéns!!!
    Exemplo 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!

    ResponderExcluir
  10. 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 :)

    ResponderExcluir
  11. Really nice blogs and sharing very useful steps know more for related issue.

    Led production counter

    ResponderExcluir
  12. 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.
    Led video display

    ResponderExcluir

Tecnologia do Blogger.