Esse é um dos Shields (escudo) com um maior número de funções, que eu já encontrei. Muito útil para quem tem dificuldade em fazer montagens de circuitos eletrônicos com Arduino, pois já vem com vários circuitos montados e deve ser encaixado por cima do Arduino Uno. Portanto a alimentação do circuito também já é realizada através dos pinos 5V e GND.
O Shield Multi-funções para Arduino tem um display de 7 segmentos (anodo comum) com 4 dígitos. Tem circuito com 4 leds, 4 botões, um Buzzer, um potenciômetro, 4 headers (conjunto de pinos) para controle PWM, e mais outros dois conjuntos de soquetes – um para sensores de temperatura e outro para APC220. Irei explicar o funcionamento e aplicação para cada um dos circuitos. O Botão de Reset serve para reiniciar o Arduino.
Foto Gustavo Murta
Vermelho – Display 7 segmentos com 4 dígitos
Cinza – Soquete APC220
Azul – Buzzer (campaínha)
Verde – 4 Leds indicadores
Marrom – Potenciômetro
Amarelo – Soquete para Sensores de Temperatura
Laranja – 4 botões
Rosa – Header PWM
Observação Importante : alguns pinos do display de 4 dígitos (na parte debaixo do shield) podem encostar no conector USB do Arduino Uno e fechar um curto-circuito. Sugiro que dobre o pino que encostar e isole com um pedaço de fita isolante por baixo do Shield.
Como não encontrei um diagrama bem feito na WEB, editei esse diagrama do Shield baseado nos que eu encontrei. Conferi todas as ligações e esta tudo correto. Abra a imagem em uma nova guia, para salvá-la em alta resolução.
Diagrama do Shield Multi-funções – editado por Gustavo Murta
O circuito do Display usa um módulo com 4 dígitos ( 7 segmentos – anodo comum). Os segmentos são ativados através da multiplexação realizada pelos dois chips de Registradores de deslocamento (Shift registers) 74HC595.
Os bits são recebidos serialmente através do pino 14 (SER) do Chip U2. A porta digital D8 do Arduino envia esses bits. O sincronismo dos bits é feito através do clock do pino 11 (SRCLK), pela porta D7. O pino 12 (RCLK) é usado para armazenar os bits nos registradores – pino digital D4 do Arduino. A sequência dos bits é enviada de um chip 74HC595 para o outro através do pino 9 do U2 – QH’ .
Para esse Shield Multi-funções existe uma Biblioteca que deve ser instalada na IDE do Arduino. Baixe-a no seu PC e faça a instalação adicionando a biblioteca Zipada.
– clique em Sketch, Incluir Biblioteca e depois adicionar biblioteca.ZIP.
Depois da instalação, recarregue a Arduino IDE, senão a biblioteca não ficará ativa.
Essa biblioteca foi baixada desse site :
Hackatronics -Multi-function-shield
Uma outra Biblioteca que será também necessária é a TimerOne. Mas essa poderá instalar de outro modo. Clique em :
Sketch > Incluir Biblioteca > Gerenciar Bibliotecas
Após abrir a janela do Gerenciador de Biblioteca, refine a busca digitando TimerOne. Na biblioteca TimerOne, clique em More Info e depois em Instalar. Após alguns segundos, ela será automaticamente instalada. Lembre-se que o seu computador precisa estar conectado na internet, para poder baixar a biblioteca. Após a instalação da Biblioteca, é necessário que feche e abra novamente o programa Arduino IDE.
Um exemplo bem interessante de Sketch para teste do display é esse, que foi copiado do mesmo site da Biblioteca Multi-funções.
/* Programa de teste do Display do Shield Multi-função Blog Eletrogate - https://blog.eletrogate.com/guia-completo-do-shield-multi-funcoes-para-arduino Arduino UNO - IDE 1.8.5 - Shield Multi-função para Arduino Gustavo Murta 13/junho/2018 Baseado em http://www.cohesivecomputing.co.uk/hackatronics/arduino-multi-function-shield/part-1/ */ #include <TimerOne.h> // Bibliotec TimerOne #include <Wire.h> // Biblioteca Wire #include <MultiFuncShield.h> // Biblioteca Multifunction shield void setup() { Timer1.initialize(); // inicializa o Timer 1 MFS.initialize(&Timer1); // initializa a biblioteca Multi função MFS.write("Hi"); // escreve no display Hi delay(2000); // atraso de 2 segundos MFS.write(-273); // escreve no display - 273 delay(2000); // atraso de 2 segundos MFS.write(3.141, 2); // escreve no display 3.141 delay(2000); // atraso de 2 segundos } int counter = 0; // incializa o conatdor byte ended = false; // define variavel ended void loop() { if (counter < 200) // se o contador for menor do que 200 { MFS.write((int)counter); // escreve no display a contagem counter++; // incrementa o contador } else if (!ended) // se aconatgem terminou { ended = true; MFS.write("End"); // escreve no display End MFS.blinkDisplay(DIGIT_ALL, ON); // pisca a ultima mensagem } delay(50); // atraso de 50 milisegundos }
O circuito dos botões , LEDs e buzzer são muito simples . No caso dos 4 LEDs , estão conectados nas portas digitais de saída D13, D12, D11 e D10. Resistores de 1K ohm limitam a corrente nos LEDs.
Esse é um programa para teste dos Leds. Veja que na Biblioteca Multifunção , existem comandos para ligar, apagar e piscar os LEDs. Facilitam bastante o controle dos LEDs.
/* Programa de teste dos LEDs do Shield Multi-função Blog Eletrogate - https://blog.eletrogate.com/guia-completo-do-shield-multi-funcoes-para-arduino Arduino UNO - IDE 1.8.5 - Shield Multi-função para Arduino Gustavo Murta 13/junho/2018 Baseado em http://www.cohesivecomputing.co.uk/hackatronics/arduino-multi-function-shield/part-1/ */ #include <TimerOne.h> // Bibliotec TimerOne #include <Wire.h> // Biblioteca Wire #include <MultiFuncShield.h> // Biblioteca Multifunction shield void setup() { Timer1.initialize(); // inicializa o Timer 1 MFS.initialize(&Timer1); // initializa a biblioteca Multi função } void loop() { MFS.writeLeds(LED_ALL, ON); // acende todos os LEDs delay(1000); // atraso de 1 segundo MFS.blinkLeds(LED_1, ON); // pisca LED 1 delay(1000); // atraso de 1 segundo MFS.blinkLeds(LED_2, ON); // pisca LED 2 delay(1000); // atraso de 1 segundo MFS.blinkLeds(LED_1 | LED_2, OFF); // apaga LED 1 e 2 MFS.blinkLeds(LED_3 | LED_4, ON); // pisca LED 3 e 4 delay(1000); // atraso de 1 segundo MFS.blinkLeds(LED_ALL, ON); // pisca todos os LEDs delay(1000); // atraso de 1 segundo MFS.blinkLeds(LED_ALL, OFF); // apaga o pisca dos LEDs MFS.writeLeds(LED_ALL, OFF); // apaga o acender dos LEDs delay(1000); // atraso de 1 segundo }
Esse é o circuito dos botões. Todos os botões tem resistores de Pullup de 10K , isto é, o nível de tensão nas portas será de 5V (HIGH). Quando o botão for acionado, o nível de tensão será zero (LOW). O botão de RESET serve para reiniciar o programa no Arduino. Os botões SW1 , SW2 e SW3 estão conectados nas portas analógicas de entrada A1, A2 e A3, respectivamente.
Esse é o programa de teste dos Botões. Veja que o programa detecta se o botão foi pressionado rapidamente ou demoradamente. E detecta também se um ou mais botões foram pressionados ao mesmo tempo.
/* Programa de teste dos Botões do Shield Multi-função Blog Eletrogate - https://blog.eletrogate.com/guia-completo-do-shield-multi-funcoes-para-arduino Arduino UNO - IDE 1.8.5 - Shield Multi-função para Arduino Gustavo Murta 13/junho/2018 Baseado em http://www.cohesivecomputing.co.uk/hackatronics/arduino-multi-function-shield/part-1/ */ #include <TimerOne.h> // Biblioteca TimerOne #include <Wire.h> // Biblioteca Wire #include <MultiFuncShield.h> // Biblioteca Multifunction shield void setup() { Serial.begin(9600); // monitor serial 9600 Bps Timer1.initialize(); // inicializa o Timer 1 MFS.initialize(&Timer1); // initializa a biblioteca Multi função Serial.println("Pressione um ou mais Botoes"); // imprime mensagem } void loop() { byte btn = MFS.getButton(); // lendo os botões if (btn) // se botão pressionado { byte buttonNumber = btn & B00111111; // comparando os bits das portas analógicas byte buttonAction = btn & B11000000; Serial.print("BOTAO_"); // imprime mensagem Serial.write(buttonNumber + '0'); // imprime número do botão Serial.print("_"); // imprime traço if (buttonAction == BUTTON_PRESSED_IND) // compara a ação do botão { Serial.println("PRESSIONADO"); // imprime mensagem } else if (buttonAction == BUTTON_SHORT_RELEASE_IND) // compara a ação do botão { Serial.println("SOLTA RAPIDO"); // imprime mensagem } else if (buttonAction == BUTTON_LONG_PRESSED_IND) // compara a ação do botão { Serial.println("PRESSIONADO LONGO"); // imprime mensagem } else if (buttonAction == BUTTON_LONG_RELEASE_IND) // compara a ação do botão { Serial.println("SOLTA LONGO"); // imprime mensagem } } }
O circuito do Buzzer (campainha) é controlado por um transistor, para não sobrecarregar a corrente na porta digital do Arduino. Se a porta D3 estiver em HIGH, o transistor não aciona o Buzzer. Mas se a porta estiver em LOW, a campainha toca.
Esse é um programa de teste do Buzzer . Toca um bip curto e depois de um segundo, toca 4 sequencias de bips por três vezes consecutivas. Programando a função MFS.beep, poderá criar inúmeras opções de bips. Bem legal.
/* Programa de teste do Buzzer do Shield Multi-função Blog Eletrogate - https://blog.eletrogate.com/guia-completo-do-shield-multi-funcoes-para-arduino Arduino UNO - IDE 1.8.5 - Shield Multi-função para Arduino Gustavo Murta 13/junho/2018 Baseado em http://www.cohesivecomputing.co.uk/hackatronics/arduino-multi-function-shield/part-1/ */ #include <TimerOne.h> // Bibliotec TimerOne #include <Wire.h> // Biblioteca Wire #include <MultiFuncShield.h> // Biblioteca Multifunction shield void setup() { Timer1.initialize(); // inicializa o Timer 1 MFS.initialize(&Timer1); // initializa a biblioteca Multi função Buzzer (); // toca a campainha } void Buzzer () { MFS.beep(); // Bip curto de 300 milisegundos delay(1000); // atraso de 1 segundo // 4 bips curtos , repetidos 3 vezes MFS.beep(5, // bip por 50 milisegundos 5, // silencio por 50 milisegundos 4, // repete o bip 4 vezes 3, // repete o loop 3 vezes 50 // aguarda 500 milisegundos entre os loops ); } void loop() { }
O pino central do Potenciômetro esta conectado na porta analógica A0 de entrada no Arduino. O capacitor de 0,1 micro Farads serve para limitar ruídos elétricos na leitura de tensão. A tensão no POT poderá variar entre +5V e 0V. Como o conversor ADC do Arduino tem 10 bits, os valores digitais serão de zero a 1023.
Esse é o programa de teste do Potenciômetro. O legal é que o valor digital correspondente à tensão, será mostrado no display de 4 dígitos ! Gire a cabeça do parafuso do POT com uma pequena chave de fenda e o valor mostrado será entre zero e 1023.
/* Programa de teste do POT do Shield Multi-função Blog Eletrogate - https://blog.eletrogate.com/guia-completo-do-shield-multi-funcoes-para-arduino Arduino UNO - IDE 1.8.5 - Shield Multi-função para Arduino Gustavo Murta 13/junho/2018 Baseado em http://www.cohesivecomputing.co.uk/hackatronics/arduino-multi-function-shield/part-1/ */ #include <TimerOne.h> // Bibliotec TimerOne #include <Wire.h> // Biblioteca Wire #include <MultiFuncShield.h> // Biblioteca Multifunction shield void setup() { Timer1.initialize(); // inicializa o Timer 1 MFS.initialize(&Timer1); // initializa a biblioteca Multi função } void loop() { MFS.write(analogRead(POT_PIN)); // le a tensão no Potenciometro // e mostra no display delay(100); // atraso de 100 milisegundos }
Esse é o diagrama do Header PWM – conjunto de pinos. Todos pinos da esquerda (3) estão conectados ao terra (GND). Os pinos centrais (2) estão conectados aos 5V. E os pinos da direita (1) estão conectados nas portas digitais de saídas D5, D6 e D9 (podem ser usadas com PWM) e na porta de entrada analógica A5. Não recomendo o uso direto dessas portas para controlar motor servo, pois poderão provocar excesso de corrente no regulador do Arduino. Se for usar servo motor, use uma fonte externa de 5V. Nessas portas poderá conectar uma grande variedade de dispositivos, desde que use cabos para conectá-los. Por exemplo, sensor infra-vermelho de presença, sensor Ultra-sônico, etc. Mas fique atento para o consumo de corrente – o regulador do Arduino suporta no máximo 1 ampere.
Como referência para estudos :
Sensor de presença com Arduíno
Sensor Ultra-sônico HC-SR04 com Arduino
Foto Gustavo Murta
Esse shield é bem versátil mesmo ! Dá para conectar facilmente um sensor de temperatura DS18B20. Um dos melhores sensores de temperatura do mercado, barato e bem preciso. Esse é o diagrama do soquete para sensores de temperatura. A parte chanfrada do DS18B20 deve estar virada para a frente. Mantenha o jumper J1 conectado.
Esse é o programa para uso do sensor DS18B20. A temperatura do sensor é medida e mostrada no display de 4 dígitos. O valor da temperatura tem uma casa decimal, mas se quiser, poderá ter até duas casas. Para funcionar, instale essas duas bibliotecas – OneWire e DallasTemperature , usando o procedimento descrito acima :
Sketch > Incluir Biblioteca > Gerenciar Bibliotecas
/* Programa de teste do DS18B20 no Shield Multi-função Blog Eletrogate - https://blog.eletrogate.com/guia-completo-do-shield-multi-funcoes-para-arduino Arduino UNO - IDE 1.8.5 - Shield Multi-função para Arduino Gustavo Murta 13/junho/2018 Não remova o jumper J1 e verifique como inserir o DS18B20 no soquete */ #include <MultiFuncShield.h> // Biblioteca Multifunction shield #include <OneWire.h> // Biblioteca OneWire #include <DallasTemperature.h> // Biblioteca do sensor DS18B20 #define ONE_WIRE_BUS A4 // pino de dados DS18B20 = A4 do Arduino OneWire oneWire(ONE_WIRE_BUS); // criando a instancia do sensor DallasTemperature sensors(&oneWire); void setup() { sensors.begin(); // inicializando o sensor MFS.initialize(&Timer1); // inicializa a biblioteca Multi função } void loop() { sensors.requestTemperatures(); // envia o camando para o sensor float tempCentigrade = sensors.getTempCByIndex(0); // lê a temperatura no DS18B20 MFS.write(tempCentigrade, 1); // mostra a temperatura no display(1 casa decimal) delay(200); // atraso de 200 milisegundos }
Sugestão para outras implementações com o termômetro digital – crie um termostato com alarme. Por exemplo, ao exceder uma determinada temperatura, acione o buzzer ou um relé (módulo relé) através da portas digitais do header PWM.
Uma outra aplicação bem interessante para o Shield, que eu encontrei no site da Hackatronics é do relógio Digital com alarme. A contagem do tempo é realizada através dos timers internos do Arduino, por isso, nem tão precisa. Se necessita de precisão no relógio, sugiro que use um módulo RTC DS3231. Nesse caso terá que fazer adaptações no programa.
Para acertar as horas, pressione o botão 1 até piscar as horas. Pressione o botão 3 para avançar as horas. Pressione novamente o botão 1 para acertar os minutos. Para avançar os minutos, pressione o botão 3. Após acerto do relógio, pressione novamente o botão 1.
Para acertar o alarme, pressione o botão 2 e botão 1 ao mesmo tempo. E repita o procedimento para acertar as horas e minutos. Para ativar ou desativar o alarme, pressione e segure o botão 3. Se alarme for ativado, o led 1 ficará aceso.
Esse é o programa do Relógio Digital , com comentários traduzidos por mim.
/* Programa Relógio Digital com alarme para Shield Multi-funções Blog Eletrogate - https://blog.eletrogate.com/guia-completo-do-shield-multi-funcoes-para-arduino Arduino UNO - IDE 1.8.5 - Shield Multi-funções para Arduino Gustavo Murta 14/junho/2018 */ #include <TimerOne.h> // Biblioteca TimerOne #include <Wire.h> // Biblioteca Wire #include <MultiFuncShield.h> // Biblioteca Multifunction shield volatile unsigned int clockMilliSeconds = 0; // variáveis do relógio volatile byte clockSeconds = 0; // segundos volatile byte clockMinutes = 0; // minutos volatile byte clockHours = 12; // horas volatile byte clockEnabled = 1; // relógio ativado byte alarmMinutes = 30; // alarm inicial 06:30 hs byte alarmHours = 6; volatile byte alarmEnabled = false; // alarme desligado byte alarmTogglePressed = false; enum displayModeValues // modos de amostragem do relógio { MODE_CLOCK_TIME, MODE_CLOCK_TIME_SET_HOUR, MODE_CLOCK_TIME_SET_MINUTE, MODE_ALARM_TIME, MODE_ALARM_TIME_SET_HOUR, MODE_ALARM_TIME_SET_MINUTE }; byte displayMode = MODE_CLOCK_TIME; // modo normal do relógio void setup() { Timer1.initialize(); // inicializa timer 1 MFS.userInterrupt = clockISR; // uso da interrupção para contagem de tempo MFS.initialize(&Timer1); // inicializa shield multi-funções MFS.blinkDisplay(DIGIT_ALL); // pisca os dígitos do display } void loop() { byte btn = MFS.getButton(); // verifica botão pressionado switch (displayMode) // seleciona o modo do relógio { case MODE_CLOCK_TIME: // modo normal displayTime(clockHours, clockMinutes); // mostra horas e minutos if (btn == BUTTON_2_PRESSED) // se o botão 2 foi pressionado { MFS.beep(0); // cancela o bip displayMode = MODE_ALARM_TIME; // seleciona o modo de alarme } else if (btn == BUTTON_1_LONG_PRESSED) // se o botão 1 também for pressionado longo { MFS.blinkDisplay(DIGIT_ALL, OFF); // para de piscar todos os dígitos MFS.blinkDisplay(DIGIT_1 | DIGIT_2); // pisca somente as horas displayMode = MODE_CLOCK_TIME_SET_HOUR; // seleciona modo de acerto de horas clockEnabled = false; // contagem de tempo parada clockMilliSeconds = 0; // zera os contadores de milisegundos clockSeconds = 0; // zera os segundos } else if (btn == BUTTON_3_LONG_PRESSED && !alarmTogglePressed) // se o botão 3 for pressionado { alarmTogglePressed = true; // liga o alarme alarmEnabled = !alarmEnabled; MFS.writeLeds(LED_1, alarmEnabled); // acende o Led 1 } else if (btn == BUTTON_3_LONG_RELEASE) // soltando o botão 3 { alarmTogglePressed = false; // alarme pressionado é falso } break; case MODE_CLOCK_TIME_SET_HOUR: // modo para acerto de horas if (btn == BUTTON_1_PRESSED) // se o botão 1 for pressionado { MFS.blinkDisplay(DIGIT_1 | DIGIT_2, OFF); // para de piscar as horas MFS.blinkDisplay(DIGIT_3 | DIGIT_4); // pisca os minutos displayMode = MODE_CLOCK_TIME_SET_MINUTE; // modo para acerto de minutos } else if (btn == BUTTON_3_PRESSED || btn == BUTTON_3_LONG_PRESSED) // se o botão 3 for pressionado { clockHours++; // incrementa as horas if (clockHours >= 24) // se for mais de 24 horas { clockHours = 0; // zera as horas } displayTime(clockHours, clockMinutes); // mostra horas e minutos } break; case MODE_CLOCK_TIME_SET_MINUTE: // modo para acerto de minutos if (btn == BUTTON_1_PRESSED) // se o botão 1 for pressionado { MFS.blinkDisplay(DIGIT_3 | DIGIT_4, OFF); // para de piscar os minutos displayMode = MODE_CLOCK_TIME; // modo normal clockEnabled = true; // contagem de tempo iniciada } else if (btn == BUTTON_3_PRESSED || btn == BUTTON_3_LONG_PRESSED) // se o botão 3 for pressionado { clockMinutes++; // incrementa os minutos if (clockMinutes >= 60) // se for mais de 60 minutos { clockMinutes = 0; // zera os minutos } displayTime(clockHours, clockMinutes); // mostra horas e minutos } break; case MODE_ALARM_TIME: // modo de acerto do alarme displayTime(alarmHours, alarmMinutes); // mostra horas e minutos do alarme if (btn == BUTTON_2_SHORT_RELEASE || btn == BUTTON_2_LONG_RELEASE) // se o botão 2 for pressionado { displayMode = MODE_CLOCK_TIME; // modo normal } else if (btn == BUTTON_1_LONG_PRESSED) // se o botão 1 for pressionado longo { MFS.blinkDisplay(DIGIT_ALL, OFF); // para de piscar todos os dígitos MFS.blinkDisplay(DIGIT_1 | DIGIT_2); // pisca somente as horas displayMode = MODE_ALARM_TIME_SET_HOUR; // modo acerto de horas do alarme alarmEnabled = false; // alarme desligado } break; case MODE_ALARM_TIME_SET_HOUR: // modo acerto de horas do alarme if (btn == BUTTON_1_PRESSED) // se o botão 1 for pressionado { MFS.blinkDisplay(DIGIT_1 | DIGIT_2, OFF); // para de piscar todos os dígitos MFS.blinkDisplay(DIGIT_3 | DIGIT_4); // pisca os minutos displayMode = MODE_ALARM_TIME_SET_MINUTE; // modo acerto dos minutos do alarme } else if (btn == BUTTON_3_PRESSED || btn == BUTTON_3_LONG_PRESSED) // se o botão 3 for pressionado { alarmHours++; // incrementa horas do alarme if (alarmHours >= 24) // se for mais de 24 horas { alarmHours = 0; // zera as horas } displayTime(alarmHours, alarmMinutes); // mostra horas e minutos do alarme } break; case MODE_ALARM_TIME_SET_MINUTE: // modo acerto dos minutos do alarme if (btn == BUTTON_1_PRESSED) // se o botão 1 for pressionado { MFS.blinkDisplay(DIGIT_3 | DIGIT_4, OFF); // para de piscar os minutos displayMode = MODE_CLOCK_TIME; // modo normal alarmEnabled = true; // alarme ligado MFS.writeLeds(LED_1, ON); // acende o Led 1 } else if (btn == BUTTON_3_PRESSED || btn == BUTTON_3_LONG_PRESSED) // se o botão 3 for pressionado { alarmMinutes++; // incrementa minutos do alarme if (alarmMinutes >= 60) // se for mais de 60 minutos { alarmMinutes = 0; // zera os minutos } displayTime(alarmHours, alarmMinutes); // mostra horas e minutos do alarme } break; } } void displayTime (byte hours, byte minutes) // mostra relógio { char time[5]; // vetor de 5 caracteres sprintf(time, "%03d", (hours * 100) + minutes); // mostra horas e minutos MFS.write(time, 1); } void clockISR () { // Procedimento de contagem de tempo if (clockEnabled) { clockMilliSeconds++; if (clockMilliSeconds >= 1000) { clockMilliSeconds = 0; clockSeconds++; if (clockSeconds >= 60) { clockSeconds = 0; clockMinutes++; if (clockMinutes >= 60) { clockMinutes = 0; clockHours++; if (clockHours >= 24) { clockHours = 0; } } // se o horario do relógio coincide com o alarme, dispara o bip if (alarmEnabled && (clockMinutes == alarmMinutes) && (clockHours == alarmHours)) { MFS.beep( 10, // 10 ms ON 5, // 5 ms OFF 4, // numero de repetições 100, // número de sequências 50 // atraso entre as sequências ); } } } } }
Na placa do Shield Multi-Funções tem mais um soquete na parte superior do lado esquerdo. Esta escrito na placa, o nome de alguns módulos que podem ser usados nesse soquete :
Esse é o diagrama do Soquete APC220 :
Na WEB , podemos encontrar outras aplicações interessantes para o Shield Multi-funções :
Hackatronics/arduino-multi-function-shield/Part 2
Hackatronics/arduino-multi-function-shield/Part 3
Hackatronics – Arduino Multi-function Shield
Conheça a Metodologia Eletrogate e ofereça aulas de robótica em sua escola!
|
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!