A matriz de LED é um componente que vem em vários kits de Arduino, mas muitos podem ficar confusos por sua aparente complexidade e acabam não usando. Portanto, neste post, vamos entender a matriz de LED e ver como acioná-la.
O que é
A matriz de LED é um componente que possui 64 LEDs distribuídos em 8 linhas e 8 colunas, formando assim um quadrado. Veja o exemplo de uma na imagem abaixo:
Ela é feita de modo a facilitar o acionamento de cada LED individualmente. Portanto, ao invés de 65 pinos (64 pinos + o terra), ela possui apenas 16.
Essa solução é alcançada interligando os LEDs por linhas e colunas da seguinte forma: os LEDs de cada coluna tem os ânodos interligados e os LEDs de cada linha tem os cátodos interligados. Entretanto, essa interligação pode ser invertida dependendo do modelo da matriz: em cada coluna o cátodo é interligado e em cada linha o ânodo é interligado.
Normalmente a ligação obedece um dos esquemas abaixo:
Repare que, não é possível criar certos padrões com os LEDs, pois acionando um LED, você interfere no funcionamento de outro. Para resolver isso, você pode acender e apagar cada LED por vez e criar um delay muito pequeno entre os acionamentos. Esse delay pequeno, para nossos olhos, é imperceptível e o resultado final será algo constante. Recomendo usar em torno de 20 microssegundos.
Como usar
Acesso aos pinos
Antes de começar a energizar a matriz de LED, temos um pequeno problema para resolver: ela não cabe nas protoboards de forma a possibilitar seu acionamento. Pelos testes que fiz, ela fica muito larga e não dá para acessas seus pinos. E, para resolver esse problema, existem duas formas usando protoboards: colocando uma do lado da outra ou passando vários fios por baixo dela e ligando eles em outro ponto da protoboard.
Como muitos não tem uma protoboard de sobra, é melhor optar pela segunda opção. Na imagem abaixo, primeiro eu passei os fios (fios de cabo de rede) e liguei eles em trilhas fora da matriz.
Depois, com a matriz encaixada, eu consigo acessar todos os pinos.
Obs.: A parte inferior é a que possui o escrito na lateral da matriz.
Ligação
Para acionar corretamente os LEDs, precisamos descobrir a numeração correta dos pinos da matriz. Para isso, liguei o último pino (da esquerda pra direita) da parte inferior no 5v. E fui ligando o GND em outros pinos. Com isso, comparei com o esquema que mostrei antes:
Dessa forma, descobri que a minha matriz corresponde a da imagem da direita. E, o último pino (o mesmo de antes) é o pino 8. Obs.: Na imagem acima, você deve olhar o número que está dentro de um círculo para descobrir qual é o pino correspondente. Portanto, meu resultado foi:
Obs.: A imagem acima mostra a placa de cabeça para baixo, então a numeração parece estar invertida em relação ao que falei logo acima. Por fim, basta seguir o esquema de ligação para saber quais pinos você quer acionar. Por exemplo, quero ligar o LED da 1ª linha e 1ª coluna: De acordo com o diagrama da direita, o pino 9 deve ser ligado no 5v e o pino 13 no GND.
Obs²: Não esqueça de usar resistores.
Finalmente, vamos então as formas de controlar a matriz de LED.
Arduino
Ligação
Agora que nós vimos como fazer a ligação, não tem muito segredo para acionar os LEDs. Você só deve ficar atento ao seguinte fato: a matriz de LED possui 16 pinos e o Arduino UNO possui 13 pinos digitais. Portanto, você deve ligar o restante dos pinos nas portas analógicas (A0-A5). Não tem problema algum em fazer isso, pois os pinos analógicos também são pinos digitais no fim das contas. Essa separação só é feita pra simplificar o entendimento para novatos.
Além disso, vale lembrar que, se você for usar os pinos D0 e D1 do Arduino, não pode usar a comunicação serial. Isso, porque são os pinos padrões utilizados para a comunicação. Então, é só pular os dois caso você queira utilizar a comunicação serial.
Agora, você pode usar a lógica que preferir. Para exemplificar, vou ligar os pinos (da matriz) correspondentes às linhas nos pinos D0-D7 de maneira sequencial (D0 – linha 1, D1 – linha 2…). No meu caso são os pinos (da matriz): 9, 14, 8, 12, 1, 7, 2 e 5. Os pinos correspondentes as colunas eu liguei da mesma forma, porém do D8-D13 e do A0-A1.
Programação
Código para testar a matriz
Para testar os pinos e ver se a matriz está corretamente ligada, use o código abaixo. Se você não seguiu a mesma ligação que fiz, basta mudar os pinos no início do código e a lógica para apagar os LEDs. Usei vetores para definir os pinos, pois assim é mais fácil de controlá-los.
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 | int linhas[8] = {0, 1, 2, 3, 4, 5, 6, 7}; // Pinos que controlam as linhas int colunas[8] = {8, 9, 10, 11, 12, 13, 14, 15}; // 14 corresponde ao A0 e 15 corresponde ao A1 void setup() { int i; // Variavel para o for for (i = 0; i < 16; i++) { // Vai de 0 até 16 definindo os pinos como saida pinMode(i, OUTPUT); if (i < 8) { // GND nos ânodos digitalWrite(i, LOW); } else { // 5v nos cátodos digitalWrite(i, HIGH); } } } void loop() { int i, j; // Variaveis para o for digitalWrite(colunas[0], LOW); for (i = 0; i < 8; i++) { for (j = 0; j < 8; j++) { digitalWrite(colunas[i], LOW); digitalWrite(linhas[j], HIGH); if (j > 0) { // Se não for a primeira linha, apaga a linha anterior digitalWrite(linhas[j - 1], LOW); } delay(500); // Delay entre os LEDs } digitalWrite(colunas[i], HIGH); // Depois de sair do for, apaga os ultimos leds acionados digitalWrite(linhas[j - 1], LOW); } } |
Código de exemplo
Para exemplificar, vou escrever na matriz a letra M e a letra P. Essas letras são impossíveis de serem escritas sem que o acionamento de um LED atrapalhe o outro. Para isso, vou usar a técnica de criar um delay muito pequeno (20µs) entre o acionamento de cada LED por coluna.
Novamente, para rodar o código, apenas mude os pinos para a configuração que você usou e mude a função limpar (feita para apagar os LEDs).
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 | int linhas[8] = {0, 1, 2, 3, 4, 5, 6, 7}; int colunas[8] = {8, 9, 10, 11, 12, 13, 14, 15}; // 14 corresponde ao A0 e 15 corresponde ao A1 void setup() { int i; // Variavel para o for for (i = 0; i < 16; i++) { // Vai de 0 até 16 definindo os pinos como saida pinMode(i, OUTPUT); } } void loop() { int i, j; // Letra M for (i = 0; i < 6250; i++) { // For criado para manter a letra M por 1 seg - Considerando que cada avanço do for dura 160us -> 160us x 6250 = 1segundo limpar(); digitalWrite(colunas[0], LOW); // 1 coluna for (j = 0; j < 8; j++) { digitalWrite(linhas[j], HIGH); } delayMicroseconds(20); limpar(); digitalWrite(colunas[1], LOW); // 2 coluna digitalWrite(linhas[1], HIGH); delayMicroseconds(20); limpar(); digitalWrite(colunas[2], LOW); // 3 coluna... digitalWrite(linhas[1], HIGH); digitalWrite(linhas[2], HIGH); delayMicroseconds(20); limpar(); digitalWrite(colunas[3], LOW); digitalWrite(linhas[2], HIGH); digitalWrite(linhas[3], HIGH); delayMicroseconds(20); limpar(); digitalWrite(colunas[4], LOW); digitalWrite(linhas[2], HIGH); digitalWrite(linhas[3], HIGH); delayMicroseconds(20); limpar(); digitalWrite(colunas[5], LOW); digitalWrite(linhas[1], HIGH); digitalWrite(linhas[2], HIGH); delayMicroseconds(20); limpar(); digitalWrite(colunas[6], LOW); digitalWrite(linhas[1], HIGH); delayMicroseconds(20); limpar(); digitalWrite(colunas[7], LOW); // 1 coluna for (j = 0; j < 8; j++) { digitalWrite(linhas[j], HIGH); } delayMicroseconds(20); } // Letra P for (i = 0; i < 6250; i++) { // Mesma coisa da letra M limpar(); digitalWrite(colunas[0], LOW); // 1 coluna for (j = 0; j < 8; j++) { digitalWrite(linhas[j], HIGH); } delayMicroseconds(20); limpar(); digitalWrite(colunas[1], LOW); //2 coluna digitalWrite(linhas[0], HIGH); digitalWrite(linhas[3], HIGH); delayMicroseconds(20); limpar(); digitalWrite(colunas[2], LOW); //3 coluna... digitalWrite(linhas[0], HIGH); digitalWrite(linhas[3], HIGH); delayMicroseconds(20); limpar(); digitalWrite(colunas[3], LOW); digitalWrite(linhas[0], HIGH); digitalWrite(linhas[3], HIGH); delayMicroseconds(20); limpar(); digitalWrite(colunas[4], LOW); digitalWrite(linhas[0], HIGH); digitalWrite(linhas[3], HIGH); delayMicroseconds(20); limpar(); digitalWrite(colunas[5], LOW); digitalWrite(linhas[0], HIGH); digitalWrite(linhas[3], HIGH); delayMicroseconds(20); limpar(); digitalWrite(colunas[6], LOW); digitalWrite(linhas[0], HIGH); digitalWrite(linhas[3], HIGH); delayMicroseconds(20); limpar(); digitalWrite(colunas[7], LOW); digitalWrite(linhas[0], HIGH); digitalWrite(linhas[1], HIGH); digitalWrite(linhas[2], HIGH); digitalWrite(linhas[3], HIGH); delayMicroseconds(20); } } void limpar() { // Funçao criada para apagar todos os leds int i; // Variavel para o for for (i = 0; i < 16; i++) { if (i < 8) { // GND nos ânodos digitalWrite(i, LOW); } else { // 5v nos cátodos digitalWrite(i, HIGH); } } } |
Resultado (Uma das linhas da minha matriz está queimada):
Módulo com CI
Meu objetivo no post era focar no acionamento da matriz sem usar módulos ou bibliotecas. Portanto, vou apenas dar um direcionamento a respeito do uso da matriz com módulo.
Outra forma de controlar a matriz de LED e evitar a confusão de fios, é usar o módulo com o CI MAX7219. Esse módulo de matriz de LED, já vem com as ligações feitas com o CI. Se quiser acessar o datasheet dele, clique aqui.
De 16 pinos, nós temos apenas 5 agora: Vcc, GND, DIM, CS e CLK. Você pode acessar esta página para ler a documentação da biblioteca necessária e aprender sobre a ligação.
Você pode baixar a biblioteca aqui e rodar os códigos de exemplo para aprender a controlar a matriz.
Bom dia tenho uma matriz de led de 8×64 leds 1088AS e não estou conseguindo colocar efeitos todas os exemplos que baixo não funciona
Bom dia. Por acaso essa sua matriz possui apenas 5 fios para ligação?
olá estou com o mesmo problema do colega Geraldo, 4 blocos de 8×8, 5 fios.
opa acabei de descobrir o problema, um dos pinos do arduino estava sem corrente. talvez pode ser seu caso também, se não for faça a modificação abaixo:
…
#define HARDWARE_TYPE MD_MAX72XX::ICSTATION_HW
#define MAX_DEVICES 4
#define CLK_PIN 13 // or SCK
#define DATA_PIN 11 // or MOSI
#define CS_PIN 10 // or SS
// SPI hardware interface
//MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
// Arbitrary pins
MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
….
Valeu pela ajuda Weslei. Espero que sua solução possa ajudar outras pessoas com o mesmo problema.
São 4 blocos de 8×8
como altero a programaçao do arduino pra fazer um painel 16×32 ou maior ?
Olá, Edson. Então, depende de como você fará a ligação com a matriz e de qual Arduino você está utilizando. Lembre-se que o Arduino UNO possui 20 pinos apenas, então não dá para ligar todos os pinos da sua matrix 16×32 (você só pode ligar 20 pinos). Recomendo você pegar o desenho dos LEDs da placa e usar como referência para você criar a sua ligação. Com isto, a parte da programação envolve apenas utilizar os comandos pinMode e digitalWrite. Se quiser uma referência dos comandos, dê uma olhada neste post.
Boa tarde
Me ajudou muito o post, obrigado, estou projetando uma matriz de 8×8 com led 3mm e pretendo usar shiftRegister 74hc595.
Boa noite. Por nada, Rafael! Gostei da ideia do shiftRegister, pois vai economizar bastante pino. Obrigado pelo comentário!
Fiz uma matriz de Leds colorido na mesma malha, só que alguns Leds interferem no funcionamento do outro.
Pode me dizer se tem alguma solução para isso?
Não entendi muito bem a sua ligação, mas, para evitar esta interferência, você pode ligar um LED e desliga-lo bem rapidamente e depois ligar outro LED que esteja na mesma malha por um período de tempo pequeno também. E você fica repetindo este processo rapidamente. Com isto, nosso olho não percebe esta variação e o nosso cérebro acaba pensando que os LEDs estão constantemente ligados. Não sei se deu pra entender.
Prezado, saudações.
Fantástica didática, era o que eu estava procurando, ligar leds com Arduino, no meu caso a matriz é de 19 linhas por 19 colunas (comprei os leds e a placa)
já deu uma luz legal em como vou fazer a minha tela, obrigado!
Olá, Luís. Muito bom ler seu comentário! Fico feliz em ajudar e obrigado pelo feedback. Boa sorte no seu projeto!