Use a tecnologia da biometria para proteger seus projetos – este Sensor Óptico de Impressão Digital ( DY-50) tornará a adição e detecção de impressões digitais muito simples. Esses módulos são geralmente usados em cofres. Existe um Chip DSP ( Processador de Sinal Digital) de alta potência que pode renderizar, calcular, localizar e pesquisar imagens. Conecte-se a qualquer microcontrolador ou sistema TTL Serial e envie pacotes de dados para tirar fotos, detectar conteúdo de impressão, hash , pesquisa entre outros. E no caso do sensor óptico, você pode registrar novos “dedos ” diretamente já que esses sensores suportam em média até 162 impressões digitais armazenadas na memória flash integrada.Falaremos mais a seguir.
Se você teve interesse neste leitor biométrico, mas ainda não tem os conhecimentos de sua funcionalidade, ou não entende os diagramas eletrônicos dele, chegou a hora de aprender!
– Modelo: DY50;
– Tensão de alimentação DC: 3,6 a 6V;
– Corrente de operação: <120mA;
– Corrente de pico máx: 150mA;
– Tempo de impressão digital de imagem: <1,0 segundo;
– Capacidade de armazenamento on-board: 162 digitais;
– Nível de segurança configurável: 1-baixo, 3-médio, 5-alto;
– Taxa de aceitação falsa: <0,001% (nível de segurança 3);
– Taxa de rejeição falsa: <1,0% (nível de segurança 3);
– Interface: UART (Serial TTL);
– Taxa de transmissão: 9600, 19200, 28800, 38400, 57600 (o padrão é 57600);
– Temperatura de operação: -20ºC a +50ºC;
– Umidade de trabalho: <85%;
– Comprimento do cabo: 150mm;
– Área da janela de leitura: 14x18mm;
– Dimensões totais: 55x 21x21mm;
– Peso: 20g.
Existem resumidamente alguns requisitos para o uso do leitor biométrico. Primeiro, você precisa registrar sua impressão digital, isso significa definir números de identificação a cada impressão, para que você possa acessá-las mais tarde. Depois de registrar todas as impressões, podemos “procurar” facilmente o sensor exigindo que ele reconheça o ID que está sendo gravado no momento. E hoje ensinaremos um de seus modos de aplicação !
Como o fio do sensor é muito fino, usualmente descascamos um pouco o fio e o soldamos em um outro jumper para fazermos as conexões, já que assim evitamos mal contato, tornamos o projeto mais profissional e também fica mais firme. Depois de conectado, você pode ver um LED piscando, isso significa que o sensor está funcionando. O nosso sensor possui 6 fios, mas é necessário apenas 4 desses para que ele ligue e funcione perfeitamente! Se o seu sensor tiver todos os fios da mesma cor, o primeiro fio (da esquerda à direita) é o nosso GND, depois os dois pinos de dados ( Rx, Tx) e, em seguida, nosso Vcc. Caso os fios sejam de cores distintas, falaremos a seguir de como diferenciá-los e para que servem!
Vcc(fio vermelho): Deve ser alimentado pelo arduino de acordo com a tensão especificada ( 3,6V – 6V ).
GND (fio preto): Este fio deve ser conectado ao GND do arduino para que ele esteja integrado ao circuito.
RX (fio branco): O fio de recepção ( Rx) deverá ser ligado à uma porta digital do arduino que será programada posteriormente.
TX (fio verde): O fio de trasmissão também deverá ser ligado à uma porta digital do arduino.
Um aspecto interessante do sensor biométrico DY-50 é que não é necessário que o Arduino faça tratamento de imagem, toda a parte de identificação e detecção das digitais é feita pelo próprio sensor. A comunicação estabelecida entre o sensor e o Arduino é uma comunicação serial. A comunicação serial – especificamente neste caso também conhecida como UART (Serial TTL) é um elemento poderoso, que permite a comunicação entre a placa de desenvolvimento ( Arduino ) e o computador ou entre a placa de desenvolvimento e outros dispositivos (como módulos GPS, GSM e em nosso projeto o Sensor Óptico de Impressão Digital). É desta forma que o código é carregado para o nosso Arduino. Uma das vantagens da UART é a simplicidade do protocolo, e também o fato de ser Full-Duplex. O pino de transmissão (Tx) do protocolo envia um pacote de dados, que será interpretado pouco a pouco pelo pino receptor. Cada pacote de dados enviado contém 1 bit de início, indicando o início da mensagem, 1 ou 2 bits de parada, indicando o final da mensagem, 5 a 9 bits de informação e 1 bit de paridade para evitar o recebimento de erros. Por ser uma conexão assíncrona, ela não requer um sinal de clock, portanto requer menos fios. No entanto, o envio de dados é mais complicado e propenso a erros, portanto, alguns parâmetros são necessários para garantir uma transmissão sem erros. Um parâmetro muito óbvio na comunicação assíncrona é a taxa de transmissão, que especifica a velocidade de recebimento e envio, portanto, é muito importante que os dois dispositivos usem a mesma taxa.
Conexão: Comunicação Assíncrona, a comunicação é realizada através de dois pinos Rx / Tx, que dependem da taxa de transmissão como referência, como mencionado acima.
Dentre as várias placas disponíveis no mercado, temos diversas configurações possíveis e combinações quem podem ser feitas para essa estabelecer essa comunicação. O Arduino UNO, por exemplo, possui um canal de comunicação de hardware e este canal fica conectado aos pinos digitais Rx e Tx ( Os pinos 0 e 1 do Arduino UNO). Esses pinos, por sua vez, são conectados ao microcontrolador ATMEGA16U2 que serve para converter sinais de comunicação USB com o próprio computador.
É possível assim, atraves do Monitor Serial fazermos essa leitura direta entre o sensor e o Arduino, não necessariamente precisando de algum softaware para isso. É admitido outras formas de interação com essa comunicação, por exemplo, os próprios softwares, ou displays devices.
Ficou com alguma dúvida, ou deseja aprender mais sobre o protocolo de comunicação? Clique nesse link para ver a matéria completa.
Estudamos e entendemos melhor através da descrição acima ,sobre a parte técnica do nosso sensor. Compreendemos também as suas especificações, portanto agora vamos aprender na prática uma de suas aplicabilidades, desenvolvendo um Sistema de Segurança utilizando uma trava elétrica, que é controlada remotamente pela digital do usuário! Continue conosco para aprender como desenvolver este projeto.
O primeiro passo para montarmos, é entender o circuito apresentado a seguir. Portanto, preste bastante atenção na ligação dos jumpers e em como serão dispostos os fios. Logo abaixo apresentaremos o passo-a-passo de como ser montado. Observe:
O primeiro passo é pegarmos o sensor e como dito anterioremente na parte dos pinos, retirar o conector original em um dos lados e unir os fios a jumpers ou conectores que facilitem o contato com o arduino. Dica: Solde jumpers no lugar dos fios e prenda-os com algum material isolante ( fitas adesivas). Lembre se que apenas 4 fios são usados, portanto isole os outros dois que sobraram.
Após este processo, interligue os novos pinos no Arduino/protoboard, como feito em nosso diagrama esquemático. Os fios do Rx e Tx serão ligados respectivamente aos pinos digitais 7,6 do arduino.
O segundo passo é colocar o PushButton que funcionará como segurança para gerenciamos e defnirmos quem será o administrador do sistema. Portanto, em projetos reais pode ser substituido por alguma fechadura para que apenas quem possui a chave poderá substituir e gerenciar quem será o administrador do projeto. Lembre-se: Alguns botões necessitam obrigatoriamente de resistor, então fique atento às especificações de seu botão. Em nosso projeto colocaremos um terminal do botão no pino digital 5 do Arduino e o outro ligado ao GND.
O terceiro passo é inteligarmos o Relé, a Trava Solenoide FEC-91 e a nossa Fonte DC 12V. Fique bastante atento à esta parte do projeto, pois se tiver mal contato a trava não funcionará corretamente. O positivo da Fonte irá diretamente ao conector positivo da Trava solenoide. O negativo da fonte irá ao borne COMUM do relé e o negativo da Trava irá ao pino NORMAL ABERTO do relé. Dessa forma, o relé funciona como chave que só permitirá que o circuito feche quando ele for ativado pelo comando do Arduino.
Após conectarmos os pinos nos bornes, temos que alimentar o Relé com os 5V do Arduino e interligar o GND. O pino de sinal (1)do Relé será ligado ao pino digital 8 do Arduino.
Ficou com dúvida em relação ao funcionamento do Relé e suas portas ? Clique neste link para um tutorial completo sobre os relés
O 4º passo é ligarmos o Liquid Crystal Display (LCD) ao nosso circuito. O nosso módulo I2C deverá estar conectador ao LCD e montaremos da seguinte forma: Alimentaremos o módulo com as entradas do Arduino, e a conexão SDA (Serial Data) será ligada ao pino ANALÓGICO A4 e nossa conexão SCL ( Serial Clock) será ligada ao pino ANALÓGICO A5 .
Ficou com dúvida em relação as portas SDA e SCL do LCD ? Clique neste link para um tutorial completo sobre os LCD’s!
Pronto ! Terminamos a parte física do projeto e agora será necessário programar nosso Arduino.
Antes de começarmos, será necessário baixar algumas bibliotecas para utilizarmos o sensor, o LCD_Módulo I2C e caso utilize o botão, uma biblioteca para eliminar o efeito boucing . Clique nos links abaixo para baixar as bibliotecas:
Adafruit_Fingerprint_Sensor_Library
Liquid_Crystal_Display_I2C_Library
Baixe os arquivos para seu computador e abra a pasta compactada
Clique na opção “extrair para” e adicione à pasta Libraries no arquivo da IDE do Arduino.
Pronto! Repita o processo para a biblioteca LIQUIDCRYSTAL_I2C e a biblioteca PUSHBUTTON e então continue .
Arduino: Será responsável por comandar os processos e será programado para executar todas as etapas do sistema.
Sensor Biométrico: Será responsável por ler, identificar, codificar e gravar as digitais recebidas e inseridas.
Botão: Definirá e registrará o “Dedo Administrador” , após este processo, toda vez que o Administrador inserir o dedo . O sensor entra em modo de gravação e poderá ser adicionado novas digitais que permitirão a abertura de nossa trava.
Relé: Controlará o estado da trava solenoide, habilitando sua abertura ou o seu trancamento.
LCD: Display responsável por comunicar ao usuários as etapas que estão sendo realizadas, assim o usuário saberá exatamente o que fazer e o está sendo pedido.
// INCLUSÃO DAS BIBLIOTECAS BAIXADAS! #include <Adafruit_Fingerprint.h> #include <SoftwareSerial.h> #include <PushButton.h> #include <LiquidCrystal_I2C.h> #include <Wire.h> //Inicializando o display no endereço 0x27 LiquidCrystal_I2C lcd(0x27,20,4); // Configura endereço I2C e display com 20 caracteres e 4 linhas // PINAGENS DO PROJETO #define button 5 #define trava 8 // INSTANCIANDO OBJETOS SoftwareSerial mySerial(7, 6); // mySerial( Rx, Tx) <-- Pinagens do Sensor; Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); PushButton botao(button); // DECLARAÇÃO DAS VARIÁVEIS E FUNCOES uint8_t numID = 1; bool gravar=false; uint8_t modoGravacaoID(uint8_t IDgravar); void setup() { lcd.begin(16,2); lcd.noCursor(); pinMode(trava, OUTPUT); digitalWrite(trava, HIGH); //Serial.begin(9600); finger.begin(57600); if(finger.verifyPassword()){ lcd.print("DY-50 encontrado!"); delay(1000); } else { lcd.autoscroll(); lcd.print("DY-50 não encontrado"); delay(3000); lcd.clear(); while(true) { delay(1); } } lcd.print("sensor Carregado"); delay(900); lcd.clear(); lcd.print(" Aguardando"); lcd.setCursor(1,1); lcd.print(" entrada"); } void loop() { botao.button_loop(); if ( botao.pressed() ){ gravar = true; } if(gravar){ modoGravacaoID(0); gravar = false; } getFingerprintIDez(); } uint8_t modoGravacaoID(uint8_t IDgravar) { int p = -1; lcd.print("Registre o ADM #"); lcd.print(IDgravar); delay(2000); lcd.clear(); while (p != FINGERPRINT_OK) { p = finger.getImage(); switch (p) { case FINGERPRINT_OK: lcd.clear(); lcd.print(" concluído"); break; case FINGERPRINT_NOFINGER: lcd.print("."); delay(200); break; case FINGERPRINT_PACKETRECIEVEERR: lcd.clear(); lcd.print("Erro"); break; case FINGERPRINT_IMAGEFAIL: lcd.print("Erro leitura"); break; default: lcd.print("ERROR"); break; } } // Se não entrou em algum dos erros, todos os processos estão OK ! p = finger.image2Tz(1); switch (p) { case FINGERPRINT_OK: lcd.print("Leitura convertida"); break; case FINGERPRINT_IMAGEMESS: lcd.print("tente novamente "); return p; case FINGERPRINT_PACKETRECIEVEERR: lcd.print("ERROR"); return p; case FINGERPRINT_FEATUREFAIL: lcd.print("Endereço invalido"); return p; case FINGERPRINT_INVALIDIMAGE: lcd.print("Imagem invalida"); return p; default: lcd.print("ERRO"); return p; } lcd.clear(); lcd.print("Retire o Dedo"); delay(2000); lcd.clear(); p = 0; while (p != FINGERPRINT_NOFINGER) { p = finger.getImage(); } lcd.print("ID "); lcd.print(IDgravar); p = -1; lcd.print(" Insira o dedo "); lcd.setCursor(1,1); lcd.print(" novamente"); while (p != FINGERPRINT_OK) { p = finger.getImage(); switch (p) { case FINGERPRINT_OK: lcd.print("Concluido ! "); break; case FINGERPRINT_NOFINGER: lcd.print("."); delay(200); break; case FINGERPRINT_PACKETRECIEVEERR: lcd.print("Erro no pacote"); break; case FINGERPRINT_IMAGEFAIL: lcd.print("Erro na imagem"); break; default: lcd.print("Erro "); break; } } // Se não entrou em algum dos erros, o primeiro processo está OK ! p = finger.image2Tz(2); switch (p) { case FINGERPRINT_OK: lcd.print("Leitura convertida"); break; case FINGERPRINT_IMAGEMESS: lcd.print("Má leitura"); return p; case FINGERPRINT_PACKETRECIEVEERR: lcd.print("Erro- comunicacao"); return p; case FINGERPRINT_FEATUREFAIL: lcd.print("Endereco invalido"); return p; case FINGERPRINT_INVALIDIMAGE: lcd.print("imagem invalida"); return p; default: lcd.print("Erro "); return p; } // Se não entrou em algum dos erros, todos os processos estão OK ! lcd.print("Novo ID para #"); lcd.print(IDgravar); p = finger.createModel(); if (p == FINGERPRINT_OK) { lcd.print("As digitais batem!"); } else if (p == FINGERPRINT_PACKETRECIEVEERR) { lcd.print("Erro de comunicação"); return p; } else if (p == FINGERPRINT_ENROLLMISMATCH) { lcd.print("As digitais não batem"); return p; } else { lcd.print("Erro desconhecido"); return p; } lcd.print("ID "); lcd.print(IDgravar); p = finger.storeModel(IDgravar); if (p == FINGERPRINT_OK) { lcd.print("Armazenado!"); } else if (p == FINGERPRINT_PACKETRECIEVEERR) { lcd.print("Erro de comunicação"); return p; } else if (p == FINGERPRINT_BADLOCATION) { lcd.print("Erro na memória"); return p; } else if (p == FINGERPRINT_FLASHERR) { lcd.print("Erro-memória flash"); return p; } else { lcd.print("Erro desconhecido"); return p; } } int getFingerprintIDez() { uint8_t p = finger.getImage(); if (p != FINGERPRINT_OK) return -1; p = finger.image2Tz(); if (p != FINGERPRINT_OK) return -1; p = finger.fingerFastSearch(); if (p != FINGERPRINT_OK) return -1; //Alguma digital foi reconhecida pelo sensor if (finger.fingerID == 0) { lcd.print("Modo ADM ON"); numID++; modoGravacaoID(numID); return 0; } else { lcd.clear(); digitalWrite(trava, LOW); lcd.print("ID encontrado #"); lcd.print(finger.fingerID); lcd.setCursor(1,1); lcd.print("seguranca:"); lcd.print(finger.confidence); //Confiabilidade da leitura ! delay(1000); //<<----- Tempo que a trava ficará aberta em milisegundos digitalWrite(trava, HIGH); delay(1000); lcd.clear(); lcd.print(" Aguardando"); lcd.setCursor(1,1); lcd.print(" entrada"); } }
Agora estudaremos o passo-a passo do nosso código, começando temos:
// INCLUSÃO DAS BIBLIOTECAS! #include <Adafruit_Fingerprint.h> #include <SoftwareSerial.h> #include <PushButton.h> #include <LiquidCrystal_I2C.h> #include <Wire.h> //Inicializando o display no endereço 0x27 LiquidCrystal_I2C lcd(0x27,20,4); // Configura endereço I2C e display com 20 caracteres e 4 linhas // PINAGENS DO PROJETO #define button 5 #define trava 8 // INSTANCIANDO OBJETOS SoftwareSerial mySerial(7, 6); // mySerial( Rx, Tx) <-- Pinagens do Sensor; Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); //Criando o nosso objeto Sensro ! PushButton botao(button); // DECLARAÇÃO DAS VARIÁVEIS E FUNCOES uint8_t numID = 1; //Variável responsável pelo armazenamento da digital bool gravar=false; // Indicador booleano para permitir que o sensor grave ou não uint8_t modoGravacaoID(uint8_t IDgravar);
Neste primeiro passo, adicionamos todas as bibliotecas baixadas e algumas já dispostas para o Arduino, para que o nosso projeto funcione perfeitamente !
Observação: Normalmente os endereços já definidos para os LCD’s é 0x27 . Mas o LCD usado veio configurado como 0x3f. Caso não funcione com o seu , abra este post para aprender como identificar.
Segue o próximo passo!
void setup() { lcd.begin(16,2); //Iniciando o nosso LCD lcd.noCursor(); pinMode(trava, OUTPUT); //Definindo o pino da trava, como saída digitalWrite(trava, HIGH); //Serial.begin(9600); finger.begin(57600); // O sensor nominalmente trabalha neste valor, confira no seu datasheet caso não seja este ! if(finger.verifyPassword()){ // Testando se o sensor foi identificado lcd.print("DY-50 encontrado!"); delay(1000); lcd.clear(); } else { lcd.autoscroll(); lcd.print("DY-50 não encontrado"); delay(3000); lcd.clear(); while(true) { delay(1); } } lcd.print("sensor Carregado"); delay(900); lcd.clear(); lcd.print(" Aguardando"); lcd.setCursor(1,1); lcd.print(" entrada"); }
Nessa segunda etapa, definimos as entradas e saidas do projeto, lembre-se que caso o seu display seja de outro tamanho , será necessário colocar as dimensões dele no comando lcd.begin(linhas,colunas). Se o sensor não for identificado, fique atento ao mal contato e reinicie o processo até que ele seja identificado.
Seguimos temos:
void loop() { botao.button_loop(); if ( botao.pressed() ){ gravar = true; } if(gravar){ modoGravacaoID(0); gravar = false; } getFingerprintIDez(); } uint8_t modoGravacaoID(uint8_t IDgravar) { int p = -1; lcd.print("Registre o ADM #"); lcd.print(IDgravar); delay(2000); lcd.clear(); while (p != FINGERPRINT_OK) { p = finger.getImage(); switch (p) { case FINGERPRINT_OK: lcd.clear(); lcd.print(" concluído"); break; case FINGERPRINT_NOFINGER: lcd.print("."); delay(200); break; case FINGERPRINT_PACKETRECIEVEERR: lcd.clear(); lcd.print("Erro"); break; case FINGERPRINT_IMAGEFAIL: lcd.print("Erro leitura"); break; default: lcd.print("ERROR"); break; } } //Foram configurados alguns dos erros mais comuns apresentandos pelo Sensor. p = finger.image2Tz(1); switch (p) { case FINGERPRINT_OK: lcd.print("Leitura convertida"); break; case FINGERPRINT_IMAGEMESS: lcd.print("tente novamente "); return p; case FINGERPRINT_PACKETRECIEVEERR: lcd.print("ERROR"); return p; case FINGERPRINT_FEATUREFAIL: lcd.print("Endereço invalido"); return p; case FINGERPRINT_INVALIDIMAGE: lcd.print("Imagem invalida"); return p; default: lcd.print("ERRO"); return p; } lcd.clear(); lcd.print("Retire o Dedo"); delay(2000); lcd.clear(); p = 0; while (p != FINGERPRINT_NOFINGER) { p = finger.getImage(); } lcd.print("ID "); lcd.print(IDgravar); p = -1; lcd.print(" Insira o dedo "); lcd.setCursor(1,1); lcd.print(" novamente"); while (p != FINGERPRINT_OK) { p = finger.getImage(); switch (p) { case FINGERPRINT_OK: lcd.print("Concluido ! "); break; case FINGERPRINT_NOFINGER: lcd.print("."); delay(200); break; case FINGERPRINT_PACKETRECIEVEERR: lcd.print("Erro no pacote"); break; case FINGERPRINT_IMAGEFAIL: lcd.print("Erro na imagem"); break; default: lcd.print("Erro "); break; } } // Se não entrou em algum dos erros, o primeiro processo está OK ! p = finger.image2Tz(2); switch (p) { case FINGERPRINT_OK: lcd.print("Leitura convertida"); break; case FINGERPRINT_IMAGEMESS: lcd.print("Má leitura"); return p; case FINGERPRINT_PACKETRECIEVEERR: lcd.print("Erro- comunicacao"); return p; case FINGERPRINT_FEATUREFAIL: lcd.print("Endereco invalido"); return p; case FINGERPRINT_INVALIDIMAGE: lcd.print("imagem invalida"); return p; default: lcd.print("Erro "); return p; } // Se não entrou em algum dos erros, todos os processos estão OK ! lcd.print("Novo ID para #"); lcd.print(IDgravar); p = finger.createModel(); if (p == FINGERPRINT_OK) { lcd.print("As digitais batem!"); } else if (p == FINGERPRINT_PACKETRECIEVEERR) { lcd.print("Erro de comunicação"); return p; } else if (p == FINGERPRINT_ENROLLMISMATCH) { lcd.print("As digitais não batem"); return p; } else { lcd.print("Erro desconhecido"); return p; } lcd.print("ID "); lcd.print(IDgravar); p = finger.storeModel(IDgravar); if (p == FINGERPRINT_OK) { lcd.print("Armazenado!"); } else if (p == FINGERPRINT_PACKETRECIEVEERR) { lcd.print("Erro de comunicação"); return p; } else if (p == FINGERPRINT_BADLOCATION) { lcd.print("Erro na memória"); return p; } else if (p == FINGERPRINT_FLASHERR) { lcd.print("Erro-memória flash"); return p; } else { lcd.print("Erro desconhecido"); return p; } } int getFingerprintIDez() { uint8_t p = finger.getImage(); if (p != FINGERPRINT_OK) return -1; p = finger.image2Tz(); if (p != FINGERPRINT_OK) return -1; p = finger.fingerFastSearch(); if (p != FINGERPRINT_OK) return -1; //Alguma digital foi reconhecida pelo sensor if (finger.fingerID == 0) { lcd.print("Modo ADM ON"); //Se for a digital ADM, ele entra em modo de gravação e acrescenta 1 valor ao numero // de endereço. numID++; modoGravacaoID(numID); return 0; } else { lcd.clear(); digitalWrite(trava, LOW); //Caso o dedo identificado não seja o adm, e esteja registrado a trava é aberta lcd.print("ID encontrado #"); lcd.print(finger.fingerID); lcd.setCursor(1,1); lcd.print("seguranca:"); lcd.print(finger.confidence); //Confiabilidade da leitura ! delay(2000); //<<----- Tempo que a trava ficará aberta em milisegundos digitalWrite(trava, HIGH); delay(1000); lcd.clear(); lcd.print(" Aguardando"); lcd.setCursor(1,1); lcd.print(" entrada"); } }
Neste processo do void loop() definimos a constante verificação da leitura e do estado do sensor ! Foram programados comandos para caso o sensor apresente algum de seus erros, portanto verifique sempre o estado dos fios e deixe sempre o sensor limpo
Hoje aprendemos como utilizar o Sensor Óptico de Impressão Digital DY-50 e entendemos como ele funciona, estudamos suas especificações e criamos um sistema de segurança utilizando esse sensor. Esperamos que você tenha entendido e conseguido montar nosso projeto. Se você curtiu, aprendeu e/ou desenvolveu o Sistema de Segurança, poste nas redes sociais e nos marque lá no instagram: @eletrogate
Gostou? Deixe um curtir e compartilhe com seus amigos! Ficou com alguma dúvida? Quer fazer um elogio? Deixe um comentário!
Obrigado por nos acompanhar e ler até aqui.
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.
Tenha a Metodologia Eletrogate dentro da sua Escola! Conheça nosso Programa de Robótica nas Escolas!