Sensor Reflexivo de Obstáculo KY-032

Sensor Reflexivo de Obstáculo Infravermelho KY-032 com arduino:

Semelhantemente ao Módulo Sensor de linha TCRT5000 do tutorial “ROBÔ SEGUIDOR DE LINHA COM SENSOR TCRT5000: ” e o Sensor de obstáculo infravermelho do tutorial “ROBÔ SEGUIDOR DE LINHA” temos o Sensor Reflexivo de Obstáculo Infravermelho KY-032 com arduino. Porém, com a diferença de que ao invés de identificar as cores preto e branco iremos utilizá-lo para identificar objetos.

Como funciona o Sensor Reflexivo de Obstáculo Infravermelho KY-032 com arduino ?

Precipuamente, o funcionamento do nosso sensor é baseado no sistema de reflexão infravermelho, ou seja, possui um LED emissor de infravermelho e um LED fotodiodo receptor, quando algum obstáculo/objeto passa no ângulo de detecçãodo sensor na distância ajustada, o sensor indica tal situação colocando a saída em nível lógico BAIXO. Vemos isso na imagem abaixo:

Imagem dos LED’s emissor e receptor detectando objeto

kit robotica educacional com Arduino ESP ou Microbit

- Circuito Integrado

Os circuitos integrados tem a função de temporizador, controlar, oscilar e amplificar a presença ou não de obstáculos, sinalizando assim com o valor logico 1(alto) se não houver a presença de obstáculos e com valor logico 0(baixo) se houver a presença de obstáculos. O circuito integrado utilizado no sensor é um chip preto acoplado ao módulo é baseado em um temporizador NE555. Vejamos abaixo uma imagem de um circuito integrado:

Circuito Integrado

Para sua operação o modulo foi projetado para funcionar com frequência de 38KHz, há uma tensão de 3.3 a 6VDC. Além disso, o módulo possui dois potenciômetros ajustáveis, um para controle da frequência de operação e outro para controle da sensibilidade da distância de detecção que pode ficar entre 2cm e 40cm. Vejamos abaixo o Módulo Sensor Reflexivo de Obstáculo Infravermelho KY-032 e seus componentes:

Imagem do Sensor Infravermelho KY-032

Vemos que temos os dois potenciômetros P2 para ajuste do feixe de luz do emissor e P1 para ajuste da distância de detecção, uma entrada para jumper e ao lado temos o circuito integrado NE555. Logo depois, embaixo temos o sensor de energização do módulo (Power LED) que fica constantemente aceso quando o sensor está sendo energizado e logo ao lado temos o LED identifica se detectou ou não a presença de obstaculo. Em seguida temos os LEDs emissor e receptor.

- Óptica

O princípio físico do funcionamento do sensor tem a ver com a absorção da luz e emissão de calor pelas cores. A absorção da luz é o processo pelo qual a luz que incide sobre um corpo é convertida em energia e com isso os elétrons deste corpo se agitam, fazendo com que oscilem e emitem calor. Para isso acontecer, a luz que incide sobre um material em particular precisa ter uma frequência de oscilação próxima da frequência na qual os elétrons dos átomos desse material vibram. Veja a tabela de frequência de cores abaixo:

Tabela identificando as principais frequências da luz

Temos então que as cores que não produzem a própria luz depende da frequência que elas são capazes de absorver e da forma como elas interagem com a luz que as incide, ou seja, a cor não está no objeto. Temos que, na verdade, os objetos absorvem todas as cores que estão na luz branca e refletem apenas aquela que vemos. Essa luz é a que chega aos nossos olhos. Por exemplo, temos que se um objeto absorve todas as frequências de luz igualmente, então a cor que será expressa por ele que veremos será a cor preta. Porém, caso não consiga absorve algum intervalo de frequência de luz visível, como a azul, nós enxergaremos esse objeto com a cor azul, pois será está a cor que refletirá nos nossos olhos.

- Cores

Imagem de incidência da mesma luz branca em dois objetos

Em suma, acima iluminamos dois objetos com a mesma luz branca, e ambos os objetos absorvem todas as cores, exceto a luz azul para o da esquerda e a luz verde para o da direita. Como a luz azul e a luz verde não são absorvidas, elas são refletidas em todas as direções, tornando assim o objeto da esquerda azul e o da direita verde aos nossos olhos. No sensor temos que a luz infravermelho é emitida e quando temos a presença de um objeto essa luz é refletida para o LED receptor.

- Infravermelho

As luzes ditas não-visíveis são aquelas que a frequência está abaixo da frequência da luz vermelha e acima da frequência da luz violeta.

Imagem das luzes visíveis e não visíveis

Em inicio vemos que a luz vermelha tem a maior velocidade de propagação já que o comprimento de onda é o maior e possui a menor frequência das luzes visíveis. Logo depois, por ultimo temos que a violeta é a de menor velocidade de propagação e sua frequência é a maior das luzes visíveis. O infravermelho é um tipo de radiação eletromagnética que apresenta frequência menor que a da luz vermelha, por isso, não está no espectro eletromagnético visível. Ela é utilizada para detectar a temperatura de corpos e objetos, e para o nosso sensor não difere disso, pois o LED emissor envia uma onda de luz infravermelha e quando detecta um objeto está onda é refletida para o receptor. Além disso, temos também outras luzes que não estão no espectro da luz visível, como a ultravioleta.

- Os terminais deste sensor são: 

  • VCC(+) – Tensão de entrada, entre 3,3 a 5 volts 
  • GND(-) – O pino de O V do módulo, conectado ao GND do Arduino ou fonte Saida 
  • EN – Pino de controle do módulo
  • Saída Digital(OUT)– Pino de saída digital (retorna HIGH ou LOW) 

 

Mãos à obra — Configurando um Sensor Reflexivo de Obstáculo Infravermelho KY-032 com arduino

Componentes Necessários 

- Montando o projeto: 

Precipuamente, conectaremos o GND do Módulo no GND do arduino e o VCC do Módulo no 5V do arduino. Logo após, conectaremos o OUT do Módulo no Pino 8 do arduino. Veja o Diagrama de montagem abaixo:

Diagrama de montagem do Sensor de Obstáculo Infravermelho KY-032

- Programando o Arduino: 

Neste instante vamos conectar o arduino no computador e abrir a IDE arduino. Desta forma iremos escrever o programa abaixo na IDE e compile o programa para o seu arduino.

Em contrapartida, antes de carregar o programa, você precisa selecionar qual porta você deseja usar para fazer o carregamento do seu programa no Arduino (upload). Dentro do Arduino IDE, clique no menu Ferramentas (tools) e abra o submenu Porta(Port). Clique na porta que seu Arduino está conectado, tal como COM3 ou COM4. Geralmente aparece o nome da placa Arduino : “COM3 (Arduino/Genuino Uno)”.

#define pino_out 8 //Define o fino 8 como "pino_out"

void setup(){
  pinMode(pino_out, INPUT); //  Define o "pino_out" como entrada
  Serial.begin (9600); //Inicializa a comunicação serial com velocidade
}

void loop(){
  if(digitalRead(pino_out) == LOW){ // Se a leitura do "pino_out" for igual a LOW, Executa
    Serial.println ("Objeto detectado"); //Imprime o texto "Objeto detectado" no serial monitor
  }else{ //Senão, faz
    Serial.println ("Nenhum objeto detectado"); //Imprime o texto "Nenhum objeto detectado" no serial monitor
  }
}

 

ATENÇÃO: não esqueça de definir a placa e a porta que esta utilizando para carregar

- Testando o funcionamento:

PS: o tamanho e cor do obstáculo influenciam na distância de detecção. Além disso, os trimpots do módulo devem ser ajustados para melhorar o raio de detecção. Se tudo estiver correto temos o resultado abaixo:

 

GIF do sensor funcionando

- Ajuste de sensibilidade do Sensor Reflexivo de Obstáculo Infravermelho KY-032 com arduino

O ajuste para a detecção de objetos é feita no trimpot. Quando o LED de leitura de detecção estiver aceso, significa que o sensor está recebendo o sinal infravermelho de volta, detectando assim o obstaculo/objeto.

Imagem dos trimpots

 

Entendendo a fundo: 

Software 

– Definições e variáveis utilizadas no projeto do Sensor Reflexivo de Obstáculo Infravermelho KY-032 com arduino

A instrução #define apenas associou a porta 8 dos pinos do arduino ao nome “pino_out”, pois é mais fácil para se lembrar durante o programa.

#define pino_out 8 //Define o fino 8 como "pino_out"

– Função Setup – Definindo pinos do Sensor Reflexivo de Obstáculo Infravermelho KY-032 com arduino

Sabemos que função setup é aquela que irá rodar apenas uma vez quando nosso programa for iniciado. Ela é do tipo void, ou seja, não tem retorno e também não tem parâmetros de entrada. Em início na função pinMode nos definimos se os pinos serão entradas ou saída, no caso do “pino_out” ele será uma entrada. Logo depois, por último inicializamos a comunicação serial para podemos visualizar o que esta acontecendo no serial monitor.

void setup(){
  pinMode(pino_out, INPUT); //  Define o "pino_out" como entrada
  Serial.begin (9600); //Inicializa a comunicação serial com velocidade
}

– Função Loop – Leitura do nosso Sensor Reflexivo de Obstáculo Infravermelho KY-032 com arduino de som e Estruturas de decisão 

Em analogia, a função loop ao contrário da setup roda tudo que estiver dentro dela varias vezes em um loop constante até que seja reiniciado ou parado o programa.

Na estrutura de decisão if temos que se for verdadeira a condição entre parenteses o que está entre os colchetes do if será executado, caso contrario o que estiver entre os colchetes do else que será. A função digitalRead() faz a leitura do pino que está entre parenteses. Assim sendo, vemos que no caso do nosso programa o pino em questão é o “pino_out” e se a leitura feita for o valor “0”, nível logico baixo, a condição do if será verdadeira e será impresso no monitor serial o texto "Objeto detectado". Logo depois, caso a função digitalRead() leia “1”, nível logico alto, o else que será executado imprimindo assim o texto "Nenhum objeto detectado" no serial monitor.

void loop(){
  if(digitalRead(pino_out) == LOW){ // Se a leitura do "pino_out" for igual a LOW, Executa
    Serial.println ("Objeto detectado"); //Imprime o texto "Objeto detectado" no serial monitor
  }else{ //Senão, faz
    Serial.println ("Nenhum objeto detectado"); //Imprime o texto "Nenhum objeto detectado" no serial monitor
  }
}

 

Considerações finais: 

No tutorial mostramos como funciona e como utilizar o Sensor Reflexivo de Obstáculo Infravermelho KY-032 . Esperamos que você continue nos acompanhando e sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.

 


Robô Seguidor de Linha com Sensor TCRT5000:

Chassi 2WD como Seguidor de Linha:

O seguidor de linha é um dos primeiros projetos de robótica móvel que todos os entusiastas, hobistas ou profissionais constroem no intuito de nos ensinar o quão simples e ainda sim inigualável é a cultura maker e as tecnologias de interação entre nós e os objetos e entre os objetos. Precipuamente, antes de irmos para a montagem do Robô Seguidor de Linha com Sensor TCRT5000  vamos aprender sobre os principais componentes para o seu funcionamento, sendo o restante conectores, alimentação e a carcaça do carrinho. Para a construção do seguidor de linha utilizaremos o Módulo segue faixa(TCRT5000), Módulo Driver ponte H HG7881 L9110S, Protoboard, jumpers e Adaptador P4/KRE Macho para a conexão e, o Chassi 2WD que é a carcaça do Robô.

Imagem do seguidor de faixa

kit robotica educacional com Arduino ESP ou Microbit

Para melhor entendimento deste tutorial é necessário que você já tenha um conhecimento prévio sobre Arduino e ponte H. Entretando não se preocupe, pois nossa equipe já produziu outros tutoriais sobre esses assuntos e você pode conferir alguns destes nos seguintes links: Entradas e Saídas Analógicas e Módulo Ponte H L298n.

- Robô Seguidor de Linha com Sensor TCRT5000 nas escolas

Em início, como já sabemos, o seguidor de linha já é muito utilizado em indústrias, mas para que utilizar nas escolas? Bem, com um projeto deste, mesmo que simples, podemos integrá-lo em diversas áreas. O robô seguidor de linha, em suma, foi criado para competições interdisciplinares e ajudar jovens a trabalhar em equipe e desenvolver o cognitivo.

Então, na História, filosofia e sociologia podemos aprender como se desenvolveu a tecnologia até a criação do robô, bem como surgiu o arduino ou como a cultura maker, sendo está uma arte, é tão disseminada por todo o globo terrestre. Na geografia como robôs e equipamentos eletrônicos foram e são tão importantes para descobertas e no nosso dia a dia como, por exemplo, prever o clima. Já na matemática temos a rotação dos motores e na física a energia elétrica que passa pelo circuito e o funcionamento óptico do sensor de faixa e suas cores preta e branca.

- Como funciona um Robô Seguidor de Linha com Sensor TCRT5000 ?

Imaginemos uma pista de corrida preta e um carro sobre ela com sensores de detecção de infravermelho embaixo do carro, quando o carro sair da pista a cor do chão irá mudar e os sensores irão detectar está mudança fazendo o que o carro vire voltando assim de volta para pista. No caso da imagem abaixo somente quando ele receber o infravermelho que ele irá virar, pois será quando o carro saiu da pista preta.

Imagem de um carro em uma pista de corrida

Similarmente o seguidor de linha deve seguir andando por cima de uma linha de cor preta (fita isolante) ou branca. Os circuitos podem alternar entre as cores do campo e da faixa, no nosso caso iremos assumir que a pista é branca e a faixa é preta, ou seja, quando o carro detectar a cor preta, não recebendo o infravermelho de volta ele irá virar. Usaremos 2 sensores infravermelhos que detectam a presença ou não desta faixa. De acordo com a combinação dos sensores, o carrinho irá para frente ou virar para um dos lados.

Imagem do funcionamento do sensor de faixa

Na imagem acima temos um carrinho com dois sensores nas laterais onde quando detectar a presença do preto o carrinho vira. Enquanto o carrinho não está detectando a cor preta o motor das rodas fica girando em uma velocidade constante com 360°graus de rotação em linha reta.

- Funcionamento do sensor infravermelho

O módulo sensor TCRT5000 emite uma luz infravermelha por um LED negro e capta o reflexo com um LED receptor (LED claro). Como sabemos pela física, a luz reflete em superfícies claras, sendo a branca a que mais reflete, e é absorvida em superfícies escuras, sendo a preta a que mais absorve, como a fita isolante. Sendo assim o LED receptor irá detectar a luz infravermelha no branco e não detectar no preto. Entretanto, para uma melhor eficácia do sensor, a superfície em contraste com a faixa preta deve ser branca.

Funcionamento do sensor infravermelho

Muitas vezes haverá a necessidade de ajustarmos a sensibilidade do sensor por isso ele possui um potenciômetro de calibração.

- Diferença entre sensores infravermelhos obstaculo e o TCRT5000

Nos pode usar diferentes sensores infravermelhos para o projeto seguidor de linha, o que precisamos considerar é as especificações de cada um. Um sensor infravermelho amplamente utilizado é o TCRT5000, o qual utilizaremos neste tutorial, que tem como vantagem seu tamanho e preço. Porém, ele precisa está próximo ao chão para que seja capaz de identificar a faixa, uma vez que seu alcance é de até 8mm. Entretanto, ele possui a vantagem de sofrer menos interferências de luzes infravermelhas externas.

Módulo Sensor de linha TCRT5000

Em contrapartida, a vantagem de usar o sensor de obstaculo é o seu maior alcance possuir ajuste, porem ele é mais suscetível a interferências das luzes ambientes.

Sensor de obstáculo infravermelho

Nesse tutorial, usaremos o TCRT5000. Dessa forma, caso esteja usando o sensor de obstaculo infravermelho, fique atento com as interferências. O local precisa estar bem iluminado e sem reflexo de luzes que possam mudar a cor da superficie que o sensor incidir.

Controlando motores com Ponte H

Quando lidamos com controle de cargas que consomem grande quantidade de energia, é importante que essas cargas sejam controladas com circuitos que separem o circuito de controle do circuito de potência. Para controlar motores, é comum usarmos um circuito chamado ponte H, ele é capaz por controlar o sentido de giro do motor e a sua velocidade, usando o PWM.

- PWM

PWM (Pulse Width Modulation – Modulação por Largura de Pulso) é uma técnica para obter resultados analógicos por meios digitais (Leia mais sobre Grandezas digitais e analógicas e PWM). Essa técnica consiste na geração de uma onda quadrada em uma frequência muito alta em que pode ser controlada a porcentagem do tempo em que a onda permanece em nível lógico alto, alterando, assim, a tensão média.

Por exemplo, se a saída é de 5V, porém ela fica apenas 50% do tempo em 5V e outros 50% do tempo em nível lógico baixo, isso resulta em uma tensão média de 2,5V (50% x 5V). Dessa forma, esta variável de tempo é capaz de controlar de velocidade do nosso carrinho alterando a tensão média aplicada no motor. Os valores de PWM variam de 0 (parado) até 255 (velocidade máxima ou 5 V).

- Controlando a velocidade do motor através da Ponte H

Existem várias opções de Ponte H, nesse tutorial usaremos o Módulo Driver Ponte H HG7881 L9110S que dispões de duas pontes H, sendo capaz de controlar dois motores. Cada ponte H possui um pino que ativa ou não a ponte H. Caso tenha um sinal de 5V aplicado nele, a ponte estará ligada, caso seja 0V a ponte estará desligada.

Imagem da ponte H

O "Motor A" e "Motor B" da parte superior utilizaremos como conexões de saída para alimentação dos motores A e B. No entanto, já o "Motor A" e o "Motor B" da parte inferior utilizaremos  para receber e passar informação para os motores A e B, respectivamente. Através desses pinos conectados ao Arduino podemos controlar a velocidade e o sentido de rotação dos motores A e B, respectivamente. A parte de alimentação serve para alimentar o modulo com tensão entre 2.5 a 12V (Corrente Contínua).

Apesar de a ponte H ser controlada por um sinal de 5V, elá pode chavear uma tensão diferente. Podemos, por exemplo, controlar uma tensão de 6V, vindo de um conjunto de 4 pilhas AA. Nesse caso, apesar de o sinal PWM ser de 5V ele modulará os 6V nos motores. Vai depender da tensão necessária para o funcionamento dos motores.

Podemos calcular a tensão de alimentação com a fórmula: Vm = Va + 1,5V (Vm = tensão mínima necessária para alimentar o motor, Va = tensão nominal do motor DC). Como exemplo temos que caso o motor tenha uma tensão nominal de 3,5 V a tensão mínima da fonte externa deve ser de 5,0V.

-Datasheet

No datasheet do chip L9110S podemos obter diversas informações de como é o funcionamento e controle da ponte H por esse chip. Em suma, uma das observações que podemos fazer é na tabela de tensão e conrrente, onde está indicando que a tensão minima é 2.5V e a maxima é 12V. Já a corrente de operação, podemos observar que a minima é de 200 microampere e a maxima é de 500 microampere. Em contrapartida, temos outra tabela ao lado sobre os pinos de rotação horaria e anti-horaria do motor como na tabela abaixo:

Tabela de rotação dos motores

Ou seja, existem apenas dois tipos de rotação, a normal e a invertida. No nosso programa nos só queremos a rotação normal, sendo assim utilizaremos a primeira linha de High e Low.

 

Mãos a obra - Montando um Robô Seguidor de Linha com Sensor TCRT5000

Componentes Necessários

- Montando o projeto do Robô Seguidor de Linha com Sensor TCRT5000

Abaixo segue o esquema de ligações e montagem eletrônica do driver Ponte H HG7881:

Diagrama de montagem da Ponte H

A carcaça do robô deve ser montada conforme o manual. Agora segue o esquema de ligações e montagem eletrônica dos Módulos TCRT5000:

Diagrama de montagem dos Módulos TCRT5000 

Os módulos devem ser fixos na frente do chassi em direção ao chão na parte de baixo para poder detectar o caminho a ser seguido. Como resultado aos esquemas anteriores temos um esquema completo de montagem Ponte H + Módulos TCRT5000:

Diagrama de montagem Ponte H + Módulos TCRT5000

Este projeto possui um procedimento de montagem complexo devido ao fato da necessidade de termos que passar vários fios por um espaço limitado ao tamanho do chassi do carrinho. Como resultado da montagem do robô temos as imagens abaixo:

Imagens do carrinho pronto

 

PS: Devemos Lembrar que o suporte das baterias deve ficar instalado embaixo do carrinho.

- Calibração do Sensor infravermelho

Ao usar o sensor infravermelho, seja o TCRT5000 ou o sensor de obstaculo, você precisa calibrar o sensor para que seja capaz de detectar adequadamente a mudança de cor entre preto e branco. Esta calibração deve ser feita no próprio sensor com o auxílio de uma chave de fenda no potenciômetro acoplado a ele.

Potenciometro(Trimpot) de ajuste do sensor

- Programando o Robô Seguidor de Linha com Sensor TCRT5000

Neste instante vamos conectar o arduino no computador e abrir a IDE arduino. Desta forma iremos escrever o programa abaixo na IDE e compilar o programa para o seu arduino.

Em contrapartida, antes de carregar o programa, você precisa selecionar qual porta você deseja usar para fazer o carregamento do seu programa no Arduino (upload). Dentro do Arduino IDE, clique no menu Ferramentas (tools) e abra o submenu Porta(Port). Clique na porta que seu Arduino está conectado, tal como COM3 ou COM4. Geralmente aparece o nome da placa Arduino : “COM3 (Arduino/Genuino Uno)”.

#define M1AA 10 //Definição do pino que controla o motor A
#define M1AB 11 //Definição do pino que controla o motor A
#define M2BA 5  //Definição do pino que controla o motor B
#define M2BB 6  //Definição do pino que controla o motor B

#define pinS1 7 //Definindo o pino 7 como pino do primeiro sensor
#define pinS2 8 //Definindo o pino 8 como pino do segundo sensor

bool Sensor1 = 0; //Declarando a variavel "Sensor1" e atribuindo a ela o valor "0"
bool Sensor2 = 0; //Declarando a variavel "Sensor2" e atribuindo a ela o valor "0"

int velocidade = 125; //Declarando a variavel "velocidade" e atribuindo a ela o valor "125"

void setup(){
  pinMode(M1AA, OUTPUT); // Define o pino de controle do motor A como saída
  pinMode(M1AB, OUTPUT); // Define o pino de controle do motor A como saída
  pinMode(M2BA, OUTPUT); // Define o pino de controle do motor B como saída
  pinMode(M2BB, OUTPUT); // Define o pino de controle do motor B como saída


  digitalWrite(M1AB, LOW);  // Setamos a direção inicial do motor 1 como 0, isto fará com que o motor gire para frente
  digitalWrite(M2BB, LOW);  // Setamos a direção inicial do motor 2 como 0, isto fará com que o motor gire para frente
  
  pinMode(pinS1, INPUT); // Define o pino do sensor 1 como entrada
  pinMode(pinS2, INPUT); // Define o pino do sensor 2 como entrada


}

void loop(){
  Sensor1 = digitalRead(pinS1); // A variavel "Sensor1" recebe o valor digital lido pelo sensor 1
  Sensor2 = digitalRead(pinS2); // A variavel "Sensor2" recebe o valor digital lido pelo sensor 2
  
  if((Sensor1 == 0) && (Sensor2 == 0)) // Os dois lados detectaram branco
  {
    analogWrite(M1AA, velocidade); //O motor A recebe velocidade 125
    analogWrite(M2BA, velocidade); //O motor B recebe velocidade 125
    delay(25);
  }
  if((Sensor1 == 1) && (Sensor2 == 0)) // O primeiro sensor detectou preto e o segundo branco
  {
    analogWrite(M1AA, 0); //O motor A recebe velocidade 0
    analogWrite(M2BA, 140); //O motor B recebe velocidade 140, girando assim o carrinho
    delay(25); //Espera de 25 milissegundos
  }
  if((Sensor1 == 0) && (Sensor2 == 1)) // O primeiro sensor detectou branco e o segundo preto
  {
    analogWrite(M1AA, 140); //O motor A recebe velocidade 140, ficando assim ligado
    analogWrite(M2BA, 0); //O motor B recebe velocidade 0, desligando-o e fazendo assim o carrinho virar no outro sentido
    delay(25); //Espera de 25 milissegundos
  }
}

 

– Testando o funcionamento do Robô Seguidor de Linha com Sensor TCRT5000:

Agora é só pôr o carrinho para rodar na pista!

Video do carrinho funcionando e seguindo a faixa

- Problemas recorrentes e como resolver

Bateria baixa – Os testes podem ter consumido a bateria e talvez seja necessário o uso de uma nova. Baterias abaixo de 6,5 Volts já começam a diminuir a eficiência do carrinho e já pode não ser mais suficiente para energizar os motores como vimos anteriormente.

Carrinho saindo da pista – Isso pode acontecer por ele estar rápido de mais ou por falha do infravermelho. Em caso de ele estar muito rápido basta trocar a velocidade dos motores em cada situação. Se o problema for com o contraste da pista (talvez parte dela esteja mais escura) use 2 LEDs de alto brilho na frente do carrinho para iluminar a pista próximo aos sensores. Os LEDs podem ir conectados direto no 5 V do arduino (lembrando de por um resistor de 300Ohms). Também pode ser que os sensores não estejam detectando o chão, pois foram colocados em uma posição que não facilita a leitura ou podem estar acima de 8mm do chão dificultando a leitura.

Carrinho não anda – Este é um problema complexo, pois podem ter infinitas possibilidades. Tente isolar os componentes e testar 1 por 1, principalmente os motores e a ponte H. Em alguns casos pode ser problemas de aterramento da bateria também, ou seja, a conexão dos jumpers.

 

PS: Vale ressaltar que o robô pode não fazer o percurso de primeira, o que significa que ajustes devem ser feitos no código ou até mesmo no hardware.

 

Entendendo a fundo

Software

– Definições e Declarando variáveis utilizadas no projeto do Robô Seguidor de Linha com Sensor TCRT5000

Inicialmente a instrução #define apenas associa os pinos do arduino nomes referente aos componentes conectados nestes pinos.  Semelhantemente, temos logo depois a declaração de variaveis e atribuições de valores a estas variaveis. Nas variaveis declaradas "Sensor1" e "Sensor2" do tipo bool atribuimos a elas o valor "0". Já na variavel declarada do tipo int atribuimos a ela o valor "125", pois é o valor de velocidade que queremos para os motores.

#define M1AA 10 //Definição do pino que controla o motor A
#define M1AB 11 //Definição do pino que controla o motor A
#define M2BA 5  //Definição do pino que controla o motor B
#define M2BB 6  //Definição do pino que controla o motor B

#define pinS1 7 //Definindo o pino 7 como pino do primeiro sensor
#define pinS2 8 //Definindo o pino 8 como pino do segundo sensor

bool Sensor1 = 0; //Declarando a variavel "Sensor1" e atribuindo a ela o valor "0"
bool Sensor2 = 0; //Declarando a variavel "Sensor2" e atribuindo a ela o valor "0"

int velocidade = 125; //Declarando a variavel "velocidade" e atribuindo a ela o valor "125"

Função Void Setup()

A função setup é aquela que irá rodar apenas uma vez quando nosso programa for iniciado. Ela é do tipo void, ou seja, não tem retorno e também não tem parâmetros de entrada. A função pinMode serve para definir quais serão os pinos de entrada e de saida. Repare que apenas os que declaramos com #define anteriormente, estão no pinMode, isto é porque as outras são variaveis que escolhemos para atribuir valores. Na função pinMode definimos que M1AB, M1AA, M2BA, M2BB (pinos dos motores) são saida e os pinos dos sensores pinS1 e pinS2 são entradas.

pinMode(M1AA, OUTPUT); // Define o pino de controle do motor A como saída
pinMode(M1AB, OUTPUT); // Define o pino de controle do motor A como saída
pinMode(M2BA, OUTPUT); // Define o pino de controle do motor B como saída
pinMode(M2BB, OUTPUT); // Define o pino de controle do motor B como saída

pinMode(pinS1, INPUT); // Define o pino do sensor 1 como entrada
pinMode(pinS2, INPUT); // Define o pino do sensor 2 como entrada

– Definindo sentido de giro dos motores no projeto do Robô Seguidor de Linha com Sensor TCRT5000

Proseguindo temos a função digitalWrite que escreve nas portas do M1AB e M2BB nivel logico baixo, ou seja, o motor não irá girar para trás, fazendo assim com que os motores girem somente para frente.

digitalWrite(M1AB, LOW);  // Setamos a direção inicial do motor 1 como 0, isto fará com que o motor gire para frente
digitalWrite(M2BB, LOW);  // Setamos a direção inicial do motor 2 como 0, isto fará com que o motor gire para frente

Função  Void Loop ()

Por analogia, a função loop ao contrário da setup rodará tudo que estiver dentro dela varias vezes em um loop constante até que seja reiniciado ou parado o programa.

– Leituras dos Sensores no projeto do Robô Seguidor de Linha com Sensor TCRT5000

De inicio temos as variaveis Sensor1 e Sensor2 recebendo o valor (0 ou 1, pois é digital) da leitura dos pinos dos sensores pinS1 e pinS2, sendo a função responsável por está leitura a digitalRead().

Sensor1 = digitalRead(pinS1); // A variavel "Sensor1" recebe o valor digital lido pelo sensor 1
Sensor2 = digitalRead(pinS2); // A variavel "Sensor2" recebe o valor digital lido pelo sensor 2

– Controlando a direção do robô

Logo após as variaveis receberem esses valores vamos para a estrutura de decisão if onde temos as condições que se os dois sensores receberem o valor "0", ou seja, detectaram a cor branca, será escrito nos pinos dos motores a velocidade 125 declarada anteriormente fazendo com que o carrinho continue andando reto.

if((Sensor1 == 0) && (Sensor2 == 0)) // Os dois lados detectaram branco
{
  analogWrite(M1AA, velocidade); //O motor A recebe velocidade 125
  analogWrite(M2BA, velocidade); //O motor B recebe velocidade 125
  delay(25);
}

Agora, caso a varivel Sensor1 receba o valor 1(o sensor detectou assim a cor preta)e  a variavel Sensor2 receba o valor 0(o sensor detectou a cor branca) a estrutura de decisão abaixo que será verdadeira e não a de cima, fazendo com que escreva no pino do motor 1 a velocidade 0 e no pino do motor 2 a velocidade 140, girando assim o carrinho como mostra na Imagem do funcionamento do sensor de faixa.

if((Sensor1 == 1) && (Sensor2 == 0)) // O primeiro sensor detectou preto e o segundo branco
 {
   analogWrite(M1AA, 0); //O motor A recebe velocidade 0
   analogWrite(M2BA, 140); //O motor B recebe velocidade 140, girando assim o carrinho
   delay(25); //Espera de 25 milissegundos
 }

Em ultima alternativa temos o contrario da anterir. Caso não seja o primeiro sensor que detectou o preto, mas sim o segundo a estrutura de decisão abaixo que será verdadeira e não as anteores fazendo com que escreva no pino do motor 1 a velocidade 140 e no pino do motor 2 a velocidade 0, girando assim carrinho para o outro lado como mostra na Imagem do funcionamento do sensor de faixa.

 if((Sensor1 == 0) && (Sensor2 == 1)) // O primeiro sensor detectou branco e o segundo preto
  {
    analogWrite(M1AA, 140); //O motor A recebe velocidade 140, ficando assim ligado
    analogWrite(M2BA, 0); //O motor B recebe velocidade 0, desligando-o e fazendo assim o carrinho virar no outro sentido
    delay(25); //Espera de 25 milissegundos
  }
}

Hardware

O carrinho funciona com uma comunicação entre os sensores, o Arduino e a ponte H controlando os motores. Por meio das leituras que os sensores fazem do meio e enviam para o Arduino por meio das portas digitais, o controlador irá acionar um motor mais rápido ou mais devagar do que o outro. Os sensores emitem 5 V (faixa preta) ou 0 V(pista branca) para as portas digitais. O Arduino modula os valores de velocidade pelos valores PWM que variam de 0 volts (0) até 5 volts (255), fazendo isso ao longo de todo trajeto. A bateria que alimenta o Arduino energiza não somente o controlador como também a ponte H dos motores por meio do pino Vin do Arduino.

 

Considerações finais:

Neste tutorial mostramos como funciona e como montar o robô seguidor de faixa. Caso queria veja também o tutorial “ROBÔ SEGUIDOR DE LINHA”, nele utilizamos o sensor de obstáculos para construir o seguidor de faixa. Esperamos que você continue nos acompanhando e sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.


Entendendo o Shield JoyStick com arduino

Shield JoyStick:

Neste tutorial utilizaremos o Shield JoyStick com arduino. Este, no que lhe concerne, é muito utilizado para manusear jogos com arquitetura arduino. Vamos visualizar como este pequeno componente funciona e desenvolver uma aplicação para ele.

kit robotica educacional com Arduino ESP ou Microbit

O  que é o Shield JoyStick?

Este componente como todos os outros sensores trabalha com os conceitos físicos.

- Funcionamento do Shield JoyStick com arduino

Primeiramente, o Shield JoyStick é de fácil conexão e possui muitas saídas, igual ao microcontrolador arduino, já que conta com uma série de pinos para conexões especiais. Além disso, podemos utilizar para controlar braços robóticos ou navegar em menus, ou seja, é ideal para controlar braços robóticos, servos motores, ou ainda para realizar a navegação e seleção em menus.

- Alavanca Analógica

Esta alavanca analógica funciona como um controle de 2 eixos (X e Y), os quais é possível movimentá-la. Quando movimentamos a alavanca analógica do shield para qualquer direção dos eixos X e Y, ela irá identificar a direção a qual a movimentamos e realizará a função que designamos para o shield. Se conectarmos, por exemplo, no braço robótico iremos fazer com que o braço se movimente na mesma direção(X e Y) que a movimentação do controle do shield. Os eixos X e Y são respectivamente os eixos do plano cartesiano que aprendemos inicialmente na matemática.

Imagem do shield joystick sendo usado para controle de braço robótico

- Os componentes do Shield JoyStick com arduino são:

Na parte superior o JoyStick Shield Arduino conta com um 4 chaves push button instaladas no formato de cruz, um sistema de alavanca analógico com diversos movimentos(Conta com uma alavanca analógica de 2 eixos (X e Y)) e duas push buttons pequenas de seleção, existe também uma chave que possibilita escolher a tensão de alimentação do shield, podendo optar entre 5v ou 3,3v, possibilitando assim a utilização em outros microcontroladores. O Joystick no eixo Y a cada movimento produzirá uma tensão proporcional no pino analógico 0, enquanto, um movimento no eixo X produzirá um sinal analógico no pino analógico 1.

Módulo do Shield JoyStick

 

Mãos à obra — Configurando um Shield JoyStick

Componentes Necessários

- Montando o projeto:

Precipuamente conectemos o Shield no arduino conforme a imagem abaixo:

Imagem do Shield JoyStick + Aduino

- Programando o Arduino:

Agora vamos conectar o arduino no computador e abrir a IDE arduino.  Escreva o programa abaixo na IDE e compile o programa para o seu arduino. Em contrapartida antes de carregar o programa, você precisa selecionar qual porta você deseja usar para fazer o carregamento do seu programa no Arduino (upload). Dentro do Arduino IDE, clique no menu Ferramentas (tools) e abra o submenu Porta(Port). Clique na porta que seu Arduino está conectado, tal como COM3 ou COM4. Geralmente aparece o nome da placa Arduino : “COM3 (Arduino/Genuino Uno)”.

//Mapeamento do Hardware do Joystick
#define  X  A0  //analógico horizontal
#define  Y  A1  //analógico vertical
#define  K  8   //Botão K
#define  F  7   //Botão F
#define  E  6   //Botão E
#define  D  5   //Botão D
#define  C  4   //Botão C
#define  B  3   //Botão B
#define  A  2   //Botão A

void setup(){
  int i;
  for(i=0; i<9; i++) pinMode(i, INPUT_PULLUP); //Define as entradas de 0 á 8 como nível logico alto constante
  pinMode(X, INPUT); //Define o pino A0 como entrada
  pinMode(Y, INPUT); //Define o pino A1 como entrada

  Serial.begin(9600); //Inicializa a comunicação serial
}

void loop(){
  int x_read = analogRead(X); // A variavel x_read recebe a leitura do pino analogico A0
  int y_read = analogRead(Y); // A variavel y_read recebe a leitura do pino analogico A1
  Serial.print ("X val:    "); // imprime na tela o texto escrito
  Serial.println ("Y val:    "); // imprime na tela o texto escrito pulando uma linha
  Serial.print  (x_read); // imprime na tela a leitura do pino A0
  Serial.print  ("    "); // imprime na tela  a parte do pino A1
  Serial.println(y_read); // imprime na tela a leitura do pino A1

  if  (!digitalRead(K)) //Vão imprimir na tela quais os botões que estão sendo pressionados 
    Serial.println("K press");
  else if (!digitalRead(F))
    Serial.println("F press");
  else if (!digitalRead(E))
    Serial.println("E press");
  else if (!digitalRead(D))
    Serial.println("D press");
  else if (!digitalRead(B))
    Serial.println("B press");
  else if (!digitalRead(C))
    Serial.println("C press");
  else if (!digitalRead(A))
    Serial.println("A press");
  else
   Serial.println("Nothing press");

   delay(741);
   
}

 

ATENÇÃO: não esqueça de definir a placa e a porta que esta utilizando para carregar o programa.

 

- Testando o funcionamento:

Em suma, podemos visualizar o sensor funcionando através do monitor serial já que nos inicializamos ele com a função Serial.begin(9600) basta clicar na lupa no canto direito superior da IDE arduino como na imagem abaixo:

Monitor serial

Entendendo a fundo:

Software

– Definições e variáveis utilizadas no projeto do Shield JoyStick com arduino

De início temos a instrução #define que colocamos para associar as portas dos pinos do arduino a nomes referente aos componentes conectados nestes pinos. Temos definido na alavanca analógico o pino A0 como sensor do eixo X e o pino A1 como do eixo Y. Nos botões temos um pino para cada como podemos observar no trecho do código abaixo:

#define  X  A0  //analógico horizontal
#define  Y  A1  //analógico vertical
#define  K  8   //Botão K
#define  F  7   //Botão F
#define  E  6   //Botão E
#define  D  5   //Botão D
#define  C  4   //Botão C
#define  B  3   //Botão B
#define  A  2   //Botão A

– Função Setup – Definindo pinos do Shield JoyStick com arduino

A função setup é aquela que ira rodar apenas uma vez quando nosso programa for iniciado. Ela é do tipo void, ou seja, não tem retorno e também não tem parâmetros de entrada. A função for irá inicializar a variável "i" com 0, logo depois colocamos uma condição na qual a função irá se repetir até que a variável "i" seja igual a 9. Logo depois, temos a função pinMode que configura as entradas de 0 á 8 como entradas de pull up, ou seja, fica em constante nível logico alto e quando um dos botões é pressionado ele irá para nível logico baixo, identificando-o. Já X e Y são entradas analógicas. Enfim temos "Serial.begin(9600)" que inicializa a comunicação seria, assim podemos visualizar o que está acontecendo no serial monitor.

void setup(){
  int i;
  for(i=0; i<9; i++) pinMode(i, INPUT_PULLUP); //Define as entradas de 0 á 8 como nível logico alto constante
  pinMode(X, INPUT); //Define o pino A0 como entrada
  pinMode(Y, INPUT); //Define o pino A1 como entrada

  Serial.begin(9600); //Inicializa a comunicação serial
}

– Função Loop – Leitura do nosso Shield JoyStick com arduino e Estruturas de decisão

A função loop ao contrário da setup roda tudo que estiver dentro dela varias vezes em um loop constante até que seja reiniciado ou parado o programa. Iniciamos a função loop com a declaração de duas variáveis "int x_read" e "int y_read". Atribuímos a elas a leitura analógica dos eixos X e Y respectivamente. Logo depois, temos o Serial.print que imprime no serial monitor o texto "X val: " e o texto "Y val: ". Além disso, também imprimir o valor da leitura do movimento dos eixos X  e Y já que como sabemos foram atribuídos as variáveis anteriores.

void loop(){
 int x_read = analogRead(X); // A variavel x_read recebe a leitura do pino analogico A0
 int y_read = analogRead(Y); // A variavel y_read recebe a leitura do pino analogico A1
 Serial.print ("X val: "); // imprime na tela o texto escrito
 Serial.println ("Y val: "); // imprime na tela o texto escrito pulando uma linha
 Serial.print (x_read); // imprime na tela a leitura do pino A0
 Serial.print (" "); // imprime na tela a parte do pino A1
 Serial.println(y_read); // imprime na tela a leitura do pino A1

Inicialmente a função if é uma estrutura de decisão. Sendo assim, colocamos condições nos "if's" e "else if's" onde vemos que se forem verdadeiras as linhas abaixo onde tem a função Serial.println serão executadas. Na primeira condição "!digitalRead(K)" se o botão K tiver sendo pressionado irá escrever no serial monitor "K press". Semelhantemente temos o mesmo para todas as outras condições com seus respectivos botões. Caso não apertemos nenhum botão o último else será executado e o texto "Nothing press" será impresso no monitor serial.

  if  (!digitalRead(K)) //Vão imprimir na tela quais os botões que estão sendo pressionados 
    Serial.println("K press");
  else if (!digitalRead(F))
    Serial.println("F press");
  else if (!digitalRead(E))
    Serial.println("E press");
  else if (!digitalRead(D))
    Serial.println("D press");
  else if (!digitalRead(B))
    Serial.println("B press");
  else if (!digitalRead(C))
    Serial.println("C press");
  else if (!digitalRead(A))
    Serial.println("A press");
  else
   Serial.println("Nothing press");

   delay(741);
   
}

 

Considerações finais:

Neste tutorial mostramos como funciona e como utilizar o Shield JoyStick . Veja também o tutorial "SENSOR DE MOVIMENTO DE CABEÇA – ITG3205 + ADXL345 + HMC5883L" e aprenda mais sobre como os eixos do plano cartesiano fazem parte da criação de sensores e shields. Esperamos que você continue nos acompanhando e sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.


Módulo Sensor de Tensão AC com arduino

Módulo Sensor de Tensão AC – ZMPT101B:

Neste tutorial utilizaremos o Módulo Sensor de Tensão AC com arduino. Este, no que lhe concerne, é muito utilizado para verificar a existência de energia alternada de até 250V em um determinado circuito onde esteja conectado. Vamos visualizar como este pequeno componente funciona e desenvolver uma aplicação para ele.

kit robotica educacional com Arduino ESP ou Microbit

O  que é o Módulo Sensor de Tensão AC?

Este componente como todos os outros sensores trabalha com os conceitos físicos. O Módulo Sensor de Tensão AC é um módulo eletrônico que apresenta resultados rápidos e precisos em projetos de automação residencial e robóticos, onde é necessário verificar a presença de tensão. Ele também pode ser utilizado para fazer a medição da tensão por uma função, voltímetro, permitindo ao usuário saber o valor exato que está passando nos fios em determinado momento. Em seu interior ele é capaz de medir o fluxo dos elétrons, comumente chamado de corrente, que passa por ele. Após isso, o sensor analisa a diferença de potencial, mais comumente chamada de tesão, vendo qual a quantidade de elétrons que está o atravessando, pois como sabemos quanto maior a diferença de potencial maior é o fluxo de elétrons

- Tensão de corrente alternada

Precipuamente, a tensão/corrente alternada, diferente da corrente/tensão contínua, não possui polaridade fixa. Em suma, este é o motivo de receberem estes nomes, exatamente porque o nível de corrente/tensão alterna entre o positivo e o negativo repetidamente e não possui um valor fixo. Como por exemplo na imagem abaixo, na corrente temos Inicialmente com nível zero e aumenta gradativamente até o máximo positivo e inicia seu retorno ao zero formando um semiciclo, observe que facilmente podemos considerar este semiciclo como sendo metade de uma circunferência e temos então 180°.

Imagem do comportamento da corrente/tensão alternada

Observando a imagem acima temos um círculo trigonométrico na esquerda que ao ser circulado por uma espera em seu entorno podemos representar graficamente essas variações em um gráfico a direita. Estas variações são o comportamento da corrente alternada indo do positivo ao negativo. Em um circuito, a corrente alternada realiza alternância do seu valor indo do positivo para negativo e logo depois do negativo para positivo.

- Os componentes deste sensor são:

O sensor possui Bornes a parafuso para a entrada de energia AC, Pinagem para alimentação do circuito com energia DC, Pinos para saída de sinal e Potenciômetro para calibração da forma de onda na saída. Também possui um Transformador ZMPT101B.

Módulo Sensor de Tensão AC

 

Mãos à obra — Configurando um Módulo Sensor de Tensão AC

Componentes Necessários

 

ATENÇÃO! Cuidado ao manusear o rabicho e o sensor de tensão, pois estamos tratando de corrente alternada.

 

- Montando o projeto:

Primeiramente, conecte o rabicho no sensor de tensão AC com o auxílio de uma chave de fenda (Caso não tenha acesse o vida de silício), tome cuidado ao conectá-lo, A fase da tomada deve ir à entrada L escrita embaixo do sensor e O neutro da tomada deve ir na entrada N também escrito embaixo do sensor. Logo depois, conecte o GND do sensor de tensão no GND do arduino e o VCC do sensor no 5V do arduino. Em seguida, conecte o OUT do sensor no A0 do arduino. Como mostra o Diagrama abaixo.

Diagrama do Módulo Sensor de Tensão AC

- Programando o Arduino:

Primeiro verifique se o sensor NÃO está conectado na tomada. Agora vamos conectar o arduino no computador e abrir a IDE arduino, escreva o programa abaixo na IDE e compile o programa para o seu arduino. Em contrapartida, antes de carregar o programa, você precisa selecionar qual porta você deseja usar para fazer o carregamento do seu programa no Arduino (upload). Dentro do Arduino IDE, clique no menu Ferramentas (tools) e abra o submenu Porta(Port). Clique na porta que seu Arduino está conectado, tal como COM3 ou COM4. Geralmente aparece o nome da placa Arduino: “COM3 (Arduino/Genuino Uno)”.

int corrente_inst[300];
int zero = 0;
int diferenca = 0;
int leitura = 0;
int pino_sensor = A2;

float corrente_pico;
float corrente_eficaz;
float tensao_rms;
float tensao_pico;
float frequencia_sinal;

double maior_valor = 0;
double corrente_valor = 0;

unsigned long tempo_zero_inicio;  
unsigned long tempo_zero_final;  
unsigned long semi_periodo;  
unsigned long periodo_completo;  

void setup(){
  Serial.begin(9600);
  pinMode(pino_sensor, INPUT);
}

void loop(){
  maior_valor = 0;
  for(int i = 0; i <300; i++){
    corrente_inst[i] =  analogRead(pino_sensor);
  }
  for(int i = 0; i <300; i++){
    if(maior_valor < corrente_inst[i]){
      maior_valor = corrente_inst[i];
    }
  }
  Serial.print("Maior Valor");
  Serial.println(maior_valor);
  delay(5000);

  tensao_pico = map(maior_valor,500,661,0,313);
  tensao_rms = tensao_pico/1.4;
  
  Serial.print("Tensão de Rede Elétrica: ");
  Serial.println  (tensao_rms);
}

 

ATENÇÃO: não esqueça de definir a placa e a porta que esta utilizando para carregar o programa.

 

-Testando o funcionamento:

Enfim conecte o rabicho na tomada conforme as especificações anteriormente ditam (Fase no L e Neutro no N). Como resultado podemos visualizar o sensor funcionando através do monitor serial já que nos inicializamos ele com a função Serial.begin(9600) basta clicar na lupa no canto direito superior da IDE arduino como na imagem abaixo:

Monitor serial

Veja abaixo o circuito do sensor pronto:

Circuito do Módulo Sensor de Tensão AC

 

Entendendo a fundo:
Software

– Definições e variáveis utilizadas no projeto do Módulo Sensor de Tensão AC com arduino

Esta instrução define quais as variáveis que iremos utilizar durante nosso programas os tipos de variáveis e os valores ou pinos atribuídos a elas. Assim sendo, temos como primeira variável do tipo int a variável "corrente_inst" sendo esta um vetor devido ao "[300]". Em seguida temos como primeira variável do tipo float "corrente_pico" declarada sem atribuições a ela. Logo depois temos a declaração "maior_valor = 0" do tipo "double" a qual foi atribuído a ela o valor 0. Por fim, temos a declaração "tempo_zero_inicio" do tipo "unsigned long". Todas está variaveis de tipos diferentes foram declaradas assim, pois elas ocupam espaços diferentes na memoria. Algumas ocupam menos como do tipo "int" e outras mais como do tipo "unsigned long".

int corrente_inst[300];
int zero = 0;
int diferenca = 0;
int leitura = 0;
int pino_sensor = A2; //Define o pino A2 como pino do sensor

float corrente_pico;
float corrente_eficaz;
float tensao_rms;
float tensao_pico;
float frequencia_sinal;

double maior_valor = 0;
double corrente_valor = 0;

unsigned long tempo_zero_inicio;  
unsigned long tempo_zero_final;  
unsigned long semi_periodo;  
unsigned long periodo_completo;

– Função Setup – Definindo pinos do Módulo Sensor de Tensão AC com arduino

  A função setup é aquela que ira rodar apenas uma vez quando nosso programa for iniciado. Ela é do tipo void, ou seja, não tem retorno e também não tem parâmetros de entrada. Com a função Serial.begin(9600) inicializamos a comunicação serial e definimos uma velocidade para podermos visualizar o que está acontecendo no serial monitor. Já com a pinMode definimos que o pino do sensor, declarado anteriormente, é uma entrada.Ou seja, é ele que irá receber a informação do meio e atuar atravez de saidas.

void setup(){
  Serial.begin(9600);
  pinMode(pino_sensor, INPUT);
}

– Função Loop – Leitura do nosso sensor Módulo Sensor de Tensão AC com arduino e Estruturas de decisão

A função loop ao contrário da setup roda tudo que estiver dentro dela varias vezes em um loop constante até que seja reiniciado ou parado o programa. Antes de tudo temos a variável "maior_valor = 0" que já foi declarada anteriormente recebendo o valor 0. Depois, ao longo do código temos a estrutura de repetição for a qual foi inicializada com a variável "i" recebendo o valor 0. Logo depois, temos que a função irá se repetir e tudo o que está dentro dela irá ser executado até que "i" seja maior ou igual a 300. Enfim temos que será adicionado +1 a variável "i" toda vez que a execução da estrutura terminar. Já na primeira linha depois do for temos que o vetor "corrente_inst[i]" recebera a leitura analógica do pino do sensor a cada ciclo e armazenará em seus devidos endereços.

void loop(){
 maior_valor = 0;
 for(int i = 0; i <300; i++){
 corrente_inst[i] = analogRead(pino_sensor);
 }

Após a estrutura anterior, temos ela novamente e dentro dela uma estrutura if de decisão. Nesta ótica, temos que caso a condição entre os parenteses do if for verdadeira tudo o que está entre os colchetes será executado. Então, caso o valor da variável "maior_valor" for menor que o respectivo valor do vetor "corrente_inst[i]", sendo esta variavel a que armazena os valores que o sensor detectou do meio, a variável "maior_valor" vai receber o valor do vetor "corrente_inst[i]" até que o valor que esteja na variavel "maior_valor" seja o maior valor que o sensor detectou.

for(int i = 0; i <300; i++){
 if(maior_valor < corrente_inst[i]){
 maior_valor = corrente_inst[i];
  }
 }

Em seguida, como resultado as duas funções for anteriores temos a função Serial.print que irá imprimir no monitor serial o texto "Maior Valor" e depois o maior valor que o sensor conseguiu detectar e que está variável armazena. Logo em seguida temos o delay que interrompe o programa por 5000 milissegundos.

Serial.print("Maior Valor");
Serial.println(maior_valor);
delay(5000);

A variável "tensao_pico" vai receber o valor da função "map(maior_valor,500,661,0,313)". A função "map(maior_valor,500,661,0,313)" nos permite efetuar o mapeamento de um intervalo numérico em outro intervalo numérico desejado. Já a variável "tensao_rms" recebera o valor da razão entre a variável "tensao_pico" e o valor 1.4. Para finalizar o código irá imprimir no serial monitor o texto "Tensão de Rede Elétrica: " e depois o valor da variavel "tensao_rms" que é a tensão que queremos saber.

  tensao_pico = map(maior_valor,500,661,0,313);
  tensao_rms = tensao_pico/1.4;
  
  Serial.print("Tensão de Rede Elétrica: ");
  Serial.println  (tensao_rms);

Considerações finais:

Neste tutorial mostramos como funciona e como utilizar o Módulo Sensor de Tensão AC – ZMPT101B. Veja também o tutorial "MEDINDO TENSÃO AC COM TRANSFORMADOR" onde falamos mais a respeito da tensão de corrente alternada. Esperamos que você continue nos acompanhando e sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.


Sensor Touch Capacitivo TTP223B com arduino

Sensor Touch Capacitivo TTP223B:

No tutorial ensinaremos a usar o Sensor Touch Capacitivo com arduino. Este, por sua vez, é muito utilizado para mudar momentaneamente o estado(HIGH ou LOW) de um certo componente. Vamos visualizar como este pequeno componente funciona e desenvolver uma aplicação para ele.

kit robotica educacional com Arduino ESP ou Microbit

O  que é o Sensor Touch Capacitivo TTP223B?

Este componente como todos os outros sensores trabalha com os conceitos físicos.

- Funcionamento do Sensor Touch Capacitivo com arduino

Primeiramente, o Sensor Touch Capacitivo TTP223B funciona como um interruptor momentâneo, ou seja, consegue reconhecer toques e ao ser pressionado muda o estado logico do componente. Temos que este sensor pode ser utilizado em controle de lampadas, desktops e interruptores touch por meio de projetos com Raspberry, Arduino ou outros microcontroladores já que o formato dele com furos nas laterais permite uma fácil fixação e instalação.

- Campo Elétrico do Sensor Touch Capacitivo com arduino

O campo elétrico é um campo de força provocado pela ação de cargas elétricas. Em suma, sabemos que cargas elétricas colocadas num campo elétrico estão sujeitas à ação de forças elétricas, elas de atração e repulsão.

Imagem do campo elétrico de cargas elétricas

Sensores capacitivos são sensores que detectam qualquer tipo de massa. Seu funcionamento se dá por meio de incidência de um campo elétrico gerado por cargas elétricas em sua face, formando assim um capacitor. Ou seja, no sensor touch capacitivo contém cargas elétricas. Elas por sua vez geram um campo elétrico constante que permite que o sensor detecte qualquer presença de toque no local sinalizado resultando em, por exemplo, nível logico alto para a saída. Os pinos VCC(+) e GND(-) do serve justamente para que o sensor reconheça o toque, já o pino IO serve para informar ao microcontrolador que foi identificado toque ou não.

Os terminais deste sensor são:

  • VCC – Tensão de entrada, entre 3,3 a 5 volts
  • GND – O pino de O V do módulo
  • IO – Pino de saída digital

Módulo do Sensor Touch Capacitivo TTP223B

 

Mãos à obra — Configurando um Sensor Touch Capacitivo TTP223B

Componentes Necessários

- Montando o projeto:

Precipuamente, conectamos led na protoboard, na perna mais curta(-) conecte o resistor de 150 ohms e a perna mais longa(+) vai no pino digital 12. Logo depois, conectamos o resistor no negativo da protoboard. Em seguida, o GND do sensor será conectado também no GND da protoboard, e o VCC do sensor conectado no 5V do arduino. Logo após, conectemos o IO do sensor é conectado no pino digital 2, como mostra o diagrama abaixo:

Diagrama do Sensor Touch Capacitivo TTP223B

- Programando o Arduino:

Agora vamos conectar o arduino no computador e abrir a IDE arduino.  Escreva o programa abaixo na IDE e compile o programa para o seu arduino. Entretanto, antes de carregar o programa, você precisa selecionar qual porta você deseja usar para fazer o carregamento do seu programa no Arduino (upload). Dentro do Arduino IDE, clique no menu Ferramentas (tools) e abra o submenu Porta(Port). Clique na porta que seu Arduino está conectado, tal como COM3 ou COM4. Geralmente aparece o nome da placa Arduino: “COM3 (Arduino/Genuino Uno)”.

#define pinSensor  2 // Conexão sensor no pino digital 2 do Arduino
#define pinLed 12  // Conexão led no pino digital 12 do Arduino
 
void setup() {
  pinMode(pinSensor, INPUT); // Define o pino do sensor como ENTRADA do Arduino
  pinMode(pinLed, OUTPUT); // Define o pino do led como SAÍDA do Arduino
}
 
void loop() {
  if (digitalRead(pinSensor) == HIGH){ // Se o sensor foi tocado, leitura é HIGH
    digitalWrite(pinLed, HIGH); // Acende o led enquanto mantemos o dedo tocando o sensor
  }
  else{
    digitalWrite(pinLed,LOW); // O led é desligado
  } 
}

 

ATENÇÃO: não esqueça de definir a placa e a porta que esta utilizando para carregar o programa.

 

- Testando o funcionamento:

Como resultado, caso tudo estiver correto vemos que o resultado será igual à imagem abaixo:

Imagem do circuito do Sensor Touch Capacitivo TTP223B

Entendendo a fundo:

Software

— Definições e variáveis utilizadas no projeto do Sensor Touch Capacitivo com arduino

A instrução #define apenas associa as portas dos pinos do arduino a nomes referente aos componentes conectados nestes pinos. Temos então que a porta 2 estamos associando ao nome pinSensor, pois é onde será conectado o pino do sensor. Logo depois, temos que na porta 12 estamos associando-a ao nome pinLed, pois é onde o LED será conectado

#define pinSensor  2 // Conexão sensor no pino digital 2 do Arduino
#define pinLed 12  // Conexão led no pino digital 12 do Arduino

— Função Setup – Definindo pinos do Sensor Touch Capacitivo com arduino

A função setup é aquela função que colocamos para rodar apenas uma vez quando nosso programa for iniciado. Ela é do tipo void, ou seja, não tem retorno e também não tem parâmetros de entrada. No pinMode definimos que o pino do sensor será uma entrada, ou seja, irá receber a informação do meio e atuará através das saídas e o pino do led uma saída assim irá expressar a informação recebida pelo sensor realizando alguma tarefa que configuramos com o código em questão.

pinMode(pinSensor, INPUT); // Define o pino do sensor como ENTRADA do Arduino
pinMode(pinLed, OUTPUT); // Define o pino do led como SAÍDA do Arduino

— Função Loop – Leitura do nosso Sensor Touch Capacitivo com arduino e Estruturas de decisão

A função loop ao contrário da setup colocamos para roda tudo que estiver dentro dela varias vezes em um loop constante até que seja reiniciado ou parado o programa. A função if será executada caso a condição "digitalRead(pinSensor) == HIGH"(a leitura digital do pino do sensor seja nível logico alto) seja verdadeira, ou seja, o sensor detectou algum tipo de toc. Em contrapartida, caso a condição for falsa as operações dentro do else que serão compiladas, ou seja, o pino do LED receberá nível logico baixo e o LED apagará.

if (digitalRead(pinSensor) == HIGH){ // Se o sensor foi tocado, leitura é HIGH
   digitalWrite(pinLed, HIGH); // Acende o led enquanto mantemos o dedo tocando o sensor
 }
 else{
   digitalWrite(pinLed,LOW); // O led é desligado
 }

Hardware

- Circuitos integrados

São circuitos eletrônicos constituídos por um conjunto de componentes como: transístores, díodos, resistências e condensadores. Eles são todos fabricados num mesmo processo, sobre uma substância comum semicondutora de silício que se designa vulgarmente por chip. Em suma a sua função é realizar ações complexas que não tem como ser executadas por apenas um componente. Dessa forma, eles podem servir como temporizador, oscilador, amplificador, controlador e muito mais.

Imagem de exemplos de circuitos integrados

- Circuito integrado TTP223B

Este circuito integrado é utilizado para identificar a variação da capacitância na placa com grande precisão e sensibilidade.

Considerações finais:

Neste tutorial mostramos como funciona e como utilizar o Sensor Touch Capacitivo TTP223B. Veja também o tutorial "SENSOR CAPACITIVO COM ARDUINO", lá você irá entender de forma mais aprofundada o capacitor. Esperamos que você continue nos acompanhando e sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.


Medindo pressão/temperatura com Sensor barométrico BMP180

Sensor de Pressão e Temperatura BMP180: Analisando seu funcionamento

Neste tutorial utilizaremos o sensor barométrico com arduino. Este, no que lhe concerne, é muito utilizado para construção de estações meteorológicas e aperfeiçoamento de navegação GPS. Vamos visualizar como este pequeno componente funciona e desenvolver uma aplicação para ele.

kit robotica educacional com Arduino ESP ou Microbit

O  que é o módulo Sensor de Pressão e Temperatura BMP180?

o sensor barométrico com arduino como todos os outros sensores trabalha com os conceitos físicos.

- Funcionamento do sensor barométrico com arduino

O sensor  barométrico BMP180 tem como finalidade fazer a medição de pressão atmosférica e temperatura. Além disso, as aplicações com esse sensor são diversas como em projetos com Arduino ou outras plataformas microcontroladoras em que seja necessário fazer a medição de pressão atmosférica, temperatura e altitude.

— Temperatura, sensor barométrico com arduino

Primeiramente, a temperatura é a grandeza física que mede o grau de agitação térmica, ou energia cinética e vibracional dos átomos que constituem um corpo. Além disso, quanto mais agitadas as moléculas, maior será a sua temperatura. Então, o sensor barométrico justamente mede e identifica essas agitações e nos fornece a temperatura em que ele esta exposto. Uma das aplicações para o sensor é claramente na meteorologia, pois como observamos na imagem abaixo existem vários graus de agitações entre as moléculas de água.

Imagem dos vários estados atmosféricos

— Pressão, sensor barométrico com arduino

Pressão é a grandeza física a qual é podemos obtê-la pela razão entre a força aplicada e sua área de contato. Vale ressaltar que a unidade de pressão no sistema internacional de unidades é o pascal. Sendo assim, o sensor barométrico irá realizar o cálculo da razão entre força aplicada a ele por sua área de contato e nos informar o resultado de tal calculo

- Os terminais do sensor barométrico com arduino:

  • Vin(+) – Tensão de entrada, entre 3,3 a 5 volts
  • GND(-) – O pino de O V do módulo
  • SCL - I2C Serial Clock (SCL);
  • SDA - I2C Serial Data (SDA);

Módulo do sensor de Pressão e Temperatura BMP180

 

Mãos à obra — Configurando um sensor barométrico BMP180

Componentes Necessários

- Montando o projeto:

Precipuamente, conecte o sensor na protoboard. Logo depois, o pino Vin será conectado ao 5V do arduino, e o pino GND no GND do arduino. Logo após, conecte o pino SCL ao pino analógico A5 do Arduíno e o pino SCA  é conectado ao pino analógico A4, como mostra o diagrama abaixo:

Diagrama de montagem do sensor barométrico BMP180

- Biblioteca "Wire.h”:

Neste tutorial utilizaremos a biblioteca Wire.h a qual é responsável por conter as funções necessárias para gerenciar a comunicação entre os dispositivos através do protocolo I2C. Para baixar a biblioteca click no link e depois no quadrado verde escrito código.

- Biblioteca "Adafruit-BMP085”:

A outra biblioteca que utilizaremos será a Adafruit-BMP085. Logo Após o download do arquivo zip, abra a IDE e adicione a biblioteca em forma zip ao seu programa. Caso não entenda nada de biblioteca ou como prosseguir,veja o tutorial COMO INSTALAR UMA BIBLIOTECA NO ARDUINO IDE” no portal vida de silício.

- Programando o Arduino:

Neste instante vamos conectar o arduino no computador e abrir a IDE arduino. Desta forma iremos escrever o programa abaixo na IDE e compile o programa para o seu arduino.

Em contrapartida antes de carregar o programa, você precisa selecionar qual porta você deseja usar para fazer o carregamento do seu programa no Arduino (upload). Dentro do Arduino IDE, clique no menu Ferramentas (tools) e abra o submenu Porta(Port). Clique na porta que seu Arduino está conectado, tal como COM3 ou COM4. Geralmente aparece o nome da placa Arduino : “COM3 (Arduino/Genuino Uno)”.

#include <Wire.h> //INCLUSÃO DE BIBLIOTECA
#include <Adafruit_BMP085.h> //INCLUSÃO DE BIBLIOTECA
 
Adafruit_BMP085 bmp; //OBJETO DO TIPO Adafruit_BMP085 (I2C)
   
void setup(){
  Serial.begin(9600); //INICIALIZA A SERIAL
  if (!bmp.begin()){ //SE O SENSOR NÃO FOR INICIALIZADO, FAZ
  Serial.println("Sensor BMP180 não foi identificado! Verifique as conexões."); //IMPRIME O TEXTO NO MONITOR SERIAL
  while(1){} //SEMPRE ENTRE NO LOOP
  }
}
   
void loop(){
    
    Serial.print("Temperatura: "); //IMPRIME O TEXTO NO MONITOR SERIAL
    Serial.print(bmp.readTemperature()); //IMPRIME NO MONITOR SERIAL A TEMPERATURA
    Serial.println(" *C (Grau Celsius)"); //IMPRIME O TEXTO NO MONITOR SERIAL
        
    Serial.print("Pressão: "); //IMPRIME O TEXTO NO MONITOR SERIAL
    Serial.print(bmp.readPressure()); //IMPRIME NO MONITOR SERIAL A PRESSÃO
    Serial.println(" Pa (Pascal)"); //IMPRIME O TEXTO NO MONITOR SERIAL
     
    Serial.print("Altitude: "); //IMPRIME O TEXTO NO MONITOR SERIAL
    Serial.print(bmp.readAltitude()); //IMPRIME NO MONITOR SERIAL A ALTITUDE APROXIMADA
    Serial.println(" m (Metros)"); //IMPRIME O TEXTO NO MONITOR SERIAL
    
    Serial.print("Pressão a nível do mar (calculada): "); //IMPRIME O TEXTO NO MONITOR SERIAL
    Serial.print(bmp.readSealevelPressure()); //IMPRIME NO MONITOR SERIAL A PRESSÃO A NÍVEL DO MAR
    Serial.println(" Pa (Pascal)"); //IMPRIME O TEXTO NO MONITOR SERIAL

    Serial.print("Altitude real: "); //IMPRIME O TEXTO NO MONITOR SERIAL
    Serial.print(bmp.readAltitude(101500)); //IMPRIME NO MONITOR SERIAL A ALTITUDE REAL
    Serial.println(" m (Metros)"); //IMPRIME O TEXTO NO MONITOR SERIAL
     
    Serial.println("-----------------------------------"); //IMPRIME UMA LINHA NO MONITOR SERIAL
    delay(2000); //INTERVALO DE 2 SEGUNDOS
}

 

ATENÇÃO: não esqueça de definir a placa e a porta que esta utilizando para carregar o programa.

 

Imagem do circuito do sensor barométrico BMP180

- Testando o funcionamento:

Em seguida podemos visualizar o sensor funcionando através do monitor serial já que nos inicializamos ele com a função Serial.begin(9600). Basta clicar na lupa no canto direito superior da IDE arduino como na imagem abaixo:

Monitor serial

 

Entendendo a fundo:

Software

– Definições e variáveis utilizadas no projeto do sensor barométrico com arduino

Inicialmente a instrução #include <> serve para incluirmos bibliotecas ao nosso código, facilitando assim a escrita do mesmo, incluímos as bibliotecas Wire.h e Adafruit_BMP085.h. Logo depois, definimos um objeto do tipo Adafruit_BMP085 bmp.

#include <Wire.h> //INCLUSÃO DE BIBLIOTECA
#include <Adafruit_BMP085.h> //INCLUSÃO DE BIBLIOTECA 

Adafruit_BMP085 bmp; //OBJETO DO TIPO Adafruit_BMP085 (I2C)

– Função Setup – Definindo pinos do sensor barométrico com arduino

A função setup é aquela que ira rodar apenas uma vez quando nosso programa for iniciado. Ela é do tipo void, ou seja, não tem retorno e também não tem parâmetros de entrada. Em princípio, inicializamos a comunicação serial. Logo depois, temos uma estrutura de decisão if na qual a condição de que se o sensor não for inicializado "!bmp.begin()" for verdadeira ele executara imprimindo no serial monitor o texto "Sensor BMP180 não foi identificado! Verifique as conexões.". Então, en seguida temos a estrutura de repetição "while(1)" formando um loop.

Serial.begin(9600); //INICIALIZA A SERIAL
if (!bmp.begin()){ //SE O SENSOR NÃO FOR INICIALIZADO, FAZ
Serial.println("Sensor BMP180 não foi identificado! Verifique as conexões."); //IMPRIME O TEXTO NO MONITOR SERIAL
while(1){} //SEMPRE ENTRE NO LOOP

– Função Loop – Leitura do nosso sensor barométrico com arduino e Estruturas de decisão

A função loop ao contrário da setup roda tudo que estiver dentro dela varias vezes em um loop constante até que seja reiniciado ou parado o programa. A função serial.print imprime primeiro um texto em que esta entre coxetes e depois entre aspas e depois imprime a leitura feita no sensor. Neste instante, na função loop temos uma série de Serial.print a qual vai imprimir no monitor serial textos entre aspas, a temperatura, a altitude e pressão. A função "bmp.readTemperature()" serve justamente para ler a temperatura neste caso, no sensor e nos retornar o resultado, A função "bmp.readPressure()" serve para ler a pressão no sensor e nos retornar o resultado e A função "bmp.readAltitude()" serve para ler a altitude no sensor e nos retornar o resultado. Logo depois, irá imprimir no serial monitor o resultado. Temos no final uma espera de 2000 milissegundos de espera para depois executar toda a função loop novamente.

Serial.print("Temperatura: "); //IMPRIME O TEXTO NO MONITOR SERIAL
   Serial.print(bmp.readTemperature()); //IMPRIME NO MONITOR SERIAL A TEMPERATURA
   Serial.println(" *C (Grau Celsius)"); //IMPRIME O TEXTO NO MONITOR SERIAL
       
   Serial.print("Pressão: "); //IMPRIME O TEXTO NO MONITOR SERIAL
   Serial.print(bmp.readPressure()); //IMPRIME NO MONITOR SERIAL A PRESSÃO
   Serial.println(" Pa (Pascal)"); //IMPRIME O TEXTO NO MONITOR SERIAL
    
   Serial.print("Altitude: "); //IMPRIME O TEXTO NO MONITOR SERIAL
   Serial.print(bmp.readAltitude()); //IMPRIME NO MONITOR SERIAL A ALTITUDE APROXIMADA
   Serial.println(" m (Metros)"); //IMPRIME O TEXTO NO MONITOR SERIAL
   
   Serial.print("Pressão a nível do mar (calculada): "); //IMPRIME O TEXTO NO MONITOR SERIAL
   Serial.print(bmp.readSealevelPressure()); //IMPRIME NO MONITOR SERIAL A PRESSÃO A NÍVEL DO MAR
   Serial.println(" Pa (Pascal)"); //IMPRIME O TEXTO NO MONITOR SERIAL

   Serial.print("Altitude real: "); //IMPRIME O TEXTO NO MONITOR SERIAL
   Serial.print(bmp.readAltitude(101500)); //IMPRIME NO MONITOR SERIAL A ALTITUDE REAL
   Serial.println(" m (Metros)"); //IMPRIME O TEXTO NO MONITOR SERIAL
    
   Serial.println("-----------------------------------"); //IMPRIME UMA LINHA NO MONITOR SERIAL
   delay(2000); //INTERVALO DE 2 SEGUNDOS

Considerações finais:

Neste tutorial mostramos como funciona e como utilizar o Sensor de Pressão e Temperatura BMP180. Esperamos que você continue nos acompanhando e sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.


Sensor de Fluxo de Água: Medindo a vazão com Arduino

Sensor de Fluxo de Água: Medindo a vazão com Arduino

O Sensor de Fluxo de Água 1/2″ – YF-S201 é um dispositivo usado para medir o volume ou a massa em fluxo de um gás, ou líquido que passa por uma turbina. Neste tutorial aprenderemos como usá-lo e visualizaremos como este pequeno componente funciona.

kit robotica educacional com Arduino ESP ou Microbit

O  que é o Sensor de Fluxo de Água?

Este componente, como todos os outros sensores, trabalha com os conceitos físicos.

- Funcionamento

Portanto, o Sensor de Fluxo de Água possui como componentes o sensor hall, a vedação externa, a turbina, um imã e a carcaça para juntar todos esses componentes como na imagem abaixo:

Imagem interna do sensor de vazão de água

Como podemos observar quando a água flui através da entrada até a turbina, esta gira e a velocidade muda conforme o fluxo de água aumenta ou diminui e enquanto as turbinas estão exercendo seu trabalho, o imã e o sensor de efeito Hall realiza a leitura e emite um sinal de pulso, respectivamente. Mas como assim? Bom, a leitura da vazão funciona da seguinte forma. Quando a água passa pela turbina, ela gira e detecta a quantia de voltas dadas. A leitura desses dados se faz pelo ímã, o qual possui um polo norte e um polo sul, posicionado em uma das pás da turbina, e o sensor de efeito hall de forma paralela envia o sinal digital para o microcontrolador e por fim a água sai pelo outro lado.

Ps: Quanto maior a intensidade da água por minuto maior será a contagem de pulsos.

- Os terminais deste sensor de vazão são:

  • VCC(vermelho) – Tensão de entrada, entre 3,3 a 5 volts
  • GND(preto) – O pino de O V do módulo, conectado ao GND do Arduino ou fonte
  • Saída Digital(amarelo) – Pino de saída digital de contagem de pulsos por minuto
Módulo do sensor de vazão de água
Módulo do sensor de vazão de água

 

Mãos à obra — Configurando um Sensor de Fluxo de Água

Componentes Necessários

- Montando o projeto com Sensor de vazão de água

Primeiramente, conecte o terminal preto do sensor de fluxo no GND do Arduino e o terminal vermelho no 5V do Arduino e conecte o terminal amarelo será conectado no pino digital D2, como mostra o diagrama abaixo:

Diagrama do sensor de fluxo de água
Diagrama do sensor de fluxo de água

- Programando o Arduino para usar o Sensor de fluxo de água

Agora, que já montamos nosso projeto, vamos conectar o arduino no computador e abrir a IDE arduino.  Escreva o programa abaixo na IDE e compile o programa para o seu Arduino.

Para isso, antes de carregar o programa, você precisa selecionar qual porta você deseja usar para fazer o carregamento do seu programa no Arduino (upload). Dentro do Arduino IDE, clique no menu Ferramentas (tools) e abra o submenu Porta(Port). Em seguida, clique na porta que seu Arduino está conectado, tal como COM3 ou COM4. Geralmente aparece o nome da placa Arduino : “COM3 (Arduino/Genuino Uno)”.

int contaPulso; //Variável para a quantidade de pulsos

void setup(){
  Serial.begin(9600);
  pinMode(2,INPUT);
  attachInterrupt(0,incpulso,RISING); //Configura o pino 2(Interrupção 0)interrupção
  
}


void loop(){
  
sei(); //Habilita interrupção
delay(1000);
cli(); //Desablilita interrupção
if(contaPulso>0){
  Serial.print("Contagem de Pulsos");
  Serial.println(contaPulso);
}
else{
  Serial.println("Sem pulsos");
}
contaPulso = 0;
}

void incpulso(){
  contaPulso++; //Incrementa a variável de pulsos
}

 

- Testando o funcionamento do Sensor de vazão de água

Enfim, caso tudo estiver correto o resultado será igual à imagem abaixo. 

Imagem do circuito do sensor de fluxo de água
Imagem do circuito do sensor de fluxo de água

 

Dessa forma, visualizamos o sensor funcionando através do monitor serial já que nos inicializamos ele com a função Serial.begin(9600) basta clicar na lupa no canto direito superior da IDE Arduino como na imagem abaixo:

Monitor serial coletando dados do sensor de vazão
Monitor serial coletando dados do sensor de vazão

 

Entendendo a fundo

Software

– Definições e variáveis utilizadas no projeto

Primeiramente, nesta instrução declaramos uma variável para podermos usá-la em nosso programa. Neste caso, a variável que declaramos é do tipo int, ou seja, possui dois bytes de memória disponível para ela.

int contaPulso; //Variável para a quantidade de pulsos

– Função Setup – Definindo pinos

Em seguida. a função setup é aquela que roda apenas uma vez no início do programa. Está função é do tipo void, ou seja, não tem retorno e também não tem parâmetros de entrada.

Nesta função, Serial.begin inicializa a comunicação serial da placa arduino com o computador. Em seguida, o comando pinMode define o que será entrada e o que será saída na nossa programação. E por fim o comando attachInterrupt define o pino de leitura como interrupção do Arduino no programa. 

Serial.begin(9600);
pinMode(2,INPUT);
attachInterrupt(0,incpulso,RISING); //Configura o pino 2(Interrupção 0)interrupção

– Função Loop – Leitura do nosso Sensor de Fluxo de Água e Estruturas de decisão

Enfim, a função loop ao contrário da setup roda tudo que estiver dentro dela varias vezes em um loop constante até que seja reiniciado ou parado o programa. A função if define uma condição para que o Arduino execute as funções dentro dele, caso a condição for verdadeira, ou seja, a variável declarada anteriormente tiver o valor maior que 0, o Arduino executa tudo o que esta nos colchetes do if. Senso assim, irá imprimir no serial monitor o texto "Contagem de Pulsos" e depois o valor que está atribuído a variável contaPulso. Entretanto, caso a condição do if seja falsa o que esta nos colchetes do else que será executado, o seja, irá imprimir no serial monitor o texto "Sem pulsos". Logo depois, a variável contaPulso recebe o valor 0. Toda vez que houver interrupção, ou seja, houver a mudança de estado de 0V (0) para 5V(1) a função void incpulso será executada, já que na função attachInterrupt(0,incpulso,RISING) nos definimos isso. Assim será adicionado +1 a variável contaPulso.

sei(); //Habilita interrupção
delay(1000);
cli(); //Desablilita interrupção
if(contaPulso>0){
  Serial.print("Contagem de Pulsos");
  Serial.println(contaPulso);
}
else{
  Serial.println("Sem pulsos");
}
contaPulso = 0;
}

void incpulso(){
  contaPulso++; //Incrementa a variável de pulsos

Considerações finais:

Por fim, neste tutorial mostramos como funciona e como utilizar o sensor de fluxo de água. Esperamos que você continue nos acompanhando e sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.


Módulo Sensor de Gesto e RGB APDS9960 com Arduino

Módulo sensor de gesto e RGB APDS9960: Analisando seu funcionamento

Neste tutorial utilizaremos o sensor de gesto e RGB APDS9960 com arduino. Este, no que lhe concerne, é utilizado para fazer a medição de luz, cor ambiente, detecção de proximidade e detecção de gestos. Visualizaremos como este pequeno componente funciona e desenvolveremos uma aplicação para ele.

kit robotica educacional com Arduino ESP ou Microbit

O  que é o Módulo Sensor de Gesto e RGB APDS9960?

Este módulo possui o Sensor APDS-9960. Ele mede na parte de cor RGB a intensidade da luminosidade do ambiente, cor ambiente. Além disso, ele também na parte de sensor de gestos detecta nível de proximidade e sentido de gestos (direita, esquerda, alto e baixo) o que permite que um computador, robô ou plataforma microcontroladora possa ser controlado por ele.

- Funcionamento

Primeiramente, o sensor utiliza barramento I2C para utilização (pinos SDA e SCL), possui pino de interrupção (INT) para transferir os dados de proximidade de gesto e um pino adicional (VL) para LED infravermelho além de ser utilizado em projetos  com diversos tipos de Arduino como o NodeMCU ESP8266, pequenos computadores como o Raspberry ou qualquer outra plataforma microcontroladora. Ao mover o sensor, ele consegue identificar o movimento e direção por meio dos gestos que realizamos com ele e nos informar.

- Movimento

De início, os controladores por gestos são muito utilizados hoje em nossos smartphones. Temos então que antes de serem inseridos na sociedade havia a necessidade de ter botões nas telas dos smartphones, entretanto com a chegado desta tecnologia, agora apenas temos que arrastar para o lado quando queremos desbloquear ou mudar de aba no smartphone.

Imagem do sensor de gesto em Smartphones

Aliás, vemos que os sensores de gestos como mostra a imagem abaixo são capazes de imitar perfeitamente os movimentos que fazemos com nossas mãos, por exemplo, em outros objetos.

Imagem do sensor de gesto imitando movimentos

- Os terminais deste sensor são:

  • INT - pino de interrupção
  • VCC - Tensão de entrada 3.3V
  • GND - O pino de O V do módulo, conectado ao GND do Arduino ou fonte
  • SDA  - Pino utilizado pelo barramento I2C
  • SCL - Pino utilizado pelo barramento I2C
  • VL - Pino adicional para LED infravermelho.

Sensor de Gesto e RGB APDS9960

 

Mãos à obra — Configurando um sensor de gesto

Componentes Necessários

- Montando o projeto:

Primeiramente, o sensor da vida de silício vem sem os pinos Headers soldados, então antes de iniciar a montagem vamos soldá-los ao módulo, lembrando que soldamos ao módulo a parte de menor comprimento. Após a soldagem conectaremos o modulo sensor de gesto na protoboard e conectar o VCC do módulo no 3.3V do arduino (Cuidado para não conectar no 5V ou pode danificar o módulo). Logo depois, vamos conectar o GND do módulo ao GND do arduino, já o SDA do módulo conectaremos no pino analógico A4 do arduino e o SCL do módulo conectamos no pino analógico A5 do arduino. Observe o diagrama de montagem abaixo:

Diagrama de montagem do sensor de gesto e RGB APDS9960

 — Biblioteca <Adafruit_APDS9960.h>:

A biblioteca que utilizaremos será a Adafruit_APDS9960.h . Esta biblioteca nos permitirá configurar o sensor com função que já estão dentro dela e apenas precisaremos utilizá-las em nosso programa. Após o download do arquivo zip, abra a IDE e adicione a biblioteca em forma zip ao seu programa. Caso não entenda nada de biblioteca ou como prosseguir,veja o tutorial  COMO INSTALAR UMA BIBLIOTECA NO ARDUINO IDE” no portal vida de silício.

- Programando o Arduino:

Agora vamos conectar o arduino no computador e abrir a IDE arduino.  Escreva o programa abaixo na IDE e compile o programa para o seu arduino.

Entretando, antes de carregar o programa, precisamos selecionar qual porta desejamos usar para fazer o carregamento do nosso programa no Arduino (upload). Dentro do Arduino IDE, clique no menu Ferramentas (tools) e abra o submenu Porta(Port). Clique na porta que seu Arduino está conectado, tal como COM3 ou COM4. Geralmente aparece o nome da placa Arduino : “COM3 (Arduino/Genuino Uno)”.

#include <Adafruit_APDS9960.h> //INCLUSÃO DE BIBLIOTECA
Adafruit_APDS9960 apds; //OBJETO DO TIPO Adafruit_APDS9960 (I2C)

void setup() {
  Serial.begin(9600); //INICIALIZA A SERIAL
  
  if(!apds.begin()){ //SE O SENSOR NÃO FOR INICIALIZADO, FAZ
    Serial.println("Falha ao inicializar o dispositivo. Verifique as conexões!"); //IMPRIME O TEXTO NO MONITOR SERIAL
  }//SENÃO, FAZ
  else Serial.println("Dispositivo inicializado!"); //IMPRIME O TEXTO NO MONITOR SERIAL

  //O MODO DETECÇÃO DE GESTO SERÁ HABILITADO QUANDO O SENSOR DETECTAR ALGO PRÓXIMO DO MÓDULO (APROXIME SEU DEDO E AFASTE)
  apds.enableProximity(true);
  apds.enableGesture(true);
}

void loop() {
    uint8_t gesture = apds.readGesture(); //FAZ A LEITURA DA DIREÇÃO DO GESTO
    if(gesture == APDS9960_DOWN) Serial.println("↓"); //SE DETECTAR GESTO (DE CIMA PARA BAIXO), IMPRIME O SÍMBOLO NO MONITOR SERIAL
    if(gesture == APDS9960_UP) Serial.println("↑"); //SE DETECTAR GESTO (DE BAIXO PARA CIMA), IMPRIME O SÍMBOLO NO MONITOR SERIAL
    if(gesture == APDS9960_LEFT) Serial.println("←"); //SE DETECTAR GESTO (DA DIREITA PARA A ESQUERDA), IMPRIME O SÍMBOLO NO MONITOR SERIAL
    if(gesture == APDS9960_RIGHT) Serial.println("→"); //SE DETECTAR GESTO (DA ESQUERDA PARA A DIREITA), IMPRIME O SÍMBOLO NO MONITOR SERIAL
}

- Testando o funcionamento:

Em fim, caso tudo estiver correto o resultado será igual à imagem abaixo. Temos que o sensor de gestos ficará identificando os seus movimentos ao passar com a mão encima dele e mostrará no serial monitor a direção.

Imagem do serial monitor

ATENÇÃO: não esqueça de definir a placa e a porta que esta utilizando para carregar o programa.

Imagem do circuito do Sensor de Gestos

 

Entendendo a fundo:

Software

– Definições e variáveis utilizadas no projeto do sensor de gesto e RGB APDS9960 com arduino

Precipuamente, a instrução inclui <> permitirá que adicionemos a biblioteca Adafruit_APDS9960.h ao nosso programa. Assim podemos utilizar suas funcionalidades em nosso algoritmo.

#include <Adafruit_APDS9960.h> //INCLUSÃO DE BIBLIOTECA

– Função Setup – Definindo pinos do sensor de gesto e RGB APDS9960 com arduino

Vemos que a função setup é aquela que ira rodar apenas uma vez quando nosso programa for iniciado. Além disso, ela é do tipo void, ou seja, não tem retorno e também não tem parâmetros de entrada. Em princípio, temos a função Serial.begin que irá inicializar a comunicação serial para podermos visualizar os resultados nela. Temos que na função if, antes de mais nada, possui uma condição entre parenteses "!apds.begin()" a qual se for verdadeira tudo o que tiver entre os colchetes do if será executado, ou seja, será impresso no monitor serial o texto "Falha ao inicializar o dispositivo. Verifique as conexões!". Em seguida, podemos observar que caso a condição seja falsa o comando else será executado e imprimirá "Dispositivo inicializado!" no serial monitor. As funções " apds.enableProximity(true)" e "apds.enableGesture(true)" da biblioteca serão executadas como parâmetro "true".

Serial.begin(9600); //INICIALIZA A SERIAL
 
 if(!apds.begin()){ //SE O SENSOR NÃO FOR INICIALIZADO, FAZ
   Serial.println("Falha ao inicializar o dispositivo. Verifique as conexões!"); //IMPRIME O TEXTO NO MONITOR SERIAL
 }//SENÃO, FAZ
 else Serial.println("Dispositivo inicializado!"); //IMPRIME O TEXTO NO MONITOR SERIAL

 //O MODO DETECÇÃO DE GESTO SERÁ HABILITADO QUANDO O SENSOR DETECTAR ALGO PRÓXIMO DO MÓDULO (APROXIME SEU DEDO E AFASTE)
 apds.enableProximity(true);
 apds.enableGesture(true);

– Função Loop – Leitura do nosso sensor de gesto e RGB APDS9960 com arduino e Estruturas de decisão

A função loop ao contrário da setup roda tudo que estiver dentro dela varias vezes em um loop constante até que seja reiniciado ou parado o programa. Primeiramente, temos a leitura das direções do sensor "uint8_t gesture = apds.readGesture()" com a função declarada no void setup. Logo depois, temos uma série de comando if's, que por sua vez, caso forem verdadeiras irão imprimir no serial monitor os textos em aspas. No entando, seguindo a lógica apenas uma pode ser verdadeira de cada vez. Similarmente, temos que a primeira condição "gesture == APDS9960_DOWN" que será verdadeira caso a direção for para baixo, a função "Serial.println("↓")" será executada. Na mesma perspectiva, caso a condição "gesture == APDS9960_UP" que, por assim dizer, detectou gesto para cima, for verdadeira a função "Serial.println("↑")" será executada e assim por diante.

uint8_t gesture = apds.readGesture(); //FAZ A LEITURA DA DIREÇÃO DO GESTO
   if(gesture == APDS9960_DOWN) Serial.println("↓"); //SE DETECTAR GESTO (DE CIMA PARA BAIXO), IMPRIME O SÍMBOLO NO MONITOR SERIAL
   if(gesture == APDS9960_UP) Serial.println("↑"); //SE DETECTAR GESTO (DE BAIXO PARA CIMA), IMPRIME O SÍMBOLO NO MONITOR SERIAL
   if(gesture == APDS9960_LEFT) Serial.println("←"); //SE DETECTAR GESTO (DA DIREITA PARA A ESQUERDA), IMPRIME O SÍMBOLO NO MONITOR SERIAL
   if(gesture == APDS9960_RIGHT) Serial.println("→"); //SE DETECTAR GESTO (DA ESQUERDA PARA A DIREITA), IMPRIME O SÍMBOLO NO MONITOR SERIAL

Hardware

- Cor RGB - APDS9960:

A Cor RGB digital APDS-9960 é a parte do sensor que permite identificar cores e intensidades de luz em um ambiente.

 

Considerações finais:

Neste tutorial mostramos como funciona e como utilizar o sensor de gesto e RGB APDS9960. Esperamos que você continue nos acompanhando e sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.


Como descobrir o endereço do módulo Bússola Digital / Magnetômetro Três Eixos – GY-273

Como descobrir o endereço do Módulo Bússola Digital / Magnetômetro Três Eixos – GY-273

Neste tutorial descobriremos como achar o endereço de do módulo bússola digital com arduino, mais especificamente do módulo Bússola Digital / Magnetômetro Três Eixos – GY-273.

kit robotica educacional com Arduino ESP ou Microbit

O  que é o módulo Bússola Digital / Magnetômetro Três Eixos – GY-273?

O Módulo Bússola Eletrônica 3 Eixos Campo Magnético HMC5883L é um dispositivo de Bússola e Magnetômetro equipado com o chip HMC5883L.

- Funcionamento

Precipuamente o Magnetômetro consegue detectar onde fica o norte geográfico magnético da Terra através de um sensor magnético de 3 eixos, fornecendo na saída informações sobre os eixos X, Y e Z. Não obstante, utiliza o protocolo de comunicação I2C. Ademais, para mais informações sobre o chip HMC5883L e o sensor acesse o (datasheet) e visualize a sua composição.

- Circuito integrado

O chip HMC5883L é um circuito integrado é por isso é responsável por realizar tarefa complexas que não poderiam ser executadas por apenas um componente.

Circuitos Integrados

- Campo magnético

O sensor Magnetômetro utiliza do campo magnético da terra para o seu funcionamento com o fim de identificar a sua posição em relação aos eixos X, Y e Z e em relação ao norte da terra onde a bússola como já sabemos sempre aponta. Além disso, o campo magnético faz com que à terra funcione como um ímã gigante já que possui um norte e um sul e as linhas do campo vão de um para o outro. Aliás, o Polo norte é na verdade o sul magnético e o polo sul o norte magnético.

- Os terminais deste sensor são:

  • VCC(+) – Tensão de entrada, entre 3,3 a 5 volts
  • GND(-) – O pino de O V do módulo, conectado ao GND do Arduino ou fonte
  • Pino SCL - I2C Serial Clock
  • Pino SDA - I2C Serial Data

Módulo Bússola Digital / Magnetômetro

Mãos à obra — Configurando uma Bússola Digital

Componentes Necessários

- Montando o projeto:

Primeiramente conecte o VCC do módulo no 3.3V do arduino e logo após conecte o GND do módulo no GND do arduino. Depois disso conecte o SCL do módulo no pino A5 e o SDA no pino A4 do arduino desta forma temos como mostra o diagrama abaixo:

Diagrama de montagem do Módulo Bússola Digital / Magnetômetro

- Biblioteca  <wire.h>:

A biblioteca que utilizaremos será a Wire.h. Após o download do arquivo zip, abra a IDE e adicione a biblioteca em forma zip ao seu programa. Não obstante, caso não entenda nada de biblioteca ou como prosseguir, veja o tutorial  COMO INSTALAR UMA BIBLIOTECA NO ARDUINO IDE” no portal vida de silício.

- Programando o Arduino:

Antes de mais nada vamos conectar o arduino no computador e abrir a IDE arduino.  Escreva o programa abaixo na IDE e compile o programa para o seu arduino.

Antes de carregar o programa, você precisa selecionar qual porta você deseja usar para fazer o carregamento do seu programa no Arduino (upload). Dentro do Arduino IDE, clique no menu Ferramentas (tools) e abra o submenu Porta(Port). Clique na porta que seu Arduino está conectado, tal como COM3 ou COM4. Geralmente aparece o nome da placa Arduino : “COM3 (Arduino/Genuino Uno)”.

#include <Wire.h>
 
void setup()
{
  Wire.begin();//Inicie a biblioteca Wire
  Serial.begin(9600);//Inicie a Comunicação Serial
  while (!Serial);             //Espera pelo serial monitor
  Serial.println("\nI2C Scanner");
}
 
void loop()
{
  byte error, address;
  int nDevices;
  Serial.println("Scanning...");
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknow error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(5000);           // wait 5 seconds for next scan
}

Se as conexões estiverem corretas, ao abrir o serial monitor você terá a seguinte tela, mostrando o endereço do dispositivo detectado.

Imagem do serial monitor

O I2C Scanner é um programa que serve não apenas para este módulo, mas também para qualquer outro dispositivo I2C conectado ao barramento. Tenha este programa sempre à mão para descobrir o endereço do dispositivo ou simplesmente para verificar se ele está se comunicando com o Arduino, podemos ver isto no tutorial do Sensor de Movimento de cabeça, onde é utilizamos o mesmo programa.

Imagem do circuito da Bússola Digital

Entendendo a fundo:

Software

– Definições e variáveis utilizadas no projeto do módulo bússola digital com arduino

A instrução #include<> serve para incluir bibliotecas no algoritmo.

#include <Wire.h>

– Função Setup – Definindo pinos do módulo bússola digital com arduino

A função setup é aquela que ira rodar apenas uma vez quando nosso programa for iniciado. Ela é do tipo void, ou seja, não tem retorno e também não tem parâmetros de entrada. A função "Wire.begin()" Inicializa a biblioteca Wire. Semelhantemente a função Serial.begin inicia a comunicação serial e define uma velocidade para ela. A função "while (!Serial)" Espera pelo serial monitor e a função "Serial.println" imprime no serial monitor o texto "I2C Scanner".

void setup() { 
 Wire.begin();//Inicie a biblioteca Wire
 Serial.begin(9600);//Inicie a Comunicação Serial
 while (!Serial); //Espera pelo serial monitor
 Serial.println("\nI2C Scanner");
 }

– Função Loop – Leitura do nossa módulo bússola digital com arduino e Estruturas de decisão

Em primeira instância a função loop ao contrário da setup roda tudo que estiver dentro dela varias vezes em um loop constante até que seja reiniciado ou parado o programa. Temos primeiro a declaração das variáveis do tipo byte "error" e "address" e a variável do tipo int "nDevices". Logo depois imprime no serial monitor o texto "Scanning..." e atribui a variável nDevices o valor 0.

void loop() { 
 byte error, address;
 int nDevices;
 Serial.println("Scanning...");
 nDevices = 0;

Posteriormente temos a estrutura de repetição for onde atribui a variável "address" o valor 1, depois coloca a condição"address < 127" de que enquanto a variável "address" for menor que 127 tudo que estiver entre os colchetes será executado e a seguir a cada ciclo irá ser adicionado +1 a variável "address" no comando "address++". Lodo depois, dentro do for temos de incio por assim dizer o comando" Wire.beginTransmission(address)" que inicia a comunicação com START e referência o dispositivo escravo address. Já o comando "error = Wire.endTransmission()" atribua a variável error um valor recebido pela função.

for(address = 1; address < 127; address++ ) {
 Wire.beginTransmission(address);
 error = Wire.endTransmission();

- IF's e Else's do nossa módulo bússola digital com arduino

Similarmente dentro do for temos a estrutura de decisão if que será executada caso a condição de a variável error for igual a 0 ser verdadeira. Assim sendo, temos a função Serial.print que executará dentro do if e imprimirá o texto "I2C device found at address 0x" no serial monitor. Logo após temos outra estrutura de decisão dentro da anterior, onde caso a condição da variável address ser menor que 16 for verdadeira será executada e em seguida imprimira no serial monitor o texto "0", depois o endereço hexadecimal da bússola e depois o texto " !" e adicionará a variável nDevice +1.

if (error == 0) {
 Serial.print("I2C device found at address 0x");
 if (address<16) Serial.print("0");
 Serial.print(address,HEX);
 Serial.println(" !");
 nDevices++;
 }

Se a variável error for igual a 4 a estrutura else if será executada e não a if anterior, assim sendo a variável nDevices não receberá +1 e será escrito no monitor serial o texto "Unknow error at address 0x". Em contrapartida, semelhantemente ao if anterior caso a variável address for menor que 16  será impresso no serial monitor o texto "0" e logo depois o endereço hexadecimal do módulo.

else if (error==4) {
 Serial.print("Unknow error at address 0x");
 if (address<16){
  Serial.print("0");
  Serial.println(address,HEX);
   }
 }

Na estrutura if abaixo se a variável nDevices for igual a 0 será impresso no monitor serial o texto "No I2C devices found". Entretando, caso o nDevices não for igual a 0 o else será executado, então será impresso no serial monitor o texto "done" e esperará 5000 milissegundos para executar a próxima linha.

 
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
  delay(5000);           // wait 5 seconds for next scan
}

Considerações finais:

Neste tutorial mostramos como funciona e como ver o endereço do Módulo Bússola Eletrônica 3 Eixos Campo Magnético HMC5883L. Esperamos que você continue nos acompanhando e sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.


Sensor de Vibração SW-420 com arduino

Sensor de Vibrações: Detectando Oscilações Sonoras

Neste tutorial utilizaremos o sensor de vibração com arduino. Este, no que lhe concerne, é muito utilizado para alarmes e detecção de vibrações do meio. Vamos visualizar como o pequeno componente funciona e desenvolver uma aplicação para ele.

kit robotica educacional com Arduino ESP ou Microbit

O  que é o módulo sensor de vibração?

O sensor como todos os outros trabalha com os conceitos físicos.

- Funcionamento

Precipuamente, o sensor possui uma esfera de metal solta dentro de um cilindro acoplado a ele, quando este sensor sente vibrações a esfera se movimenta(Vibra) desfazendo o contato com os dois terminais que vão para o sensor. Além disso, enquanto o sensor não está detectando vibrações, a saída fica em nível logico baixo, somente quando o sensor detecta um certo nível de vibração regulado manualmente no trimpot a saída fica em nível logico alto.  Uma das inúmeras aplicações para este sensor é no monitoramento de condições de um determinado equipamento, ou seja, mede as vibrações de um equipamento onde quando é detectado um nível de vibração anormal logo é informado o possível defeito.

— Vibração

As vibrações ou oscilações são movimentos que se repetem de forma contínua ou não dado um intervalo de tempo. As direções das ondas de vibração são com toda certeza longitudinais e transversais. Ela está em toda nossa volta já que tudo o que é material está em constante vibração

Onda transversal

Por analogia podemos observar as moléculas de água as quais entre seus 3 estados o mais agitado, que estão vibrando com mais intensidade é o gasoso.

Molécula vibrando 

- Frequência

A frequência está relacionada com a vibração. Ela é a quantidade de vezes que ocorre a vibração completa dado um intervalo de tempo de 1 segundo. Podemos usar as figuras de Chladni que dependendo da frequência da vibração sobre o composto em cima da tela preta temos formas diferentes.

Figuras de Chladni

No sensor de vibração a frequência é fundamental para seu funcionamento, pois sem ela não seria possível identificar as vibrações irregulares de um equipamento.

- Os terminais deste sensor são:

  • VCC(+) – Tensão de entrada, entre 3,3 a 5 volts
  • GND(-) – O pino de O V do módulo conectado ao GND do Arduino ou fonte
  • Saída Digital(D0)– Pino de saída digital (retorna HIGH ou LOW)

Módulo do sensor de vibrações

Mãos à obra — Configurando um Sensor de Vibrações

Componentes Necessários

 

- Montando o projeto:

Primeiramente conecte o LED e o resistor na protoboard.  Logo depois, a perna maior do LED será conectada no resistor e a menor no negativo da  protoboard. Já a outra extremidade do resistor será conectada ao pino 12 do arduino. Em seguida conecte o VCC do sensor de vibração no 5V do arduino e o GND do sensor no negativo da protoboard. A saida digital(D0) do sensor será conectada ao pino 5 do arduino. Depois de ter realizado os passos anteriores conectem o GND do arduino no negativo da protoboard. Veja abaixo o circuito do sensor com mais detalhes:

Diagrama de montagem do sensor de vibração

- Programando o Arduino:

Vamos agora conectar o arduino no computador e abrir a IDE arduino.  Escreva o programa abaixo na IDE e compile o programa para o seu arduino.

Antes de carregar o programa, você precisa selecionar qual porta você deseja usar para fazer o carregamento do seu programa no Arduino (upload). Dentro do Arduino IDE, clique no menu Ferramentas (tools) e abra o submenu Porta(Port). Clique na porta que seu Arduino está conectado, tal como COM3 ou COM4. Geralmente aparece o nome da placa Arduino : “COM3 (Arduino/Genuino Uno)”.

#define pinoLed 12 //Pino digital utilizado pelo led
#define pinoSensor 5 //Pino digital utilizado pelo sensor

int ler = 0; // Declaração da Variavel "ler"
void setup(){
  Serial.begin(9600);
  pinMode(pinoSensor, INPUT); //Define o pino como entrada
  pinMode(pinoLed, OUTPUT); //Define o pino como saída
}

void loop(){
  ler = digitalRead(pinoSensor);// A varialvel "ler" recebe o nivel logico lido no pino do sensor de vibrações
  Serial.println(ler);// Printa no monitor serial o valor atribuido a variavel "ler"
  delay(150);// Espera 150 milisegundos
  if(ler == HIGH){ //Se a leitura do pino for igual a low, executa
      digitalWrite(pinoLed, HIGH); //ACENDE O LED
  }else//Senão, executa
  {
    digitalWrite(pinoLed, LOW); //APAGA O LED
  }
}

- Testando o funcionamento:

Caso tudo estiver correto o resultado será igual à imagem abaixo em que o sensor de vibração ficará constante em nível lógico baixo(LOW) enquanto ele não detectar vibração, por exemplo. E ao detectar vibração o nível lógico da saida vai para alto (HIGH).

 

ATENÇÃO: não esqueça de definir a placa e a porta que esta utilizando para carregar o programa.

 

Imagem do circuito do sensor de vibração funcionando

Como resultado, ao detectar uma quantidade de vibração pré-determinada ajustando a sensibilidade no potenciômetro(trimpot) o LED acenderá, tente utilizar uma chave de fenda ou algo do tipo e bata com ela em uma superfície rigida , certifique-se se o sensor esta perto para detectar as vibrações.

Potenciômetro do sensor para a regulação de sensibilidade

Podemos visualizar o sensor funcionando através do monitor serial já que inicializamos ele com a função Serial.begin(9600) basta clicar na lupa no canto direito superior da IDE arduino como na imagem abaixo:

Monitor serial

 

Entendendo a fundo:
Software

— Definições e variáveis utilizadas no projeto do sensor de vibração com arduino

A instrução #define apenas associa as portas dos pinos do arduino a nomes referente aos componentes conectados nestes pinos. O pino 12 está definido como pinoLed e o pino 5 está como pinoSensor. Logo depois as variáveis declaradas com o tipo int são atribuídas a elas valores escolhidos pelo programador. A variável ler do tipo int foi atribuído o valor 0.

#define pinoLed 12 //PINO DIGITAL UTILIZADO PELO LED
#define pinoSensor 5 //PINO DIGITAL UTILIZADO PELO SENSOR
int ler = 0; // Declaração da Variavel "ler"

— Função Setup – Definindo pinos do sensor de vibração com arduino

A função setup é aquela que ira rodar apenas uma vez quando nosso programa for iniciado. Ela é do tipo void, ou seja, não tem retorno e também não tem parâmetros de entrada e a função pinMode dentro da setup define o que será entrada e o que sera saída na nossa programação. A função serial.begin está inicializando a comunicação serial. Já a função pinMode esta definindo o pino 12 que está como "pinoSensor" como entrada, ou seja, é neste pino que o sensor atuará após receber vibrações do meio e converter em sinais elétricos e o pino 5 como saída que expressará o resultado que queremos com o código e o sensor.

void setup(){
  Serial.begin(9600);
  pinMode(pinoSensor, INPUT); //DEFINE O PINO COMO ENTRADA
  pinMode(pinoLed, OUTPUT); //DEFINE O PINO COMO SAÍDA
}

— Função Loop – Leitura do nosso sensor de vibração com arduino e Estruturas de decisão

A função loop ao contrário da setup roda tudo que estiver dentro dela varias vezes em um loop constante até que seja reiniciado ou parado o programa. Na variável "ler" será atribuído a leitura das vibrações do pino digital 5 onde esta o sensor. No monitor serial será impresso o valor atribuído a variável ler, assim saberemos se o sensor identificou uma vibração fora do comum. A função daley irá espera 150 milisegundos para  imprimir novamente o que o sensor está lendo.

void loop(){  
 ler = digitalRead(pinoSensor);// A varialvel "ler" recebe o nivel logico lido no pino do sensor de vibrações  
 Serial.println(ler);// Printa no monitor serial o valor atribuido a variavel "ler"  
 delay(150);// Espera 150 milisegundos

Já a função digitalWrite irá escrever no pino digital 12 onde está o LED (declarado anteriormente como saída), nível logico alto caso a condição no if seja verdadeira, ou seja, a variável ler ter recebido nive logico alto, assim o led irá acender indicando que o sensor identificou uma vibração incomum. Se a condição do if for falsa será executado o que estiver dentro dos colchetes do else, ou seja, o led irá apagar.

  if(ler == HIGH){ //SE A LEITURA DO PINO FOR IGUAL A LOW, FAZ    
   digitalWrite(pinoLed, HIGH); //ACENDE O LED  
 }else//SENÃO, FAZ 
  { digitalWrite(pinoLed, LOW); //APAGA O LED 
 } 
}

 

Hardware

Elemento de vibração do sensor:

É um cilindro com uma esfera metálica em seu interior e no momento em que o sensor detectar vibração, a esfera se movimentará desfazando o contato com os terminais do sensor, assim sabemos que detectou vibração fora do comum.

Considerações finais:

Neste tutorial mostramos como funciona e como utilizar o sensor de vibrações. Veja também o tutorial "SENSOR DE SOM COM ARDUINO: ACENDENDO UMA LÂMPADA" em nosso portal. Esperamos que você continue nos acompanhando e sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.

 


Sensor de Movimento de Cabeça – ITG3205 + ADXL345 + HMC5883L

GY-85 – SENSOR IMU – ITG3205 + ADXL345 + HMC5883L

Neste tutorial aprenderemos sobre o Sensor de Movimento de Cabeça GY-85. Este, no que lhe concerne, é muito utilizado em controles em jogos de videogame. Visualizaremos como este pequeno componente funciona e desenvolveremos uma aplicação para ele.

kit robotica educacional com Arduino ESP ou Microbit

O  que é o Sensor IMU — GY-85?

O sensor IMU é utilizado como dito anteriormente para projetos vestíveis(wearables) para movimentação. Contudo, ele utiliza 3 sensores em uma mesma placa: acelerômetro, giroscópio e magnetômetro. 

- Funcionamento

Primeiramente, o sensor de movimento IMU(Inertial Measurement Unit) possui 9 eixos acoplados a ele, sendo estes: 3 eixos acelerômetros, 3 eixos giroscópio e 3 eixos campo magnético. Com estes eixos é possível detectar qualquer tipo de movimento que efetuar com o sensor. Os sensores utilizam da força da gravidade, de seus polos e das direções X, Y e Z para realizar as suas funcionalidades, cada um para determinar algo distinto. Com a gravidade da terra e com os eixos X, Y e Z destes sensores é possivel saber o posicionamento espacial, a aceleração, a direção e o sentido daquele que utiliza o sensor como por exemplo um smartphone.

- Campo Magnético 

Graças a um efeito de dínamo a terra possui um campo magnético e como consequencia nos podemos usar ele em nossas tecnologias. Como sabemos o núcleo líquido de ferro que se movimenta cria correntes elétricas no interior da terra, enquanto a rotação da Terra em seu próprio eixo faz com que essas correntes gerem um campo magnético gigante, o qual nos orientou por muito tempo com o auxilio da bussola e nos orienta até hoje em direção ao futuro, nos ajudando no desenvolvimento das tecnologias.

Imagem do campo magnético da terra

O fato dos campos magnéticos irem do polo sul até o polo norte faz com que a terra seje considerada um imã. O sensor IMU utiliza do campo magnético, da força gravitacional e dos circuitos integrados para identificar seu posicionamento espacial, aceleração, intensidade, distancia e sentido .

- Sensores acoplados:

As funções dessa placa são controladas por 3 Circuitos integrados, cada um com sua função específica:

  • ITG3205 (3-Axis Angular Rate Sensor) – Giroscópio 3 eixos
  • ADXL345 (3-Axis Digital Accelerometer) – Acelerômetro 3 eixos
  • HMC5883L (3-Axis Digital Compass) – Bússola digital / Magnetômetro 3 eixos

- Os terminais deste sensor que serão utilizados são:

  • VCC_IN(+) – Tensão de entrada, entre 3,3 a 5 volts
  • GND(-) – O pino de O V do módulo, que é conectado ao GND do Arduino ou fonte
  • SCL - I2C Serial Clock
  • SDA - I2C Serial Data

Módulo do sensor IMU

 

Mãos à obra — Configurando um sensor IMU

Componentes Necessários

- Montando o projeto:

Mostraremos como utilizar cada sensor ligando-o ao Arduino Uno. Sobretudo, como todos eles utilizam o mesmo barramento I2C, teremos apenas um circuito para todos os programas exemplos. A principio, para a montagem do circuito conectemos o sensor na protoboard. O VCC do sensor é conectado no 5v do arduino, logo após conectaremos o GND do sensor ao GND do arduino. Além disso, o pino SCL do sensor é conectado ao pino A5 do arduino e o pino SDA é conectado ao pino A4 do arduino como mostra o diagrama abaixo:

Diagrama de montagem do sensor IMU

- Biblioteca Wire.h:

Neste tutorial utilizaremos a biblioteca Wire.h responsável por conter as funções necessárias para gerenciar a comunicação entre os dispositivos através do protocolo I2C. Ademais, caso não entenda nada de biblioteca ou como prosseguir, veja o tutorial COMO INSTALAR UMA BIBLIOTECA NO ARDUINO IDE” no portal vida de silício.

- Programando o Arduino:

Agora vamos conectar o arduino no computador e abrir a IDE arduino.  Escreva o programa abaixo na IDE e compile o programa para o seu arduino.

Antes de carregar o programa, você precisa selecionar qual porta você deseja usar para fazer o carregamento do seu programa no Arduino (upload). Dentro do Arduino IDE, clique no menu Ferramentas (tools) e abra o submenu Porta(Port). Clique na porta que seu Arduino está conectado, tal como COM3 ou COM4. Geralmente aparece o nome da placa Arduino : “COM3 (Arduino/Genuino Uno)”.
A primeira coisa que você notará é que ao alimentar o sensor não há nenhuma indicação de que ele está ligado. A placa não possui nenhum led , logo utilizaremos um programa chamado I2C Scanner (http://playground.arduino.cc/Main/I2cScanner) para efetuar um rastreamento no barramento I2C e garantir que o sensor esteja adequadamente ligado ao Arduino. Carregue o I2C Scanner:

#include <Wire.h>
void setup()
{
  Wire.begin();
  Serial.begin(9600);
  Serial.println("\nI2C Scanner");
}
void loop()
{
  byte error, address;
  int nDevices;
  Serial.println("Scanning...");
  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
      nDevices++;
    }
    else if (error==4) 
    {
      Serial.print("Unknow error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
  delay(5000);           // wait 5 seconds for next scan
}

Se as conexões estiverem corretas, ao abrir o serial monitor teremos a seguinte tela, mostrando os endereços dos dispositivos detectados:

O I2C Scanner é um programa que serve não apenas para este módulo, mas também para qualquer outro dispositivo I2C conectado ao barramento. Além disso, Tenha este programa sempre à mão para descobrir o endereço do dispositivo ou simplesmente para verificar se ele está se comunicando com o Arduino.

Imagem do circuito do sensor IMU

- Acelerômetro 3 eixos(ADXL345)

Já sabendo o endereço do circuito integrado ADXL345 podemos proseguir. Este circuito é um acelerômetro muito utilizado nos telefones celulares, pois é através do acelerômetro que o seu celular detecta a posição do aparelho e permite que você passe horas jogando sem apertar nenhum botão, apenas movimentando o aparelho. Utilize o programa abaixo para testar o ADXL345 (datasheet), cujo endereço I2C é 0x53:

#include <Wire.h>
#define Register_ID 0
#define Register_2D 0x2D
#define Register_X0 0x32
#define Register_X1 0x33
#define Register_Y0 0x34
#define Register_Y1 0x35
#define Register_Z0 0x36
#define Register_Z1 0x37
// Endereco I2C do sensor : 83 em decimal ou 0x53
int ADXAddress = 0x53;  // the default 7-bit slave address
int reading = 0;
int val=0;
int X0,X1,X_out;
int Y0,Y1,Y_out;
int Z1,Z0,Z_out;
double Xg,Yg,Zg;
void setup()
{
  Wire.begin();                
  Serial.begin(9600);    
  delay(100);
  // enable to measute g data
  Wire.beginTransmission(ADXAddress);
  Wire.write(Register_2D);
  Wire.write(8);                //measuring enable
  Wire.endTransmission();     // stop transmitting
}
void loop()
{
  //--------------X
  Wire.beginTransmission(ADXAddress); // transmit to device
  Wire.write(Register_X0);
  Wire.write(Register_X1);
  Wire.endTransmission();
  Wire.requestFrom(ADXAddress,2); 
  if(Wire.available()<=2)   
  {
    X0 = Wire.read();
    X1 = Wire.read(); 
    X1=X1<<8;
    X_out=X0+X1;   
  }
  //------------------Y
  Wire.beginTransmission(ADXAddress); // transmit to device
  Wire.write(Register_Y0);
  Wire.write(Register_Y1);
  Wire.endTransmission();
  Wire.requestFrom(ADXAddress,2); 
  if(Wire.available()<=2)   
  {
    Y0 = Wire.read();
    Y1 = Wire.read(); 
    Y1=Y1<<8;
    Y_out=Y0+Y1;
  }
  //------------------Z
  Wire.beginTransmission(ADXAddress); // transmit to device
  Wire.write(Register_Z0);
  Wire.write(Register_Z1);
  Wire.endTransmission();
  Wire.requestFrom(ADXAddress,2); 
  if(Wire.available()<=2)   
  {
    Z0 = Wire.read();
    Z1 = Wire.read(); 
    Z1=Z1<<8;
    Z_out=Z0+Z1;
  }
  //
  Xg=X_out/256.0;
  Yg=Y_out/256.0;
  Zg=Z_out/256.0;
  Serial.print("X= ");
  Serial.print(Xg);
  Serial.print("       ");
  Serial.print("Y= ");
  Serial.print(Yg);
  Serial.print("       ");
  Serial.print("Z= ");
  Serial.print(Zg);
  Serial.println("  ");
  delay(200);
}

Movimente o sensor e observe a variação dos eixos X, Y e Z  de acordo com a força gravitacional que incide sobre o circuito integrado no serial monitor:

Imagem do serial monitor para o acelerômetro

- Bússola digital(HMC5883L)

O circuito integrado HMC5883L (datasheet) é um instrumento usado para medir a intensidade, direção e sentido de campos magnéticos e possui 3 eixos. É com ele que montamos uma bússola com o Arduino, utilizando como base o programa abaixo, que mostra os valores correspondentes aos eixos X, Y e Z. O endereço I2C do sensor é 0x1E, o qual já achamos anteriormente:

#include <Wire.h>
// Define o endereco do HMC5883L - 0x1E ou 30 em decimal
#define address 0x1E 
void setup()
{
  Serial.begin(9600);
  Wire.begin();
  
  // Inicializa o HMC5883L
  Wire.beginTransmission(address);
  // Seleciona o modo
  Wire.write(0x02); 
  // Modo de medicao continuo
  Wire.write(0x00); 
  Wire.endTransmission();
}
void loop()
{
  int x,y,z; //triple axis data
  
  // Indica ao HMC5883L para iniciar a leitura
  Wire.beginTransmission(address);
  Wire.write(0x03); //select register 3, X MSB register
  Wire.endTransmission();
 
  // Le os dados de cada eixo, 2 registradores por eixo
  Wire.requestFrom(address, 6);
  if(6<=Wire.available())
  {
    x = Wire.read()<<8; //X msb
    x |= Wire.read(); //X lsb
    z = Wire.read()<<8; //Z msb
    z |= Wire.read(); //Z lsb
    y = Wire.read()<<8; //Y msb
    y |= Wire.read(); //Y lsb
  }
  
  // Imprime os vaores no serial monitor
  Serial.print("x: ");
  Serial.print(x);
  Serial.print("  y: ");
  Serial.print(y);
  Serial.print("  z: ");
  Serial.println(z);
  
  delay(250);
}

Da mesma forma que no exemplo anteriores, os valores são mostrados no serial monitor de acordo com o campo magnetico que incide sobre o circuito integrado:

Imagem do serial monitor para a Bússola digital

Entendendo a fundo:

Software

– Definições e variáveis utilizadas no projeto do sensor de movimento de cabeça

A instrução #include<> serve para incluir bibliotecas no algoritmo.

#include <Wire.h>

– Função Setup – Definindo pinos do nosso sensor de movimento de cabeça

 A função setup é aquela que ira rodar apenas uma vez quando nosso programa for iniciado. Ela é do tipo void, ou seja, não tem retorno e também não tem parâmetros de entrada. A função  Serial.begin inicia a comunicação serial e define uma velocidade para ela para que possamos visualizar o funcionamento do sensor no serial monitor da IDE arduino. A função Serial.println escreve no serial monitor o texto "I2C Scanner" .

Serial.begin(9600);
Serial.println("\nI2C Scanner");

– Função Loop – Leitura do nosso sensor de movimento de cabeça e Estruturas de decisão

A função loop ao contrário da setup roda tudo que estiver dentro dela varias vezes em um loop constante até que seja reiniciado ou parado o programa. Precipuamente, declaramos uma variavel do tipo int e logo depois do "Serial.println" atribuimos o valor 0 a ela. Também declaramos as veriaveis do tipo byte "error" e "address".

void loop(){ 
 byte error, address;  
 int nDevices;   
 Serial.println("Scanning...");   
 nDevices = 0;

Não obstante, a estrutura de repetição for será executada enquanto a variavel declarada anteriormente "address" for menor que 127. Ela inicializa com o valor 1 e a cada ciclo adiciona- se +1.

for(address = 1; address < 127; address++ ){

Similarmente, estrutura de de decisão if será executada caso a condição entre parenteses for verdadeida. No primeiro if caso a variave "error" fo igual a zero a linha de código "Serial.print("I2C device found at address 0x");" será executada.

if (error == 0){       
  Serial.print("I2C device found at address 0x");

Logo depois, caso a variavel "address" for menor que 16 as linhas de código dentro dos colchetes será executada. Irá imprimir o texto "0" e logo após o endereço dos circuitos integrados. Tambem irá imprimir no serial monitor o texto " !" e  vai adicionar +1 a variavel nDevices com o comando "nDevices++".

if (address<16) {        
  Serial.print("0");        
  Serial.print(address,HEX);        
  Serial.println("  !");        
  nDevices++;  
   }

Caso a estutura if com a condição "error == 0" não for verdadeira iremos direto para a estrutura else if. Se for verdadeira, ou seja, a variavel error for igual a quatro a linha "Serial.print("Unknow error at address 0x");" será executada e impressa no serial monitor.

 else if (error==4){    
   Serial.print("Unknow error at address 0x");

Igualmente a estura if, se a variavel "address" for menor que 16 será executado as linhas de código abaixo, imprimindo no serial monitor o texto zero e o endereço dos circuitos integrados.

if (address<16)  {        
  Serial.print("0");       
  Serial.println(address,HEX);    
 }

Agora, caso a variavel "address" for maior que 16, então as estruturas anteriores com a condição "address<16" não serão executadas e a variavel "nDevices" permanecerá com o valor 0. Sendo assim, a estrutura if a seguir será verdadeira e a estrutura "Serial.println("No I2C devices found\n");" será executada. Em contrapartida, se a variavel "address" for menor que 16 de fato, a estrutura else que será executada.

       
    
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
    delay(5000);           // wait 5 seconds for next scan
}

 

Hardware

- ITG3205

O sensor giroscópio de 3 eixos acoplado ao sensor IMU permite entender o posicionamento espacial através da força de gravidade. sendo assim, quando um objeto está em movimento, os sensores de eixo do giroscópio conseguem informar exatamente para qual direção o produto está se movendo. Uma de suas aplicações é em aparelhos smartphones onde detecta quando você gira o aparelho detectando a velocidade angular do aparelho e se está apontado para cima ou para baixo. O que podemos tirar disto é que ele é muito empregado em sistema que necessitam interpretar os movimentos do utilizador.

- ADXL345

O sensor acelerômetro de 3 eixos acoplado ao sensor IMU mede a aceleração através da força de gravidade a que o sensor está sujeito em cada um dos três eixos. Ele mede a inclinação e o movimento. Sendo assim, consegue detectar o movimento de rotação e gestos tais como balançar ou agitar um objeto do qual ele faz parte.

O gráfico (a) representa uma situação onde o acelerômetro se encontra em repouso, pousado numa superfície plana, os valores comunicados pelos sensores serão x= 0, y=0 e z=-1. Já o gráfico (b) representa a rotação do eixo X para baixo, os valores comunicados pelo sensor serão x=1, y=0 e z=0. O grafico (c) representa a rotação do eixo Y, os valores comunicados pelo sensor serão x=0, y=1 e z=0.

- HMC5883L

Sensor magnetômetro de 3 eixos é acoplado ao sensor IMU.  Sendo assim, ele funciona como uma bússola digital e identifica a intensidade, direção e sentido de campos magnéticos . Com o arduino é usado para literalmente nos dar um norte.

Considerações finais:

Neste tutorial mostramos como funciona e como utilizar o sensor de movimento IMU. Esperamos que você continue nos acompanhando e sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.


Sensor de Som KY-037: Acendendo LED com arduino

MÓDULO SENSOR DE SOM KY-037: ACENDENDO UM LED COM ARDUINO

 Este tutorial tem como objetivo ensinar a utilizar o sensor de som para acender um LED. Surpreendentemente, vamos automatizar e programar um LED para acender quando o sensor detectar som. Além disso, aprimoraremos os seus conhecimentos sobre programação para arduino utilizando as funções digitalWrite e delay.

kit robotica educacional com Arduino ESP ou Microbit

O  que é o módulo sensor de som?

O sensor de som constitui uma placa de circuito impresso com uma função específica. O módulo faz com que emita pulsos de energia ao detectar som fazendo com que uma lâmpada acenda ou apague.

- Funcionamento

Presipuamente, o sensor realiza a transformação da intensidade das ondas sonoras para tensões de 0 a 5V. Em seguida, o pino de leitura digital manda um sinal de nível lógico alto se uma determinada intensidade do som for atingida. Este sensor em especial possui também um pino analógico para podermos ter diversos valores da intensidade do som.
O sensor de som utiliza o microfone para captar o som, identificando a vibração das ondas no meio e o Trimpot(Potenciômetro) para ajustar a sensibilidade do microfone a essas vibrações.
Este componente possui um potenciômetro com a função de ajustar a sensibilidade do som que queira detectar. Támbem, possui dois leds em sentidos opostos onde um serve para alertar que o módulo está energizado e o outro que a saída está ativa, pois ele detectou som.

 

ATENÇÃO: Entretanto, quando o circuito estiver montado, ao alimentar a placa o LED pode iniciar piscando. Isto indica que você deve ajustar a sensibilidade do sensor no trimpot.

- Os terminais deste sensor são:

  • VCC(+) – Tensão de entrada, entre 3,3 a 5 volts
  • GND(-) – O pino de O V do módulo, que é conectado ao GND do Arduino ou fonte
  • Saida Analogica(A0) – Pino de saída analogica (retorna o valor da intensidade do som captado)
  • Saída Digital(D0)– Pino de saída digital (retorna HIGH ou LOW)

Sensor de Som

Mãos à obra - Fazendo um pisca-pisca usando o Arduino

Componentes Necessários

 

- Montando o projeto:

Neste tutorial montaremos um circuito para acender um LED, porem ao contrário de muitos outros neste utilizaremos da programação para transformar um simples acender de LED em um pisca-pisca quando o sensor de som detectar vibrações. Monte conforme o projeto abaixo:

Diagrama de montagem do sensor de som

A perna maior dos LEDs esta ligada aos pinos das portas digitais(sendo estes, verde ligada a porta 7, amarelo ligada a porta 6 e vermelho ligada a porta 5) e a perna menor no resistor de 470 ohm. O resistor no que lhe concerne esta ligado ao GND da protoboard. Enfim, no circuito do sensor o VCC está ligado ao 5V do arduino, o GND esta também ligado no GND(-) da protoboard e a saída digital(D0) esta ligada ao pino 12 do arduino.

Imagem do circuito do sensor de som

- Programando o Arduino:

Com o circuito montado vamos conectar o arduino no computador e abrir a IDE arduino para configurar o programa. Escreva programa abaixo na IDE e compile o programa para o seu arduino. Vamos comentá-lo mais adiante.

Antes de carregar o programa, você precisa selecionar qual porta você deseja usar para fazer o carregamento do seu programa no Arduino (upload). Dentro do Arduino IDE, clique no menu Ferramentas (tools) e abra o submenu Porta(Port). Clique na porta que seu Arduino está conectado, tal como COM3 ou COM4. Geralmente aparece o nome da placa Arduino : “COM3 (Arduino/Genuino Uno)”.

#define led1 7 // O led1 esta definido no pino 7
#define led2 6 // O led2 esta definido no pino 6
#define led3 5 // O led3 esta definido no pino 5
#define sensor 12 // O pino 12 contem o sensor de som
int  valor_A0 = 9; // Cria uma variável do tipo inteiro(int) chamada valor_A0 e atribui-lhe o valor 9
int aceso = 0; // Cria uma variável do tipo inteiro(int) chamada aceso e atribui-lhe o valor 0
void setup() {
  Serial.begin(9600); //Inicializa a comunicação serial e estabelece uma velocidade para ela
  pinMode(led1, OUTPUT); // Define o pino 7 onde esta o led1 como saída
  pinMode(led2, OUTPUT);  // Define o pino 6 onde esta o led2 como saída
  pinMode(led3, OUTPUT);  // Define o pino 5 onde esta o led3 como saída
  pinMode(sensor, INPUT); // Define o pino 12 como saída
}

void loop() {
  valor_A0 = digitalRead(sensor);// A variavel  valor_A0 recebe a leitura digital do pino 12 onde o sensor esta
  Serial.print("\nSaida A0: "); // Imprime no serial monitor "\nSaida A0: "
  Serial.print(valor_A0); // Imprime no serial monitor o valor que a variável valor_A0 recebeu
  delay(500); // O delay espera 500 milissegundos
   if(valor_A0 == HIGH){ // é detectada a presença de som
    switch(aceso){ // switch necessário para definir se o led vai acender ou apagar
      case 0: // caso o led esteja apagado...
        digitalWrite(led1, HIGH); // ...ele se acenderá
        delay(1000);
        digitalWrite(led3, HIGH); // ...ele se acenderá
        delay(1000);
        digitalWrite(led1, LOW); // ...ele se apagará
        delay(500);
        digitalWrite(led2, HIGH); // ...ele se acenderá
        delay(1000);
        digitalWrite(led3, LOW); // ...ele se apagará
        delay(500);
        digitalWrite(led1, HIGH); // ...ele se apagará
        delay(1000);
        digitalWrite(led2, LOW); // ...ele se apagará
        delay(500);
        digitalWrite(led3, HIGH); // ...ele se acenderá
        delay(1000);
        digitalWrite(led1, LOW); // ...ele se apagará
        delay(500);
        digitalWrite(led2, HIGH); // ...ele se acenderá
        delay(1000);
        digitalWrite(led3, LOW); // ...ele se apagará
        delay(500);
        digitalWrite(led1, HIGH); // ...ele se apagará
        delay(1000);
        digitalWrite(led2, LOW); // ...ele se apagará
        delay(500);
        digitalWrite(led3, HIGH); // ...ele se acenderá
        delay(1000);
        digitalWrite(led2, HIGH); // ...ele se apagará
        delay(1000);
        aceso = 1; // atribuição para definir que o led está aceso
        break;
      case 1: // caso o led esteja aceso...
        digitalWrite(led1, LOW); // ...ele se apagará
        delay(1000);
        digitalWrite(led3, LOW); // ...ele se apagará
        delay(1000);
        digitalWrite(led1, HIGH); // ...ele se acenderá
        delay(500);
        digitalWrite(led2, LOW); // ...ele se apagará
        delay(1000);
        digitalWrite(led3, HIGH); // ...ele se apagará
        delay(500);
        digitalWrite(led1, LOW); // ...ele se apagará
        delay(1000);
        digitalWrite(led2, HIGH); // ...ele se apagará
        delay(500);
        digitalWrite(led1, HIGH); // ...ele se acenderá
        delay(500);
        digitalWrite(led1, LOW); // ...ele se apagará
        delay(1000);
        digitalWrite(led3, LOW); // ...ele se apagará
        delay(1000);
        digitalWrite(led2, LOW); // ...ele se apagará
        delay(100);
        aceso = 0; // atribuição para definir que o led esta apagado
        break;
    }
  }
}

 

ATENÇÃO: não esqueça de definir a placa e a porta que esta utilizando para carregar o programa.

Imagem do circuito do sensor de som funcionando

Em seguida, regule o potenciômetro para detectar as vibrações desejadas:

Imagem do regulador de vibrações

Assim, abra o Monitor serial e visualize o funcionamento do sensor:

Monitor serial

 

Entendendo a Fundo:

Software

– Definições e variáveis utilizadas no projeto

A instrução #define apenas associa os numeros dos pinos do arduino a nomes referente aos componentes conectados nestes pinos.  Semelhantemente, nas variáveis declaradas com o tipo int são atribuídas a elas valores escolhidos pelo programador.

#define led1 7 // O led1 esta definido no pino 7
#define led2 6 // O led2 esta definido no pino 6
#define led3 5 // O led3 esta definido no pino 5
#define sensor 12 // O pino 12 contem o sensor de som
int  valor_A0 = 9; // Cria uma variável do tipo inteiro(int) chamada valor_A0 e atribui-lhe o valor 9
int aceso = 0; // Cria uma variável do tipo inteiro(int) chamada aceso e atribui-lhe o valor 0

– Função Setup – Inicialização da comunicação serial e definindo pinos

A função setup é aquela que irá rodar apenas uma vez quando nosso programa for iniciado. Ela é do tipo void, ou seja, não tem retorno e também não tem parâmetros de entrada. O serial.begin(9600) inicializa a comunicação serial, assim possibilitando que visualizemos as intensidades do som no Monitor serial da IDE arduino. A função pinMode define quais dos pinos serão entradas e quais serão as saídas.

void setup() {
  Serial.begin(9600); //Inicializa a comunicação serial e estabelece uma velocidade para ela
  pinMode(led1, OUTPUT); // Define o pino 7 onde esta o led1 como saída
  pinMode(led2, OUTPUT);  // Define o pino 6 onde esta o led2 como saída
  pinMode(led3, OUTPUT);  // Define o pino 5 onde esta o led3 como saída
  pinMode(sensor, INPUT); // Define o pino 12 como saída
}

– Função Loop – Usando o monitor serial, leitura do nosso sensor de som e Estruturas de decisão

Por analogia, a função loop ao contrário da setup rodará tudo que estiver dentro dela varias vezes em um loop constante até que seja reiniciado ou parado o programa. Então, na variável valor_A0 será atribuído a leitura digital(digitalRead) do pino do sensor. A função Serial.print imprime no monitor serial primeiro o texto entre aspas e depois o valor que esta na variável valor_A0. Logo após, a função delay(500) faz com que esta impressão do texto e valor seja mais lenta dando tempo para a visualização.

void loop() {
valor_A0 = digitalRead(sensor);// A variável  valor_A0 recebe a leitura digital do pino 12 onde o sensor esta
Serial.print("\nSaida A0: "); // Imprime no serial monitor "\nSaida A0: "
Serial.print(valor_A0); // Imprime no serial monitor o valor que a variável valor_A0 recebeu delay(500); // O delay espera 500 milissegundos

O if é uma estrutura de decisão onde entre parenteses esta a condição para ser verdadeiro, ou seja, se a variável valor_A0 for igual a HIGH significa que detectou som e ele executará a estrutura swich - case. A estrurura ”switch(aceso)” determina qual dos dois cases serão executados. Se na variável aceso estiver atribuído a ela o valor 0 será o primeiro case, em contrapartida se estiver atribuído a ela o valor 1 será o segundo.
O digitalWrite escreve no pino do led nível logico HIGH ou LOW. Já o delay espera 1000 milissegundos para executar a próxima linha do código.

if(valor_A0 == HIGH){ // é detectada a presença de som
   switch(aceso){ // switch necessário para definir se o led vai acender ou apagar
     case 0: // caso o led esteja apagado...
       digitalWrite(led1, HIGH); // ...ele se acenderá
       delay(1000);
       digitalWrite(led3, HIGH); // ...ele se acenderá
       delay(1000);
       digitalWrite(led1, LOW); // ...ele se apagará
       delay(500);

Hardware

– Microfone

Microfones são transdutores sonoro-elétricos, ou seja, são dispositivos que convertem energia sonora em energia elétrica através de uma membrana flexível chamada diafragma. Este diafragma entra em vibração ao receber ondas sonoras. Através de um processo específico esta vibração produz um sinal elétrico que é depois amplificado e filtrado em aparelhos eletrônicos.

– LM393D

É um circuito integrado com amplificadores operacionais, capaz de executar tarefas avançadas.

Diagrama do Circuito Integrado LM393D

Acima temos o diagrama do circuito integrado LM393D com pinos saída, pinos de entrada com dois negativos e dois positivos, um pino do vcc e outro do GND . Estes pinos devem ser utilizados conforme a aplicação que queira realizar com o circuito integrado. No projeto ele é responsável por amplificar os som do ambiente em 100 vezes.

Considerações finais:

Neste tutorial mostramos como utilizar o sensor de som, que por sua vez, tem uma aplicação bastante interessante na automação onde utilizamos para energizar e desenergizar uma lâmpada como vemos no tutorial "ACENDENDO UMA LÂMPADA COM VIBRAÇÕES SONORAS". Esperamos que você continue nos acompanhando e sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.


Sensor de Chuva: Detectando água

MÓDULO SENSOR DE CHUVA: DETECTANDO LIQUIDO

Neste tutorial vamos ensinar a utilizar o sensor de chuva com arduino para projetos que precisam da detecção de água. Antes de mais nada utilizaremos um sensor de chuva para atuar na detecção de partículas liquidas.

kit robotica educacional com Arduino ESP ou Microbit

O  que é o módulo sensor de chuva?

Este sensor como todos os outros trabalha com os conceitos físicos.

— Funcionamento

Precipuamente, o sensor de chuva usa da reflexão e refração da luz infravermelha para seu funcionamento que como por exemplo em um para-brisa a propriedade de reflexão é aplicada a ele e o sensor de chuva inicia seu trabalho. Quando há a presença de partículas de chuva no para-brisa o recebimento da luz infravermelho diminui, ou seja, quando há presença de algum líquido, a quantidade de luz recebida pelo sensor diminui, alterando a leitura desse infravermelho do sensor. Então, o sensor de chuva consegue detectar essa diferença na reflexão.

 

- Os terminais deste sensor são:

  • VCC(+) – Tensão de entrada, entre 3,3 a 5 volts
  • GND(-) – O pino de O V do módulo, conectado ao GND do Arduino ou fonte
  • Saida Analogica(A0) – Pino de saída analogica (retorna o valor da intensidade do som captado)
  • Saída Digital(D0)– Pino de saída digital (retorna HIGH ou LOW)

Módulo do sensor de chuva

Mãos à obra — Configurando um sensor de chuva

Componentes Necessários

- Montando o projeto:

A princípio vamos utilizar os jumpers que vem com a placa sensora  para conectar ela ao módulo de leitura. Já os jumpers não possuem distinção, ou seja, podem ser conectados de ambos os lados. Ligue ao módulo de leitura.  Conectaremos o VCC do módulo no 5V do arduino, o GND do módulo no negativo(-) da protoboard e o pino D0 do módulo no pino digital 3 do arduino. Na protoboard vamos conectar o LED sendo que a perna menor do LED será conectada ao negativo(-) da protoboard e a perna maior no resistor de 150ohms.  Por outro lado, a outra extremidade do resistor este será conectada ao pino digital 12 do arduino. Enfim, o GND do arduino ao negativo(-) da protoboard para assim fechar o circuito. Veja o circuito abaixo:

Diagrama de montagem do sensor de chuva

- Programando o Arduino:

Agora vamos conectar o arduino no computador e abrir a IDE arduino.  Escreva o programa abaixo na IDE e compile o programa para o seu arduino.

Antes de carregar o programa, você precisa selecionar qual porta você deseja usar para fazer o carregamento do seu programa no Arduino (upload). Dentro do Arduino IDE, clique no menu Ferramentas (tools) e abra o submenu Porta(Port). Clique na porta que seu Arduino está conectado, tal como COM3 ou COM4. Geralmente aparece o nome da placa Arduino : “COM3 (Arduino/Genuino Uno)”.

#define pinoLed 12 //PINO DIGITAL UTILIZADO PELO LED
#define pinoSensor 3 //PINO DIGITAL UTILIZADO PELO SENSOR

int lersensor = 0;// DECLARA UMA VARIAVEL CHAMADA lersensor E ATRIBUA A ELA O VALOR 0

void setup(){
  pinMode(pinoSensor, INPUT); //DEFINE O PINO COMO ENTRADA
  pinMode(pinoLed, OUTPUT); //DEFINE O PINO COMO SAÍDA
}

void loop(){
 lersensor = digitalRead(pinoSensor);
  if(lersensor == LOW){ //SE A LEITURA DO PINO FOR IGUAL A LOW, FAZ
      digitalWrite(pinoLed, HIGH); //ACENDE O LED
  }else//SENÃO, FAZ
  {
    digitalWrite(pinoLed, LOW); //APAGA O LED
  }

Enfim, quando tudo estiver correto o sensor de chuva ficará constantemente em nível lógico alto (HIGH) enquanto a placa sensora estiver seca. Quando ela começa a receber pingos, o nível lógico vai para baixo (LOW). Caso queira ou aja necessidade também é possível realizar a leitura analógica dos valores lidos e assim poder agir gradativamente conforme a chuva.

ATENÇÃO: não esqueça de definir a placa e a porta que esta utilizando para carregar o programa.

 

Imagem do circuito do sensor de chuva funcionando

Como resultado temos que ao detectar uma quantidade de líquido pre-determinado, ajustando a sensibilidade no potenciômetro(trimpot), o LED acenderá.

Potenciômetro do sensor para a regulação de sensibilidade

 

Entendendo a fundo:

Software

— Definições e variáveis utilizadas no projeto do sensor de chuva com arduino

A instrução #define apenas associa as portas dos pinos do arduino a nomes referente aos componentes conectados nestes pinos. Logo depois as variáveis declaradas com o tipo int são atribuídas a elas valores escolhidos pelo programador.

#define pinoLed 12 //PINO DIGITAL UTILIZADO PELO LED
#define pinoSensor 3 //PINO DIGITAL UTILIZADO PELO SENSOR

int lersensor = 0;// DECLARA UMA VARIÁVEL CHAMADA "lersensor" E ATRIBUI-LHE O VALOR "0"

— Função Setup – Definindo pinos do sensor de chuva com arduino

A função setup é aquela que ira rodar apenas uma vez quando nosso programa for iniciado. Ela é do tipo void, ou seja, não tem retorno e também não tem parâmetros de entrada. A função pinMode define que o pino do sensor será uma entrada e o pino do led será uma saída.

void setup(){
  pinMode(pinoSensor, INPUT); //DEFINE O PINO COMO ENTRADA
  pinMode(pinoLed, OUTPUT); //DEFINE O PINO COMO SAÍDA
}

— Função Loop – Leitura do nosso sensor de chuva com arduino e Estruturas de decisão

Em analogia, a função loop ao contrário da setup roda tudo que estiver dentro dela varias vezes em um loop constante até que seja reiniciado ou parado o programa. Na variável lersensor será atribuído a leitura do pino digital 3 que está o sensor. Logo apos, temos a estrutura de decisão if. Primeiramente, caso a variável lersensor seja igual ao nível logico baixo, já que o sensor não está detectando a luz infravermelha, então será executado a função no if. Em contrapartida, se a variável lersensor for igual ao nível logico alto significa que o sensor está detectando a luz infravermelha e que a condição dentro do if é falsa, então não possui liquido sobre o sensor. Assim sendo, será executado o else.

A função digitalWrite irá escrever no pino digital 12 onde está o LED (declarado anteriormente como saída), nível logico alto ou nível logico baixo dependendo se a condição dentro dos parenteses da estrutura de decisão if for verdadeira ou falsa.

void loop(){
 lersensor = digitalRead(pinoSensor);
  if(lersensor == LOW){ //SE A LEITURA DO PINO FOR IGUAL A LOW, FAZ
      digitalWrite(pinoLed, HIGH); //ACENDE O LED
  }else//SENÃO, FAZ
  {
    digitalWrite(pinoLed, LOW); //APAGA O LED
  }

Hardware

Trimpot:

No módulo de leitura existe um potenciômetro(trimpot) para o ajustar de quando o sensor entenderá como chuva ou seco. Dependendo da intensidade da chuva que você pretende sentir.

 

Considerações finais:

Neste tutorial mostramos como funciona e como utilizar o sensor de chuva. Semelhantemente a ele tem o sensor de umidade, esperamos que você continue nos acompanhando e sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.


Sensor de Som com arduino: Acendendo uma Lâmpada

ACENDENDO UMA LÂMPADA COM VIBRAÇÕES SONORAS

Este tutorial visa ensinar uma maneira prática de utilizar o sensor de som com arduino para automação residencial. Enfim daremos o primeiro passo para desenvolver um sistema inteligente acendendo uma lâmpada quando o sensor de som detectar vibrações sonoras.

kit robotica educacional com Arduino ESP ou Microbit

O  que é o módulo sensor de som?

O sensor de som com arduino apesar de muitos acreditarem ser um microfone, na verdade, constitui uma placa de circuito impresso com uma função específica. O módulo faz com que emite pulsos de energia ao detectar som fazendo com que uma lâmpada acenda ou apague. Este sensor também pode ser utilizado como um "sensor de presença" do ambiente, porém utilizarão ondas sonoras para entender o que acontece ao seu redor. 

- Funcionamento

Precipuamente o sensor realiza a transformação da intensidade das ondas sonoras para tensões de 0 a 5V. Em segundo plano, o pino de leitura digital manda um sinal de nível alto se detectar som. Além disso, o sensor de som utiliza o microfone para captar o som, identificando a vibração das ondas no meio e o Trimpot(Potenciômetro) para ajustar a sensibilidade do microfone a essas vibrações.

Este componente possui um potenciômetro com a função de ajustar a sensibilidade do som que queira detectar. Possui dois leds em sentidos opostos onde um serve para alertar que o módulo está energizado e o outro que a saída está ativa, pois ele detectou som. Ademais é possível construir seu próprio sensor de som com praticamente os mesmos componentes do módulo. Entretanto o modulo sensor de som fornece maior praticidade na hora da utilização, com ele é possível controlar diversos eletrodomésticos em sua casa sem o auxílio de interruptores convencionais, ou seja, utilizando apenas o bater de palmas. 

- Ondas sonoras

De início são ondas mecânicas que vibram em uma frequência de 20 a 20.000 hertz (Hz), sendo normalmente perceptíveis pelo ouvido humano. Elas são originadas por vibrações no meio material em que elas vão se propagar, onde na maioria dos casos, esse meio é o ar. Além disso, essa vibração é transmitida para as moléculas de ar que estão ao redor, que por sua vez passam a vibrar. O sensor de som detectas essas ondas e em seguida atua através das saídas nos fornecendo os resultados que o programamos para ter.

ATENÇÃO: tenha cuidado ao executar projetos envolvendo alta tensão! Certifique-se de realizar as conexões entre os componentes com o circuito desligado da rede.

 

- Os terminais deste sensor são:

  • VCC(+) – Tensão de entrada, entre 3,3 a 5 volts
  • GND(-) – O pino de O V do módulo, conectado ao GND do Arduino ou fonte
  • Saída(OUT) – Pino de saída

Sensor de Som

Mãos à obra — Automatizando uma lâmpada

Componentes Necessários

 

- Montando o projeto:

Primeiramente veremos como funciona um interruptor eletromecânico (Relé) para ligar e desligar a lâmpada com indução magnética. Conecte o 5v e o GND do arduino nos pinos horizontais da protoboard. Logo depois, conecte o módulo sensor de som na protoboard, o VCC será conectado no 5v da protoboard e o GND do módulo será conectado no GND da protoboard. Posteriormente o OUT do sensor de som conectaremos no pino 4 do arduino.

Além disto, conecte agora o módulo relé. O VCC do módulo será conectado no 5v da protoboard e o GND do módulo relé no GND da protoboard. A porta IN do módulo relé será conectada no pino 7 do arduino, como mostra a imagem abaixo.

Diagrama de montagem do sensor de som sem lâmpada

Veja abaixo o circuito sem lâmpada:

Imagem do circuito do sensor de som

- Programando o Arduino:

Agora vamos conectar o arduino no computador e abrir a IDE arduino.  Escreva o programa abaixo na IDE e compile o programa para o seu arduino.

Antes de carregar o programa, você precisa selecionar qual porta você deseja usar para fazer o carregamento do seu programa no Arduino (upload). Dentro do Arduino IDE, clique no menu Ferramentas (tools) e abra o submenu Porta(Port). Clique na porta que seu Arduino está conectado, tal como COM3 ou COM4. Geralmente aparece o nome da placa Arduino : “COM3 (Arduino/Genuino Uno)”.

#define pinorele 7 // pino em que o relé será conectado
#define pinosom 4 // pino em que o sensor de som será conectado

bool rele;

void setup() {
  pinMode(pinorele,OUTPUT); //Define o pino do relé como saída
  pinMode(pinosom,INPUT); //Define o pino do sensor de som como entrada
  rele=false; // A variável rele recebe falso
  digitalWrite(pinorele, rele); //Escreve no pino digital do relé falso 
}

void loop() {
 if(digitalRead(pinosom)==HIGH){ //Lê o pino do sensor de som
   rele=!rele;
 }
 digitalWrite(pinorele,rele); //Escreve no pino do rele
}

 

ATENÇÃO: caso a compilação de erro certifique se a porta do seu arduino está selecionada na IDE.

 

- Conectando a lâmpada:

Antes de mais nada adicionaremos a lâmpada ao circuito para ver como irá funcionar na prática. Aliás, desconecte o arduino do computador e corte um dos dois fios que vai até à lâmpada e conectar no módulo relé como mostra a figura abaixo.

Imagem da Lâmpada com um dos dois fios cortados

Não tem importância qual dos dois fios da lâmpada será cortado, apenas deve prestar atenção onde conectá-los no relé. Um deve ficar no pino do meio no relé e o outro em qualquer uma das extremidades.

Diagrama de montagem do sensor de som com a lâmpada

 

ATENÇÃO: verifique que não tenha nenhum fio desencapado e com risco de choque  ou curto-circuito. Caso tenha, utilize uma fita isolante para eliminar este risco.

 

- Testando o sensor de som:

 Conecte o arduino a fonte externa de 9v e a lâmpada na tomada. O resultado deve ser igual à imagem abaixo:

Imagem do circuito do sensor de som finalizado

 

Posteriormente, caso sua lâmpada esteja acendendo e apagando com muita facilidade, você deve ajustar a sensibilidade do sensor de som. Primeiramente desligue a lâmpada da tomada. Após isso, com a lâmpada desligada utilize uma chave de fenda pequena para regular a sensibilidade no sensor de som como mostra a imagem abaixo. Logo após regulada a sensibilidade conecte a lâmpada na tomada novamente.

Potenciômetro do sensor para a regulação de sensibilidade

Entendendo a Fundo:

Software

– Definições e variáveis utilizadas no projeto do sensor de som com arduino

As instruções #define são apenas para associar nomes aos pinos do relé e do sensor no arduino. Já a variável rele é criada para que posteriormente possamos chamá-la em alguma parte de nossa programação.

#define pinorele 7 // pino em que o relé será conectado
#define pinosom 4 // pino em que o sensor de som será conectado
bool rele;

– Função Setup – Definindo pinos do sensor de som com arduino

A função setup é aquela que ira rodar apenas uma vez quando nosso programa for iniciado. Ela é do tipo void, ou seja, não tem retorno e também não tem parâmetros de entrada. A função pinMode define que o pino do relé será a saída, acendendo ou não a lampada, e o pino do sensor será a entrada dos sinais elétricos. A função digitalWrite escreve no pino 7 o valor atribuído a variável rele.

void setup() {
  pinMode(pinorele,OUTPUT); //Define o pino do relé como saída
  pinMode(pinosom,INPUT); //Define o pino do sensor de som como entrada
  rele=false; // A variável rele recebe falso
  digitalWrite(pinorele, rele); //Escreve no pino digital do relé falso 
}

– Função Loop – Leitura do nosso sensor de som com arduino e Estruturas de decisão

Por analogia, a função loop ao contrário da setup ira rodar tudo que estiver dentro dela varias vezes em um loop constante até que seja reiniciado ou parado o programa. Então na função if se a leitura digital(digitalRead) do pino do sensor for nível logico alto(HIGH) o rele recebe true, acendendo a lâmpada. Caso a leitura seja nível logico baixo será escrito(digitalWrite) false no relé, apagando a lâmpada.

void loop() {
 if(digitalRead(pinosom)==HIGH){ //Lê o pino do sensor de som
   rele=!rele;
 }
 digitalWrite(pinorele,rele); //Escreve no pino do rele
}

Hardware

Microfone

Microfones são transdutores sonoro-elétricos, ou seja, são dispositivos que convertem energia sonora em energia elétrica através de uma membrana flexível chamada diafragma. Este diafragma entra em vibração ao receber ondas sonoras. Através de um processo específico esta vibração produz um sinal elétrico que é depois amplificado e filtrado em aparelhos eletrônicos.

– LM393

É um Amplificador Operacional que consiste em dois comparadores de tensão de precisão e independentes.

Diagrama do Circuito Integrado LM393

conforme acima temos o diagrama do circuito integrado LM393 com pinos de entrada e saída, um pino do vcc e outro do GND e mais dois pinos um negativo e outro positivo. Estes pinos devem ser utilizados conforme a aplicação que queira realizar com o circuito integrado. No projeto ele é responsável por amplificar os sons do ambiente em 100 vezes para que o sensor de som com arduino funcione corretamente.

Considerações finais:

Neste tutorial mostramos como utilizar o sensor de som para automatizar sua residência. No tutorial "MÓDULO SENSOR DE SOM KY-037: ACENDENDO UM LED" mostramos como utilizar o sensor de som para acender um LED. Esperamos que você continue nos acompanhando e sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.


Configurando senha no módulo Bluetooth HC-06 com comandos AT

Configurando Senha no Módulo Bluetooth HC-06 com Comandos AT

A segurança da informação é um ponto muito importante a ser considerado em sistemas de comunicação sem fio. Nesse tutorial vamos aprender como configurar uma senha no módulo Bluetooth HC-06 com comandos AT.

Veja também nosso tutorial:  Módulo Bluetooth HC-05 e HC-06 – Acionando um módulo relé via Bluetooth.

[toc]

kit arduino robótica educacional

Comunicação via Bluetooth

Nossa necessidade cada vez maior de conectividade nos leva a estarmos interligados a tudo. Até os aparelhos conversam entre si para realizar suas tarefas, através de protocolos de comunicação como o Bluetooth.

Telefones celulares, tablets, televisores, carros, e muitos outros dispositivos, contam com pelo menos uma interface para comunicação via rede, e o Bluetooth é uma delas.

Módulos Bluetooth

O Bluetooth é um padrão de comunicação sem fio, de curto alcance, com baixo custo e baixo consumo de energia. Essas características tornam essa tecnologia de comunicação uma ferramenta bastante interessante.

É muito comum encontrar projetos de Arduino usando comunicação Bluetooth, e o módulo HC-06 é um dos mais utilizados. A conexão é via comunicação serial e é realizada recebendo o endereço e o clock do outro dispositivo. O endereço é um número de 48 bits, recebido na fabricação, único para cada módulo Bluetooth.

A configuração do HC-06 é realizada por um conjunto de comandos Hayes, também conhecidos como comandos AT (attention, atenção no inglês). Trata-se uma linguagem de comandos desenvolvida para comunicação com modems. Os comandos AT são uma série de cadeias curtas de texto que podem ser combinadas para realizar operações como ligar, desligar ou para alterar configurações.

Mantendo seu Projeto Seguro

Para tornar a comunicação segura, os módulos HC-06 podem ser configurados com senha, evitando acessos indesejados. A senha pode ser alfanumérica e deve ter no mínimo 4 caracteres.

Mãos a obra - Parte 1 - Testando o Módulo Bluetooth HC-06

Nesta parte nós vamos apenas ligar o módulo e testar seu funcionamento. Não será necessário nenhum programa nessa primeira etapa. 

Componentes Necessários

Montando o Projeto

O modulo tem quatro pinos de comunicação, que devemos conectar ao Arduino. Suas funções são:.

  • VCC - Tensão de entrada, entre 3,6 a 6 volts
  • GND - O pino de O V do módulo, que é conectado ao GND do Arduino ou fonte
  • TXD - Pino de transmissão de dados
  • RXD - Pino de recepção de dados

A intenção nessa primeira parte é verificar o funcionamento do módulo HC-06. Dessa forma, precisamos apenas alimentar o VCC, e o GND. O circuito fica como a figura abaixo:

 

Circuito Módulo Bluetooth  HC-06 com Arduino
Circuito Módulo Bluetooth HC-06 com Arduino

Colocando para Funcionar

Agora, basta ligar seu Arduino e verificar no celular se ele aparece como um dispositivo Bluetooth. Você verá que o modulo já veio configurado com nome padrão, que aprenderemos a alterar.

 

Módulo Bluetooth HC-06 sendo reconhecido pelo celular Android
Módulo Bluetooth HC-06 sendo reconhecido pelo celular Android

 

Mãos a obra - Parte 2 - Configurando o modulo bluetooh HC-06

Nesta parte vamos configurar o módulo HC-06. A comunicação é serial, e no caso do Arduino Uno os pinos padrão para comunicação serial são os pinos 0 e 1. Entretanto, esses pinos também são os utilizados internamente quando gravamos um programa na memória do Arduino. Por isso, usaremos uma biblioteca especifica para comunicação serial e vamos usar os pinos 10 e 11 para as funções RX e TX.

Componentes Necessários

Montando o Projeto

O módulo HC-06 é configurado para funcionar sempre como escravo e sempre no modo AT. Não é necessário trocar a ligação elétrica para fazer as configurações.

O pino RX do módulo deve receber 3,3 V, e essa informação vem anotada no verso do módulo, como advertência.

 

Módulo Bluetooth HC-06
Módulo Bluetooth HC-06

Entretanto, a saída digital do Arduino fornece 5 V em nível alto. Por isso, adicionamos um divisor de tensão e tomamos a tensão reduzida para o pino RX.

O circuito fica como na figura abaixo. Atenção no posicionamento dos resistores. 

 


Circuito Módulo Bluetooth  HC-06 com Arduino
Circuito Módulo Bluetooth HC-06 com Arduino

 

Programando o Arduino

O código que vai fazer comunicação do Arduino com o módulo HC-06 é este:

#include <SoftwareSerial.h>

SoftwareSerial myserial(11, 10); // RX, TX

void setup() {
  delay(500);
  Serial.begin(9600);
  Serial.println("Digite os comandos AT :");
  myserial.begin(9600);
}

void loop() {
  if (myserial.available())
    Serial.write(myserial.read());
  if (Serial.available())
    myserial.write(Serial.read());
}

Enviando Comandos para o Módulo

Após carregar o código na placa Arduino, o monitor serial será responsável por gerar uma interface com o módulo HC-06, mostrando os comandos de configuração e mostrando a resposta dos parâmetros.

É fundamental colocarmos a velocidade de comunicação do monitor serial igual à do código carregado na placa Arduino.

Serial.begin(9600);

Além disso, selecionar o meio de envio para "Ambos, NL e CR":

 

Monitor Serial
Monitor Serial

 

O módulo HC-06 não responde a todos os comandos AT. Abaixo está a lista que ele aceita.

Comando Resposta Descrição
AT+VERSION HC-06-VERSÃO Informa a versão do firmware
AT+NAMENOVONOME Oksetname Muda o nome do dispositivo para NOVONOME (sem espaço depois do comando)
AT+PINNOVOPIN   Muda a senha para NOVOPIN (sem espaço depois do comando)
AT+BAUDX   Altera a taxa de transmissão do módulo para a opção X (leia abaixo)

O nome padrão é 'HC-06', e a senha padrão é '1234'.

Uma informação muito importante: alterando a taxa de transmissão, o código de comando AT que estava em funcionamento para de funcionar. Lembre que essa é a taxa de transmissão entre o Arduino e o módulo bluetooth. Se alterar o baudrate, vai ser necessário corrigir o código com a nova taxa e gravar no Arduino novamente. Os valores e velocidades respectivas são: 1 (1200 bps), 2 (2400), 3 (4800), 4 (é o padrão - 9600), 5 (19200), 6 (38400), 7 (57600) e 8 (115200).

Entendendo a fundo

Software 

A biblioteca utilizada é responsável pela comunicação serial do Arduino com outros dispositivos.

#include <SoftwareSerial.h>

Em seguida, é criado o objeto que vai se comunicar, nos pinos 11 e 10, onde o primeiro é o RX e o segundo o TX.

SoftwareSerial myserial(11, 10); // RX, TX

Quando a comunicação estiver estabelecida, e o módulo tiver algo na porta serial para enviar, o Arduino recebe os dados e imprime no monitor serial.

if (myserial.available())
  Serial.write(myserial.read());

Quando algo for escrito no monitor serial, o comando é enviado ao módulo. Quando digitamos um comando e teclamos enter, o módulo recebe o código AT e executa. A resposta será enviada ao Arduino, através da estrutura anterior.

if (Serial.available())
  myserial.write(Serial.read())

Hardware

- Montando um Divisor de tensão

Para confecção do filtro de tensão que colocamos no pino TX do HC-06, vamos usar um aplicativo que nos fornece calculadoras e técnicas que podem ser úteis em desenvolvimento.

Usando o aplicativo EletroDoid, que esta disponível para sistemas de celular Android, selecionamos a aba divisor de tensão, como na figura:

 

Aplicativo EletroDoid
Aplicativo EletroDoid

Em seguida, configuramos o divisor alimentando com os dados do nosso projeto os campos Vin, que em nosso projeto é 5 V, e Vout, que é 3,3 V. Deixe a carga em RL desabilitada, desconsiderando a resistência do pino de entrada do módulo

.

Cálculo Circuito divisor de Tensão
Cálculo Circuito divisor de Tensão

O aplicativo cria uma associação de resistores, como a que usamos em nosso projeto. Então é só ajustar os valores dos resistores que se encontram disponíveis, na sua coleção ou para comprar. Nesse tutorial, foram utilizados resistores de 1k e 2k Ohm.

Uma funcionalidade interessante desse aplicativo é que a calculadora já considera os resistores em valores comerciais. Os resistores não são fabricados em todos os valores possíveis, mas em uma quantidade de valores normatizada, que depende da sua série: E6, E12, e E24. O número depois do "E" apresenta a quantidade de valores em que o resistor é fabricado naquela série. E24, possui 24 valores numéricos e seus múltiplos. Por exemplo: um valor comercial da série E24 é 4,7 Ohm. Então existem resistores com valores múltiplos desse: 47, 470, 4,7k, 47k, e em diante.

Considerações Finais

Vimos como personalizar seu dispositivo Bluetooth, dando um nome a ele e criando uma senha, restringindo o acesso a usuários não autorizados. Esperamos que tenha gostado e que consiga fazer bom uso!

Deixe suas dúvidas nos comentários. Sugestões e críticas também são sempre bem vindos. Até o próximo!


Montando um medidor de batimento cardíaco com Arduino

O que é um fotopletismógrafo?

Fotopletismógrafo é um aparelho com o qual podemos medir a frequência cardíaca através da variação do fluxo de sangue em determinada parte do corpo.

A medida que o coração bate, a densidade de sangue em determinado membro do corpo varia mantendo um comportamento bem definido que acompanha a frequência cardíaca. Desta forma, podemos medir a frequência cardíaca citada através do uso de um emissor e de um sensor de luz, pois a intensidade de luz que atinge o sensor varia juntamente com a densidade de sangue. Este tipo de processo é também chamado de hemodinâmico, devido ao seu princípio de funcionamento.

[toc]

kit arduino robótica educacional


Mãos à obra - Montando um fotopletismógrafo

Componentes necessários

Para a montagem do projeto necessitamos dos seguintes itens:

Observação: Para montar este dispositivo, você precisará de um led de alto brilho branco e de um sensor de luz. Neste caso usaremos o BPW34, que nada mais é que um foto receptor cuja sensibilidade é mais direcionada (a luz ambiente pouco interfere no resultado, já que o sensor é sensível a luz incidente em uma área bem determinada). Além disso, construiremos filtros e amplificadores de sinais usando capacitores, resistores e amplificadores operacionais.

Montando o projeto

– Montagem do sensor

Primeiramente faremos a montagem do nosso sensor. Para isso, cortamos um pedaço de velcro, de modo que possa cobrir o dedo indicador e através de furos inserimos o fotoemissor em uma parte e o fotorreceptor em outra. Para firmá-los colocamos cola quente nas laterais e na parte de trás. Nas imagens abaixo temos o fotoemissor e o fotorreceptor respectivamente:

 

 

– Bloco amplificador

Nas montagens de protoboard a seguir as duas linhas de alimentação mais externas serão destinadas ao Ground ou referência do circuito.

Feito isso, agora vamos ao primeiro bloco do nosso circuito para tratar o sinal. O fotorreceptor gera um sinal de corrente que é proporcional a luz que incide sobre ele. Com isso, precisamos de um bloco que transforma esse sinal de corrente em um sinal de tensão amplificado. Para isso, usamos um Amplificador de Transresistência, que está representado abaixo:

 

– Bloco do filtro passa-alta

Assim, partimos para a segunda parte do nosso projeto, que é um filtro passa altas de primeira ordem com frequência de corte em 1Hz e ganho unitário:

 

– Bloco filtro passa-baixa

A terceira parte é um filtro passa baixas de segunda ordem, com frequência de corte em 40Hz e ganho de 20dB:

 

Com isso, a montagem completa do circuito é mostrada abaixo:

Na montagem podemos ver um resistor circulado em vermelho que serve para limitar corrente no LED de alto brilho, já que ele é ligado com a mesma tensão de alimentação positiva dos amplificadores operacionais. Seu valor é 680 ohms.

O fotorreceptor deve ter um de seus terminais ligados na entrada inversora do amplificador de transresistência e o outro ligado ao GND.

Com isso, já podemos visualizar a onda correspondente aos batimentos cardíacos de uma pessoa no osciloscópio. Na figura abaixo é mostrada a onda de frequência cardíaca de uma pessoa usando a montagem deste tutorial.

Caso você não tenha acesso a um osciloscópio, poderá plotar esse mesmo sinal com o Serial Ploter do arduino. Para isso, será preciso dar um Offset no sinal para que não haja parte negativa, já que a entrada analógica do arduino aceita tensões de 0V a 5V. Assim sendo, podemos acrescentar uma outra parte no nosso circuito, que é um amplificador somador.

– Adicionando um offset ao sinal

Além de amplificar o sinal, este bloco do circuito soma uma tensão DC ao sinal que é uma fração da tensão de alimentação, de modo que o sinal permanece no intervalo apropriado ao arduino.

Repare que o amplificador usado no final será um Amplificador somador inversor, de modo que a forma de onda estará de “cabeça para baixo”. Com isso, você precisará inverter seu sinal no arduino (usando uma lógica simples com valores altos para tensões perto de 0V e valores baixos para tensões perto de 5V), antes de plotá-lo no Serial Plotter, ou você poderá optar por usar um amplificador somador não-inversor. Ou ainda, acrescentar mais um circuito amplificador inversor antes do amplificador de Offset, o que não será muito eficiente, mas funcionará bem.

Hardware montado

Com isso, nossa montagem final para representar o sinal no arduino será a seguinte:

Programando

Caso você não tenha o osciloscópio e deseje ver a forma de onda no seu computador, basta utilizar o seu arduíno com o código descrito abaixo. A saída da montagem precisa estar conectada na entrada A0 analógica do arduíno. O código abaixo possui a função de ler o sinal e monta o gráfico em função do tempo do sinal de entrada.

int analogPin = A0;
int sinal = 0;

void setup()
{
  Serial.begin(9600);
void loop()
{
  sinal = analogRead(analogPin);   
  Serial.println(sinal);     
}

Feito isto, basta apertar Ctrl+Shift+L.


Entendendo a fundo

Os batimentos do coração bombeiam sangue para as diversas partes do corpo de modo que a densidade sanguínea varia na mesma frequência que o coração bate. Com isso o sensor de luz na ponta do dedo indicador capta essa variação de densidade e transforma isso em um sinal de corrente que é amplificado e transformado em um sinal de tensão pelo amplificador de transresistência. O BPW34 é um fotorreceptor que funciona como uma fonte de corrente, com valores na faixa de µA, portanto, dependentes da luminosidade que incide nele.

Depois do amplificador de transresistência, temos um filtro passa-altas com frequência de corte de 1Hz, cuja função é atenuar toda e qualquer tensão com frequência menor que 1Hz. Deste modo, eliminamos qualquer tensão DC da iluminação natural sobre o sensor.

Com o filtro passa baixas de 40Hz, conseguimos atenuar tensões de frequência maiores que 40Hz, que na maioria das vezes são ruídos e não compõem os harmônicos do sinal de interesse.Esse filtro atenua as frequência maiores que 40hz de forma mais abrupta, pois ele é de segunda ordem. Além disso ele dá um ganho de 20dB (10 vezes) no sinal de entrada que está na banda de passagem (menor que 40Hz).

Todos os capacitores cerâmicos e os dois capacitores eletrolíticos (que ficam entre o +vcc e o terra e o outro entre o terra e o -vcc) servem para manter a tensão de alimentação dos amplificadores operacionais constantes e assim, eliminar ruídos e interferências.

No fim, o amplificador somador, além de amplificar o sinal, soma-o com uma tensão DC que neste caso é 0.22% da tensão de alimentação.

Se você ainda tiver problemas com ruído, talvez seja devido ao efeito capacitivo do diodo fotorreceptor. Para resolver isto, basta acrescentar um capacitor em paralelo com o resistor de 4.7MΩ. O valor deste capacitor deve o mesmo do efeito capacitivo do diodo, algo na faixa de pF, basta verificar no datasheet do componente (no caso do BPW34 é algo na faixa de 20 a 100 pF).


Considerações finais

Assim concluímos o nosso tutorial. Espero que todos consigam montar este, que é um dos dispositivos mais usados na área médica. Lembrem-se de verificar os valores de todos os componentes e testar cada bloco do projeto para que erros sejam facilmente detectados. Em caso de dúvidas, deixem nos comentários.


Medindo rotação de motores com osciloscópio

Medindo rotação de motores com osciloscópio

Osciloscópios são instrumentos de medição de sinais elétricos cujos resultados são apresentados como gráficos em dois eixos. Os eixos mais comuns são o de diferença de potencial (eixo vertical) e o eixo da frequência (eixo horizontal). Com o objetivo de medir a rotação de um motor, pode-se fazer o uso de diversos instrumentos de medição, entre eles o osciloscópio. Como comparação, o instrumento de medição mais comum usado em trabalho de instalações elétricas prediais, o multímetro, tem excelente aplicação quando os sinais analisados na medição tem alteração gradual. Todavia, caso a alteração seja dinâmica, ou a variável de interesse seja a própria alteração (crescimento da curva de tensão em um capacitor por exemplo) o osciloscópio se torna um equipamento bem mais interessante que o multímetro.

kit arduino robótica educacional

O osciloscópio

Os osciloscópios são capazes de fornecer valores de amplitude, frequência, largura do impulso, além da forma e do padrão do sinal que está sendo medido. A medida é obtida através de um processo semelhante ao que ocorre no caso dos multímetros, ou seja, são utilizados apenas dois cabos no local onde desejamos obter uma resposta. A vantagem sobre o multímetro é que o tempo de amostragem do osciloscópio é muito superior.

Figura 1: Exemplo de osciloscópio

Neste tutorial, apresento uma forma de utilizar o osciloscópio para medir a rotação de um motor elétrico, utilizando da ideia da taxa de amostragem e frequência de impulsos. Para esse uso é necessário introduzir o conceito de um componente que será utilizado, o sensor hall.

O sensor hall

Um sensor Hall ou sensor de efeito hall é um transdutor, isto é, um dispositivo utilizado em sistemas de medição que recebe um estímulo e responde com um sinal de tensão. No caso do sensor hall, esse estímulo é a presença de um campo magnético. Sensores Hall podem ser tanto analógicos, sendo capazes de enviar diferentes sinais de tensão para diferentes intensidades de campos magnéticos, quanto digitais, que enviam sinal lógico (alto ou baixo) na presença ou não do campo magnético. Por exemplo, um sensor hall digital alimentado com 5 Volts envia constantemente sinal lógico baixo 0 Volts em sua saída, na presença de um campo magnético que  ative o transdutor o sinal passa a ser alto até que o campo não seja mais sentido pelo dispositivo.

Mãos à obra - Medido a rotação com um osciloscópio

A fim de medir a rotação de um motor elétrico, um ímã é fixado em seu rotor. Um sensor hall digital é posicionado de modo que quando o ímã gira, seja possível captar o campo magnético através do sensor. Ademais, o sinal de saída do sensor de efeito hall é  ligado à ponta de prova do osciloscópio. O motor em funcionamento faz com que o ímã fixo no eixo do rotor acompanhe o movimento de rotação do motor e passe a girar também. O movimento do imã provoca uma reação no sensor com certa frequência e esse valor de frequência nos permite calcular a velocidade do motor.

Componentes necessários

  • Osciloscópio
  • Imã (o imã deve ser de tamanho e força de atração que não impossibilite a medição)
  • Sensor hall digital (olhar no datasheet do sensor a necessidade de um resistor entre os terminais do sensor)

Procedimento

Fixe o imã no eixo do motor que deseja medir a rotação. A nossa recomendação é que você utilize uma resina de base epóxi ou fita de alumínio. Uma vez que a alta velocidade do motor  pode forçar o ímã a ser arremessado, a fixação incorreta pode oferecer certo perigo.

 

Figura 2: Detalhe da fixação do ímã com fita de alumínio

 

Com o datasheet do sensor hall digital em mão, verifique a necessidade de um resistor entre os terminais dele. Depois alimente o sensor segundo as especificações do fabricante, através de uma fonte de bancada, baterias ou outros métodos.

 

Figura 3: Montagem do Sensor Hall na Protoboard

 

A ponta de prova do osciloscópio deve ser ligada na saída do sensor hall, e o outro terminal deve ser aterrado junto do GND (ground)  do sensor. Posicione o sensor de efeito hall próximo ao ímã, de modo que quando o motor girar o sensor seja capaz de sentir a presença do campo magnético. Esse procedimento é através de tentativa e erro, pois depende da intensidade do ímã utilizado e de quão sensível é o sensor escolhido.

 

Figura 4: Sensor Hall próximo ao ímã fixo no eixo do motor

 

Para exemplificar, um sensor hall KY_003 é capaz de sentir o campo proveniente de um ímã de neodímio a uma distância média de 1 cm entre eles.

 

Figura 5: Sensor KY_003

 

Ligue o motor, o osciloscópio e certifique que a medida está sendo realizada. Possíveis erros nessa etapa estão relacionados com mal contato dos componentes ou da ponta de prova do osciloscópio. Portanto, certifique que erros não estejam ocorrendo e prossiga . Outro erro possível está nas configurações do osciloscópio, que pode estar exibindo valores de tensão em uma faixa maior ou menor que a necessária. Verifique o manual dos equipamentos  faça os ajustes necessários.

 

Figura 6: Montagem de bancada

Resultados obtidos

Com base em todo o procedimento, observe o valor de frequência com que o pulso do sensor acontece. O valor informado diz quantas vezes o pulso acontece em um segundo, ou seja o número de voltas do motor em um segundo. Utilizando matemática simples é possível determinar o número de voltas por minutos, efetuando a seguinte regra de 3:

 

pulsos em um segundo — 1 segundo

velocidade em rpm — 60 segundos

 

O resultado desse cálculo fornece a velocidade do motor medida em rpm. É possível, conforme aplicação do motor, utilizar do mesmo sistema para medir a rotação e com alguns cálculos obter valores em m/s ou km/h.

Considerações finais

A possibilidade de adaptação do método existe, com a utilização de um Arduíno por exemplo. Os pulsos do sensor podem ser contados, e transformados em velocidade da mesma maneira. Um exemplo de utilização no Arduíno está relacionada ao acionamento e controle do motor utilizado o Arduíno. É possível utilizar o valor da velocidade tanto como feedback para o controlador, quanto para variável de saída.

Figura 7: Gráfico plotado no MatLab com dados adquiridos pelo Arduíno

Saber a velocidade do motor é útil em vários aspectos. Testes de bancadas para melhoria em plantas de controle por exemplo. Com base nos valores de velocidade oferecido pelo método e tensão/corrente pela fonte é possível modificar algum parâmetro da planta de controle. Seguindo esse raciocínio, a utilização do método é útil em um serie de aplicações e seu baixo custo o torna atrativo.


Primeiros passos com Firebase - ESP8266

Primeiros passos com Firebase - ESP8266

Neste tutorial vamos fazer um circuito que permita observar a temperatura e umidade de um sensor via internet, mostrando como podemos receber sinais de um sensor DHT22 que chegam a um ESP8266 e enviá-los pela internet para uma plataforma Firebase, fazendo uma aplicação bem simples de Internet das Coisas, a famosa IoT , do inglês Internet of Things.

 

kit robotica educacional com Arduino ESP ou Microbit

O que é o Firebase?

O Firebase, produto oferecido atualmente pela Google e utilizado por empresas em todo o mundo, que integra um conjunto de tecnologias disponíveis em diversas linguagens, entregando serviços como:

  • Banco de dados armazenados em nuvem e sincronizados em tempo real;
  • Autenticação de usuários, inclusive por meio de login em provedores como Google e Facebook;
  • Facilitação na hospedagem web;
  • Pode ser usado para testes e manutenção durante o desenvolvimento dos seus apps, assim como o monitoramento dos mesmos.

Com as muitas ferramentas e serviços disponíveis pela plataforma, o desenvolvimento de apps, se torna mais ágil e problemas comuns são resolvidos mais facilmente.

A possibilidade de criar um único SDK contendo APIs do Firebase para uso tanto em Android, como também no iOS e na web é uma das facilidades oferecidas a desenvolvedores, assim como a implementação de bate-papo na aplicação e a viabilidade de testes AB, melhorando a experiência do usuário.

Há recursos também para expansão e envolvimento do público com a sua aplicação, tal como o conhecido Google Analytics, Slack e PlayStore, por exemplo.

No campo da IoT, quando tem-se objetos e aparelhos físicos conectados e em comunicação por meio da internet, também há espaço para o Firebase. Combinados os serviços oferecidos com microcontroladores, como o Arduino, são inúmeras as possibilidades de aplicações, seja em monitoramento de sensores para telemetria, ou em vertíveis (wearables), tecnologias que podem ser vestidas, como relógios inteligentes, por exemplo.

O que é IoT?

IoT, que vem do inglês "Internet of Things", refere-se à conexão da Internet com objetos do dia a dia, permitindo que estes coletem e troquem dados entre si. Basicamente, trata-se de dispositivos que, anteriormente, não tinham capacidade de conexão com a internet, como geladeiras, lâmpadas, relógios, agora estarem conectados à web para coletar e trocar dados, otimizando e automatizando processos.

O que é SDK?

SDK, que é a sigla para "Software Development Kit", refere-se a um conjunto de ferramentas de software que permitem aos desenvolvedores criar aplicações para uma determinada plataforma ou framework específico. O SDK fornece uma série de bibliotecas, guias, documentações, código e outras ferramentas para facilitar o desenvolvimento.

O que é API?

API, que significa "Application Programming Interface", é um conjunto de regras e protocolos que permite a comunicação entre diferentes software. Pode ser entendida como uma ponte que permite que diferentes programas de software se comuniquem entre si. As APIs são essenciais para permitir a integração de sistemas, permitindo que aplicativos e plataformas trabalhem em conjunto.

O que é um banco de dados?

Um banco de dados é um sistema estruturado de armazenamento que permite a coleta, organização, armazenamento e recuperação de dados. Estes dados podem ser de diversos tipos, como textos, números, imagens, entre outros. Os bancos de dados são fundamentais para sistemas e aplicações, pois fornecem uma maneira organizada de gerenciar grandes volumes de informações.

O que são Vestíveis ou wearables?

Vestíveis, ou "wearables", são tecnologias que podem ser usadas como peças de vestuário ou acessórios, como relógios, pulseiras, óculos, entre outros. Estes dispositivos normalmente possuem sensores e estão conectados à internet, coletando e fornecendo dados em tempo real para os usuários. Exemplos populares incluem relógios inteligentes, óculos de realidade aumentada e fones de ouvido inteligentes.


Mãos à Obra - Usando o Firebase em projetos de IoT

Vamos explorar algumas funcionalidades do Firebase com um exemplo prático de um circuito teste, entendendo o código necessário para um projeto simples!

Neste tutorial vamos fazer um circuito que permita observar a temperatura e umidade de um sensor via internet. Utilizaremos um DHT22, que age como um sensor de temperatura e umidade, porém você pode aplicar a outros sensores para obter diferentes informação que você deseja obter podem ser diferentes.

Componentes necessários

Montando o projeto

A montagem deve ser feita seguindo o esquema:

Ilustração do circuito e sua montagem

Olhando o DHT de frente, para a parte onde há aberturas e é feita a leitura, usa-se o pino 1 (mais à esquerda) para alimentação e o pino 4 (mais à direita) como terra.  Eles devem ser ligados, respectivamente, ao Vin e ao Gnd do ESP. Ainda seguindo essa lógica, o pino 2 do DHT deve ser ligado a uma porta digital do ESP que, no caso, foi a porta digital 5 (pino D5 do ESP). O pino 2 também deve ser ligado à alimentação (Vin) com um resistor de 10K entre eles.

Veja como ficou no nosso projeto:

Criando um banco de dados na Firebase

Entre os serviços oferecidos pelo Firebase está o Realtime Database que, como o próprio nome já diz, é um banco de dados que armazena e sincroniza dados em tempo real. Estruturalmente, ele é um banco NoSQL hospedado em nuvem, o que nos livra da necessidade de configurar servidores. Outra grande vantagem é a facilidade de integrá-lo em aplicações, seja em aplicativos iOS, Android e até Web, como é o nosso caso.

Para criar o banco:

a) Acesse a console em https://firebase.google.com  e faça login com uma conta Google.

b) Na próxima tela, adicione um novo projeto.

c) No menu à esquerda, escolha Database, depois Realtime Database e coloque modo público. Dessa forma você terá o banco e a URL que será usada para acessá-lo.

d) O último passo é o segredo do banco, uma espécie de senha. No menu lateral, é preciso clicar na engrenagem, ao lado de ‘Project Overview’ > Configurações do Projeto > Contas de serviço > Chaves secretas do banco de dados. Clicando em mostrar, o segredo pode ser obtido.

Programando

- Configurando a Arduino IDE para NodeMCU

Acesse o caminho Arquivo > Preferências e insira a URL http://arduino.esp8266.com/stable/package_esp8266com_index.json, como descrito nas fotos abaixo.

Feito isso, clique em OK e as placas esp8266 já estarão disponíveis no gerenciador de placas pelo caminho Ferramentas > Placa > Gerenciador de Placas > Instalar ‘esp8266 by ESP8266 Community’.

- Adicionando bibliotecas na Arduino IDE:

Biblioteca do Firebase

Para instalar a biblioteca do Firebase, primeiro é preciso baixá-la do GitHub: (https://github.com/googlesamples/firebase-arduino/archive/master.zip). Depois, é só acessar a Arduino IDE, adicioná-la seguindo o caminho Sketch > Incluir Biblioteca > Adicionar Biblioteca .ZIP e escolher o arquivo que foi baixado.

Biblioteca do DHT

O DTH é uma família de sensores de temperatura e umidade. O modelo que vamos utilizar aqui é o DHT22, que permite distinguir temperaturas na amplitude de -40°C até 80°C. É preciso instalar duas bibliotecas: a ‘Common sensor library’ (https://github.com/adafruit/Adafruit_Sensor) e a ‘DHT Sensor Library’ (https://github.com/adafruit/DHT-sensor-library), e incluí-las na IDE do arduino, assim como feito anteriormente.

- Escrevendo o código

O código do ESP precisa de certas alterações:

  • FIREBASE_HOST: forneça a URL do banco criado anteriormente.
  • FIREBASE_AUTH: forneça o Segredo do seu banco no Firebase.
  • WIFI_SSID e WIFI_PASSWORD: dados da sua rede WiFi.

Uma prática comum na programação são os comentários. No código abaixo, os comentários (indicados por "//") explicitam o significado e funcionalidade de cada trecho.

// Inclusão das bibliotecas necessárias
#include <DHT.h>
#include <ESP8266WiFi.h>
#include <FirebaseArduino.h>
#include <Ticker.h>

// Parâmetros do banco
#define FIREBASE_HOST "URL_do_banco"
#define FIREBASE_AUTH "Segredo_do_banco"

//Parâmetros da rede
#define WIFI_SSID "SSID"
#define WIFI_PASSWORD "Password"
#define DHT_PIN D5
#define DHTTYPE DHT22

// Intervalos de publicação. Configurado a cada 30 segundos
#define PUBLISH_INTERVAL 1000*30
DHT dht(DHT_PIN, DHTTYPE);
Ticker ticker;
bool publishNewState = true;

void publish(){
  publishNewState = true;
}

void setupPins(){
  dht.begin(); 
}

void setupWifi(){
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("connecting");
  while (WiFi.status() != WL_CONNECTED) {
	Serial.print(".");
	delay(500);
  }

  Serial.println();
  Serial.print("connected: ");
  Serial.println(WiFi.localIP());
}

void setupFirebase(){
  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
}

void setup() {
  Serial.begin(115200);
  setupPins();
  setupWifi();	
  setupFirebase();
  // Registra o ticker para publicar de tempos em tempos
  ticker.attach_ms(PUBLISH_INTERVAL, publish);
}

void loop() {
  // Apenas publique quando passar o tempo determinado
  if(publishNewState){
	Serial.println("Publish new State");
	// Obtem os dados do sensor DHT
	float humidity = dht.readHumidity();
	float temperature = dht.readTemperature();
	if(!isnan(humidity) && !isnan(temperature)){
  	// Manda para o firebase
  	Firebase.pushFloat("temperature", temperature);
  	Firebase.pushFloat("humidity", humidity);	
  	publishNewState = false;
	}else{
  	Serial.println("Error Publishing");
	}
  }
 
  delay(200);
}

Pelo Serial Monitor da Arduino IDE será possível ver a conexão com a internet, o endereço IP associado e as publicações de valores no banco. Cada ‘Publish new state’ é uma nova instância de dado gerada e armazenada no Firebase. Esses dados são gerados de acordo com a constante PUBLISH_INTERVAL e o valor é passado em milisegundos. No nosso exemplo, para cada 30 segundos o valor é de 1000*30.

Na console do firebase podem ser vistos os valores que estão sendo lidos:

 


1, 2, 3, Testando...

Vamos criar um site simples, utilizando as tecnologias web padrão HTML5, CSS3 e Javacript e hospedando-o diretamente no Firebase Hosting, outro serviço também muito lindo oferecido pelo Firebase.

 

- Ferramentas e configurações necessárias

Para fazer deploy da aplicação no Firebaseprecisamos instalar o firebase-tools, que é uma ferramenta de linha de comando para gerenciar o banco de dados e hosting de aplicações dentro da própria plataforma. Essa ferramenta é baseada em NodeJS, então precisamos da ferramenta instalada. Baixe o NodeJS no site oficial. Junto também será instalado o gerenciador de pacotes — NPM (similar ao PIP para Python).

Feito isso, é só rodar o comando no terminal: npm install -g firebase-tools

Ao final da instalação rode o comando a seguir e coloque suas credenciais do Firebase:

firebase login

 

- Programação

Crie uma pasta para o seu projeto e utilize o seguinte comando dentro da pasta:

firebase init

Assim, você estará vinculando a pasta ao projeto criado no console do Firebase, então escolha corretamente o projeto criado anteriormente. Uma pasta public será criada, onde ficarão os arquivos que podem ser hospedados no Firebase e acessados na web e também alguns arquivos de configuração do próprio projeto.

Há ainda um servidor embutido no firebase-tools. Dessa forma, estando na pasta, você também pode rodar firebase serve, para iniciar um servidor web na pasta public, na porta 5000 por padrão.

Usando a IDE da sua preferência, utilize o código de exemplo da aplicação que pode ser encontrado nesse link (app.js e o front-end em index.html). Para adequar a aplicação ao seu projeto no Firebase, deve-se alterar o começo do arquivo app.js, com as configurações do console do projeto no Firebase, seguindo os passos:

  1. Clique em Overview no menu lateral
  2. Clique em “Adicionar o Firebase ao seu aplicativo da Web”
  3. Copie o trecho dentro da segunda tag <script> e substitua pelo código correspondente no arquivo app.js

Feito isso, é só dar deploy da aplicação no hosting do Firebase. Rode o comando firebase deploy, assim você vai enviar os arquivos da pasta public pra lá e será mostrado um link para que você acesse sua aplicação online.

A aplicação deve se parecer com isso:


Considerações finais

Sobreviveu?

Simmm, acabou! Tudo certo até aqui? Finalizado este tutorial, você tem uma aplicação web que une um sensor a serviços do Firebase, contando com dados em tempo real e guardados em nuvem, ou seja, você tem uma aplicação de IoT. Esperamos que você tenha gostado e, caso tenha usado um sensor diferente, tenha sugestões, críticas ou elogios, não deixe de comentar abaixo (:


Módulo GSM SIM800L - Aplicações com Arduino

Módulo GSM SIM800L

Neste tutorial, iremos testar as principais aplicações do módulo GSM SIM800L diretamente com os comandos AT pela UART , assim, podemos fazer o mesmo código para diversos microcontroladores como PIC, ESP8266/32, ARM, AVR, etc, mudando apenas os métodos de utilização da UART de MCU para MCU, já que os comandos AT serão sempre iguais. Para esse tutorial usaremos o Arduino Mega como controlador.

Módulo GSM SIM800L
Figura 1 - Módulo GSM SIM800L

[toc]

kit robotica educacional com Arduino ESP ou Microbit

O que vamos aprender?

As principais aplicações deste módulo são:

  • SMS (receber e enviar).
  • Obter horário da rede, similar ao NTP ou RTC.
  • Obter localização por triangulação da rede.
  • Conexões TCP/UDP (inclusive SSL/TLS).
  • Ligações com entrada e saída de áudio.

Neste tutorial, Aprenderemos os 3 primeiros itens separadamente encontrados na lista apresentada.


Mãos a obra - Testando algumas funções do SIM800L

Componentes necessários

Montando o projeto

Atenção: esse módulo pode utilizar muita corrente de sua fonte em picos de transmissão (até 2A), então não alimente-o diretamente pelo Arduino. Recomenda-se utilizar uma fonte externa de 3,4V a 4,3V de no mínimo 2A. Caso não tenha uma fonte com tanta corrente, você pode adicionar alguns capacitores de alto valor capacitivo para ajudar nos picos de transmissão. Se a fonte não for suficiente para alimentá-lo, ele irá reiniciar aleatoriamente durante as transmissões.

 

Esquematico no Frittzing Arudino Mega e Módulo GSM SIM800L
Figura 2 - Esquematico no Frittzing

Projeto 1 - Enviando e recebendo SMS

Programando o Arduino

void setup()
{
  Serial2.begin(115200);
  pinMode(13, OUTPUT);//LED
  pinMode(8, OUTPUT);//Pino de reset do GSM

  //reinicia o GSM
  digitalWrite(8, 0);
  delay(2000);
  digitalWrite(8, 1);
  delay(7000);

  if (gsmWrite("AT", "OK") == "FAIL")
  {
    return;//Se o GSM nao responder, retorna a funcao (trava o mcu)
  }

  delay(5000);//Espera o termino da inicializacao do GSM
  SMSsnd("014998202683", "Arduino ON, lendo mensagens...");//Envia a mensagem pro numero. Atencao: precisa do DDD!

  
}

void loop()
{
  SMSrd();//Verifica se há novas mensagens para serem lidas a cada 10seg
  delay(10000);
}


String gsmWrite(String snd, String rcv)//Funcao que envia dados pro GSM e espera a resposta de ate 30seg
{
  Serial2.println(snd);

  if (rcv.indexOf("+CMGS") > -1)
  {
    delay(150);
    Serial2.write(0x1A);
  }

  for (uint16_t i = 0; i < 1200; i++)
  {
    delay(25);
    if (Serial2.available())
    {
      delay(50);
      String a = Serial2.readString();


      if (a.indexOf(rcv) > -1 || rcv.length() == 0)
      {
        return a;
      }
    }
  }

  return "FAIL";
}

void SMSsnd(String nm, String msg)//Funcao que envia o SMS
{
  String snd = "AT+CMGS=\"";  snd += nm;  snd += "\"";

  gsmWrite("AT+CMGF=1", "OK");
  gsmWrite("AT+CSMP=17,255,0,0", "OK");
  gsmWrite(snd, ">");
  gsmWrite(msg, "+CMGS:");
}

void SMSrd()//Funcao que le se ha SMS nao lido
{
  String c = "";
  gsmWrite("AT+CMGF=1", "OK");
  c = gsmWrite("AT+CMGL=\"REC UNREAD\"", "");

  if (c.indexOf("+CMGL:") > -1)
  {
    if    (c.indexOf("ON") > -1)//ON
    {
      digitalWrite(13, 1);//se o SMS conter o texto ON, liga o LED
    }
    else if (c.indexOf("OFF") > -1)//OFF
    {
      digitalWrite(13, 0);//se o SMS conter o texto OFF, desliga o LED
    }

    gsmWrite("AT+CMGD=1,1", "OK");//apaga todas mensagens (SIM card ha pouca memoria)
  }
}

Colocando para funcionar

Depois de ligar nosso projeto na alimentação, vamos logo receber uma mensagem indicando que o sistema está ativo, mostrando que o envio de SMS funcionou perfeitamente. Também foi adicionada a leitura de SMS, de modo que, quando um SMS é enviado com a mensagem "ON" ou "OFF",  o LED no pino 13 seja ligado ou desligado.

Mensagem recebida do Módulo GSM SIM800L
Figura 3 - Mensagem recebida do Módulo GSM SIM800L

Projeto 2 - Obtendo horário através da rede

Programando o Arduino

void setup()
{
  Serial.begin(115200);
  Serial2.begin(115200);//Inicia a Serial do GSM
  pinMode(8, OUTPUT);//Pino de reset do GSM

  //Reinicia o GSM
  digitalWrite(8, 0);
  delay(2000);
  digitalWrite(8, 1);
  delay(7000);

  String rcv = gsmWrite("AT", "*PSUTTZ:");//Espera o GSM obter o horario da rede
  if (rcv.indexOf("FAIL") > -1)
  {
    gsmWrite("AT+CLTS=1;&W", "OK");//Se nao responder, pode ser configuracao do seu GSM, entao vamos ativar a obtencao automatica de horario pela rede
    setup();//retorna ao inicio
  }

  delay(5000);
  

  
}

void loop()
{
  Serial.println(gsmTIME());//Mostra a data e horario no Serial Monitor
  delay(5000);
}


String gsmWrite(String snd, String rcv)//Funcao que envia dados ao GSM e espera a resposta
{
  Serial2.println(snd);

  if (rcv.indexOf("+CMGS") > -1)
  {
    delay(150);
    Serial2.write(0x1A);
  }

  for (uint16_t i = 0; i < 1200; i++)
  {
    delay(25);
    if (Serial2.available())
    {
      delay(50);
      String a = Serial2.readString();


      if (a.indexOf(rcv) > -1 || rcv.length() == 0)
      {
        return a;
      }
    }
  }

  return "FAIL";
}

String gsmTIME()//Funcao que retorna a data e horario
{
  String c = gsmWrite("AT+CCLK?", "+CCLK:");

  int16_t a = c.indexOf("\"") + 1;
  int16_t b = c.indexOf("\"", a);
  return c.substring(a, b);
}

Colocando para funcionar

Abrindo o Serial Monitor, podemos observar a data e o horário retornado pelo módulo GSM, lembrando que a data está no padrão (ano/mês/dia). O ultimo valor do horário corresponde ao fuso horário*4, logo, para obter nosso fuso horário, basta dividir "-12" por 4  e chegamos em -3 (fuso horário de brasília).

Data e hora do módulo GSM SIM800L
Figura 4 - Data e hora do módulo GSM SIM800L

Projeto 3 - Obtendo localização através da rede

Programando o Arduino

void setup()
{
  Serial.begin(115200);
  Serial2.begin(115200);
  pinMode(8, OUTPUT);//Pino de reset do GSM

  //Reseta o GSM
  digitalWrite(8, 0);
  delay(2000);
  digitalWrite(8, 1);
  delay(7000);

  if (gsmWrite("AT", "OK") == "FAIL")
  {
    return;
  }

  delay(5000);
  
  if (gsmWrite("AT+SAPBR=1,1", "OK") == "FAIL")//Ativa a rede pra localizacao
  {
    return;
  }
  else
  {
    String rcv = gsmWrite("AT+CIPGSMLOC=1,1", "+CIPGSMLOC:");//Pergunta a localizacao ao GSM
    int a = rcv.indexOf(":") + 2;
    int b = rcv.indexOf(",", a);
    if (rcv.substring(a, b) == "0")
    {
      a = rcv.indexOf(",", b) + 1;
      b = rcv.indexOf(",", a) + 1;
      b = rcv.indexOf(",", b);
      Serial.println(rcv.substring(a, b));//Mostra a localizacao no Serial monitor
    }
  }
}

void loop()
{
  
}


String gsmWrite(String snd, String rcv)//Funcao que envia dados ao GSM e espera a resposta
{
  Serial2.println(snd);

  if (rcv.indexOf("+CMGS") > -1)
  {
    delay(150);
    Serial2.write(0x1A);
  }

  for (uint16_t i = 0; i < 1200; i++)
  {
    delay(25);
    if (Serial2.available())
    {
      delay(50);
      String a = Serial2.readString();


      if (a.indexOf(rcv) > -1 || rcv.length() == 0)
      {
        return a;
      }
    }
  }

  return "FAIL";
}

Colocando para funcionar

As coordenadas que o módulo GSM retorna é longitude e latitude respectivamente.

Coordenadas lidas pelo Módulo GSM SIM800L
Figura 5 - Coordenadas lidas pelo Módulo GSM SIM800L

Entendendo a fundo

Software

Para utilização do módulo GSM foram usados os comandos "AT" do Datasheet, este pode ser encontrado logo abaixo em nossa seção de referências. Existem incontáveis comandos para as mais diversas aplicações e se você pretende utilizar o módulo GSM, aconselhamos que estude o Datasheet e conheça os comandos necessários para seu projeto.

A comunicação entre o Microcontrolador e o módulo GSM é feita através da porta Serial (UART) à 115200b/s neste caso, mas pode ser alterada. A cada comando enviado, normalmente, retorna-se uma resposta, então sempre que enviamos um comando, precisamos esperar a resposta para saber se os dados enviados foram realmente enviados. Para isso, foi criada uma função básica cuja função é escrever o dado no módulo GSM e esperar o retorno da resposta em um tempo limite de 30 segundos. Tome cuidado que alguns comandos podem demorar até 85 segundos para retornar resposta e caso isso aconteça, o código irá falhar por timeout. Para arrumar isso, aumente o timeout da função de leitura.

-Função gsmWrite(String snd, String rcv)

gsmWrite("AT", "OK");

A função criada para envio de dados do módulo GSM é uma boa maneira de utilizar o mesmo em diversos tipos de códigos, entretanto, como normalmente após a escrita de algum comando nós esperamos uma resposta, isto pode deixar nosso código lento e travando, já que alguns comandos demoram até 85 segundos!

Essa função basicamente escreve o comando (primeiro argumento da função, "snd") AT na porta Serial e posteriormente espera a resposta do mesmo (segundo argumento da função, "rcv"). Caso o módulo GSM não retorne a reposta esperada em 30 segundos que definimos no loop FOR() da função, retorna-se a mensagem "FAIL".

 -Comandos AT

O módulo GSM SIM800L funciona com os comandos AT e a maioria deles retorna alguma mensagem de confirmação ou erro, vamos ver como alguns deles funcionam!

AT+CCLK

Figura 6 - AT+CCLK

Quando requisitado "AT+CCLK?" do SIM800L, retorna-se "+CCLK: <time>" e ao fim, "OK". Também pode-se retornar erros como mostrado na imagem.

AT+CMGL

Figura 7 - AT+CMGL

A leitura de SMS do nosso projeto foi dedicada apenas às mensagens não lidas, por isso utilizamos "AT+CMGL="REC UNREAD"", mas você pode trocar para qualquer uma das opções acima que se encaixar melhor ao seu projeto.


Conclusões finais

As utilidades para o módulo GSM são inúmeras e isto nos permite ter uma gama de aplicações muito grande em um mesmo projeto, já que conta com diversas features, desde SMS até conexões TCP e etc. Apesar de alguns comandos demorarem bastante por causa da latência da rede telefônica, ainda podemos usufruir bem deste incrível módulo. O SIM800L faz muito mais do que mostrado aqui, entretanto estamos mostrando apenas o básico para norteá-los.

Referencias


Medindo Tensão AC com Módulo GBK P8 e Arduino

Medindo Tensão Elétrica AC com Módulo GBK P8 e Arduino

Neste tutorial vamos aprender como medir a tensão da rede elétrica utilizando o sensor de tensão GBK P8 em conjunto com um Arduino UNO.

[toc]

Módulo GBK P8

Em alguns projetos, é necessário medir grandezas elétricas em algum aparelho ou circuito, para monitorar condições de funcionamento, prevenir falhas, ou medir seu consumo de energia.

O módulo Sensor de Tensão GBK P8 é uma opção para medição de tensão elétrica. A placa é baseada num optoacoplador (TIL 116) e com ela é possível realizar a medição de tensões de 127 até 220 V.

Imagem do módulo GBK P8

kit robotica educacional com Arduino ESP ou Microbit


Mãos à obra - Medindo Tensão AC com Módulo Sensor de Tensão GBK P8

Componentes necessários

Neste projeto, vamos monitorar o valor de tensão de um equipamento para verificar se ele está ligado ou desligado. Para isso, precisaremos de:

Montando o projeto

A placa possui três terminais, que estão identificados, como a figura abaixo.

 

Pinagem do sensor de tensão AC

Os três terminais são:

  • +5Vcc, é o pino de alimentação, que é ligado ao 5 V do Arduino
  • gnd, é o terminal de 0 V, ligado no GND do Arduino
  • Out, que será conectado no do Arduino

ATENÇÃO! Ao realizar este projeto, você estará trabalhado diretamente com tensões maiores que o habitual. Nesse nível de tensão, um choque elétrico pode causar danos a você e ao seu equipamento.

Se você está em dúvida sobre como proceder nessa parte, peça ajuda a alguém que saiba como trabalhar com segurança.

A montagem fica assim:

 

Esquema de ligação sensor de tensão com Arduino

 

Programando

Após conectarmos o Arduino ao computador e abrirmos sua IDE, selecionamos o modelo da placa que estamos usando - no caso, Arduino UNO - e selecionamos a porta de conexão dele com o computador.

Escreva na IDE o seguinte código:

#define gbk A0

const int R1 = 220000;
const int R2 = 10000;
int valorLido = 0;
float acum = 0;
float v1 = 0;

void setup() {
  Serial.begin(9600);
}

void tensaoCalculo() {
  valorLido = analogRead(gbk);
  v1 = valorLido * 0.004882812;
  acum = v1 / (R2 / (R2 + R1));
  if(acum == 0) {
    Serial.println("Aparelho desconectado da tomada");
    Serial.println("");
  } else {
    Serial.println("Aparelho conectado a tomada");
    Serial.print("Tensao = ");
    Serial.print(acum);
    Serial.println(" V");
    Serial.println("");
  }
}

void loop() {
  tensaoCalculo();
  delay(1000);
}

Colocando pra funcionar

ATENÇÃO! Ao realizar este projeto, você estará trabalhado diretamente com tensões maiores que o habitual. Nesse nível de tensão, um choque elétrico pode causar danos a você e ao seu equipamento.

Se você está em dúvida sobre como proceder nessa parte, peça ajuda a alguém que saiba como trabalhar com segurança.

Após dar upload do código ao Arduino, conectamos o módulo em PARALELO ao dispositivo. No nosso caso, adaptamos uma extensão para ligar direto na rede elétrica em tensão AC.

IMAGEM LIGAÇÃO EXTENSÃO E SENSOR

Depois de concluir todos os passos, o Arduino deve imprimir a seguinte mensagem no monitor serial: "Aparelho desconectado da tomada". Agora conecte a extensão na tomada e veja o resultado no monitor serial.

IMAGEM MONITOR SERIAL

Através da saída analógica do sensor de tensão AC o Arduino consegue dizer quando o aparelho está conectado a tomada e informar a tensão elétrica.

Entendendo o Módulo GBK P8

Hardware

O módulo GBK é composto por um optoacoplador, resistores e um capacitor. O esquema de ligação pode ser visto logo abaixo.

(esquemático GBK P8)

Por estar conectado em paralelo com a tomada, entre os terminais de conexão da rede elétrica haverá uma diferença de potencial interligados por um resistor de 220 kΩ (como visto no esquemático acima), com isso, circulará uma corrente com valor bem reduzido por esse resistor. Essa corrente passará também pela entrada do optoacoplador TIL116.

Optoacoplador TIL116
O esquemático interno do TIL 116

Na entrada do optoacoplador existe um diodo infravermelho, que emite luz quando há corrente. Essa luz chega ao fototransistor do acoplador, chaveando corrente e criando um sinal de tensão em sua saída.

Forma de onda antes do capacitor

A forma de onda da saída do optoacoplador seria a um retificador de meia onda, permitindo corrente apenas nos ciclos positivos de corrente. Entretanto, a presença do capacitor no circuito altera o sinal, descarregando para o circuito no ciclo negativo, criando uma tensão de ripple com menos variação.

Forma de onda após o capacitor

Software

Vamos explicar os trechos do código, para que você entenda por completo o que está sendo feito, e possa modificar o que for necessário no seu projeto.

- Variáveis do programa

O programa inicia com a definição de uma constante para o compilador: onde aparecer gbk o compilador interpreta como A0, que é o pino da leitura analógica. A vantagem desse recurso é que se o pino for alterado fisicamente depois, basta fazer a alteração em apenas um lugar do código, o que é bem útil em programas muito grandes.

Depois são declaradas algumas variáveis e constantes que ficarão na memória. R1 e R2 são constantes que armazenam os valores das resistências do módulo. A variável valorLido armazena a leitura analógica do pino A0, que vem do módulo. As variáveis v1 e acum são utilizadas no cálculo da tensão.

#define gbk A0

const int R1 = 220000;
const int R2 = 10000;
int valorLido = 0;
float acum = 0;
float v1 = 0;

- As definições no setup

No setup acontece a inicialização da comunicação serial, para a utilização do monitor serial

Serial.begin(9600);

- A função de cálculo da tensão

A função que calcula a tensão, com base na leitura analógica, é chamada logo no início da função loop.

void tensaoCalculo() {
  valorLido = analogRead(gbk);
  v1 = valorLido * 0.004882812;
  acum = v1 / (R2 / (R2 + R1));
  if(acum == 0) {
    Serial.println("Aparelho desconectado da tomada");
    Serial.println("");
  } else {
    Serial.println("Aparelho conectado a tomada");
    Serial.print("Tensao = ");
    Serial.print(acum);
    Serial.println(" V");
   Serial.println("");
  }
}

Ela inicia fazendo a leitura analógica do pino A0 e armazenando na variável valorLido. Em sequência, faz a conversão da leitura, que vai de 0 a 1023, para um valor de tensão, que vai de 0 a 5 V. A conversão é feita multiplicando o valorLido por 0,004882812. Esse valor é equivalente a 5/1024, e representa quanto vale em volts cada inteiro da leitura analógica. A multiplicação então, converte a leitura analógica para um valor de tensão.

valorLido = analogRead(gbk);
v1 = valorLido * 0.004882812;

Depois, se faz o cálculo de quanto a tensão lida representa no valor real. A tensão lida no sensor é uma tensão de 0 a 5 V, na saída de um divisor de tensão. Para o valor real, a tensão faz o cálculo inverso ao do divisor de tensão:

acum = v1 / (R2 / (R2 + R1));

 

 

- Declarando a função tensaoCalculo()

Antes de iniciar o void loop(), é necessário declarar a função que será chamada por ele.

void tensaoCalculo()

- Lendo os dados do pino A0

É armazenado o valor lido no pino A0 na variável do tipo inteiro "valorLido".

valorLido = analogRead(A0);

- Convertendo para tensão

Multiplica-se o valor lido na entrada analógica por 0,00482812 para descobrir o valor da tensão da entrada analógica do arduino.

v1 = valorLido * 0.004882812;

Considerações finais

Esperamos que este tutorial tenha ajudado a entender como utilizar o Módulo Sensor de Tensão GBK P8, e como utilizá-lo em projetos para medir tensão da rede elétrica, ou de dispositivos ligados em tensão AC.

Deixe nos comentários suas dúvidas. Críticas e sugestões também são muito bem vindas.

Até o próximo!