Sejam bem vindos, caríssimos leitores, o projeto aqui apresentado consiste em uma simulação do jogo Stacker e será executado em uma Matriz de led RGB Endereçável, gerenciada pelo Arduino. Ao término desse artigo, vocês estarão aptos a programar um led, uma matriz, ou mesmo um painel composto por várias matrizes de LED’s RGB ENDEREÇÁVEIS. A importância desse aprendizado está em nos proporcionar, além de gostosas horas de programação, suporte para exibir a figura, efeitos de luz ou mesmo uma mensagem passando nas suas matrizes.
Esse jogo é uma adaptação do jogo STACKER, que é uma máquina de prêmios que tem nos shoppings.
O intuito é ir empilhando os blocos que ficam em movimentos na tela até o topo, ganhando os prêmios conforme o máximo de blocos empilhados.
Também será necessário baixar a Biblioteca Adafruit_NeoPixel.h
O código pode ser baixado de nosso repositório no Github: https://github.com/eletrogate/SubindoALadeira
Para conseguirmos simular o jogo no Arduino, foi necessário primeiro entender como funciona uma Matriz de led RGB Endereçável. O led mais comum tem dois terminais, uma tensão de trabalho em torno de 2 a 3 Volts e ele liga na cor específica que foi projetado (verde, por exemplo). Podemos colocar ele em uma porta do Arduino e o ligar e desligar com uma programação simples, como o blink. O led endereçável tem, normalmente 4 terminais: +5 volts, GND, uma porta de entrada e uma porta de saída (para o próximo led em série). No encapsulamento dele, existe um micro processador, que entende a informação digital do Arduino. Um estudo mais aprofundado, pode ser visto no link a seguir: https://blog.eletrogate.com/leds-enderecaveis-conhecendo-o-ws2812b/. A vantagem principal de um led RGB endereçável, sobre um led comum, consiste no tipo de ligação dele, pois, no caso de precisarmos gerenciar 5 LED’s comuns, independentes um do outro, será necessário usar 5 portas do Arduino. Usando LED’s RGB Endereçáveis, só usamos uma porta do Arduino, indiferente da quantidade de LED’s que iremos usar, já que eles são ligados em série um como o outro. O comando básico da biblioteca Adafruit_NeoPixel é: pixels.setPixelColor (endereço, pixels.Color(0, 0, 0));
, que consiste no endereço do led na série, começando em 0 (zero), e indo até a quantidade de LED’s na sequência ( 0, 1, 2, 3, 4 …), e as cores que ele pode emitir (dentro dos parênteses).
Exemplo 1: pixels.setPixelColor (0, pixels.Color(255, 0, 0));
irá ligar o primeiro LED da sequência, na cor vermelha;
Exemplo 2: pixels.setPixelColor (5, pixels.Color(0, 255, 0));
irá ligar o quarto LED da sequência, na cor verde. Ficou estranho, certo? É que, como a contagem dos LED’s começam em 0 (zero), o número 5 dentro dos parênteses vale 5 – 1.
O comando pixels.clear();
apaga todos os LED’s acesos, enquanto que o comando pixels.show();
efetivamente liga os LED’s que foram programados. Nos exemplos acima, liga o led 0 (zero) e o led 4. Sem o comando final pixels.show(); os LED’s programados simplesmente não vão ligar.
Temos ainda um comando que é colocado a princípio no Setup do Arduino, que seta o brilho geral dos leds: pixels.setBrightness(50);
o número dentro dos parênteses vai de 1 à 255. Sendo 1, o brilho mínimo possível e 255 o brilho máximo de cada LED.
for (int inicio = 0; inicio <=3; inicio++) { for (int coluna = 0; coluna <= 5 ; coluna++) { pixels.setPixelColor(coluna-1, pixels.Color(0, 0, 0)); pixels.show(); dunilay(50); pixels.setPixelColor(coluna, pixels.Color(255, 0, 0)); pixels.setPixelColor(coluna+1, pixels.Color(0, 255, 0)); pixels.setPixelColor(coluna+2, pixels.Color(0, 0, 255)); pixels.show(); tone(buzzer, 600, 100); dunilay(50); } for (int coluna = 6; coluna >= 2 ; coluna--) { pixels.setPixelColor(coluna+1, pixels.Color(0, 0, 0)); pixels.show(); dunilay(50); pixels.setPixelColor(coluna, pixels.Color(255, 0, 0)); pixels.setPixelColor(coluna-2, pixels.Color(0, 255, 0)); pixels.setPixelColor(coluna-1, pixels.Color(0, 0, 255)); pixels.show(); tone(buzzer, 250, 100); dunilay(50); } } //////////////////////////////////////// // POSIÇÃO FINAL. // // GERAR NÚMERO ALEATÓRIO ENTRE 1 E 5 // // PARA POSICIONAR O GABARITO. // //////////////////////////////////////// for(int f = 0; f<=10; f++) { randNumber = random(1, 5); } pixels.clear(); gabarito = randNumber; pixels.setPixelColor(gabarito, pixels.Color(255, 0, 0)); pixels.setPixelColor(gabarito+1, pixels.Color(0, 255, 0)); pixels.setPixelColor(gabarito+2, pixels.Color(0, 0, 255)); pixels.show();
for(int f = 0; f<=10; f++) { randNumber = random(1, 4); } }
if (gabarito == 1 and linha == 1) { gabaritovermelho = 14; gabaritoverde = 13; gabaritoazul = 12; } if (gabarito == 1 and linha == 2) { gabaritovermelho = 17; gabaritoverde = 18; gabaritoazul = 19; } if (gabarito == 1 and linha == 3) { gabaritovermelho = 30; gabaritoverde = 29; gabaritoazul = 28; } if (gabarito == 1 and linha == 4) { gabaritovermelho = 33; gabaritoverde = 34; gabaritoazul = 35; } if (gabarito == 1 and linha == 5) { gabaritovermelho = 46; gabaritoverde = 45; gabaritoazul = 44; } if (gabarito == 1 and linha == 6) { gabaritovermelho = 49; gabaritoverde = 50; gabaritoazul = 51; } if (gabarito == 1 and linha == 7) { gabaritovermelho = 62; gabaritoverde = 61; gabaritoazul = 60; } ////////////////////////////// // GABARITO 2 // ////////////////////////////// if (gabarito == 2 and linha == 1) { gabaritovermelho = 13; gabaritoverde = 12; gabaritoazul = 11; } if (gabarito == 2 and linha == 2) { gabaritovermelho = 18; gabaritoverde = 19; gabaritoazul = 20; } if (gabarito == 2 and linha == 3) { gabaritovermelho = 29; gabaritoverde = 28; gabaritoazul = 27; } if (gabarito == 2 and linha == 4) { gabaritovermelho = 34; gabaritoverde = 35; gabaritoazul = 36; } if (gabarito == 2 and linha == 5) { gabaritovermelho = 45; gabaritoverde = 44; gabaritoazul = 43; } if (gabarito == 2 and linha == 6) { gabaritovermelho = 50; gabaritoverde = 51; gabaritoazul = 52; } if (gabarito == 2 and linha == 7) { gabaritovermelho = 61; gabaritoverde = 60; gabaritoazul = 59; } ////////////////////////////// // GABARITO 3 // ////////////////////////////// if (gabarito == 3 and linha == 1) { gabaritovermelho = 12; gabaritoverde = 11; gabaritoazul = 10; } if (gabarito == 3 and linha == 2) { gabaritovermelho = 19; gabaritoverde = 20; gabaritoazul = 21; } if (gabarito == 3 and linha == 3) { gabaritovermelho = 28; gabaritoverde = 27; gabaritoazul = 26; } if (gabarito == 3 and linha == 4) { gabaritovermelho = 35; gabaritoverde = 36; gabaritoazul = 37; } if (gabarito == 3 and linha == 5) { gabaritovermelho = 44; gabaritoverde = 43; gabaritoazul = 42; } if (gabarito == 3 and linha == 6) { gabaritovermelho = 51; gabaritoverde = 52; gabaritoazul = 53; } if (gabarito == 3 and linha == 7) { gabaritovermelho = 60; gabaritoverde = 59; gabaritoazul = 58; } ////////////////////////////// // GABARITO 4 // ////////////////////////////// if (gabarito == 4 and linha == 1) { gabaritovermelho = 11; gabaritoverde = 10; gabaritoazul = 9; } if (gabarito == 4 and linha == 2) { gabaritovermelho = 20; gabaritoverde = 21; gabaritoazul = 22; } if (gabarito == 4 and linha == 3) { gabaritovermelho = 27; gabaritoverde = 26; gabaritoazul = 25; } if (gabarito == 4 and linha == 4) { gabaritovermelho = 36; gabaritoverde = 37; gabaritoazul = 38; } if (gabarito == 4 and linha == 5) { gabaritovermelho = 43; gabaritoverde = 42; gabaritoazul = 41; } if (gabarito == 4 and linha == 6) { gabaritovermelho = 52; gabaritoverde = 53; gabaritoazul = 54; } if (gabarito == 4 and linha == 7) { gabaritovermelho = 59; gabaritoverde = 58; gabaritoazul = 57; }
if (estadoBotao == LOW and Cor == 1 and posicaoatual <= 63) ////////// LED VERMELHO { tone(buzzer, 250, 100); if (posicaoatual == gabaritovermelho) { pontos = pontos + 1; for (int vm = 0; vm <= 20; vm++) { tone(buzzer, 250, 100); pixels.setPixelColor(posicaoatual, pixels.Color(0, 0, 0)); pixels.show(); dunilay(50); pixels.setPixelColor(posicaoatual, pixels.Color(255, 0, 0)); pixels.show(); dunilay(50); } } else {pontos = pontos - 1;} novalinha = novalinha + 8; posicaoatual = novalinha; estadoBotao = 1; tempo = tempo - 30; tentativas = tentativas + 1; linha = linha + 1; dunilay (1000); } if (estadoBotao == LOW and Cor == 2 and posicaoatual <= 63) ///////LED VERDE { tone(buzzer, 250, 100); if (posicaoatual == gabaritoverde) { pontos = pontos + 1; for (int vd = 0; vd <= 20; vd++) { tone(buzzer, 250, 100); pixels.setPixelColor(posicaoatual, pixels.Color(0, 0, 0)); pixels.show(); dunilay(50); pixels.setPixelColor(posicaoatual, pixels.Color(0, 255, 0)); pixels.show(); dunilay(50); } } else {pontos = pontos -1;} novalinha = novalinha + 8; posicaoatual = novalinha; estadoBotao = 1; tempo = tempo - 30; tentativas = tentativas + 1; linha = linha + 1; dunilay (1000); } if (estadoBotao == LOW and Cor == 3 and posicaoatual <= 63) ////////AZUL { tone(buzzer, 250, 100); if (posicaoatual == gabaritoazul) { pontos = pontos + 1; for (int az = 0; az <= 20; az++) { tone(buzzer, 250, 100); pixels.setPixelColor(posicaoatual, pixels.Color(0, 0, 0)); pixels.show(); dunilay(50); pixels.setPixelColor(posicaoatual, pixels.Color(0, 0, 255)); pixels.show(); dunilay(50); } } else {pontos = pontos -1;} novalinha = novalinha + 8; posicaoatual = novalinha; estadoBotao = 1; tempo = tempo - 30; tentativas = tentativas + 1; linha = linha + 1; dunilay (1000); }
if (tentativas == 7) // tentativas máxima de pontuar { if (pontos <= 0 or pontos == 1) { pixels.clear(); pixels.setBrightness(155); //modificar o brilho dos leds for(int f = 0; f<=10; f++) { pixels.setPixelColor(0, pixels.Color(255, 0, 0)); pixels.setPixelColor(7, pixels.Color(255, 0, 0)); pixels.setPixelColor(9, pixels.Color(255, 0, 0)); pixels.setPixelColor(14, pixels.Color(255, 0, 0)); pixels.setPixelColor(18, pixels.Color(255, 0, 0)); pixels.setPixelColor(21, pixels.Color(255, 0, 0)); pixels.setPixelColor(27, pixels.Color(255, 0, 0)); pixels.setPixelColor(28, pixels.Color(255, 0, 0)); pixels.setPixelColor(35, pixels.Color(255, 0, 0)); pixels.setPixelColor(36, pixels.Color(255, 0, 0)); pixels.setPixelColor(42, pixels.Color(255, 0, 0)); pixels.setPixelColor(45, pixels.Color(255, 0, 0)); pixels.setPixelColor(49, pixels.Color(255, 0, 0)); pixels.setPixelColor(54, pixels.Color(255, 0, 0)); pixels.setPixelColor(56, pixels.Color(255, 0, 0)); pixels.setPixelColor(63, pixels.Color(255, 0, 0)); pixels.show(); dunilay (200); pixels.setPixelColor(0, pixels.Color(0, 0, 0)); pixels.setPixelColor(7, pixels.Color(0, 0, 0)); pixels.setPixelColor(9, pixels.Color(0, 0, 0)); pixels.setPixelColor(14, pixels.Color(0, 0, 0)); pixels.setPixelColor(18, pixels.Color(0, 0, 0)); pixels.setPixelColor(21, pixels.Color(0, 0, 0)); pixels.setPixelColor(27, pixels.Color(0, 0, 0)); pixels.setPixelColor(28, pixels.Color(0, 0, 0)); pixels.setPixelColor(35, pixels.Color(0, 0, 0)); pixels.setPixelColor(36, pixels.Color(0, 0, 0)); pixels.setPixelColor(42, pixels.Color(0, 0, 0)); pixels.setPixelColor(45, pixels.Color(0, 0, 0)); pixels.setPixelColor(49, pixels.Color(0, 0, 0)); pixels.setPixelColor(54, pixels.Color(0, 0, 0)); pixels.setPixelColor(56, pixels.Color(0, 0, 0)); pixels.setPixelColor(63, pixels.Color(0, 0, 0)); pixels.show(); dunilay (200); } } /// Gera o valor dos pontos pra exibir na Matriz de leds /// if (pontos == 2) { pixels.clear(); pixels.setBrightness(155); //modificar o brilho dos leds pixels.setPixelColor(1, pixels.Color(0, 255, 0)); pixels.setPixelColor(2, pixels.Color(0, 255, 0)); pixels.setPixelColor(3, pixels.Color(0, 255, 0)); pixels.setPixelColor(4, pixels.Color(0, 255, 0)); pixels.setPixelColor(5, pixels.Color(0, 255, 0)); pixels.setPixelColor(14, pixels.Color(0, 255, 0)); pixels.setPixelColor(18, pixels.Color(0, 255, 0)); pixels.setPixelColor(28, pixels.Color(0, 255, 0)); pixels.setPixelColor(36, pixels.Color(0, 255, 0)); pixels.setPixelColor(42, pixels.Color(0, 255, 0)); pixels.setPixelColor(42, pixels.Color(0, 255, 0)); pixels.setPixelColor(49, pixels.Color(0, 255, 0)); pixels.setPixelColor(53, pixels.Color(0, 255, 0)); pixels.setPixelColor(59, pixels.Color(0, 255, 0)); pixels.setPixelColor(60, pixels.Color(0, 255, 0)); pixels.setPixelColor(61, pixels.Color(0, 255, 0)); pixels.show(); } if (pontos == 3) { pixels.clear(); pixels.setBrightness(155); //modificar o brilho dos leds pixels.setPixelColor(2, pixels.Color(0, 0, 255)); pixels.setPixelColor(3, pixels.Color(0, 0, 255)); pixels.setPixelColor(4, pixels.Color(0, 0, 255)); pixels.setPixelColor(10, pixels.Color(0, 0, 255)); pixels.setPixelColor(14, pixels.Color(0, 0, 255)); pixels.setPixelColor(21, pixels.Color(0, 0, 255)); pixels.setPixelColor(27, pixels.Color(0, 0, 255)); pixels.setPixelColor(28, pixels.Color(0, 0, 255)); pixels.setPixelColor(35, pixels.Color(0, 0, 255)); pixels.setPixelColor(36, pixels.Color(0, 0, 255)); pixels.setPixelColor(42, pixels.Color(0, 0, 255)); pixels.setPixelColor(49, pixels.Color(0, 0, 255)); pixels.setPixelColor(53, pixels.Color(0, 0, 255)); pixels.setPixelColor(59, pixels.Color(0, 0, 255)); pixels.setPixelColor(60, pixels.Color(0, 0, 255)); pixels.setPixelColor(61, pixels.Color(0, 0, 255)); pixels.show(); } if (pontos == 4) { pixels.clear(); pixels.setBrightness(155); //modificar o brilho dos leds pixels.setPixelColor(4, pixels.Color(0, 0, 255)); pixels.setPixelColor(11, pixels.Color(0, 0, 255)); pixels.setPixelColor(4, pixels.Color(0, 0, 255)); pixels.setPixelColor(20, pixels.Color(0, 0, 255)); pixels.setPixelColor(27, pixels.Color(0, 0, 255)); pixels.setPixelColor(33, pixels.Color(0, 0, 255)); pixels.setPixelColor(34, pixels.Color(0, 0, 255)); pixels.setPixelColor(35, pixels.Color(0, 0, 255)); pixels.setPixelColor(36, pixels.Color(0, 0, 255)); pixels.setPixelColor(43, pixels.Color(0, 0, 255)); pixels.setPixelColor(46, pixels.Color(0, 0, 255)); pixels.setPixelColor(49, pixels.Color(0, 0, 255)); pixels.setPixelColor(53, pixels.Color(0, 0, 255)); pixels.setPixelColor(59, pixels.Color(0, 0, 255)); pixels.setPixelColor(62, pixels.Color(0, 0, 255)); pixels.show(); } if (pontos == 5) { pixels.clear(); pixels.setBrightness(155); //modificar o brilho dos leds pixels.setPixelColor(2, pixels.Color(0, 0, 255)); pixels.setPixelColor(3, pixels.Color(0, 0, 255)); pixels.setPixelColor(4, pixels.Color(0, 0, 255)); pixels.setPixelColor(10, pixels.Color(0, 0, 255)); pixels.setPixelColor(14, pixels.Color(0, 0, 255)); pixels.setPixelColor(21, pixels.Color(0, 0, 255)); pixels.setPixelColor(26, pixels.Color(0, 0, 255)); pixels.setPixelColor(33, pixels.Color(0, 0, 255)); pixels.setPixelColor(34, pixels.Color(0, 0, 255)); pixels.setPixelColor(35, pixels.Color(0, 0, 255)); pixels.setPixelColor(36, pixels.Color(0, 0, 255)); pixels.setPixelColor(46, pixels.Color(0, 0, 255)); pixels.setPixelColor(49, pixels.Color(0, 0, 255)); pixels.setPixelColor(59, pixels.Color(0, 0, 255)); pixels.setPixelColor(60, pixels.Color(0, 0, 255)); pixels.setPixelColor(61, pixels.Color(0, 0, 255)); pixels.setPixelColor(62, pixels.Color(0, 0, 255)); pixels.show(); } if (pontos == 6) { pixels.clear(); pixels.setBrightness(155); //modificar o brilho dos leds pixels.setPixelColor(2, pixels.Color(0, 255, 0)); pixels.setPixelColor(3, pixels.Color(0, 255, 0)); pixels.setPixelColor(4, pixels.Color(0, 255, 0)); pixels.setPixelColor(10, pixels.Color(0, 255, 0)); pixels.setPixelColor(14, pixels.Color(0, 255, 0)); pixels.setPixelColor(17, pixels.Color(0, 255, 0)); pixels.setPixelColor(21, pixels.Color(0, 255, 0)); pixels.setPixelColor(33, pixels.Color(0, 255, 0)); pixels.setPixelColor(26, pixels.Color(0, 255, 0)); pixels.setPixelColor(29, pixels.Color(0, 255, 0)); pixels.setPixelColor(30, pixels.Color(0, 255, 0)); pixels.setPixelColor(33, pixels.Color(0, 255, 0)); pixels.setPixelColor(35, pixels.Color(0, 255, 0)); pixels.setPixelColor(36, pixels.Color(0, 255, 0)); pixels.setPixelColor(46, pixels.Color(0, 255, 0)); pixels.setPixelColor(49, pixels.Color(0, 255, 0)); pixels.setPixelColor(53, pixels.Color(0, 255, 0)); pixels.setPixelColor(59, pixels.Color(0, 255, 0)); pixels.setPixelColor(60, pixels.Color(0, 255, 0)); pixels.setPixelColor(61, pixels.Color(0, 255, 0)); pixels.show(); } if (pontos == 7) /// Simula uma explosão de fogos - DEVO MELHORAR { pixels.clear(); pixels.setBrightness(155); //modificar o brilho dos leds pixels.setPixelColor(5, pixels.Color(0, 255, 0)); pixels.show(); tone(buzzer, 250, 10); dunilay(100); pixels.setPixelColor(5, pixels.Color(0, 0, 0)); pixels.show(); tone(buzzer, 250, 10); dunilay(100); pixels.setPixelColor(10, pixels.Color(0, 255, 0)); pixels.show(); tone(buzzer, 250, 10); dunilay(100); pixels.setPixelColor(10, pixels.Color(0, 0, 0)); pixels.show(); tone(buzzer, 250, 10); dunilay(100); pixels.setPixelColor(21, pixels.Color(0, 255, 0)); pixels.show(); tone(buzzer, 210, 10); dunilay(100); pixels.setPixelColor(21, pixels.Color(0, 0, 0)); pixels.show(); tone(buzzer, 255, 10); dunilay(100); pixels.setPixelColor(27, pixels.Color(0, 255, 0)); pixels.show(); tone(buzzer, 250, 10); dunilay(100); pixels.setPixelColor(27, pixels.Color(0, 0, 0)); pixels.show(); tone(buzzer, 220, 10); dunilay(100); pixels.setPixelColor(36, pixels.Color(0, 255, 0)); pixels.show(); tone(buzzer, 230, 10); dunilay(100); pixels.setPixelColor(36, pixels.Color(0, 0, 0)); pixels.show(); tone(buzzer, 250, 10); dunilay(100); pixels.setPixelColor(44, pixels.Color(0, 255, 0)); pixels.show(); tone(buzzer, 100, 10); dunilay(100); pixels.setPixelColor(44, pixels.Color(0, 0, 0)); pixels.show(); tone(buzzer, 50, 10); dunilay(100); for(int f = 0; f<=20; f++) { pixels.setPixelColor(50, pixels.Color(255, 255, 255)); pixels.show(); tone(buzzer, 250, 10); dunilay(100); pixels.setPixelColor(50, pixels.Color(0, 0, 0)); pixels.show(); tone(buzzer, 200, 10); dunilay(100); } for(int f = 0; f<=50; f++) { pixels.setPixelColor(63, pixels.Color(255, 255, 0)); pixels.setPixelColor(59, pixels.Color(0, 255, 255)); pixels.setPixelColor(33, pixels.Color(150, 255, 30)); pixels.setPixelColor(46, pixels.Color(0, 255, 0)); pixels.setPixelColor(52, pixels.Color(0, 255, 0)); pixels.setPixelColor(29, pixels.Color(0, 0, 255)); pixels.show(); tone(buzzer, 150, 10); dunilay(30); pixels.setPixelColor(63, pixels.Color(0, 0, 0)); pixels.setPixelColor(59, pixels.Color(0, 0, 0)); pixels.setPixelColor(33, pixels.Color(0, 0, 0)); pixels.setPixelColor(46, pixels.Color(0, 0, 0)); pixels.setPixelColor(52, pixels.Color(0, 0, 0)); pixels.setPixelColor(29, pixels.Color(0, 0, 0)); pixels.show(); tone(buzzer, 25, 10); dunilay(30); } }
dunilay(5000); //Aguarda 5 segundos tentativas = 0; // Zera as tentativas funcao_Reset(); // Reinicia o Jogo
“Façam suas apostas para ver quem faz mais pontos”. A propósito, parece fácil no começo, mas, a cada botão acionado, o LED que se movimenta sobe uma linha e acelera a troca de coluna. Boa Sorte e divirtam-se!
Acredito que, após esse post, os leitores consigam exibir figuras, efeitos visuais, e até projetar jogos ou avisos numa ou mais Matrizes de led RGB Endereçáveis, ligadas em série. Espero, ainda, que tenha conseguido passar com clareza a maneira de gerenciar cada LED da matriz conforme a cor, brilho e posição do led. A vantagem principal do uso da Matriz de led RGB Endereçável WS2812B no Arduino, ou em outra placa controladora, é ela usar somente uma porta digital, liberando as outras para outros fins em um projeto mais audacioso. No nosso caso, poderia acionar um solenoide com outra porta e “liberar” o prêmio conforme é a máquina original Stacker. Lanço um desafio para os colegas leitores: “enxuguem” a programação e coloquem, por exemplo, um menu de níveis do jogo, para torná-lo mais ou menos difícil.
Agradeço pela paciência de minha esposa Rejane, que além de “alcançar” aquele cafezinho, deu algumas dicas do resultado final.
Agradecimentos também a meu colega Lucas Brandão, que meu deu o motivo do projeto.
|
A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.
Conheça a Metodologia Eletrogate e Lecione um Curso de Robótica nas Escolas da sua Região!