SENSOR MAGNÉTICO REED SWITCH

Sensor Magnético Reed Switch

Já pensou em controlar motores, relés ou LEDs de forma barata e fácil ? Com o sensor magnético Reed Switch, isso é possível. Esse dispositivo, como o nome já sugere, é um sensor de campo magnético, ou seja, ele é capaz de detectar quando um ímã está se aproximando ou se afastando. Simples e eficiente, o reed switch apresenta grande aplicabilidade na indústria e em diversos projetos de robótica e automação, sendo amplamente usados em portões eletrônicos e em sistemas antifurto, por exemplo.

kit robotica educacional com Arduino ESP ou Microbit

 

 

Como funciona o sensor magnético reed switch ?

Os sensores magnéticos reed switch são ampolas constituídas por um bulbo de vidro, que contém, em seu interior, duas hastes metálicas flexíveis que se movimentam conforme a ação de um campo magnético. Essa configuração possibilita que as hastes se mantenham em contato fechado ou aberto, o que implica se haverá ou não passagem de corrente elétrica.

 

Quando há um ímã próximo do sensor, ocorre a magnetização  dos contatos metálicos do dispositivo, fazendo com que estes se fechem, o que  permite a passagem de corrente elétrica. De forma análoga, com o ímã afastado, os contatos se mantêm abertos, impedindo a passagem da corrente. Nesse sentido, a passagem ou não de corrente elétrica indica ao Arduino se o ímã está longe ou perto do sensor.

 

Sistemas antifurto

A partir dessa informação, conseguiremos, através do Arduino, controlar os dispositivos que quisermos, como um buzzer em um sistema antifurto de um cofre, por exemplo. Em projetos como esse, geralmente se acopla o reed switch a uma das paredes do cofre, enquanto um ímã é anexado à sua porta. Dessa maneira, o Arduino irá interpretar quando a porta estiver aberta (sensor afastado do ímã) ou quando estiver fechada (sensor próximo ao ímã), de modo que o usuário consiga identificar arrombamentos.

Em sistemas como o da figura, quando ocorre um arrombamento, a porta do cofre permanece aberta, de maneira que o ímã e o sensor ficam separados. Desse modo, tal informação é lida pelo Arduino, que, por sua vez, coordenará o acionamento de um buzzer, que atua como um sinalizador.

Sendo assim, neste tutorial, você vai aprender a conectar o sensor reed switch ao Arduino. Além disso, vai aplicar seu conhecimento num projeto de alarme antifurto com o sensor magnético reed switch e um buzzer, seguindo o modelo do exemplo apresentado.

 

Mãos à obra - Alarme antifurto com sensor magnético reed switch

Componentes necessários

 

Montando o projeto

Vamos conectar os componentes do projeto. Para isso, desligue o cabo USB do seu Arduino e monte o circuito conforme a figura a seguir:

Programando

Crie um sketch e salve-o com o nome "reed_switch_alarme". Em seguida, com o sketch salvo, escreva o  programa da seguinte forma:

#define buzzer 2 //buzzer na porta digital 2
#define sensor 9 //sensor reed switch na porta digital 9
#define led 12 //LED na porta digital 12
int leitura;

void setup() {
pinMode(buzzer,OUTPUT); //buzzer atuando como saída
pinMode(sensor, INPUT); //sensor atuando como entrada
pinMode(led,OUTPUT); //LED atuando como saída
}

void loop() {
  leitura = digitalRead(sensor);
 
  if(leitura==0){ //se nenhum campo magnético for detectado
    tone(buzzer,1500); // o buuzer toca 
    digitalWrite(led,HIGH); //o led acende
  }
  if(leitura==1){ //se houver campo magnético 
    noTone(buzzer); //buzzer não toca
    digitalWrite(led,LOW); // led apagado
  }
}

Após digitar o código, clique em carregar, para que o programa seja transferido para a placa Arduino.

Colocando para funcionar

Terminado o passo-a-passo, você perceberá que, ao aproximar um ímã do circuito, tanto o buzzer quanto o LED permanecem desativados. Contudo, ao afastar o ímã, o buzzer irá apitar, e o LED acenderá, de maneira semelhante ao que ocorre no exemplo do cofre descrito acima.

 

Entendendo a fundo

Entendendo o software

O sensor magnético reed switch é do tipo NA (normalmente aberto), ou seja, quando a leitura do sensor tiver valor lógico 1 (HIGH), significa que há campo magnético sendo detectado. Do contrário, quando o valor lido for 0 (LOW), é sinal de que o ímã está afastado, pois não há campo magnético ao redor.

No código, a variável "leitura" recebe o valor digital lido pelo sensor através da função digitalRead()

leitura = digitalRead(sensor);

Após a leitura, o próximo passo é indicar ao Arduino o momento em que o buzzer e o LED devem ser acionados. Para isso, utiliza-se uma  estrutura condicional.

if(leitura==0){ //se nenhum campo magnético for detectado
    tone(buzzer,1500); // o buuzer toca 
    digitalWrite(led,HIGH); //o led acende
  }
  if(leitura==1){ //se houver campo magnético 
    noTone(buzzer); //buzzer não toca
    digitalWrite(led,LOW); // led apagado
  }

Dessa forma, se o valor captado pelo sensor for 0 (LOW), o que significa ausência de campo magnético, o buzzer toca, e o LED acende (HIGH); Caso contrário, se o sensor indicar 1 (HIGH), é sinal de que existe um campo magnético ao redor, e portanto, o Arduino deverá acionar tanto o buzzer quanto o LED.

Funções tone() e noTone()

A função tone() serve para o acionamento do buzzer. Como parâmetros, ela recebe a variável (buzzer) que representa o dispositivo usado e a frequência com que o som deve ser emitido. No nosso caso, utilizamos o valor de 1500 HZ.

tone(buzzer,1500); // o buzzer toca

Já a função noTone(), como o nome indica, serve para desativar o buzzer e tem como parâmetro apenas a variável que representa o dispositivo utilizado.

 

Considerações Finais

Agora que você aprendeu a usar o sensor magnético reed switch, que tal aplicar seus conhecimentos em outro projeto semelhante ? Como desafio, tente usar esse sensor para controlar um motor, simulando o que acontece em portões eletrônicos, em que o reed switch atua como um sensor fim de curso, boa sorte !

 

 

 


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.


Sonoff Relé WIFI: Acendendo uma Lâmpada

O QUE É O SONOFF ?

O Relé WIFI Sonoff é um pequeno equipamento constituído por um chip ESP8266, que nada mais é do que um microcontrolador com WIFI que se conecta à internet. Com esse relé, você pode controlar diversos dispositivos em sua casa, de maneira prática, fácil e barata, utilizando um aplicativo em seu celular. Nesse tutorial, você vai aprender a controlar uma lâmpada com o Relé WIFFI Sonoff e, com isso, dará os primeiros passos para atuar na automação residencial.

Esse dispositivo conta com um regulador de tensão bivolt. Dessa forma, o usuário pode conectá-lo diretamente na rede elétrica de sua residência, seja ela de 220V ou de 110V. Além disso, é importante enfatizar que esse relé WIFI não se limita apenas ao controle de lâmpadas. Isso quer dizer que você pode acionar equipamentos variados em sua casa, desde que a corrente máxima do circuito seja de 10A.

kit robotica educacional com Arduino ESP ou Microbit

AUTOMAÇÃO RESIDENCIAL : SUA CASA INTELIGENTE

A automação residencial consiste em um conjunto de tecnologias que permitem automatizar e programar as funções dos mais diversos equipamentos domésticos. A partir disso, vem ganhando espaço o conceito de casa inteligente. Esse tipo de residência, por sua vez, oferece maior praticidade aos seus moradores, pelo fato de possibilitar o gerenciamento remoto de atividades relacionadas ao lar, por meio de dispositivos acessíveis e usuais, como smartphones e tablets.

https://www.youtube.com/watch?v=kWbNII-gafs

MÃOS À OBRA

Componentes Utilizados

Montagem

Primeiro, remova as tampas do dispositivo para ter acesso aos seus terminais.

A partir de agora, você vai realizar a montagem do circuito elétrico envolvendo o relé.

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

Então, ligue os fios da tomada, fase e neutro, na entrada Input do relé.

Repita o procedimento anterior, mas agora, use os fios encapados para conectar a lâmpada ao relé, na saída Output.

Após isso, ligue o relé na rede elétrica e verifique se o LED acoplado ao dispositivo pisca a cada dois segundos. Se isso acontecer, é sinal de que o relé está funcionando.

Observe um esquema que representa esse circuito:

Conectando o relé ao aplicativo

Baixe o aplicativo eWeLink, disponível em Google PlayStore, para Android e AppStore, para IOS.

Ao abrir o aplicativo, na tela inicial, você deve acessar a opção "criar uma nova conta".

Depois, com a sua conta já criada, clique na opção "adicionar", para adicionar um dispositivo.

A seguir, você pode acesse a opção "emparelhamento rápido".

Nessa etapa, é preciso que você insira a senha da rede WIFI conectada ao celular e que será usada para controlar o relé. Vale lembrar que a frequência máxima da rede deve ser de 2,4GHz.

 

Antes de prosseguir no aplicativo, pressione o botão por aproximadamente 5 segundos.

Após isso, o LED piscará rapidamente até que permaneça aceso. A partir de então, seu dispositivo está emparelhado.

Com o dispositivo já emparelhado, clique em "próximo", para iniciar a conexão do Relé Sonoff à rede WIFI.

Aguarde alguns segundos, para que o emparelhamento se complete.

 

Na etapa seguinte, você pode dar um nome ao dispositivo em questão, o que facilitará o seu trabalho. Além disso, adicione seu dispositivo a alguma divisão de sua escolha.

 

Clique na opção "concluído".

Com isso, o relé está devidamente conectado ao aplicativo.

Por fim, basta clicar na opção "liga/desliga" para controlar a lâmpada através do relé.

 

 

Sempre que quiser controlar sua lâmpada inteligente, vá à tela de início e selecione a opção com nome que você deu ao dispositivo.

Caso queira controlar outro aparelho, basta abrir o aplicativo, selecionar a opção "+" e repetir o procedimento que você aprendeu.

 

 

 

 

 

 


Sensor de Peso no Arduino - Célula de Carga com conversor HX711

Sensor de Peso com Arduino - Célula de Carga com conversor HX711

As balanças, equipamentos capazes de medir o peso de um objeto, são importantes em diversas atividades, onde é necessário saber a massa de uma substância ou produto. Nesse tutorial vamos aprender como montar um sensor de peso com Arduino, usando uma célula de carga em conjunto com um conversor de sinal AD. 

Sensores de Peso

O primeiro passo para entender como um sensor funciona é investigar qual a propriedade física que ele mede. No caso de uma balança, é a força exercida sobre uma superfície, que nada mais é do que o peso.

Quando um objeto está sobre uma superfície, ele exerce uma força sobre ela que é igual a sua massa multiplicada pelo aceleração da gravidade. 

kit arduino robótica educacional

Célula de Carga

Quando submetido a uma força ou carga, um corpo se deforma momentaneamente. Essa deformação altera as propriedades físicas do material, e se esse material for um condutor, pode alterar sua resistência elétrica. A imagem abaixo mostra um strain gauge, ou extensômetro, que é a resistência elétrica utilizada como sensor. Essa resistência é colada na superfície do corpo que vai ser submetido a carga para que sofra a mesma deformação do corpo. A direção vertical é a mais sensível às forças, então o sensor é posicionado na direção da carga.

 

strain gauge - Resistencia que irá deformar conforme a força ou peso aplicado sobre eles
Strain Gauge - Resistencia que irá deformar conforme a força ou peso aplicado sobre eles

A resistência de um material é proporcional ao seu comprimento e inversamente proporcional a sua área. Por isso, se houver uma força esticando pelas bordas o strain gauge da figura, seu comprimento aumenta, aumentando sua resistência. Se ao invés de esticado, estiver sendo comprimido, então sua resistência diminui.

A célula de carga é montada em uma ponte de Wheatstone, como a figura, onde uma ou mais resistências são substituídas por um extensômetro. Quando a ponte está balanceada, as relações entre as resistências é tal que R1/R2 = R4/R3, e Vo é igual a zero.

ponte de Wheatstone
ponte de Wheatstone

Se uma das resistências for uma célula de carga, digamos R3, quando houver desbalanceamento da ponte, ou seja, se a resistência for alterada por efeito de uma carga, valores de tensão diferentes de zero passam a ser medidos em Vo.

A célula de carga pode ser construída em ponte completa, meia ponte ou um quarto de ponte. Você pode ver exemplos de montagem aqui. Um sensor de 3 terminais consiste de meia ponte, com um divisor de tensão entre uma resistência fixa e um extensômetro.

 

Meia ponte de Wheatstone
Meia ponte de Wheatstone

 

Os terminais desse sensor são:

  • Vcc - Fio branco, de alimentação da ponte
  • Vss - Fio preto, o GND de alimentação da ponte
  • Sinal - Fio vermelho, o Vo de saída
Célula de Carga - Sensor de Peso
Célula de Carga - Principal componente do sensor de peso

As células de cargas são geralmente feitas de aço ou alumínio, dependendo da capacidade ou precisão necessária. É um sensor muito utilizado por apresentar boa precisão, mesmo em ambientes com variações de umidade e temperatura, além de poderem trabalhar com um grande faixa de operação.

Conversores A/D

A natureza dos sinais mecânicos transformados em elétricos através dos transdutores é analógica e contínua no tempo. Entretanto, para permitir que o sinal possa ser tratado e processado por um microcontrolador é necessário fazer uma conversão do sinal analógico para um sinal digital. 

Essa transformação ocorre através de um conversor A/D (Analógico/Digital). Ele transforma um sinal analógico e contínuo no tempo em um sinal amostrado e discreto no tempo, com precisão determinada pela resolução em bits do conversor utilizado. Quanto mais bits, menor é o erro entre o valor analógico e o valor convertido para digital.

Conversor HX711

O módulo AD HX711 é um conversor analógico/digital de 24 bits, associado a um estágio de amplificação, específico para trabalhar com sensor de carga.

Conversor HX711 - Será usado para converter o sinal analógico da Célula de Carga em um Sinal Digital
Conversor HX711 - Será usado para converter o sinal analógico da Célula de Carga em um Sinal Digital

O diferencial de tensão na célula de carga é muito pequeno, assim como são pequenas as variações na medida. Por isso, o sinal precisa ser amplificado.

A saída do módulo usa comunicação serial para enviar a leitura de tensão para o Arduino, que será interpretada como força / peso. 

Mãos à Obra - Montando um Sensor de Peso com Arduino

Componentes Necessários

Montando o Sensor de Peso

As ligações entre a célula de carga, o conversor e o Arduino para montagem do sensor de peso devem ficar como na imagem.

 


Esquema de montagem do Sensor de Peso com Arduino
Esquema de montagem do Sensor de Peso com Arduino

 

Atenção na ordem dos terminais que ligam o conversor HX711 na ponte de Wheatstone (E+/E-/A+/A-) e a ligação dos terminais DT e SCK no Arduino.

Programando o Arduino

Biblioteca HX711.h

A biblioteca HX711.h foi criada por Bogdan Necule, e está disponível na IDE Arduino. Ela permite a interface e leitura de dados do módulo. Para baixar você pode ir em "Ferramentas/Gerenciar Bibliotecas" e procurar por HX711. Na lista de bibliotecas, procure o nome do autor. Também está disponível para download na página do autor no GitHub.

Código de calibração

O código abaixo é uma etapa intermediária para o uso do sensor. Copie e cole na IDE Arduino.

// Código de calibração da célula de carga.
//
// Arduino - HX711
// Pin 10 - SCK
// Pin 11 - DT

#include "HX711.h"

#define CELULA_DT  11
#define CELULA_SCK  10

HX711 escala;

float fator_calib = -10000; // Se esse valor estiver muito distante ao iniciar, ajustar e fazer o upload novamente

void setup() {
  
  Serial.begin(9600);
  Serial.println("Rotina para calibrar a célula.");
  Serial.println("Inicie sem carga.");
  Serial.println("Após iniciarem as leituras, coloque um peso de massa conhecida");
  Serial.println("Para calibrar o fator de ajuste digite + ou -");   

  escala.begin(CELULA_DT, CELULA_SCK);
  escala.set_scale();
  escala.tare(); // Ajusta o zero da escala no valor de leitura

}

void loop() {

  escala.set_scale(fator_calib); // Ajusta a escala para esse fator de calibração

  Serial.print("Leitura: ");
  Serial.print(escala.get_units(10), 2); // Retorna a média de 10 medidas
  Serial.print(" kg");
  Serial.print(" Fator: ");
  Serial.print(fator_calib);
  Serial.println();

  if(Serial.available())
  {
    char tecla = Serial.read();
    if(tecla == '+')
      fator_calib += 10;
    else if(tecla == '-')
      fator_calib -= 10;
  }
}

Após escrever o código, clique em Carregar (Upload) para transferir o programa para o Arduino. Com esse código você vai conseguir encontrar o valor de calibração do sensor, ou offset. Esse offset vai ser utilizado no código principal, para medida de cargas.

Código principal

Abaixo está o código para realizar medidas com a sua célula de carga. Crie um novo sketch e cole na IDE.

// Código de medida com a célula de carga.
//

#include "HX711.h"

#define CELULA_DT  11
#define CELULA_SCK  10

HX711 escala;

float fator_calib = -10000; // Coloque aqui o valor encontrado na calibração

void setup() {
  
  Serial.begin(9600);
  Serial.println("Rotina de medida com a célula de carga.");

  escala.begin(CELULA_DT, CELULA_SCK);
  escala.set_scale(fator_calib); // Ajusta a escala
  escala.tare(); // Ajusta o zero da escala
}

void loop() {

  Serial.print("Leitura: ");
  Serial.print(escala.get_units(10), 2); // Retorna a média de 10 medidas
  Serial.print(" kg");
  Serial.println();

  delay(1000);
  
}

Colocando o Sensor de Pesos para Funcionar

Ao executar o código de calibração, deixe a célula sem carga. Após a mensagem de inicialização, coloque um peso conhecido sobre a célula e faça o ajuste do fator de calibração para que o valor lido coincida com o valor real. Depois de calibrado, anote o valor.

Substitua esse valor no código principal e carregue o código. Agora sua balança funciona devidamente ajustada.

Entendendo a Fundo

Entendendo o Software

O programa imprime os dados obtidos com a biblioteca HX711.h no monitor serial. O primeiro código e o segundo são semelhantes, com o primeiro código realizando medida e calibração. O segundo programa utiliza o fator de calibração encontrado no primeiro.

- Incluindo a biblioteca

A biblioteca do conversor AD é incluída:

#include "HX711.h";

- Definimos algumas constantes e variáveis

Essas constantes são traduzidas pelo compilador. Onde no código aparecer, por exemplo, CELULA_DT, o compilador entenderá como o inteiro 11. Essas constantes são usadas para armazenar os pinos DT e SCK do conversor.

#define CELULA_DT 11
#define CELULA_SCK 10 

- Criação do objeto

Em seguida é realizada a criação do objeto escala. Também criamos uma variável com o valor inicial do fator de calibração, que vai ser alterado na execução.

HX711 escala;

float fator_calib = -10000; // Se esse valor estiver muito distante ao iniciar, ajustar e fazer o upload novamente

- Inicialização da Comunicação e Configuração do HX711

Iniciamos a comunicação serial com Serial.begin(). Em seguida inicializamos o objeto escala com a função begin, informando os pinos de dados e clock. Depois setamos a constante de escala e ajustamos o zero da balança. Note que no código principal, a escala é setada com o fator encontrado no código de calibração e não é mais ajustada na execução.

void setup() {

  Serial.begin(9600);
  Serial.println("Rotina de medida com a célula de carga.");
  
escala.begin(CELULA_DT, CELULA_SCK);
escala.set_scale(); // Ajusta a escala
escala.tare(); // Ajusta o zero da escala }

- Calibração do Sensor de Peso

Em cada loop da rotina principal, a escala é reajustada. Então é realizada a medida e apresentada no monitor serial. A função get_units(10) retorna 10 leituras da célula. Também é apresentado o fator de calibração atual, que será utilizado no código principal.

void loop() {

escala.set_scale(fator_calib); // Ajusta a escala para esse fator de calibração
Serial.print("Leitura: ");
Serial.print(escala.get_units(10), 2); // Retorna a média de 10 medidas
Serial.print(" kg");
Serial.print(" Fator: ");
Serial.print(fator_calib);
Serial.println();

}

- Ajuste do Fator de Calibração

Se a tecla + for digitada, o fator de calibração é acrescido de 10. Se for digitado -, o fator sofre decréscimo de 10. Esses valores de incremento e decremento podem ser ajustados no código se for necessário.

if(Serial.available()) {
char tecla = Serial.read();
if(tecla == '+')
fator_calib += 10;
else if(tecla == '-')
fator_calib -= 10;
}

Considerações Finais

Nesse tutorial aprendemos o que é uma célula de carga e como montar um sensor de peso com Arduino. Esperamos que tenham gostado, deixe seu comentário com duvidas, sugestões ou com a foto ou vídeo de seu projeto!! Compartilhe à vontade.


Como Instalar uma Biblioteca no Arduino IDE

Como Instalar uma Biblioteca no Arduino IDE

Muitas vezes a interligação de alguns módulos com o Arduino exige a configuração de recursos da placa, como pinagem e parâmetros de comunicação, além da necessidade de funções específicas para uso do módulo. Por isso, é bem comum que algumas bibliotecas sejam criadas para realizar essas tarefas de forma simplificada, facilitando a vida de quem precisa apenas que os módulos funcionem. Neste tutorial vamos aprender como instalar uma biblioteca no Arduino, diretamente pelo gerenciador de bibliotecas ou baixando e instalando.

Caso queira ler mais sobre Arduino, acesse nosso tutorial O que é Arduino e como funciona?

O que é uma Biblioteca

Uma biblioteca é um conjunto de rotinas ou programas, criados para executar uma tarefa específica dentro de um projeto. As bibliotecas permitem que soluções já encontradas previamente para algum problema sejam reutilizadas em novos programas. Essa estratégia de reaproveitar blocos reutilizáveis é chamada de modularização.

Em projetos com Arduino, uma biblioteca é uma coleção de programas para simplificar a configuração de recursos complexos de hardware, ou simplificar a aplicação de técnicas de engenharia e programação em determinadas funções. Sem o uso de bibliotecas, o projetista vai precisar de conhecimentos sólidos de eletrônica e programação para desenvolver projetos simples, como acionar um motor ou utilizar um display de LCD, além de gastar tempo adicional.

De forma resumida, bibliotecas simplificam a criação de novos projetos e poupam bastante tempo de pesquisa e implementação.

Caso ainda não tenha a Arduino IDE em seu computador, acesse nosso tutorial Como Instalar e Configurar o Arduino IDE.

kit arduino robótica educacional

Instalando uma Biblioteca via Gerenciador de Bibliotecas - Arduino IDE 

Quando se vai começar um projeto, ou quando se vai replicar um projeto que viu na internet - como os que você encontra aqui no Portal Vida de Silício - é comum que alguma biblioteca seja necessária. Se você souber o nome da biblioteca, e melhor, se souber também o autor, pode pesquisar por ela no Arduino IDE, em Ferramentas/Gerenciar Bibliotecas.

 

Gerenciar Bibliotecas no Arduino IDE
Gerenciar Bibliotecas no Arduino IDE

 

Depois de encontrar a biblioteca, é só clicar em instalar.

 

Usando a Ferramenta Gerenciar Bibliotecas no Arduino IDE
Usando a Ferramenta Gerenciar Bibliotecas no Arduino IDE

 

O Arduino IDE vai instalar automaticamente, e na lista a biblioteca aparecerá a sinalização INSTALLED, indicando que está pronta para ser utilizada.

Instalando uma Biblioteca de Outras Fontes - Arduino IDE 

Em algumas situações, a biblioteca necessária não estará disponível na lista do IDE. Será necessário fazer o download da biblioteca e instalar, como veremos.

O primeiro passo é fazer o download. Geralmente a biblioteca está disponível na página do autor no GitHub, ou em outro repositório onde autores deixam suas contribuições para a comunidade.

No nosso exemplo, vamos baixar a biblioteca Ultrasonic.h, utilizada para fazer o controle de um sensor ultrassônico HC-SR04. A biblioteca está disponível aqui, em formato .zip.

Depois de fazer o download, você pode ir em Sketch/Incluir Biblioteca/Adicionar biblioteca .ZIP.

 

Adicionando uma biblioteca .zip no Arduino IDE
Adicionando uma biblioteca .zip no Arduino IDE

 

Escolha o local onde você salvou o arquivo .zip da biblioteca, clique no arquivo e no botão Abrir.

 

Selecionando o arquivo da biblioteca
Selecionando o arquivo da biblioteca

 

Você vai receber a mensagem de que a biblioteca está instalada e pode conferir em Sketch/Incluir Biblioteca.

 

Verificando bibliotecas instaladas no Arduino IDE
Verificando bibliotecas instaladas no Arduino IDE

 

Utilizando a Biblioteca no seu Projeto

Toda biblioteca no Arduino é adicionada via código pela diretiva de compilação include. Uma diretiva de compilação é uma instrução do programa que dá instruções ao compilador, que é software que vai traduzir o seu código em uma linguagem que o Arduino entende. Você reconhece rapidamente as diretivas no código porque elas sempre aparecem acompanhadas do símbolo #.

A diretiva include, especificamente, informa ao compilador para adicionar as funções da biblioteca referida no programa que vai para a memória do Arduino.

As diretivas mais comuns, como include e define costumam aparecer nas primeiras linhas de código. No caso da biblioteca Ultrasonic.h, você veria algo como:

#include <Ultrasonic.h>

Consultando as Informações Sobre a Biblioteca

Quando instalamos uma biblioteca, nem sempre sabemos como utilizá-la. Muitas vezes ela foi incluída num código que vimos na internet e queremos saber mais sobre as funções que ela traz. Uma forma de verificar isso é encontrar a biblioteca em Ferramentas/Gerenciar Bibliotecas e clicar no link More Info. Esse link geralmente vai levar até a página do GitHub onde o projeto é mantido. Lá você vai encontrar arquivos de texto listando as funções disponíveis e detalhando o funcionamento.

 

Consultando as Informações Sobre a Biblioteca
Consultando as Informações Sobre a Biblioteca

 

Considerações Finais

Esperamos que esse tutorial ajude a compreender melhor o que são bibliotecas e como fazer a sua instalação e uso nos seus projetos de Arduino.

Para dúvidas e sugestões, pode deixar nos comentários. Um abraço e até a próxima!


Arduino IDE - Como Instalar e Configurar

Como Instalar e Configurar o Arduino IDE

Nesse tutorial vamos aprender como instalar e configurar corretamente o ambiente de desenvolvimento do Arduino, o Arduino IDE. É através da Arduino IDE que iremos programar nossa placa Arduino. Caso queira ler mais sobre Arduino, acesse nosso tutorial O que é Arduino e como funciona?

Este tutorial está disponível para os sistemas operacionais Windows, Linux e Mac OS.

A execução deste tutorial se divide em instalação e configuração. Você deve pular direto para a sessão de instalação específica do seu sistema operacional. Depois de instalado, será feita a configuração para a placa específica em uso e para a comunicação.

Além de um computador, você vai precisar de uma placa Arduino e de um cabo USB.

kit arduino robótica educacional

Instalando o Arduino IDE no Windows

Download Arduino IDE no Windows

Você pode fazer o download na página oficial do Arduino. Escolha a opção para Windows 7 ou mais novo, como na figura abaixo.

Baixando a Arduino IDE para Windows no site da Arduino
Baixando a Arduino IDE para Windows no site da Arduino

Você pode escolher fazer uma doação para o projeto Arduino, ou apenas fazer o download do software.

Clique em just download para baixar a Arduino IDE
Clique em just download para baixar a Arduino IDE

O seu browser deve abrir uma janela para escolher onde salvar o arquivo, ou salvar em uma pasta padrão. Em qualquer um dos casos, após o download, é provável que o browser mantenha o arquivo em uma aba para ser executado.

Clique no arquivo depois de concluído o download
Clique no arquivo depois de concluído o download

Você pode apenas clicar no arquivo depois de concluído o download. Se não for o seu caso, abra a pasta onde o arquivo foi baixado e clique duas vezes nele.

Instalação Arduino IDE no Windows

Na etapa de instalação, você vai ser perguntado sobre algumas opções. Vamos passo a passo.

Inicialmente, aceite o termo da licença do software, clicando em I Agree.

Arduino IDE Setup - Passo 1
Arduino IDE Setup - Passo 1

Depois selecione as opções de instalação. Se você não é um usuário avançado, marque todas as opções. Entre as opções, está a instalação do driver de comunicação com a placa Arduino, que é muito importante, além da criação de atalhos.

Arduino IDE Setup - Passo 2
Arduino IDE Setup - Passo 2

Em seguida, você será perguntado sobre o local de instalação. Deixe como está, se você tiver em dúvida. Clique em Install.

Se tudo correr bem, o programa será instalado e pronto para configurar e utilizar.

Instalando o driver CH341 no Windows

Se o seu Arduino é uma placa clone, a etapa de instalação precisa de um passo adicional. Você vai precisar instalar um driver de comunicação serial. Você pode baixar ele aqui.

Depois do download, abra o instalador. Clique em Uninstall e depois em Install.

Instalando o driver CH341
Instalando o driver CH341

Agora seu computador está pronto para ser conectado ao seu Arduino.

Instalando a Arduino IDE no Linux

Você pode fazer o download na página oficial. Escolha a arquitetura correta do seu sistema - é importante que escolha corretamente.

Baixando a Arduino IDE para Linux no site da Arduino
Baixando a Arduino IDE para Linux no site da Arduino

Em seguida, você será perguntado se deseja fazer uma doação para o projeto Arduino, ou só fazer o download. Para fazer apenas o download clique em Just Download. Assim, o arquivo será baixado no seu computador.

Após o download, extraia o arquivo - que está compactado - para a pasta onde ele vai ser usado para a instalação. Abra a pasta e procure o arquivo install.sh. Esse é o script de instalação. Clique com o botão direito e escolha Run in Terminal. Se essa opção não aparecer, você vai precisar abrir uma janela de Terminal e ir até a pasta de instalação - onde você descompactou o arquivo.

Digite:

./install.sh

Aguarde o processo de instalação e então o Arduino IDE está pronto para uso.

Instalando a Arduino IDE no Mac OS

Faça o download na página oficial.

Baixando a Arduino IDE para Mac OS no site da Arduino
Baixando a Arduino IDE para Mac OS no site da Arduino

O arquivo está compactado. Se você usar Safari, ele deve descompactar automaticamente.

Instalando a Arduino IDE no MAC OS
Instalando a Arduino IDE no MAC OS

Copie o pacote para a pasta de Aplicativos (ou a pasta que você preferir). Seu Arduino IDE está pronto para ser configurado.

Copie o pacote da Arduino IDE para a pasta de Aplicativos
Copie o pacote da Arduino IDE para a pasta de Aplicativos

Configurando o Arduino IDE

Agora que o Arduino IDE está instalado, conecte sua placa Arduino no cabo USB e no computador. Em seguida, abra o aplicativo.

Com o aplicativo aberto, na parte superior você vai ver um menu e alguns botões de ação mais comuns. No meio da tela existe a área do editor de texto, onde o código será mostrado. Abaixo da área de código, um terminal que apresenta informações de compilação e upload do programa para a placa.

No rodapé do programa informações sobre a posição do cursor no editor, além da porta serial escolhida para comunicar com o seu Arduino.

Conhecendo a Arduino IDE
Conhecendo a Arduino IDE

Feito isso, o próximo passo é configurar qual é a placa utilizada. O compilador precisa dessa informação para realizar configurações durante o upload do programa. No menu, clique em Ferramentas/Placa, e escolha a placa compatível com o modelo que você está utilizando.

Selecionando a placa na Arduino IDE
Selecionando a placa na Arduino IDE

Em seguida, vá em Ferramentas/Porta e escolha a porta serial que aponta a presença do seu Arduino. Isso normalmente é feito automaticamente pelo software, e provavelmente, a porta correta já estará selecionada.

Selecionando porta de comunicação na Arduino IDE
Selecionando porta de comunicação na Arduino IDE

Caso o seu Arduino é uma placa clone ou similar você vai precisar descobrir em que porta serial sua placa está conectada. No Windows, digite Win+R e clique em Gerenciador de Dispositivos. Procure em Portas qual onde a placa está conectada.

Carregando um Programa de Teste na placa Arduino

Próximo passo é testarmos o funcionamento da placa Arduino em conjunto com a Arduino IDE. Para isso faremos o carregamento, ou upload, de um código exemplo para a placa.

Desta forma, no menu da Arduino IDE, vá em Arquivo/Exemplos/Basics e escolha o programa Blink. Esse exemplo faz piscar o LED interno da placa Arduino.

selecionando programa exemplo Blink na Arduino IDE
Selecionando exemplo Blink na Arduino IDE

 

 

O código será aberto em uma nova janela. Confira se a placa e a porta serial estão corretamente selecionados. Depois de tudo configurado, clique na seta abaixo do menu ou vá em Sketch/Carregar (você também pode usar a tecla de atalho Ctrl+U).

carregar programa na placa Arduino da Arduino IDE
carregar programa na placa Arduino

Se tudo estiver correto, você verá a informação no terminal da IDE, e a mensagem “Carregado” na barra de status acima do terminal.

mensagem “Carregado” na barra de status acima do terminal
mensagem “Carregado” na barra de status acima do terminal

Depois de carregado o programa na placa Arduino, você deve ver o LED da placa Arduino piscando.

 

Se deu tudo certo até aqui, parabéns! Você configurou a sua placa corretamente e agora está tudo certo para você utilizá-la.

Erro de Comunicação no Linux

Se estiver usando Linux, pode acontecer de você receber a mensagem Error opening serial port. Se isso acontecer, você vai precisar ajustar a permissão da porta serial.

Abra o Terminal e digite:

ls -l /dev/ttyACM*

Você receberá uma resposta como: crw-rw---- 1 root dialout 188, 0 5 apr 23.01 ttyACM0

O 0 (zero) após ACM pode ser outro número, ou podem haver várias saídas. A informação que precisamos é dialout.

Digite no Terminal:

sudo usermod -a -G dialout <username>

Onde <username> é o seu nome de usuário.

Em seguida, você precisará fazer logout e login novamente para que a ação tenha efeito.

Feito isso, você deve conseguir fazer o upload do programa para a placa Arduino.

Considerações Finais

Para aprender e praticar fique por dentro dos tutoriais do portal Vida de Silício. Existem vários projetos muito bem explicados para você botar as mãos na massa.

Caso tenha alguma dúvida, deixe nos comentários. Críticas e sugestões também são muito bem vindas.

Até o próximo!


Sensor de Chama Infravermelho com Arduino

Sensor de Chama Infravermelho com Arduino

Entre as aplicações da automação estão os sistemas de segurança. São necessários para a proteção da vida em vários níveis, e dos bens materiais. Nesse tutorial iremos aprender como fazer um detector de fogo usando o sensor de chama infravermelho em conjunto com uma placa Arduino.

Caso queira ler mais sobre Arduino, acesse nosso tutorial O que é Arduino e como funciona?

Sistemas de Segurança

A presença de sensores de fumaça e fogo em shoppings e outros ambientes coletivos é definida por leis e normas. Quando detectado, é importantíssimo que se tomem medidas rápidas para garantir a segurança das pessoas. Em residências, onde a implantação desse tipo de sistema é escolha dos donos e moradores, sua existência não é tão comum. Entretanto, existem várias fontes de incêndio em casa.

Se você estiver dormindo e por algum motivo sua cozinha começa a pegar fogo, quanto tempo você levaria para reconhecer e controlar o fogo ou até mesmo evacuar a casa? Quanto antes detectar o problema, mais fácil será o seu controle.

Aqui entra a automação como nossa aliada. Vamos montar um sensor que detecta fogo usando um módulo sensor de chama.

Esse projeto é um protótipo: sistemas de segurança comerciais precisam de cuidados adicionais, que não são cobertos aqui.

kit arduino robótica educacional

Sensor de Chama Infravermelho

Nem sempre o fogo é visível, a luz emitida pela chama varia muito com o combustível do fogo, ou os compostos que estão sendo queimados. Porém, as chamas emitem luz na forma de radiação térmica, na região do infravermelho, que apesar de não ser visível, pode ser detectada.

Uma câmera térmica nos mostra a temperatura das superfícies através da captação de luz infravermelha emitido por elas. A câmera faz uma representação das temperaturas dessa luz invisível em luz visível, com o gradiente de temperatura representado por cores. O vermelho representa as superfícies mais quentes, e o azul as mais frias.

Câmera com detecção de calor através de luz infravermelha
Câmera com detecção de calor através de luz infravermelha

Módulo Sensor de Chama IR

Nosso Módulo Sensor de Chama é constituído de um fotodiodo capaz de detectar o espectro de luz infravermelha emitido por chama. Ele é sensível à fontes de luz com comprimento de onda entre 760 e 1100 nm.

Sensor de fogo Infravermelho
Sensor de fogo Infravermelho

O módulo possui duas saídas: uma analógica (A0) e uma digital (D0). Também possui um LED que indica se o sensor está ligado e outro LED que acende quando a saída digital está ativada.

A saída digital fica em nível lógico alto (1) e vai para baixo (zero) quando houver chama. A sensibilidade do sensor de chama pode ser ajustada através de um resistor variável presente no módulo. A saída analógica aponta o valor lido no fotodiodo, e pode ser utilizada no Arduino para ler o nível de calor detectado pelo sensor.


Mãos à obra – Fazendo nosso sistema detector de chama / Sensor de chama

Componentes necessários:

Montando o circuito do sensor detector de chama 

Agora vamos montar o projeto. Antes de tudo, desligue o cabo USB de seu Arduino e monte seguindo a ligação da figura abaixo.

 

Circuito Sensor de Chama na Placa Arduino
Circuito Sensor de Chama na Placa Arduino

 

Conectando o Arduino ao Computador

Conecte seu Arduino ao computador e abra a IDE Arduino.

Caso ainda não tenha a Arduino IDE em seu computador, acesse nosso tutorial Como Instalar e Configurar o Arduino IDE.

Antes de carregar um programa, você precisa selecionar qual porta você deseja usar para fazer carregar o 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 já a porta e o nome da placa: “COM3 (Arduino/Genuino Uno)”.

 

Configurando a porta de comunicação
Configurando a porta de comunicação

 

Você também precisa garantir que o tipo de placa apropriado está selecionado em Ferramentas (Tools) no submenu Placa (Board).

 

selecionando a placa Arduino
selecionando a placa Arduino

 

Programando a placa Arduino

Crie um programa (Sketch) e salve com o nome de “programa_sensor_de_chama”. Depois de salvar, copie o código abaixo.

//Programa: Sensor de Chama Arduino

int pino_D0 = 7;
int valor_d;

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

void loop() {
  valor_d = digitalRead(pino_D0);
  Serial.print("Porta digital: ");
  Serial.println(valor_d);
  if (valor_d != 1) {
    Serial.println("Fogo detectado!!");
  }
  delay(500);
}

Colocando o Sensor de Chama para Funcionar

Caso tenha ocorrido tudo como esperado, ao acendermos um isqueiro próximo ao sensor, o LED irá acender. Abra o monitor serial para verificar o que está sendo lido. Deve funcionar como na figura abaixo.

 


Entendendo a Fundo

Entendendo o Software

– Declarando o pino de entrada utilizado

Na primeira parte do programa declaramos uma variável para armazenar o número do pino digital de entrada do Arduino (pino 7). Esse pino está ligado no pino de saída digital do sensor de chamas. A outra variável será usada para armazenar o valor da leitura do pino digital.

int pino_D0 = 7;
int valor_d;

Em seguida inicializamos a comunicação serial com Serial.begin() e configuramos o pino 7 como entrada digital.

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

Na função principal, iniciamos fazendo a leitura da entrada digital do pino 7 e armazenamos o valor na variável valor_d. Na sequência, fazemos a impressão no monitor serial do valor atual do pino digital.


Considerações Finais

Esperamos que tenham gostado!

Deixe seu comentário com duvidas, sugestões ou com a foto ou vídeo de seu projeto. Compartilhe à vontade!


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!


O que é Arduino e como funciona?

O que é Arduino e como funciona?

Amado por muitos estudantes e hobistas das áreas de eletrônica e robótica, a família Arduino vem ganhando cada vez mais adeptos, em especial, o Arduino Uno. Neste tutorial, iremos entender o que é Arduino, para que serve, como funciona e o que ele têm de tão especial?

https://www.youtube.com/watch?v=8dVo1PE5avI

Direto ao ponto: O que é Arduino?

Falando em termos práticos, as placas Arduino possuem funcionamento semelhante ao de um pequeno computador, no qual, pode-se programar a maneira como suas entradas e saídas devem se comportar em meio aos diversos componentes externos que podem ser conectados nas mesmas.

No site oficial da Arduino, encontramos a seguinte definição (traduzida):

Arduino é uma plataforma open-source de prototipagem eletrônica com hardware e software flexíveis e fáceis de usar, destinado a artistas, designers, hobistas e qualquer pessoa interessada em criar objetos ou ambientes interativos.

Ou seja, O Arduino é uma plataforma formada por dois componentes: A placa, que é o Hardware que usaremos para construir nossos projetos e a IDE Arduino, que é o Software onde escrevemos o que queremos que a placa faça.

A maior vantagem dessa plataforma de desenvolvimento sobre as demais é a sua facilidade de sua utilização, pois, pessoas que não são da área técnica podem aprender o básico e criar seus próprios projetos em um intervalo de tempo relativamente curto.

Antes do famoso Arduino

Há pouco tempo atrás, para se confeccionar um circuito interativo, era necessário fazer projetos do zero para uma aplicação específica. Além disso, para se fazer pequenas alterações nas funcionalidades do circuito era necessário um estudo crítico e bastante trabalho.

Com o advento dos microcontroladores, foi possível que problemas que antes eram tratados com soluções de hardware fossem tratados usando software de computadores. Dessa forma, um mesmo circuito poderia desempenhar funções totalmente diferentes, através da reprogramação e alteração de alguns parâmetros do programa.

No entanto, apesar da facilidade trazida pelos microcontroladores, trabalhar com os mesmos não é tão trivial.

Desta forma, um grupo de pesquisadores italianos teve a ideia de fazer um dispositivo que tornasse o seu uso simples e acessível a qualquer um. O resultado foram as placas Arduino.

kit robotica educacional com Arduino ESP ou Microbit

Como o Arduino funciona?

Como já dito, os Arduinos possuem funcionamento semelhante ao de um pequeno computador capaz de interpretar entradas e controlar as saídas afim de criar sistemas automáticos. Para isso, você precisa programa-lo.

Programação

Programação nada mais é que falar ao controlador quais decisões devem ser tomadas em cada circunstancia. Para isso, escrevemos um código que segue uma sequência logica de tomada de decisões que leva em conta as vareáveis que serão lidas e/ou controladas.

Para programar essas placas, ou seja, ensiná-las a desempenharem a as funcionalidades que você deseja, basta utilizarmos a sua IDE (ambiente integrado de desenvolvimento), que por sua vez, é um software onde podemos escrever um código em uma linguagem semelhante a C/C++, o qual, será traduzido, após a compilação, em um código compreensível pela nossa placa.

Aplicações do Arduino

Por exemplo, um uso simples de um Arduino seria para acender uma lâmpada por um certo intervalo de tempo, digamos, 30 segundos, depois que um botão fosse pressionado. Nesse exemplo, o Arduino teria uma lâmpada e um botão conectados a ele. O circuito aguardaria pacientemente até que o botão fosse pressionado, de modo que, uma vez pressionado o botão, ele acenderia a lâmpada e iniciaria a contagem. Depois de 30 segundos, apagaria a lâmpada e aguardaria um novo apertar do botão.

projeto usando Arduino

Você também poderia utilizar essa mesma configuração para controlar uma lâmpada em um cômodo, por exemplo, usando um Sensor de Presença PIR | HC-SR501 no lugar do botão. Assim, quando a quando uma pessoa entrasse em um cômodo, o sensor detectaria a presença de uma pessoa e abra cadabra!! O ambiente seria automaticamente iluminado.

Outros inúmeros projetos podem ser feitos com essa plataforma, como um sistema de emergência com sensor de gás, um sistema de automação de uma horta capaz de  medir a umidade do solo e medir temperatura e umidade ambiente para ligar e desligar uma bomba e um ventilador com o auxilio de um módulo relé.

Ou então painel solar que se move de acordo com a incidência da radiação proveniente do sol com o auxilio de um sensor de luz, uma planta que manda uma mensagem no twitter quando precisar ser regada, uma caixa de brinquedos aberta por leitura de impressão digital, um robô seguidor de linha, entre muitos outros. A imaginação é o limite!

Robótica Educacional

Projeto usando Arduino robótica educacional

Robótica educacional nada mais é que o uso da robótica como ferramenta para potencializar o aprendizado dos estudantes. Sua principal proposta é incentivar o uso da robótica com o intuito de resolver problemas reais ou fictícios do dia-a-dia.

Devida a facilidade utilização, o Arduino tem entrado, cada vez mais, nas salas de aula do Brasil e do mundo, se tornando um dos protagonistas no ensino de robótica para crianças e adolescentes, mesmo considerando concorrentes de peso como o Lego.

O Lego, que também é uma ferramenta fenomenal, possui algumas limitações.

Robô móvel com ArduinoA primeira é a dificuldade de se integrar com outros equipamentos que não sejam da marca. Isso implica na dificuldade de se usar o Lego para desenvolver projetos de robótica e automação que usem equipamentos cotidianos, tais como: lâmpadas, ventiladores, entre outro equipamentos. O que limita muito a sua aplicação.

O Arduino possibilita a utilização de uma gama infinitamente maior de opções de sensores e por ser uma ferramenta mais robusta, pode ser facilmente conectado a vários periféricos .

Outro ponto fundamental é o preço. Um kit da Lego custa até 10 vezes mais que um kit Arduino.

É valido saber que é possível integrar o LEGO com o Arduino. Essa união pode criar resultados surpreendentes.

Quais os modelos mais famosos de placas Arduino?

Existem diversas modelos de placas Arduino, mas a mais popular é o Arduino Uno e será ela que iremos usar como referência nessa apostila, além dela, temos outras placas muito usadas, tais como o Arduino Mega, Arduino Nano e  o Arduino Micro.

Apesar de diferentes modelos, os projetos que programamos em um modelo pode ser facilmente adaptado para outro. Só fique atento para as particularidades de sua Placa.

Modelos de placas Arduino - O que é Arduino
Modelos de placas Arduino

Arduino Uno - A placa mais popular

Definitivamente, a mais famosa das placas é o Arduino Uno, esse será o modelo que você mais encontrará nos nossos tutoriais ou em de outros sites.

O motivo dessa popularidade, muito provavelmente, está ligado a ela se a sucessora dos primeiros modelos de placas Arduino desenvolvidas, tal como o Arduino Duemilanove e o Arduino Diecimila, mantendo o mesmo layout.

Além disso, ela possui um tamanho didático e uma configuração boa o suficiente para atender a maior parte dos projetos.

A placa Uno está em sua terceira revisão. Por isso, é comum você encontrar essa placa descrita como Arduino UNO REV3. Porém, depois de tanto tempo da revisão, na grande maioria das vezes, as placas que encontrará, mesmo que não tenha o REV3 ou R3, sinalizando a revisão, provavelmente serão o modelo mais recente.

O Hardware do Arduino Uno

O hardware do Arduino Uno, como a da maioria dos modelos, é simples, entretanto muito eficiente.

Vamos analisar a partir desse momento o hardware do Arduino UNO Rev 3. Ele é composto pelos seguintes blocos:

Principais elementos de uma placa Arduino Uno
Principais elementos de uma placa Arduino Uno
  1. Microcontrolador:

    MicrocontroladorEsse é o cérebro do Arduino. Um computador inteiro dentro de um pequeno chip. Este é o dispositivo programável que roda o código que enviamos à placa.

    Existem várias opções de marcas e modelos de microcontroladores, nessas placas foram adotados os microcontroladores da Microchip, que inicialmente eram produzidos pela Atmel,  mas especificamente a linha ATmega. O modelo UNO, por exemplo,  usa o microcontrolador ATmega328.

  2. Conector USB:

    Conecta a placa ao computador. É por onde o computador e o Arduino se comunicam com o auxílio de um cabo USB, além de ser uma opção de alimentação da placa.

  3. Pinos de Entrada e Saída:

    Pinos que podem ser programados para agirem como entradas ou saídas fazendo com que o Arduino interaja com o meio externo. O UNO R3 possui 14 portas digitais (I/O), 6 pinos de entrada analógica e 6 saídas analógicas (PWM).

  4. Pinos de Alimentação:

    Fornecem diversos valores de tensão que podem ser utilizados para energizar os componentes do seu projeto. Devem ser usados com cuidado, para que não sejam forçados a fornecer valores de corrente superiores ao suportado pela placa.

  5. Botão de Reset:

    Botão que reinicia a placa.

  6. Conversor Serial-USB e LEDs TX/RX:

    Para que o computador e o microcontrolador conversem, é necessário que exista um chip que traduza as informações vindas de um para o outro. Os LEDs TX e RX acendem quando o Arduino está transmitindo e recebendo dados pela porta serial respectivamente.

  7. Conector de Alimentação: 

    Responsável por receber a energia de alimentação externa, que pode ter uma tensão de no mínimo 7 Volts e no máximo 20 Volts e uma corrente mínima de 300mA. Recomendamos 9V, com um pino redondo de 2,1mm e centro positivo. Caso a placa também esteja sendo alimentada pelo cabo USB, ele dará preferência à fonte externa automaticamente.

  8. LED de Alimentação:

    Indica se a placa está energizada.

  9. LED Interno:

    LED conectado ao pino digital 13.

Especificações da placa Arduino Uno:

Nesta placa, o microcontrolador ATmega328 é utilizado, este dispõem de 32kb de memória flash e 2kb de SRAM. De maneira simples, a memória flash é o local na qual nosso programa será salvo, já a SRAM é a memória na qual nossas variáveis serão salvas. A diferença básica entre esses dois tipos de memória é que a flash não perde seus dados caso o Arduino seja desligado ou reiniciado o mesmo não é válido para a SRAM.


IDE Arduino

Arduino IDEUma das grandes vantagens da plataforma Arduino está no seu ambiente de desenvolvimento, que usa uma linguagem baseada no C/C++, linguagem bem difundida, usando uma estrutura simples.

Por isso, mesmo pessoas sem conhecimento algum em programação conseguem, com pouco estudo, elaborar programas rapidamente.

Para baixar a IDE Arduino acesse o site oficial. No site, clique na aba software.

Site Arduino.cc - baixando a IDE Arduino
Site oficial Arduino

Na página software, procure pela última versão do Arduino IDE. No dia em que escrevo é a versão 1.8.4.

Escolha a IDE adequada a seu sistema operacional:

Opções de download da Arduino IDE
Opções de download da Arduino IDE

Na página que abará, clique em JUST DOWNLOAD

Como baixar Arduino IDE
Como baixar Arduino IDE

Windows

  • Primeira Opção: baixar o instalador (Installer) que funciona como qualquer outro instalador de programa.
  • Segunda Opção: Baixar todos os arquivos da IDE Arduino compactados para Windows (ZIP file), nessa versão basta baixar e descompactar na pasta que você desejar, inclusive no seu pen driver ou HD virtual. Eu costumo descompactar na Área de Trabalho.
  • Terceira opção: Aplicativo para windows 10.

Mac OS X

Basta baixar e instalar

Linux

Baixar todos os arquivos da IDE Arduino compactados para Linux (32bit ou 64bit), nessa versão basta baixar e descompactar na pasta que você desejar, inclusive no seu pen driver ou HD virtual. Eu costumo descompactar na Área de Trabalho.


Entendendo a IDE Arduino

Em resumo, é um programa simples de se utilizar e de entender com bibliotecas que podem ser facilmente encontradas na internet. As funções da IDE do Arduino são basicamente três: permitir o desenvolvimento do software, de enviá-lo à placa para que possa ser executado e de interagir com a placa Arduino.

entendendo a IDE Arduino
Entendendo a IDE Arduino

Como aprender a usar o Arduino

O Arduino é uma plataforma de fácil utilização e com infinitas possibilidades de aplicação. Há muito conteúdo disponível sobre ele na internet e isso o faz ainda mais especial.

Porém, ainda assim, as vezes não é fácil encontrar um material que organize de forma didática tudo que se precisa saber quando se está começando nesse mundo. Visto que proposta dessa placa é que qualquer um possa criar seu próprio projeto de automação, mesmo sem um conhecimento técnico muito profundo.

Levando isso em consideração, desenvolvemos uma séria de três apostilas gratuitas para que qualquer um possa aprender a usá-lo!

Elas abordam os assuntos mais básicos, levando em conta aqueles que não sabem nada sobre o assunto.

O melhor de tudo é que elas são gratuitas!! =D

Você pode saber mais sobre elas no link a seguir: Apostila Arduino


A comunidade Arduino

Existem varias outra placas concorrentes e que muitas vezes são melhores em hardware, tal como a Freescale, MSP, etc.

Então o que faz dessa placa tão famosa? A sua comunidade!

Portanto, você pode digitar qualquer tipo de dúvida sobre Arduino na internet que raramente não encontrará alguém falando sobre. Fóruns, blogs, portais, canais do Youtube, etc. Uma infinidade de opções de lugares onde você poderá encontrar pessoas falando sobre o mesmo assunto.

De alguma forma, existe algo em torno dessa plataforma que contagia as pessoas a compartilharem suas experiências.

Por exemplo, o portal Vida de Silício abre espaço para que qualquer um interessado em escrever tutorias se inscreva como autor.

A maioria dos tutoriais foram escritos por pessoas que se dispuseram a ajudar a comunidade. Existe um senso de que, dessa forma, estamos ajudando o mundo.

- Dica 1: Tutoriais em inglês

Mesmo que exista muito conteúdo em português, as vezes não encontramos algo que precisamos. Então, lembre-se de fazer uma pesquisa em inglês.

Você irá descobrir que existe muita gente no mundo falando sobre esse assunto e muito provavelmente alguém já enfrentou o mesmo problema que você.

- Dica 2: Sites referência

Alguns site onde você encontrará pessoas compartilhando conteúdo sobre projetos com Arduino:

  • Portal Vida de Silício (Português): Claro que vamos puxar um pouco de sardinha para nosso lado, hehehe. Mas falando sério, tem muito tutorial bom aqui no portal. A galera se esforça para escrever conteúdos surpreendentes.  Mas claro que existem muitos outros blogs na internet tal como o Br-Arduino e o Arduino & Cia que por diversas vezes nos serviu como material de consulta.
  • Forum Arduino (em Português) : Esse é o forum oficial. Existem muitos outros foruns na internet, mas esse reuni uma grande quantidade de pessoas se ajudando e ótimos tópicos já resolvidos que você pode consultar.
  • Instructables (Inglês): A proposta desse site é reunir em um só lugar tutoriais que ensinem a fazer praticamente qualquer coisa. Com isso, existem diversas aplicações criativas usando Arduino cujo o qual você pode se inspirar.
  • EmbarcadosO embarcado é algo como o Portal Vida de Silício, só que com conteúdos mais voltados para sistemas embarcados. Com certeza tem muita coisa bacana lá para você usar.

Fechamento

Enfim, aprendemos o que é Arduino e suas principais funcionalidades.

Esperamos que tenham gostado, deixe seu comentário com duvidas, sugestões ou com a foto ou vídeo de seu projeto!! Compartilhe à vontade.


comunicação serial

Como usar o Serial Monitor na IDE Arduino

Comunicação Serial no Arduino via Serial Monitor

A Comunicação Serial é um recurso amplamente utilizado no estabelecimento de comunicação entre uma placa Arduino e outros dispositivos, como módulos ZigBee e Bluetooth, shields, sensores, e até mesmo com o computador. A gravação de um código no microcontrolador do Arduino, por exemplo, é realizada via Comunicação Serial. Para que possamos ler informações via comunicação serial da placa arduino no computador, usaremos o Serial Monitor, ferramenta que pode ser encontrada na IDE Arduino.

Devido a esta enorme importância da comunicação serial, neste tutorial iremos apresentar alguns conceitos sobre esse tipo de comunicação e os procedimentos necessários para utilizar o serial monitor.

[toc]

kit arduino robótica educacional

O Serial Monitor

A IDE oficial do Arduino disponibiliza uma ferramenta chamada Serial Monitor. Essa ferramenta é uma interface gráfica que apresenta a troca de informações pela porta serial entre o Arduino e o computador. A comunicação via Serial Monitor é um recurso interessante, para monitorar o envio e no recebimento de dados, permitindo inclusive realizar testes sem a necessidade de uma interface externa.

Para acessarmos esta ferramenta, basta clicarmos no ícone localizado no canto superior direito da IDE, ou simplesmente, utilizar o atalho Ctrl+Shift+M. Também é possível abrir o Serial Monitor através do menu Tools, localizado na barra de ferramentas.

 

Em um primeiro momento, precisamos definir apenas a taxa de transmissão de dados (baud rate), que deve ser a mesma que a taxa de transmissão definida no programa que está carregado no Arduno. Além da informação da taxa, o Serial Monitor possui dois campos: um é o local onde você pode enviar dados para seu Arduino e o outro é uma área de exibição de saída de dados.

 


Mãos à Obra - 4 Projetos com o Serial Monitor

Aqui são apresentados 4 projetos utilizando a comunicação via Serial Monitor. Para simplificar, todos utilizam o mesmo hardware, focando no acesso e uso da ferramenta. Os projetos desenvolvidos são:

  • Enviando uma mensagem para o monitor serial
  • Enviando uma sequência de mensagens
  • Lendo dados através do monitor serial
  • Controlando o Arduino através do monitor serial

Componente necessário


Projeto 1: Enviando uma mensagem

Neste projeto vamos enviar dados através da Comunicação Serial.

Código utilizado

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    /*** Arguardando o estabelecimento da conexão ***/
  }
  Serial.print("Vida de Silicio");
}

void loop() {}

Entendendo o software

– Definindo as configurações iniciais

O primeiro passo consiste na inicialização da interface de Comunicação Serial entre a placa Arduino que estamos utilizando e o Serial Monitor. Para isto, utilizamos a função begin(), que recebe dois parâmetros: a taxa de transmissão em bits por segundo (é bastante comum 9600 em transmissões mais lentas); o segundo parâmetro é configuração de bits por transmissão, paridade e bits de parada. Deixando o segundo parâmetro em branco, a função adota o padrão. Para consultar valores possíveis para a taxa e configuração, você pode ver esse link.

Note que, por se tratarem de funções membros de uma classe, as funções disponíveis para a Comunicação Serial devem ser acessadas através do objeto global  Serial e do operador " ." (ponto), sendo assim, para utilizar a função begin(), deve-se escrever: Serial.begin(9600).

Serial.begin(9600);

Em seguida, utilizamos a função while() com o parâmetro !Serial. Esta estrutura faz com que o programa aguarde até que a conexão serial seja estabelecida, e só então, continue a execução.

while (!Serial) {
  /*** Arguardando o estabelecimento da conexão ***/
}

– Imprimindo a informação

Por fim, utilizamos a função print() para enviar a mensagem, que será visualizada no Serial Monitor.

Serial.print("Vida de Silicio");

O resultado deve ser esse:

 


Projeto 2: Enviando uma sequência de mensagens

Neste projeto vamos enviar uma sequência de dados através da Comunicação Serial.

Código do projeto

Segue o código para ser utilizado no Arduino:

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    /*** Arguardando o estabelecimento da conexao ***/
  }
  Serial.println(16,DEC);
  Serial.println(16,BIN);
  Serial.println(16,OCT);
  Serial.println(16,HEX);
  Serial.println(16.2372523,2);
}

void loop() { }

– Definindo as configurações iniciais

Dentro da função setup(), inicializamos a Comunicação Serial a uma taxa de 9600 bits por segundo com begin():

Serial.begin(9600);

Como no projeto anterior, checamos o estabelecimento da conexão serial:

while (!Serial) {
  /***** Aguardando o estabelecimento da conexão *****/
}

– Imprimindo as informações

Após estabelecer a conexão serial utilizamos a função println() para enviar um dado através da porta serial e saltar para próxima linha. Outra informação interessante das funções println() e print() é que ambas podem ser utilizadas com dois parâmetros. O primeiro parâmetro é a mensagem e o segundo é a formatação.

Para imprimir, por exemplo, números inteiros, podemos utilizar o segundo parâmetro para determinar se deve ser enviado como um decimal, binário, octal ou hexadecimal:

Serial.println(16,DEC);
Serial.println(16,BIN);
Serial.println(16,OCT);
Serial.println(16,HEX);

No caso de números reais, do tipo float, esse segundo parâmetro determina o número de casas decimais:

Serial.println(16.2372523,2);
O código todo fica assim:
void setup() {
  Serial.begin(9600);
  while (!Serial) {
    /*** Arguardando o estabelecimento da conexão ***/
  }
  Serial.println(16,DEC);
  Serial.println(16,BIN);
  Serial.println(16,OCT);
  Serial.println(16,HEX);
  Serial.println(16.2372523,2);
}

void loop() { }

E o resultado que obtemos com esse código é esse:

Se ao invés da função println(), utilizássemos a função print(), o resultado seria esse:

Repare que sem saltar linha, cada mensagem é colocada em sequência, uma após a outra.


Projeto 3: Lendo dados através do monitor serial

Neste projeto ensinaremos a você como fazer uma leitura de dados do Serial Monitor para o Arduino.

Código do projeto

Segue o código para leitura de dados via Serial Monitor.

char dado;

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    /*** Aguardando o estabelecimento da conexão ***/
  }
}

void loop() {
  if(Serial.available()) {
    dado = Serial.read();
    Serial.print(dado);
  }
}

– Declarando a variável para armazenar a leitura

Criamos uma variável do tipo char para armazenar um caractere.

char dado;

– Definindo as configurações iniciais

Como nos projetos 1 e 2, inicializamos a comunicação serial e fazemos a checagem:

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    /***** Aguardando o estabelecimento da conexão *****/
  }
}

– Imprimindo a informação recebida

Já dentro da função loop(), temos uma função if() cujo argumento consiste em uma função chamada available(). Ela é responsável por retornar a quantidade de caracteres disponíveis para leitura na porta serial. Se não há caracteres, ela retorna zero.

Na estrutura do projeto, queremos conferir se há algum caractere para ser lido. Caso haja, o conteúdo interno da função if() será executado.

if(Serial.available() > 0) {
  /***** conteúdo da função if() *****/
}

Se houver algum caractere para ser lido, utilizamos a função read() para ler o primeiro caractere da fila na porta de entrada. Efetuamos a leitura do primeiro caractere da fila e armazenamos na variável dado.

dado = Serial.read();

Por fim, para conferir o resultado desta aplicação, utilizamos a função print() para enviar o valor recebido para o Serial Monitor.

Serial.print(dado);

A função loop() ficou assim:

void loop() {
  if(Serial.available()) {
    dado = Serial.read();
    Serial.print(dado);
  }
}

Projeto 4: Controlando o Arduino através do Serial Monitor

Neste projeto ensinaremos a você como proceder para controlar um led através do monitor serial.

Código do projeto

#define LED 13

char dado;

void setup() {
  pinMode(LED,OUTPUT);
  Serial.begin(9600);
  while (!Serial) {
    /*** Aguardando o estabelecimento da conexão ***/
  }
}

void loop() {
  if(Serial.available()) {
    dado = Serial.read();
    switch(dado) {
      case 'a':
        digitalWrite(LED,HIGH);
        break;
      case 'A':
        digitalWrite(LED, LOW);
        break;
    }
  }
}

– A diretiva #define

Iniciamos o código utilizando a diretiva #define para associar o nome LED ao número 13, de modo que, toda vez que chamamos "LED" no código, o compilador do Arduino interpreta como o inteiro 13. A vantagem desse recurso é que, caso seja necessária a alteração de um valor, ele só precisa ser alterado em um único lugar.

#define LED 13

– Declarando a variável para armazenar o caractere

Criamos uma variável do tipo char para armazenar um caractere.

char dado;

– Definindo as configurações iniciais

O pino 13 é configurado como saída digital.

pinMode(LED,OUTPUT);

Fazemos a inicialização e checagem da Comunicação Serial, como nos projetos anteriores.

Serial.begin(9600);
while (!Serial) { 
  /*** Aguardando o estabelecimento da conexão ***/    
}

A função setup() fica assim:

void setup() {
  pinMode(LED,OUTPUT);
  Serial.begin(9600);
  while (!Serial) {
    /***** Aguardando o estabelecimento da conexão *****/
  }
}

– Acionando o led a partir do dado recebido

Dentro da função loop(), fazemos a checagem da porta serial para a presença de caractere. Se houver, o caractere será armazenado na variável dado.

if(Serial.available() > 0) {
  dado = Serial.read();  
}

Após a leitura do primeiro caractere da fila da porta serial utilizamos a estrutura switch()/case para determinarmos qual ação deve ser tomada. Esta estrutura funciona da seguinte maneira: passamos como parâmetro da função switch() a variável que queremos comparar e, em seguida, criamos os cases, com os valores esperados da variável. Se a variável for identificada em alguns dos cases, os comandos daquele bloco serão executados. O elemento break sinaliza o final de cada case, saindo da estrutura switch().

No código, caso a variável dado seja a letra a (minúscula), o led deve ser aceso. Caso dado seja a letra A (maiúscula), apagamos o led.  

switch(dado) {
  case 'a':
    digitalWrite(LED,HIGH);
    break;
  case 'A':
    digitalWrite(LED,LOW);
    break;
}

Lembre-se que o conteúdo descrito anteriormente está localizado dentro da função loop(), portanto os procedimentos de leitura e comparação do caractere serão realizados repetidamente.

A função loop() fica assim:

void loop() 
{
  if(Serial.available()) {
    dado = Serial.read();
    switch(dado) { 
      case 'a':
        digitalWrite(LED,HIGH); 
        break; 
      case 'A': 
        digitalWrite(LED,LOW); 
        break; 
    }
  }
}

 


Considerações finais

Nesse conteúdo foi possível demonstrar algumas possibilidades para uso da comunicação via Serial Monitor. Esperamos que você tenha gostado, e sinta-se à vontade para deixar suas sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.


Regulador de Tensão LM2596 1.25V-35V

Conhecendo o Regulador de Tensão Ajustável LM2596 1.25V - 35V

Hoje, nós vamos trazer para você um conteúdo com aspecto bem prático, já que vamos falar basicamente sobre um componente muito importante e que normalmente é ignorado por nós no desenvolvimento dos nossos circuitos: Os reguladores de tensão, ou melhor, o regulador de tensão ajustável LM2596 1.25V-35V.

[toc]

kit robotica educacional com Arduino ESP ou Microbit

Reguladores de tensão

Antes de apresentarmos o Regulador de tensão ajustável LM2596, nós devemos conversar um pouco sobre o que são reguladores de tensão e quais os tipos de reguladores normalmente encontrados nas aplicações de eletrônica.

LM2596 - regulador de tensão
LM2596 - regulador de tensão

Os reguladores de tensão elementos essenciais em situações nas quais nós precisamos garantir um determinado nível de tensão em um ponto específico de um circuito. Atualmente, nós podemos classificar estes elementos em duas famílias.

  • Em uma delas nós temos os reguladores lineares que, por sua vez, são mais simples e baratos, entretanto dissipam muita potência chegando a terem rendimentos da ordem de 30% a 40%. De maneira rápida, estes elementos são bons para aplicações que envolvem uma quantidade pequena de corrente (alguns miliamperes).
  • A segunda família de reguladores é a dos reguladores chaveados, também conhecidos como conversores chaveados. Estes elementos dissipam pouca energia em forma de calor, portanto, são certamente indicados em aplicações nas quais exige-se uma quantidade elevada de corrente. A ideia por trás deste tipo de equipamento consiste na transição rápida de uma chave entre os estados ligada/desligada que, por sua vez, de acordo com a frequência desta transição, garante a existência de uma tensão média e consequentemente uma corrente média na carga. Desta forma, rendimento deste tipo de conversor está entre 75% e 90%.

O módulo regulador de tensão ajustável LM2596

Este módulo regulador de tensão consiste em um dispositivo pequeno, no entanto, muito interessante que já conta com o LM2596 integrado ao circuito e componestes necessários para sua utilização.

Esse módulo deve ser utilizado para quem necessita de um sinal de tensão pré-ajustado (ou pré-regulado como dizem algumas literaturas), estável e filtrado, para isto, temos dois capacitores e um indutor no circuito.

O Módulo Regulador de Tensão Ajustável LM2596 também é conhecido como conversor chaveado DC/DC step-down ou simplesmente conversor buck, pois, a tensão de saída é sempre menor que a de entrada e sua a seleção deve feita através da manipulação de um trimpot localizado no módulo.


Mãos à obra - Testando o regulador de tensão ajustável LM2596

Componentes necessários

Montagem do circuito

Confira como o circuito deve ser montado na imagem abaixo:

Utilizando o regulador

Para utilizar este regulador de tensão, nós devemos primeiramente ligar o adaptador P4/KRE Fêmea no plugue da nossa fonte bivolt.

Em seguida é necessário conectarmos cada um dos polos do plugue nas entradas IN+ e IN- do módulo regulador de tensão que estamos utilizando. Um detalhe importante neste ponto é que talvez você queira soldar os terminais que vão do plugue até estas entradas, portanto, para que você consiga realizar este procedimento da melhor maneira possível, nós preparamos um tutorial para te guiar neste caminho, para acessa-lo basta clicar aqui.

 

Conectando o módulo regulador de tensão através do adaptador
Conexão do módulo com o adaptador

 

Posteriormente, você pode estar ligando as pontas de prova do seu multímetro nos terminais OUT+ e OUT- do seu módulo regulador de tensão e configurando ele para ler tensões contínuas. Se você ainda não sabe muito bem como manusear um multímetro, clique aqui para acessar o nosso tutorial sobre sobre primeiros passos que você precisa dar para realizar medições utilizando esta ferramenta.

Veja o resultado do nosso experimento utilizando a tensão mínima de saída:

 

Medindo a saída do regulador no limite mínimo
Verificação do nível de tensão existente na saída do regulador

 

Por outro lado, se alterarmos um pouco o valor do trimpot, podemos ter tensões de saída um pouco maiores.

Mudando o valor do trimpot para comparar a medição
Alteração no valor do trimpot

Explicando o Hardware

Discas e truques

- Corrente máxima de saída

Geralmente encontramos nos documentos referentes à este módulo regulador de tensão, que a corrente máxima na qual ele pode operar é de 3 A. No entanto, na prática, o ideal é utilizarmos um valor de corrente máxima de 2 A.  Para chegarmos a 3A é aconselhável a utilização de um dissipador sobre o LM2596.

Detalhe do LM2596 com dissipador
Detalhe do LM2596 com dissipador

- Tensão máxima de saída

É uma boa prática checar se a tensão de saída do seu regulador está de acordo com o capacitor de saída (por vezes, vemos uma especificação referente à uma tensão de saída de 40V, no entanto, o capacitor de saída é de 35V. Neste caso, é indicado que você use uma tensão máxima de saída de apenas 35V). Tal informação pode ser conferida lendo as informações do próprio capacitor na saída do módulo.

Valor de tensão máxima do capacitor de saída de 35V
Valor de tensão máxima do capacitor de saída de 35V

- Perda de tensão

É muito importante destacar que existe uma perda de tensão de 1 a 1,5V, portanto, a tensão desejada de saída deve ser pelo menos de 1,5V menor que a de entrada. Ou seja, se você quer uma saída de 9V, vocês precisa de uma entrada maior que 10,5V.


Considerações finais

Neste tutorial, nós demonstramos como você pode fazer para reduzir tensões com o módulo Regulador de tensão ajustável LM2596. Esperamos que continue nos acompanhando e sinta-se à vontade para nos dar sugestões. Lembre-se de deixar suas dúvidas nos comentários abaixo.


Conhecendo o cabo Conversor USB/TTL

Cabo conversor USB/TTL

Alguns motores elétricos apresentam controladores sofisticados que podem ser programados através de um computador, para tanto é necessário realizar a comunicação entre estes dois elementos utilizando os cabos adequados. Neste tutorial vamos mostrar uma aplicação para o cabo conversor USB/TTL onde controlaremos um motor elétrico BLDC de 3kW.

 

Figura 1 - Motor BLDC e controlador VEC 300

kit robotica educacional com Arduino ESP ou Microbit

O que é o cabo conversor USB/TTL

O Cabo Conversor USB/TTL RS232 PL2303 é um conversor que utiliza o CI PL2303 da Prolific. Com ele, é possível utilizar a porta USB do seu computador como sendo uma porta Serial RS232, sendo nível TTL, é compatível com os canais RS232 dos microcontroladores.

Figura 2 - Cabo conversor

Entenda um pouco mais sobre a nossa aplicação

Na nossa aplicação buscamos carregar os dados de um controlador VEC 300. O controlador de um motor serve para limitar alguns parâmetros como tensão máxima, corrente máxima, entre outros, dessa garantimos a segurança do motor e melhor desempenho. Utilizamos um programa chamado PI-800 para configurar tais parâmetros.

Figura 3 - Controlador VEC 300

Mãos à obra - Configurando um motor

Componentes necessários

  • Cabo conversor
  • Computador (com o controlador instalado!)
  • Motor (controlador do mesmo)

Montando o projeto

Como este cabo utiliza CI da Prolific foi necessário fazer o download do driver para que o computador pudesse reconhecer a porta, é possível baixar esse arquivo no próprio site da Prolific (http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=225&pcid=41).

 

Figura 4 - Conecte o cabo junto ao computador

 

O cabo, bem como no motor, possui quatro conexões a serem feitas, Vcc, GND, Rx e Tx, como mostrado na Figura 5. Sendo assim, é necessário conectarmos a alimentação e o terra dos mesmos juntos, e os transmissores e receptores ao contrário, ou seja, Rx do motor no Tx do cabo e vice versa.

 

Figura 5 - Conexões físicas a serem feitas (Vcc, Gnd, Rx e Tx)

 

Após as conexões físicas serem estabelecidas foi necessário abrir o software do controlador e iniciar as configurações. O software que utilizamos era um PI 800, este software pode ser encontrado no site da representante canadense da Golden Motor.

Após as conexões físicas feitas é hora de abrir o programa. Se tudo estiver correto a porta em que o controlador estiver ligado será reconhecida como na Figura 6.

 

Figura 6 - Porta reconhecida

Clique no botão “connect” indicado na Figura 7 e uma mensagem aparecerá dizendo que os dados foram carregados com sucesso. Pronto! Agora temos a configuração do motor carregada no computador, podemos alterá-la de acordo com nosso propósito. No caso do Projeto Solares, queríamos aumentar a corrente máxima permitida para que o motor pudesse atingir maiores velocidades durante a competição. É válido lembrar que, por fator de segurança, alguns valores/parâmetros não são aceitos.

 

Figura 7 - Botão a ser clicado e mensagem

Configurações finais

Esse tutorial teve como objetivo mostrar uma aplicação do cabo conversor USB/TTL, note que além do projeto apresentado, nós utilizá-lo com outras finalidades como programar um Arduíno mini, por exemplo.

 


Utilizando displays OLED 0.96" I2C em paralelo com Arduino

Utilizando displays OLED 0.96" I2C em paralelo com Arduino

O display OLED 0.96″ é considerado uma boa opção para estabelecer uma interface de visualização de dados, no entanto, o seu tamanho limita a quantidade de informações que podem ser exibidas em uma única tela. De forma a possibilitar o aproveitamento das vantagens que o uso do display fornece e garantir a exibição de uma maior quantidade de informações, neste tutorial, aprenderemos a modularizar mais de dois displays OLED 0.96″ com o Arduino UNO utilizando o demux CD4051E.

kit arduino robótica educacional

Displays OLED 0.96" I2C 

A estrutura de um OLED (Organic Light-Emitting Diode, ou, Diodo Emissor de Luz Orgânico) é constituída basicamente de uma camada de semicondutor orgânico, situada entre dois eletrodos, sendo que um deles geralmente é transparente. Esse material orgânico ao ser estimulado por uma corrente ou campo elétrico, emite luz nas cores vermelho, verde e azul (RGB), dispensando a necessidade de haver luz traseira (backlight), ao contrário das telas dos displays LCD, por exemplo. Essa característica do OLED traz uma grande vantagem frente ao uso dos outros tipos de tela que é a considerável economia de energia.

Estrutura de um OLED

Devido a presença de material orgânico na sua constituição, a vida útil do display OLED costuma ser menor do que a dos outros tipos de displays e também apresenta a desvantagem de ter baixa resistência à água. Entretanto, além do baixo consumo de energia, o display OLED proporciona uma melhor resolução, qualidade de cor, brilho, contraste e além disso, costuma ser mais leve e fino em relação aos outros displays.

O display utilizado neste projeto possui controlador SSD1306 e a tela tem 0.96 polegadas com resolução de 128x64 pixels (também pode ser encontrado com resolução de 128x32 pixels). A comunicação com o arduino é feita via interface I2C (também pode ser por SPI), portanto, além dos pinos de alimentação (VCC e GND), o display OLED conta com mais 2 pinos (SDA e SCL) para a conexão com o arduino. Certamente a pinagem reduzida do OLED é outra grande vantagem deste display frente aos outros disponíveis no mercado.

Display OLED

O display OLED pode apresentar dois endereços diferentes (0x3C ou 0x3D), possibilitando alternar entre eles a partir da modificação da configuração de resistores na parte traseira da placa. Sendo assim, o modo de endereçamento possibilita utilizar apenas dois displays em paralelo.

O multiplexador/demultiplexador CD4051E

Enquanto um demultiplexador (demux) é um sistema digital que contém apenas uma entrada (analógica ou digital) cujo conteúdo é passado para uma das saídas a partir da combinação dos sinais de controle, um multiplexador (mux) apresenta uma lógica inversa: contém uma saída que recebe o conteúdo de uma entre várias entradas (analógicas ou digitais) dependendo da configuração dos sinais de controle. O CD4051E é um CI (Circuito Integrado) que pode agir tanto como um demultiplexador quanto um multiplexador e nesse tutorial, usaremos ele como um demux.

Diagrama de pinos do 4051

O componente que iremos utilizar contém uma entrada analógica/digital e 8 saídas, além de 3 entradas de controle. Seguindo o diagrama da figura 3:

  • O pino 16 (VDD) é o de alimentação (pode ser 5V ou 3.3V)
  • O pino 8 (VSS) é o GND ou terra
  • O pino 7 (VEE) é a tensão negativa para a geração de ruído entre as entradas e saídas (neste tutorial, o conectaremos ao GND)
  • Os pinos 9 a 11 (A0, A1 e A2) são as entradas de controle digitais
  • Os pinos 1, 2, 4, 5, 12 a 15 (Y0 a Y7) são as entradas/saídas (neste tutorial, serão saídas analógicas)
  • O pino 3 (Z) é a entrada/saída que irá ser conectada ao arduino (neste tutorial, será entrada analógica).
  • O pino 6 (E) é o pino de habilitação do CI (neste tutorial, o conectaremos ao GND)

Como iremos utilizar um demux de 8 canais, é possível utilizar até 8 OLEDs em paralelo. Entretanto, para facilitar o entendimento e simplificar a lógica, iremos modularizar apenas 3 OLEDs, portanto, utilizaremos 3 entradas do demux.


Mãos à obra - Imprimindo informações nos displays

Componentes necessários

Você também pode optar por utilizar outro demux da família do 4051 (por exemplo, o HEF4051B) ou outros da família do 4052 que são de 4 canais, mas atente-se a pinagem do componente que costuma ser diferente de uma família para outra. Se você escolher utilizar outro Arduino, verifique os pinos de comunicação I2C para estabelecer as ligações corretamente.

Montando o projeto

Esquemático do projeto
  • Conecte os pinos de VCC dos displays e do demux ao 5V do arduino.
  • Conecte os pinos de GND dos displays e os pinos 6, 7 e 8 do demux ao GND do arduino.
  • Conecte os pinos SCL dos displays ao pino A5 do arduino (os pinos podem ser ligados em paralelo como mostra a figura 4).
  • Conecte cada um dos pinos SDA dos displays aos pinos 12 a 14 do demux (você pode escolher qualquer combinação de 3 pinos dentre os pinos de saída do demux).
  • Conecte o pino 3 do demux ao pino A4 do arduino.
  • Conecte os pinos 9 a 11 do demux aos pinos digitais 2, 3 e 4 do arduino (você pode escolher qualquer combinação de 3 pinos digitais do arduino).

Verifique como ficou nossa montagem na prática:

Montagem do projeto na prática

Bibliotecas

Neste projeto, usaremos apenas a biblioteca “U8glib.h” para estabelecer a comunicação com os displays e imprimir informações nos OLEDs. Você pode baixar-lá no site: https://github.com/olikraus/u8glib/.

Instale a biblioteca no diretório padrão de suas bibliotecas. Geralmente, este diretório se encontra dentro da pasta “Arduino”, localizada em “Documentos”.

Adicionando a biblioteca ao diretório

Programando

Segue o código a ser usado no projeto:

#include "U8glib.h"

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK);

//Pinos do arduino conectados as entradas de controle do demux
int a0 = 2;
int a1 = 3;
int a2 = 4;

//Função que contém os comandos gráficos do display 1
void draw0() {
  
  u8g.setFont(u8g_font_fur25);//Seleciona a fonte de texto

  u8g.drawStr( 30, 42, "Vida");//Escreve uma palavra no display
  
}

//Função que contém os comandos gráficos do display 2
void draw1() {
  
  u8g.setFont(u8g_font_fur25);

  u8g.drawStr( 40, 42, "de");
  
}

//Função que contém os comandos gráficos do display 3
void draw2() {
  
  u8g.setFont(u8g_font_fur25);

  u8g.drawStr( 20, 42, "Silicio");

}

void setup(void) {
  //Declara os pinos do arduino como saídas
  pinMode(a0, OUTPUT);

  pinMode(a1, OUTPUT);

  pinMode(a2, OUTPUT);

  //Para inicializar o display 1
  digitalWrite(a0, LOW);

  digitalWrite(a1, LOW);

  digitalWrite(a2, LOW);
  u8g.begin();

  //Para inicializar o display 2
  digitalWrite(a0, HIGH);

  digitalWrite(a1, LOW);

  digitalWrite(a2, LOW);
  u8g.begin();

  //Para inicializar o display 3
  digitalWrite(a0, LOW);

  digitalWrite(a1, HIGH);

  digitalWrite(a2, LOW);
  u8g.begin();

}

void loop(void) {
  //Combinação dos sinais de controle para o display 1 (em binário)
  digitalWrite(a0, LOW);

  digitalWrite(a1, LOW);

  digitalWrite(a2, LOW);

  //Bloco de comandos necessário para a escrita no display 1
  u8g.firstPage();
  do
  {
    draw0();//Chama a função que contém os comandos gráficos
  } while ( u8g.nextPage() );

  delay(500);

  //Combinação dos sinais de controle para o display 2 (em binário)
  digitalWrite(a0, HIGH);

  digitalWrite(a1, LOW);

  digitalWrite(a2, LOW);

  u8g.firstPage();
  do
  {
    draw1();
  } while ( u8g.nextPage() );

  delay(500);

  //Combinação dos sinais de controle para o display 3 (em binário)
  digitalWrite(a0, LOW);

  digitalWrite(a1, HIGH);

  digitalWrite(a2, LOW);

  u8g.firstPage();
  do
  {
    draw2();
  } while ( u8g.nextPage() );

  delay(500);

}

Colocando para funcionar

Veja como ficou o resultado final:

Testando o código

 

Testando o código

Entendendo a fundo

Software

Para ter acesso a todas as funções que a biblioteca “U8glib” disponibiliza, consulte: https://github.com/olikraus/u8glib/wiki/userreference

- Objeto SSD1306, 128x64 

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK);

Os displays utilizados neste projeto apresentam controlador SSD1306, contém 128 por 64 pixels e se comunicam com o arduino via protocolo I2C. Para verificar quais controladores e tamanhos de tela são suportados pela biblioteca, consulte: https://github.com/olikraus/u8glib/wiki/device.

- Função .setFont()

u8g.setFont(u8g_font_fur25);

Esta função seleciona a fonte do texto que será impresso na tela do display. Para selecionar outra fonte de texto, consulte:

https://github.com/olikraus/u8glib/wiki/fontsize

- Função .drawStr()

u8g.drawStr( 30, 42, "Vida");

Esta função possibilita a escrita de uma palavra no display.  Seus respectivos argumentos são: coordenada x, coordenada y e uma string.

- Função .begin()

u8g.begin();

Esta função é responsável por inicializar o OLED. É necessária utilizar-lá antes do comando de escrever no display.

- Função digitalWrite()

digitalWrite(a0, LOW);

Esta função escreve 1 (HIGH) ou 0 (LOW) no pino associado.


Considerações finais

Em suma, os displays OLED possibilitam a exibição de imagens e caracteres com muita nitidez e por apresentarem uma biblioteca com uma infinidade de funções é possível exibir qualquer tipo de informação que se deseja. Neste tutorial, com o objetivo de aproveitar as inúmeras vantagens que estes pequenos displays proporcionam e possibilitar a exibição de uma maior diversidade de informações, aprendemos a utilizar mais de dois displays em paralelo com a ajuda de um pequeno componente, que é o demux.  

Espero que tenham gostado deste tutorial e não se esqueçam de deixar suas dúvidas, sugestões, críticas ou elogios nos comentários abaixo.


Medindo tensão AC com Transformador

Medindo tensão elétrica com Arduino e Transformador

Alguns projetos exigem que seja feita a medição de grandezas elétricas referentes a algum determinado aparelho ou circuito, visando assim monitorar suas condições de funcionamento, para assim prevenir alguma falha, ou mensurar seu consumo de energia. Neste tutorial, estaremos ensinando como realizar a medição da tensão alternada da rede elétrica utilizando um transformador 127/220 para 12 V em conjunto com um Arduino Uno. 

[toc]

kit robotica educacional com Arduino ESP ou Microbit

Por que medimos tensão elétrica?

Em ambientes industriais, o monitoramento da tensão elétrica é de suma importância para o funcionamento da indústria, pois por meio da análise tanto da tensão quanto da corrente, é possível realizar manutenções preventivas e evitar que máquinas venham a sofrer algum tipo de danificação proveniente de sobrecarga ou outras possíveis causas de falha.

Imagem meramente ilustrativa

Visto o cenário atual, no qual muitos desejam automatizar suas casas controlando a iluminação, controlando o ar condicionado, dentre outros comandos, tudo pelo celular, ocorre-se a necessidade de se monitorar o consumo de energia, seja individualmente ou de maneira geral em sua residencial, e para isso faz-se necessário efetuar a leitura de grandezas elétricas como tensão e corrente, para assim poderem fazer os cálculos de consumo de potência elétrica e assim monitorarem seu consumo de energia.

Imagem meramente ilustrativa

Para acrescentar-lhe conhecimento a respeito da medição de corrente elétrica, citada como parte vital tanto de um sistema de automação industrial quanto residencial, recomendamos que vejam o tutorial relacionado ao sensor SCT-013 e ao módulo ACS712.

Transformador

O transformador é uma máquina elétrica capaz de reduzir e elevar tensões elétricas AC (corrente alternada) por meio da indução eletromagnética. Existem diversos modelos de transformadores, de modo que, o que utilizaremos neste tutorial é semelhante ao representado logo abaixo.

Exemplo de um transformador
Exemplo de um transformador

O transformador em questão é empregado em sistemas elétricos AC, pois depende da variação constante do valor da corrente para que, por meio da indução, ele possa rebaixar ou elevar os valores de tensão.

A vantagem do transformador comparado aos outros métodos consiste no motivo que por meio dele podemos fazer com que o arduino "veja" a forma de onda senoidal que deverá ser medida, possibilitando não só o cálculo do valor RMS da tensão como também permite análises mais profundas a respeito da forma de onda da tensão.

Esse tutorial envolve conceitos de eletricidade e programação que serão explicados no  no tópico Entendendo a fundo.


Mãos à obra - Medindo a Tensão Elétrica AC da Rede com transformador

Neste projeto, iremos monitorar o valor de tensão de um equipamento, podendo assim perceber se ele está ligado ou desligado. 

Componentes necessários

Montando o projeto

Primeiro é necessário identificar quais fios do transformador devem ser conectados à fonte de tensão. Esta informação normalmente está contida no próprio transformador. Caso não seja possível distinguir quais fios são do primário e quais são do secundário, basta ver qual lado possui a mesma cor de fios para todos, pois, o lado que possuir essa característica corresponderá ao secundário do transformador.

Indicação do lado secundário do transformador
Indicação do lado secundário do transformador

Após identificar os fios, é necessário conectá-los em PARALELO com a fonte de tensão a ser monitorada.

Agora é necessário montar o seguinte circuito na protoboard para que o arduino possa ler os valores de tensão da saída do transformador.

Esquema para montagem prática do projeto para medição de tensão AC com transformador e Arduino Uno
Esquema para montagem prática do projeto para medição de tensão AC com transformador e Arduino Uno

Feito isso, só nos resta programar o arduino para que ele possa interpretar os valores que serão lidos em sua porta analógica.

Programando

Com o arduino conectado ao computador, faça upload do seguinte programa:

void setup() {
  
  Serial.begin(115200);  

  ADCSRA = 0;
  ADCSRB = 0;

  ADMUX |= (0 & 0b0000);

  ADMUX |= (1 << REFS0);
  ADMUX |= (1 << ADLAR);

  ADCSRA |= (1 << ADPS2);

  ADCSRA |= (1 << ADEN);
  ADCSRA |= (1 << ADSC);

}

void loop() {

  float amostras[200];          // Variável criada para armazenar as amostras lidas pelo arduino
  float tensaoPROTO[200];       // Utilizada para armazenar os valores correspondentes a tensão na protoboard
  float tensaoREAL[200];        // Valores reais de tensão
  
  int i;
  float soma = 0;

  float tensaoRMS;

  for(i = 0; i < 200; i++)
  {
    amostras[i] = analogRead(A0);
    delayMicroseconds(63);
  }
  
  for(i = 0; i < 200; i++)
  {
    tensaoPROTO[i] = (amostras[i] * 0.004882812) - 2.5;
    
    tensaoREAL[i] = tensaoPROTO[i] * 221.73;

    tensaoREAL[i] = tensaoREAL[i] * tensaoREAL[i];
    soma = tensaoREAL[i] + soma;
  }

  tensaoRMS = soma / 200;
  tensaoRMS = sqrt(tensaoRMS);
  
  Serial.print("Tensao: ");
  Serial.println(tensaoRMS);

  Serial.println("");
}

Com porta e placa selecionados corretamente, basta realizar o upload código.

Colocando pra funcionar

Montagem e programação concluídos, só nos resta conectar o aparelho a ser monitorado na tomada.

ATENÇÃO: Cuidado ao realizar este projeto, pois você estará trabalhando diretamente com energia elétrica.

O resultado pode ser conferido logo abaixo:

Vista superior da montagem prática
Vista superior da montagem prática

 

Montagem prática na protoboard
Montagem prática na protoboard

 

Informações apresentadas no monitor serial

Entendendo a fundo - Hardware

Conceitos básicos de Eletricidade e Eletromagnetismo

Para esse conteúdo é importante que o leitor entenda alguns conceitos de Eletricidade Básica e Electromagnetismo.

- Corrente Alternada

É uma corrente elétrica no qual seu valor varia com o tempo, mudando seu sentido constantemente. Sua forma de onda muitas vezes se assemelha a uma senoide, como podemos ver na imagem logo abaixo.

Corrente Alternada
Corrente Alternada

- Lei de Ampère

Segundo esta lei, todo condutor percorrido por corrente elétrica variante no tempo faz surgir em seu entorno um campo magnético variante proporcional ao valor da corrente elétrica. A lei em questão estabelece uma relação matemática entre o campo magnético, a corrente elétrica e a distância do condutor. A equação pode ser vista logo abaixo:

B = ( μ × i ) ÷ ( 2π × R )

É possível descobrir o sentido das linhas de campo geradas pela corrente elétrica variante no condutor seguindo a Regra da Mão Direita, no qual o polegar da mão direita indica o sentido da corrente, e os outros dedos indicam o sentido das linhas de campo. Isso pode ser melhor entendido com a imagem logo abaixo.

Ilustração da Regra da Mão Direita

- Lei de Faraday

A Lei de Faraday estabelece uma relação entre a variação do fluxo magnético e a força eletromotriz induzida em uma espira. Do mesmo modo que a corrente elétrica variante faz surgir um campo magnético variante, ocorre o mesmo quando expomos um condutor a uma variação de campo magnético.

Lei de Faraday
Lei de Faraday

Como observado logo acima, surge uma diferença de potencial entre os terminais da bobina conforme ocorra a variação do campo magnético (movimentação do imã).

Entendendo o Transformador

- Transformador 127/220 para 12V

O transformador em questão é composto de duas partes principais: o enrolamento e o núcleo. O enrolamento consiste em várias bobinas que serão responsáveis por realizar a indução eletromagnética. O núcleo é por onde as linhas de campo provenientes das bobinas transitam, onde normalmente é constituído por um material ferromagnético.

Esquemático do funcionamento de um trasnformador
Esquemático do funcionamento de um trasnformador

Quando conectamos em sua bobina primária (linhas vermelhas) uma tensão elétrica, pela Lei de Faraday, surge um campo magnético, no qual suas linhas de campo passarão pelo material ferromagnético (estrutura cinza), e induzirá uma corrente na bobina secundária (linhas azuis), fazendo surgir uma diferença de potencial entre seus terminais.

Representação das linhas de campo em um transformador
Representação das linhas de campo em um transformador

- Circuito do medidor de tensão

Neste tópico iremos explicar os detalhes que compõem o circuito proposto nesse tutorial.

Primeiramente temos um circuito divisor de tensão entre os terminais do transformador, que tem por objetivo diminuir o valor de pico da tensão de saída para que o arduino possa ler os valores de tensão. Abaixo é possível ver o diagrama que indica o circuito divisor de tensão.

Circuito divisor de tensão

Com este divisor de tensão, as formas de onda encontradas em cada resistor serão as seguintes:

Formas de onda em cada resistor

Utilizando a Lei de Ohm, podemos também calcular os valores de pico de tensão nos resistores, levando em conta que o secundário do transformador possua uma tensão de saída de 12V. Fazendo os cálculos, descobriremos o seguinte.

V = R × I

12 = 21000 × I

I = 12 ÷ 21000

I = 0,57 mA

Com isso, descobrimos que a corrente do circuito equivale a 0,57 mA. Com este valor, podemos descobrir a queda de tensão sobre o resistor R3.

V = 1000 × 0,00057

V = 0,57 V

Precisamos transformar esse valor, que corresponde ao rms, em valor de pico. Para isso, multiplicaremos o resultado anterior por √2.

V = 0,57 × √2

V = 0,81 V ou 810 mV

Sabemos agora que o valor de pico, ou seja, o valor mais alto que a tensão sobre esse resistor atinge, é de 800 mV.

Necessitamos agora de um circuito que irá adicionar uma tensão de offset sobre esse resistor, para que o arduino também possa ler os valores que correspondem ao semiciclo negativo da forma de onda, visto que se conectarmos esse resistor diretamente nele, o arduino não conseguirá ler esses valores negativos. Para isso, foi montado um segundo divisor de tensão, no qual utiliza a alimentação do arduino (5V e GND) para gerar o valor de tensão DC que será adicionado a forma de onda do resistor R3. O circuito equivalente a este divisor pode ser visualizado logo abaixo.

Divisor de tensão para offset

Com o acréscimo de uma tensão de offset na forma de onda presente no resistor R3, teremos o seguinte resultado:

Forma de onda resultante

O esquemático do circuito final pode ser visualizado logo abaixo.

Esquemático do circuito apresentado neste tutorial

 


Entendendo a fundo - Software

Será abordado neste tópico os detalhes sobre cada linha de programação, vista na seção Mãos à obra

Abaixo está o diagrama geral informando como ocorre o processo de conversão dos valores analógicos para digitais, visto que ele será necessário para a explicação dos registradores. Durante as explicações, serão apresentados partes específicas desse diagrama. Ele também poderá ser consultado indo diretamente ao datasheet do microcontrolador ATmega328p.

Diagrama de blocos representando a operação de conversão analógica para digital

- ADMUX

ADMUX é um registrador composto por 8 bits no qual ele contém a tensão de referência a ser utilizada para a leitura dos terminais analógicos e qual terminal será utilizado para as leituras. Abaixo está a tabela que informa os bits correspondentes a cada informação do registrador.

Tabela geral das informações que compõem o byte ADMUX
  • MUX3...0

Os primeiros 4 bits correspondem ao pino responsável pela leitura analógica. Abaixo está a tabela com as informações referentes para setar o pino desejado.

Tabela referente aos pinos e sua representação binária no registrador ADMUX

Pelo diagrama abaixo vemos que os bits relacionados a seleção dos pinos de entrada são conectados a um decodificador, no qual sua saída é conectada ao multiplexador, onde os terminais A0...A5 estão conectados nas entradas desse multiplexador.

Diagrama relacionado aos pinos de leitura analógica

- REFS1 e REFS0

Os dois bits mais significativos (7º e o 6º bit) corresponde a tensão de referência que deverá ser utilizada para a leitura do valor analógico. Assim como anteriormente, o datasheet do ATmega328p apresenta uma tabela para auxiliar a configuração desta informação.

Tabela referente a seleção da tensão de referência

O padrão é utilizar AREF, no qual não conectamos nada ao terminal.

Pelo diagrama abaixo podemos entender melhor o funcionamento a respeito do 6º e 7º bit do ADMUX, para a seleção da tensão de referência.

Diagrama relacionado ao 6º e 7º bit

O bit REFS1 é conectado ao multiplexador, no qual esse bit definirá qual entrada será direcionada a saída. Se o REFS1 seja 0, a saída será o AVCC, mas  se o bit for 1, será a tensão interna de referência 1,1V. Já o bit REFS0 é responsável por controlar a conexão entre a saída do multiplexador acima e o AREF, onde caso seja esse bit seja 0, não haverá conexão, mas caso seja 1, haverá conexão entre eles.

- ADLAR

O bit referente ao ADLAR é responsável pela configuração da forma de exibição dos resultados (/da conversão feita pelo ADC) no Registrador de Dados ADC. Setando ele em 1, o resultado será alinhado a esquerda, e setando 0, se alinhará a direita. Ele é composto por dois registradores, chamados: Registrador de Dados ADC Low e High. Abaixo está o diagrama com sua localização na operação de conversão. Veja que abaixo do nome principal do registrador está entre parênteses os nomes ADCH e ADCL, que correspondem a siglas correspondentes de Low (ADCL) e High (ADCH).

obs: o registrador principal do Registrador de Dados ADC possui 16 bits, pois se trata da união dos dois registradores.

Diagrama referente ao registrador ADC Data Register

- ADCL

ADCL corresponde ao registrador localizado a direita do principal. Quando ADLAR está setado em 0, temos a seguinte configuração:

Tabela referente ao ADCL quando setado em 0

Já quando setado em 1:

Tabela referente ao ADCL quando setado em 1

- ADCH

ADCH corresponde ao registrador localizado a esquerda do principal. Quando ADLAR está setado em 0, temos a seguinte configuração:

Tabela referente ao ADCH quando setado em 0

Já quando setado em 1:

Tabela referente ao ADCH quando setado em 1

Os valores ADC9...ADC0 equivalem aos bits resultantes da conversão AD realizada anteriormente.

Processo de conversão

O ADC irá gerar um resultado de 10 bits que será apresentado nos Registradores de Dados ADC, ADCH e ADCL. Dependendo do valor de ADLAR, o resultado será apresentado a esquerda ou a direita. Caso o resultado seja ajustado a direita e apresente 8 bits, basta ler o valor presente no registrador ADCH. Caso contrário, o ADCL deverá ser lido primeiro, e logo após o ADCH, pois após a sua leitura, não será possível modificar os valores desses registradores. Já quando é efetuada a leitura no registrador ADCH, o acesso para modificação é reativado. Com isso, pode ocorrer as seguinte situações:

  • Efetuar a leitura do ADCL, e ocorrer uma conversão antes do registrador ADCH ser lido, tanto os dados desse registrador quanto os novos valores que foram convertidos serão perdidos;
  • Caso seja feita uma inversão na ordem de leitura dos registradores (ler ADCH antes de ADCL), após efetuar a leitura de ADCL, o acesso aos valores serão bloqueados e nenhuma alteração poderá ser feita, perdendo com isso os dados de conversões futuras.

ADCSRA e ADCSRB

Os registradores ADCSRA e ADCSRB são responsáveis pelo processo de conversão analógica para digital no arduino. ADCSR é a sigla do termo inglês ADC (Analog Digital Converter) Control and Status Register (Registrador de Status e Controle ADC), no qual o microcontrolador do arduino apresenta dois, A e B.

O ADCSRA é composto pelos seguintes bits:

Byte referente ao registrador ADCSRA

Os bits que compõem o byte do registrador ADCSRA são:

  • ADEN: ativa o sistema ADC. É necessário estar setado em 1 para que o processo de conversão ocorra. Quando o processo se encerra, ele retornará ao valor 0.
  • ADSC: quando 1 ele inicia o processo de conversão, já quando for 0, encerra-se o processo.
  • ADATE: é utilizado para configurar o trigger do arduino. Caso seja setado em 1, o auto trigger do conversor AD é habilitado.
  • ADIF: Este bit é definido quando uma conversão de ADC é concluída e os registros de dados são atualizados.
  • ADIE: Quando esse bit é gravado em um e o bit 1 em SREG é definido, a interrupção completa de conversão do ADC é ativada.
  • ADPS2...0: Esses bits determinam o fator de divisão entre a freqüência do clock do sistema e o clock de entrada para o ADC.

É necessário manipular diretamente os registradores no void setup() pois desse modo o arduino conseguirá fazer um maior número de leituras durante o tempo de 16,66 ms (equivalente a um período da frequência de 60 Hz da rede elétrica).

Até aqui poderia ir para outro tutorial


- Iniciando a comunicação serial

É iniciado uma comunicação serial com baud rate de 115200. Caso você não conheça bem os recursos da comunicação serial, recomendamos que veja o tutorial Comunicação Serial Arduino.

Serial.begin(115200);

- Limpando registradores

É atribuído o valor 0 aos registradores ADCSRA e ADCSRB:

ADCSRA = 0;
ADCSRB = 0;

- Setando o pino de entrada analógica

É definido o pino A0 como INPUT, assim como a tensão de referência:

ADMUX |= (0 & 0b0000);
ADMUX |= (1 << REFS0);

- Configurando a forma de exibição

Alinha o valor ADC a esquerda, para que seja lido somente os 8 bits mais significativos do registrador ADCH:

ADMUX |= (1 << ADLAR);

- Determinando o fator de divisão

É determinado o fator de divisão entre o clock do sistema e a entrada de clock do ADC. Neste caso, como ADPS0 e ADPS1 estão em estado lógico 0, e o ADPS2 é setado com estado lógico 1, o valor do fator de divisão será 16.

ADCSRA |= (1 << ADPS2);

- Ativação do conversor ADC

O conversor ADC presente no arduino é habilitado:

ADCSRA |= (1 << ADEN);

- Iniciando as medições ADC

É iniciado as medições ADC:

ADCSRA |= (1 << ADSC);

- Criando variáveis locais para o código

São criados vetores que serão responsáveis por armazenar o valor bruto lido, e de mesmo modo, os valores convertidos e tratados. Foi criado vetores com 200 pontos pois estes já serão suficientes para que seja realizado o cálculo do valor quadrático médio da tensão.

float amostras[200];
float tensaoPROTO[200];
float tensaoREAL[200];

Também são criados outras variáveis auxiliares e a variável em que será armazenado o valor final.

int i;
float soma = 0;
 
float tensaoRMS;

- Captação dos valores instantâneos da tensão

É realizado um laço for para realizar a leitura das 200 amostras que serão lidas pelo pino analógico A0. O delay foi utilizada para que ao final da leitura das 200 amostras, o tempo gasto fosse próximo dos 16,66 ms, que equivale ao tempo de duração de um ciclo da senoide de 60 Hz.

for(i = 0; i < 200; i++)
{
  amostras[i] = analogRead(A0);
  delayMicroseconds(63);
}

- Tratamento dos valores armazenados na variável "amostra[200]"

Da mesma maneira que o tópico anterior, é realizado um laço for para que seja feito o tratamento em todos os 200 valores armazenados na variável amostra, para que sejam utilizados após isso no processo de encontro do valor quadrático médio.

for(i = 0; i < 200; i++)
{
  tensaoPROTO[i] = (amostras[i] * 0.004882812) - 2.5;
  
  tensaoREAL[i] = tensaoPROTO[i] * 221.73;

  tensaoREAL[i] = tensaoREAL[i] * tensaoREAL[i];
  soma = tensaoREAL[i] + soma;
}

De início, é feito a conversão de número decimal binário para o valor real de tensão de 0 à 5V, multiplicando-o por 0,004882812, que equivale a 5 dividido por 1024.Após isso, é necessário subtrair este valor por 2,5, que equivale ao valor da tensão de offset que foi adicionado propositalmente para que o arduino pudesse ler os semiciclos negativos da forma de onda da tensão.

tensaoPROTO[i] = (amostras[i] * 0.004882812) - 2.5;

O próximo passo consiste em realizar um cálculo que corresponde a proporção dos valores na protoboard com os valores reais da tensão elétrica.

Como foi explicado anteriormente, o valor de pico que o resistor R3 terá será de 0,81 mV, e isso nos quer dizer que quando a tensão sobre o primário do transformador for de 127 V, o valor de pico sobre o resistor R3 será de 0,81 mV. Com esta informação, podemos traçar uma regra de três que fará a proporção conforme ocorra variação dos valores instantâneos colhidos pelo pino A0, já que a proporção entre os valores de pico será a mesma para todas as outras amostras. Desse modo, é realizado o seguinte cálculo:

(127 × √2)     -     0,81 mV

                                            x     -     valor da amostra lida

Realizando a multiplicação em forma de x, podemos ver que o valor da amostra lida será multiplicado pela divisão de 179,60 (127 × √2) por 0,00081. Realizando essa divisão, teremos o seguinte valor:

(127 × √2) ÷ 0,00081

221,73

Logo, para convertermos o valor correspondente a tensão sobre o resistor R3 para a tensão equivalente no transformador, basta multiplicarmos esse valor por 221,73, e é isso que o código faz, como mostrado logo abaixo.

tensaoREAL[i] = tensaoPROTO[i] * 221.73;

Concluído esse processo, o cálculo que deve ser realizado agora corresponde a raiz da média quadrática, no qual sua fórmula pode ser visualizada logo abaixo.

Fórmula da raiz média quadrática

Com isso, a primeira coisa a ser feita é a elevação ao quadrado de cada termo dentro do vetor, no qual esse processo pode ser visualizado abaixo.

tensaoREAL[i] = tensaoREAL[i] * tensaoREAL[i];

Após isso é necessário realizar a soma de todos os termos presentes no vetor, e para isso foi realizado o seguinte comando:

soma = tensaoREAL[i] + soma;

E com isso terminamos o último laço for do código.

- Descobrindo o valor RMS

Dando prosseguimento ao processo citado no tópico anterior, é necessário dividir a soma de todos os termos pelo número de termos (que equivale a 200, o número total de amostras presente no vetor) e realizar a raiz quadrada dessa divisão. O comando sqrt() é responsável por efetuar o cálculo da raiz quadrada na programação de arduino.

tensaoRMS = soma / 200;
tensaoRMS = sqrt(tensaoRMS);

- Mostrando no monitor serial

É realizado o print do valor RMS da tensão no monitor serial.

Serial.print("Tensao: ");
Serial.println(tensaoRMS);
 
Serial.println("");

E com isso, encerramos as explicações a respeito do hardware e software deste tutorial.


Considerações finais

Esperamos que este tutorial tenha lhe acrescentado conhecimento tanto na área da eletrônica assim como na área de programação.

Obrigado pela atenção e continuem buscando conhecimento no portal Vida de Silício.


Medindo Temperatura com Termistor NTC e Arduino

Medindo Temperatura com Termistores

Em alguns projetos, faz-se necessária a medição de uma determinada temperatura para a tomada de alguma decisão, como por exemplo, acionar uma carga ou sinalizar algo. Dependendo do projeto, talvez seja necessário monitorar a temperatura de um circuito eletrônico a fim de evitar falhas ou problemas que possam ocorrer. Com isso mente, neste tutorial te ensinaremos como utilizar o termistor NTC 10k em conjunto com um Arduino.

Projeto com Arduino uno usando Termistor NTC 10K
Projeto com Arduino uno usando Termistor NTC 10K

kit robotica educacional com Arduino ESP ou Microbit

[toc]

Da Automação Industrial para Automação Residêncial

O monitoramento da temperatura por muito tempo limitou-se a ambientes industriais, como por exemplo, no controle de fornos, no monitoramento do funcionamento de máquinas, em controle de processos, entre outros.

A redução do custo dos sistemas automáticos, impulsionada pela disseminação das placas de desenvolvimento de baixo custo e dos conceitos de Internet das Coisas (IoT - Internet of Things), possibilitaram que sensores de grandezas físicas (luminosidade e temperatura) ganhassem importância em ambientes residencias e empresariais.

Hoje, qualquer pessoa pode montar seu próprio sistema de automação que responda sozinho a variações de luminosidade e/ou temperatura utilizando tecnologias baratas tais como placas Arduino.

Sensores de temperatura estão presente em sistemas de climatização
Sensores de temperatura estão presente em sistemas de climatização

Os diferentes tipos de sensores de temperatura

A variedade de tipos de processos e ambientes no qual precisamos medir temperatura resultou em uma grande variedade de sensores de temperatura, cada um com sua particularidade.

Os principais sensores de temperatura encontrados no mercado são:

  • Termopares
  • RTD - Transdutores Termoresistivos
  • Termistores

Obs: Ainda existe outros sensores inteligentes tais como o LM35 e o DS18B20

Termopares

Sensores baseados na variação proporcional da tensão entre dois metais a temperatura ao qual são submetidos. Este efeito é chamado de Seebeck. Com custo elevado, são empregados em aplicações profissionais, onde se requer alta confiabilidade e precisão.

Esse tipo de sensor é explicado com detalhes no Tutorial Termopar tipo K + MAX6675.

RTD - Transdutores Termorresistivos

Seu funcionamento tem como base a variação proporcional da resistência de um material condutor conforme temperatura ao qual é submetido. Esse efeito é denominado de termorresistividade.

Como exemplo de transdutores termos o PT100 e o PT1000 feitos com fio de Platina. Estes dois sensores apresentam uma alta importância na indústria, pois apresentam alta precisão, além de oferecerem estabilidade e alta imunidade aos ruídos elétricos produzidos no ambiente no qual foi empregado.

Termistores

Os termistores também utilizam a propriedade física da termorresistência. A diferença é que os termistores são constituídos de semicondutores, enquanto os transdutores são constituídos por metais.

Esses componentes,  quando submetidos a uma variação de temperatura, apresentam variação no valor de sua resistência.

Diferentes tipos de termistores

A grande vantagem dos termistores é seu baixo custo e pequeno tamanho. Esses sensores são comumente utilizados em sistemas eletrônicos tais como impressoras, eletrodomésticos, notebooks,etc.

Diferença entre Termistores NTC e PTC

A relação entre temperatura e resistência pode variar de forma negativa ou positiva conforme variação de temperatura, fazendo com que os termistores se dividam em dois grupos:

- Termistores NTC

NTC é a sigla para o termo Negative Temperature Coefficient, que traduzindo significa Coeficiente Negativo de Temperatura. Isso significa que para um aumento de temperatura o termistor terá a sua resistência diminuída seguindo sua curva característica. Abaixo é possível visualizar essa curva característica de um modelo de termistor como exemplo.

Curva característica que relaciona temperatura e resistência de um termistor NTC

- Termistores PTC

PTC é a sigla para o termo Positive Temperature Coefficient, que significa Coeficiente Positivo de Temperatura. Ele apresenta um funcionamento inverso ao anterior, ou seja, quando ocorre aumento de temperatura, a resistência do termistor aumentará seguindo sua curva característica. Como no caso anterior, abaixo poderá ser visto um exemplo de curva característica de um modelo de termistor PTC.

Curva característica entre temperatura e resistência de um termistor PTC

Resistência do Termistor

Por padrão, os termistores são especificados pela sua resistência na temperatura de 25ºC. Ou seja, o termistor NTC 10k terá a resistência de 10k Ohm quando submetido a temperatura de 25ºC.

A relação entre resistência e temperatura de um termistor não é linear e pode ser feita usando coeficiente B ou Beta, fornecido pelo datasheet.

Este coeficiente é calculado baseado na formula de Steinhart–Hart que descreve a temperatura de um dispositivo semicondutor em dada temperatura. Você pode entender melhor esse coeficiente no artigo em inglês do Wikipédia sobre Termistores.

Para esse tutorial  utilizarmos a biblioteca thermistor.h que calculará o valor da temperatura conforme a resistência medida, assim não ficará mais simples medir a temperatura.

Termistor NTC 10K

Quando se trata de Arduino e outras placas de desenvolvimento, o termistor NTC 10k é definitivamente um dos sensores de temperatura mais populares.

Termistor NTC 10K 3mm
Termistor NTC 10K 3mm

Sua popularidade se dá pelo seu baixo preço e facilidade de utilização junto com microcontroladores.

Esse termistores possuem as seguintes especificações:

  • Resistência à 25ºC: 10k Ohm
  • Faixa de leitura: -55 a 125°C
  • Coeficiente Beta: B25/100  = 4300 K

Veja as especificações desse sensor na página 37 deste datasheet.


Mãos a obra - Medindo a temperatura ambiente com Termistor NTC

Componentes necessários

Para este exemplo prático, serão necessários os seguintes itens:

Com esses itens em mãos, conseguiremos medir a temperatura utilizando o sensor.

Montando o projeto

O circuito eletrônico pode ser visto logo abaixo:

Esquema de montagem do Termistor NTC 10k com Arduino Uno
Esquema de montagem do Termistor NTC 10k com Arduino Uno

Programando

Tratando-se do código, é necessário realizar o download da biblioteca "thermistor.h", que pode ser baixada clicando aqui.

O código utilizado se encontra abaixo.

#include "thermistor.h"

int pinNTC = A1;
float temperatura;

THERMISTOR thermistor(pinNTC, 10000, 3950, 10000);

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

void loop()
{
    temperatura = thermistor.read();

    Serial.print("Temperatura: ");
    Serial.print(temperatura);
    Serial.println(" graus");

    Serial.println("");

    delay(1000);
}

Colocando em prática

Aqui está imagens do resultado deste exemplo prático.

Imagem do circuito montado em protoboard
Print screen do monitor serial

Entendendo a fundo

Neste tópico serão abordados o hardware e o software deste exemplo, com o objetivo de permitir que você possa compreender bem todo o funcionamento e com isso fazer as alterações que julgar necessárias para adaptá-lo aos seus projetos.

Hardware

O hardware deste circuito consiste em um simples divisor de tensão, no qual o pino analógico A0 é conectado na junção entre o sensor e o resistor, que por sua vez, estão conectados em série. A tensão de 5V é conectada ao outro terminal do sensor e o GND é conectado ao terminal restante do resistor.

Circuito eletrônico

Quando ocorre variação de temperatura, há uma variação na resistência do sensor, e consequentemente na tensão sobre o resistor de 10kΩ. Essa variação de tensão sobre o resistor será lida pelo Arduino e com isso o valor de temperatura poderá ser estipulado.

Caso você utilize um termistor que apresente outro valor de resistência máxima, lembre-se de ter em mãos um resistor que possua um valor de resistência igual ao do termistor.

Software

Agora será explicado cada linha do código utilizado.

- Configurações iniciais

É incluso a biblioteca "Thermistor.h".

#include <thermistor.h>

Cria-se duas variáveis, uma para armazenar o valor da temperatura e outra para usar como identificador do pino analógico utilizado.

int pinNTC = A1;
float temperatura;

Cria-se o objeto "thermistor" com os seguintes parâmetros: pino utilizado para a leitura no arduino, valor da resistência do termistor, coeficiente do termisto, valor da resistência do resistor utilizado.

THERMISTOR thermistor(pinNTC, 10000, 3950, 10000);

Habilitamos a conexão serial entre o arduino e o computador com 9600 de baud rate.

Serial.begin(9600);

- Leitura do sensor e envio para o monitor serial

É efetuada a leitura do sensor pelo comando thermistor.read() e é salvo na variável "temperatura".

temperatura = thermistor.read();

O valor é mostrado no monitor serial e após isso, é dado um tempo de espera de 1 segundo.

Serial.print("Temperatura: ");
Serial.print(temperatura);
Serial.println(" graus");

Serial.println("");

delay(1000);

Considerações finais

Esperamos que este tutorial tenha esclarecido qualquer dúvida sobre a utilização de um termistor e suas aplicações no mundo maker.

Obrigado pela atenção e continue buscando conhecimento no portal do Vida de Silício.


Display LCD TfT 2.4"- Primeiros passos com Touchscreen

Display LCD TfT 2.4" - Primeiros passos com touchscreen

Neste tutorial iremos dar continuidade a utilização do display TfT no Arduíno Uno. Caso não tenha lido esse tutorial, recomendo fortemente que o veja aqui, pois nele ensinamos o processo de configuração da tela. Já nesta parte do tutorial, iremos aprender a como configurar, calibrar e utilizar o touchscreen disponível no display.

kit robotica educacional com Arduino ESP ou Microbit

[toc]

Evolução da interface homem máquina (IHM)

Durante o desenvolvimento de qualquer tipo de sistema computacional, é fundamental que a elaboração de interfaces para visualização e controle destes sistemas sejam elaboradas levando em consideração fatores como facilidade de uso e layout agradável. Com isso, muito vem se evoluindo no que tange o desenvolvimento de intefaces homem máquina, e algo que permitiu um salto significativo na evolução destas interfaces foi o desenvolvimento das telas de toque, ou TouchScreen.

As telas TouchScreen podem ser consideradas como uma evolução para o desenvolvimento de interfaces homem máquina mais robustas. Isso se deve ao fato de que através de uma tela TouchScreen, é possível elaborar interfaces dinâmicas, com imagens e comandos intuitivos ao usuário final. Além disso, seu uso pode reduzir significativamente o tamanho final de um produto, uma vez que dispensa a necessidade de outros periféricos de interface humana, como botões, teclados, e mouse. E levando em consideração o barateamento desta tecnologia seu uso ainda reduz o preço final de um produto.

 

Diferença entre paineis clássicos e paineis de controle TouchScreen

O surgimento da considerada primeira "tela" touchscreen

 

Considerada como um "acidente", a primeira tela touchscreen surgiu em meados dos anos 70. Em virtude da necessidade de se criar um meio mais simples para interação com planos cartesianos, o engenheiro George Samuel Hurst, conseguiu, através de uma malha condutiva, ler as coordenadas de um plano cartesiano ao pressionar um ponto desta malha com uma caneta, criando assim o que pode ser considerado a primeira "tela" touchscreen.

Como funciona

Telas TouchScreen são subdivididas entre duas categorias, denominadas resistivas e capacitivas.

  • Tela Resistiva: Uma tela resistiva é composta basicamente por duas camadas, sendo a primeira camada um material condutor e a segunda camada composta por vidro. No momento em que uma pressão é realizada sob a tela e essa pressão é capaz de fazer com que a camada de vidro toque a camada condutora, uma variação no campo elétrico é detectada e com base nessa variação o sistema é capaz de informar o ponto onde o toque ocorreu.
Tela de toque resistiva
  • Tela Capacitiva: Composta por um material condutor carregado eletricamente e um controlador capaz de detectar variações no campo elétrico em regiões distintas um ponto de toque é detectado no momento em que ocorre uma variação no campo elétrico decorrente ao toque de um material condutor na superfície.
Funcionamento tela capacitiva.

Shield Lcd TFT 2.4″ Touchscreen

Neste tutorial iremos utilizar o shield LCD TFT 2.4" como base para o nosso projeto de controle de acesso. Se você ainda não sabe como configurar, instalar driver e renderizar informações nesta tela, você pode conferir um tutorial neste link:

O shield Lcd TFT 2.4″ possui uma resolução de 240×320, além de possuir uma interface touchscreen resistiva por onde é possível interagir com a tela sem a necessidade de botões. A tela conta com um total de 13 pinos distribuídos entre alimentação, controle do touch e controle do display.

Tela utilizada

É importante que para o uso correto deste display, você utilize o tutorial anterior e consiga assim configurar e instalar as bibliotecas corretas.

 

 


Mãos a obra - Primeiros passos com Touchscreen

Componentes utilizados

Instalando bibliotecas necessárias

Para implementarmos as aplicações propostas, nós iremos primeiramente baixar a biblioteca TouchScreen da Adafruit, que pode ser facilmente encontrada através da opção Gerenciar Biblioteca dentro do menu Sketch como mostra a figura abaixo:

Baixando biblioteca Touchscreen através do Gerenciador de Biblioteca.

Calibração da tela

Com a biblioteca instalada, iremos agora iniciar o processo de calibração da tela, que consiste basicamente em encontrar os valores de extremidade da nossa tela. Esse processo é extremamente importante, pois será através dos valores obtidos desta calibração que sistema será capaz de identificar qual ponto da tela foi pressionado. Para iniciarmos o processo de calibração, iremos executar um dos exemplos disponibilizados pela biblioteca MCU_FRIEND de nome TouchScreen_Calibr_native como mostra a imagem a seguir:

Exemplo a ser executado para calibração da tela.

 

Se todo processo de instalação da biblioteca tiver sido feito corretamente, você verá a seguinte imagem no display.

Informações sobre como realizar a calibração.

A tela em questão informa tudo que deve ser feito para realização do processo de calibração, que consiste apenas em pressionar alguns quadrados que vão estar posicionados nas extremidades da tela. Para prosseguir até a próxima tela, basta tocar a tela em qualquer lugar. Logo após clicarmos na tela, seremos direcionado a imagem abaixo:

Tela de calibração.

Nessa tela, você deve pressionar sequencialmente todos os quadrados o mais próximo possível do sinal de + e manter pressionado até que a mensagem PRESS, mude para RELEASE. O processo deve ser feito em TODOS os quadrados, sendo um por vez e sempre levando em consideração que o quadrado que deve ser pressionado estará com uma cor branca mais forte. Ao fim do procedimento você será direcionado para uma segunda tela, onde as configurações de calibração estarão seguindo o formato da imagem abaixo:

Resultado da calibração.

Anote todas as configurações, elas serão fundamentais para qualquer projeto que você queira utilizar o Touchscreen.

 

No caso da minha tela, foi gerada a seguinte configuração:

Modo Retrato:

  • x = map(p.x,LEFT=184,RT=924,0,240)
  • y = map(p.y,TOP=177,BOT=901,0,320)

Modo Paisagem:

  • x = map(p.y, LEFT=177,BOT=902,0,320)
  • y = map(p.x, TOP=924, BOT=184,0,240)

As duas configurações em questão, estão diretamente relacionadas a forma como a tela ficará posicionada. Sendo assim caso queira utilizar a tela em modo retrato, utilize a primeira configuração, caso contrário a segunda.

 

- Programando

Agora que instalamos a biblioteca Touchscreen, e realizamos a calibração da tela, podemos prosseguir para a parte do código. O código abaixo é responsável por renderizar todos os componentes da tela  e responder a toques na tela.

#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>
#include <TouchScreen.h>

#define TAMANHOMAXSENHA 9
#define SENHAVALIDA "01234"
#define MINPRESSURE 300
#define MAXPRESSURE 2000
#define PRETO   0x0000
#define VERMELHO     0xF800
#define VERDE   0x07E0
#define BRANCO   0xFFFF

#define XP 6
#define XM A2
#define YP A1
#define YM 7

#define TS_LEFT 170
#define TS_RT 901
#define TS_TOP 932
#define TS_BOT  159


TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
Adafruit_GFX_Button botoes[12];
MCUFRIEND_kbv tft;

bool pressionado = false;
int posX;
int posY;
String senha = "";


bool obterToque(void){
    TSPoint p = ts.getPoint();
    pinMode(YP, OUTPUT);      
    pinMode(XM, OUTPUT);
    digitalWrite(YP, HIGH);   
    digitalWrite(XM, HIGH);
    bool pressed = (p.z > MINPRESSURE);
    if (pressed) {
        posX = map(p.y, TS_LEFT, TS_RT, 0, 320); 
        posY = map(p.x, TS_TOP, TS_BOT , 0, 240);
        return true;
    }
    return false; 
}



void setup() {
  uint16_t ID = tft.readID();
  tft.begin(ID);
  tft.setRotation(1);
  telaInicial();
}

void telaInicial(){
  senha = "";
  tft.fillScreen(PRETO);
  botoes[0].initButton(&tft,  60, 100, 30, 40, BRANCO, VERDE, PRETO, "1", 2);
  botoes[1].initButton(&tft, 110, 100, 30, 40, BRANCO, VERDE, PRETO, "2", 2);
  botoes[2].initButton(&tft, 160, 100, 30, 40, BRANCO, VERDE, PRETO, "3", 2);
  botoes[3].initButton(&tft, 210, 100, 30, 40, BRANCO, VERDE, PRETO, "4", 2);
  botoes[4].initButton(&tft, 260, 100, 30, 40, BRANCO, VERDE, PRETO, "5", 2);
  botoes[5].initButton(&tft, 60,  150, 30, 40, BRANCO, VERDE, PRETO, "6", 2);
  botoes[6].initButton(&tft, 110, 150, 30, 40, BRANCO, VERDE, PRETO, "7", 2);
  botoes[7].initButton(&tft, 160, 150, 30, 40, BRANCO, VERDE, PRETO, "8", 2);
  botoes[8].initButton(&tft, 210, 150, 30, 40, BRANCO, VERDE, PRETO, "9", 2);
  botoes[9].initButton(&tft, 260, 150, 30, 40, BRANCO, VERDE, PRETO, "0", 2);
  botoes[10].initButton(&tft, 85, 200, 80, 40, BRANCO, VERDE, PRETO, "Acesso", 2);
  botoes[11].initButton(&tft, 235, 200, 80, 40, BRANCO, VERDE, PRETO, "Apagar", 2);

  for (int i=0; i<12; i++){
    botoes[i].drawButton(false);
  }
  escreveSenha();
  
}

void TeclaPressionada(bool teclaTocada){
  for (int i=0; i<12; i++){
    botoes[i].press(teclaTocada && botoes[i].contains(posX,posY));
  }
  checkPressedButton();

}

void checkPressedButton(){
  for (int i=0; i<12; i++){
    if (botoes[i].justPressed()){
      checkPressed(i);
    }
  }
}

void esperaSoltar(){
  while (obterToque()){
    delayMicroseconds(50);
  }

}

void escreveSenha(){
  tft.fillRect(70, 30, 190, 30, BRANCO);
  tft.setCursor(74,35); 
  tft.setTextColor(PRETO); 
  tft.setTextSize(3);
  tft.print(senha+"_"); 
}


void apagarUltimocaractere(){
  if (senha.length()>0){
    senha.remove (senha.length () - 1);
  }
}
void checkPressed(int button){
    botoes[button].drawButton(true);
    esperaSoltar();
    botoes[button].drawButton();
    if(senha.length()<TAMANHOMAXSENHA || button == 10 || button == 11){
    switch (button){
        case 0:
          senha = senha + "1";
        break;
        case 1:
          senha = senha + "2";
        break;
        case 2:
          senha = senha + "3";
        break;
        case 3:
          senha = senha + "4";        
        break;
        case 4:
          senha = senha + "5";
        break; 
        case 5:
          senha = senha + "6";
        break;
        case 6:
          senha = senha + "7";
        break;
        case 7:
          senha = senha + "8";
        break;
        case 8:
          senha = senha + "9";
        break;
        case 9:
          senha = senha + "0";
        break;
        case 10:
        validarAcesso();
        break; 
        case 11:
        apagarUltimocaractere();
        break;  
    }
    escreveSenha();
    }
}




void validarAcesso(){

  if (senha == SENHAVALIDA){
     tft.fillScreen(PRETO);
     tft.setCursor(10,100);
     tft.setTextColor(VERDE);
     tft.setTextSize(3);
     tft.print("Acesso Autorizado");
     delay(3000);
     telaInicial();
  }
  else{ // Caso contrário
     tft.fillScreen(PRETO);
     tft.setCursor(40,100);
     tft.setTextColor(VERMELHO); 
     tft.setTextSize(3); 
     tft.print("Acesso Negado"); 
     delay(3000); 
     telaInicial();
  }
  
}

void loop() {
  bool toque = obterToque();
  TeclaPressionada(toque);
}

 

Colocando pra funcionar


Entendendo a Fundo

Software

- Bibliotecas utilizadas

Neste tutorial, iremos precisar de três bibliotecas para construir o nosso sistema de controle de acesso. Essas bibliotecas serão responsáveis por fornecer os objetos necessários para comunicação entre o display e o microcontrolador.

#include <Adafruit_GFX.h> // Biblioteca gráfica Adafruit
#include <MCUFRIEND_kbv.h> // Biblioteca do display
#include <TouchScreen.h> // Biblioteca do Touchscreen

- Defines

Alguns defines também serão criados para facilitar a modificação de parâmetros conforme a necessidade, sendo eles:

  1. TAMANHOMAXSENHA: Define o tamanho máximo que a senha pode ter.
  2. SENHAVALIDA: Serve apenas para testar o código, você pode adaptar o código por exemplo para ler os dados de um cartão sd.
  3. MINPRESSURE:  Valor mínimo de força a ser considerado como um toque pelo código.
  4. MAXPRESSURE: Valor máximo de força a ser considerado como um toque pelo código.
  5. PRETO, VERMELHO, VERDE, BRANCO: Código hexadecimal das cores utilizadas neste código.
  6. XP XM, YP, YM: Pinos utilizados para comunicação com módulo touchscreen.
  7. TS_LEFT, TS_RT, TS_TOP, TS_BOT: Valores limites da tela que foram obtidos através do código de calibração.
#define TAMANHOMAXSENHA 9 // Tamanho máximo da senha
#define SENHAVALIDA "01234" // Senha válida
#define MINPRESSURE 300 // Pressão minima para a tela considerar um toque
#define MAXPRESSURE 2000 // Pressão máxima que a tela deve considerar
#define PRETO   0x0000 // Cor preta
#define VERMELHO     0xF800 // Cor vermelha
#define VERDE   0x07E0 // Cor verde
#define BRANCO   0xFFF // Cor branca

// Pinos do touchscreen
#define XP 6 
#define XM A2
#define YP A1
#define YM 7

// Pontos de extremidade do touchscreen
#define TS_LEFT 170
#define TS_RT 901
#define TS_TOP 932
#define TS_BOT  159

- Objetos criados

Para elaboração da interface gráfica, iremos utlizar um total de 12 botões, sendo 10 botões representando os valores entre 0 e 9 e os outros dois botões utilizados para realizar uma tentativa de acesso e apagar o último caractere escrito. Sabendo disso, iremos utilizar um recurso muito interessante disponível na biblioteca Adafruit_GFX, que são os Adafruit_GFX_Button. Essa funcionalidade permite com que criemos botões de forma bem transparente e simplificada, onde passando alguns parâmetros criamos botões selecionaveis com bastante facilidade. Neste exemplo iremos instanciar um vetor contendo 12 desses botões, o fato de utilizar um vetor ao invés de criar uma variável para cada botão é o fato de que conseguimos reduzir bastante o nosso código utilizando o comando for para acesso a cada um deles.

Adafruit_GFX_Button botoes[12];

Além disso, iremos instânciar um objeto do tipo Touchscreen, que será responsável por estabelecer a comunicação entre o nosso código e o touchscreen da tela. Ele recebe como parâmetros os pinos onde o touchscreen está conectado e um valor que representa o nível de força mínimo na tela para que seja considerado um toque.

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); // Instancia do objeto ts do tipo touchscreen

Por fim, mas não menos importante, o objeto responsável por estabelecer a comunicação entre nosso código e a tela, de nome tft também será instanciado.

MCUFRIEND_kbv tft; // Instancia do objeto tft, responsável por se comunicar com a tela

- Variáveis globais

Um conjunto de 4 variáveis globais serão criadas neste código, sendo elas:

  • pressionado: informa se o touchscreen está sendo pressionado ou não.
  • posX: Armazena a posição X onde a tela foi pressionada.
  • posY: Armazena a posição Y onde a tela foi pressionada.
  • senha: Armazena a senha digitada pelo usuário.

- Função setup

dentro da função setup, iremos inicializar o nosso display, através do método tft.begin() e rotacionar a tela para o modo paisagem, e por fim chamar a função responsável por desenhar todo o nosso painel de acesso.

void setup() {
  uint16_t ID = tft.readID();
  tft.begin(ID);
  tft.setRotation(1);
  telaInicial();
}

-Função telaInicial

Esta função, tem como objetivo construir todo o desenho do nosso painel de acesso. Para fazer isso, iremos initialmente escurecer toda a tela com o comando tft.fillScreen(PRETO). Logo em seguinda inicializamos os botões que iremos utilizar para digitar a senha de acesso, fazemos isso através do método initButton que recebe como parâmetros:

  1.  Referência do objeto de acesso a tela - tft
  2.  Posição X na tela.
  3.  posição Y na tela.
  4.  Altura.
  5.  Largura.
  6.  Cor da borda.
  7.  Cor de preenchimento do botão.
  8.  Cor de preenchimento do botão ao ser apertado.
  9.  O que deve ser escrito no botão.
  10.  Tamanho da fonte.

Neste trecho de código inicializamos todos os 12 botões seguindo essa ordem:

  botoes[0].initButton(&tft,  60, 100, 30, 40, BRANCO, VERDE, PRETO, "1", 2);
  botoes[1].initButton(&tft, 110, 100, 30, 40, BRANCO, VERDE, PRETO, "2", 2);
  botoes[2].initButton(&tft, 160, 100, 30, 40, BRANCO, VERDE, PRETO, "3", 2);
  botoes[3].initButton(&tft, 210, 100, 30, 40, BRANCO, VERDE, PRETO, "4", 2);
  botoes[4].initButton(&tft, 260, 100, 30, 40, BRANCO, VERDE, PRETO, "5", 2);
  botoes[5].initButton(&tft, 60,  150, 30, 40, BRANCO, VERDE, PRETO, "6", 2);
  botoes[6].initButton(&tft, 110, 150, 30, 40, BRANCO, VERDE, PRETO, "7", 2);
  botoes[7].initButton(&tft, 160, 150, 30, 40, BRANCO, VERDE, PRETO, "8", 2);
  botoes[8].initButton(&tft, 210, 150, 30, 40, BRANCO, VERDE, PRETO, "9", 2);
  botoes[9].initButton(&tft, 260, 150, 30, 40, BRANCO, VERDE, PRETO, "0", 2);
  botoes[10].initButton(&tft, 85, 200, 80, 40, BRANCO, VERDE, PRETO, "Acesso", 2);
  botoes[11].initButton(&tft, 235, 200, 80, 40, BRANCO, VERDE, PRETO, "Apagar", 2);
 for (int i=0; i<12; i++){
   botoes[i].drawButton(false);
 }
 escreveSenha();

E por fim, desenhamos os botões na tela utilizando o comando drawButton(), o resultado será semelhante ao da imagem abaixo:

 

 

Botões de acesso

- Função escreveSenha

como o próprio nome diz, esta função serve simplemente para escrever a senha de acesso na tela, para fazer isso, iremos criar um retângulo branco na tela, onde a string será escrita a medida em que os botões forem sendo pressionados.

Tela de acesso.

- Função loop

no trecho de loop do nosso código, iremos estar sempre conferindo se o botão foi de fato pressionado ou não através da função obterToque(), e logo em seguida checamos se algum desses botões foram pressionados ou não através do método TeclaPressionada().

void loop() {
  bool toque = obterToque();
  TeclaPressionada(toque);
}

-Função obterToque

A função obterToque, como o próprio nome diz é responsável por descobrir se a tela foi pressionada ou não, e além disso determinar em qual posição (x,y) a tela foi pressionada. Para fazer isso iremos utilizar o objeto ts instanciado no início do código e seu método getPoint().

    TSPoint p = ts.getPoint();

Além disso, iremos configurar os pinos XP e XM como saída e habilitar seu nível lógico para alto.

    pinMode(YP, OUTPUT);      
    pinMode(XM, OUTPUT);
    digitalWrite(YP, HIGH);   
    digitalWrite(XM, HIGH);

Para determinarmos se de fato um clique na tela foi feito, utilizamos o bloco if e verificamos se a força feita é maior do que o valor mínimo determinado.

bool pressed = (p.z > MINPRESSURE);

Se o botão tiver sido de fato pressionado, a variável pressed receberá o valor true, caso contrário terá como resultado false. esse valor será posteriormente utilizado em um bloco if onde caso o botão tenha sido realmente pressionado iremos além de atualizar a variável pressionado para true, obteremos as cordenadas x e y de onde foi feito o toque.

    if (pressed) {
        posX = map(p.y, TS_LEFT, TS_RT, 0, 320); 
        posY = map(p.x, TS_TOP, TS_BOT , 0, 240);
        return true;
    }
    return false;

Você se lembra dos valores obtidos logo no começo deste tutorial para calibração ? eles são necessários neste ponto do código, onde iremos determinar qual coordenada foi tocada pelo usuário. Para fazer isso basta obter, as coordenadas x e y fornecidas pelo objeto p e realizar  uma operação map sob estes dados levando em consideração a resolução desta tela, que no caso é 320 por 240 pixels. Por fim, retornamos true caso o botão tenha sido pressionado ou else caso contrário.

-Função TeclaPressionada

dentro da função TeclaPressionada iremos determinar se uma tecla foi pressionada ou não. Para isso, utilizando o método press(), executamos a seguinte operação lógica sob todos os botões:

  • Percorremos todo o vetor de botões 0 até 11 determinando se um botão foi pressionado ou não da seguinte forma:
    • Se a tela foi tocada e o meu botão está dentro das coordenadas definidas, houve um clique no botão
    • Caso contrário o botão não foi tocado

 

void TeclaPressionada(bool teclaTocada){
  for (int i=0; i<12; i++){
    botoes[i].press(teclaTocada && botoes[i].contains(posX,posY));
  }
  checkPressedButton();
}

Ao fim desse código verificamos qual botão foi apertado através da função checkPressedButton().

 

-Função checkPressedButton

dentro da função checkPressedButton, iremos simplesmente verificar qual botão foi apertado, para isso basta verificarmos através de um for, qual botão está com retorno true para função justPressed().

void checkPressedButton(){
  for (int i=0; i<12; i++){
    if (botoes[i].justPressed()){
      checkPressed(i);
    }
  }
}

Caso o botão da iteração atual esteja sendo pressionado a funão checkPressed será invocada recebendo como parâmetro o indice do botão em questão.

-Função checkPressed

Essa função será responsável por executar todos os comandos associados aos botões, sendo eles:

  • Escrever adicionar a senha digitos de 0 a 9.
  • Apagar o último caractere digitado.
  • Realizar uma tentativa de acesso ao sistema.
  • Mudar a animação do botão quando ele for pressionado.

 

void checkPressed(int button){
    botoes[button].drawButton(true);
    esperaSoltar();
    botoes[button].drawButton();
    if(senha.length()<TAMANHOMAXSENHA || button == 10 || button == 11){
    switch (button){
        case 0:
          senha = senha + "1";
        break;
        case 1:
          senha = senha + "2";
        break;
        case 2:
          senha = senha + "3";
        break;
        case 3:
          senha = senha + "4";        
        break;
        case 4:
          senha = senha + "5";
        break; 
        case 5:
          senha = senha + "6";
        break;
        case 6:
          senha = senha + "7";
        break;
        case 7:
          senha = senha + "8";
        break;
        case 8:
          senha = senha + "9";
        break;
        case 9:
          senha = senha + "0";
        break;
        case 10:
        validarAcesso();
        break; 
        case 11:
        apagarUltimocaractere();
        break;  
    }
    escreveSenha();
    }
}

Inicialmente, mudamos a animação de algum dos botões através da função drawButton(true), ao receber o parâmetro true altera a cor do botão para preto, que definimos no início do código através do initButton. Logo em seguida, chamamos uma função denominada esperaSoltar(). Esta função ( que pode ser melhorada e fica de desafio :) ) será responsável por travar o código até que o usuário pare de tocar o botão na tela. Ela consiste basicamente em um while onde utilizamos a função obterToque para descobrir se o botão foi de fato solto ou não.

void esperaSoltar(){
  while (obterToque()){
    delayMicroseconds(50);
  }
}

Logo após o botão ser solto, retornamos o botão para sua cor inicial (verde) atavés da função drawButton().

botoes[button].drawButton();

Em seguida iremos executar o comando ao qual o botão está associado, para isso devemos sempre levar em consideração que a nossa senha não pode ultrapassar o valor definido em TAMANHOMAXSENHA. Com isso, iremos restringir a execução dos botões números quando a senha for igual ao valor máximo através do if abaixo:

if(senha.length()<TAMANHOMAXSENHA || button == 10 || button == 11)

Esse comando if permite apenas que o bloco delimitado seja executado caso a senha não tenha atingido seu valor máximo, ou o botão apertado seja aqueles utilizados para apagar caracteres ou realizar uma tentativa de acesso. Por fim, o bloco swich-case, será responsável por de fato executar os comandos.

    switch (button){
        case 0:
          senha = senha + "1";
        break;
        case 1:
          senha = senha + "2";
        break;
        case 2:
          senha = senha + "3";
        break;
        case 3:
          senha = senha + "4";        
        break;
        case 4:
          senha = senha + "5";
        break; 
        case 5:
          senha = senha + "6";
        break;
        case 6:
          senha = senha + "7";
        break;
        case 7:
          senha = senha + "8";
        break;
        case 8:
          senha = senha + "9";
        break;
        case 9:
          senha = senha + "0";
        break;
        case 10:
        validarAcesso();
        break; 
        case 11:
        apagarUltimocaractere();
        break;  
    }

do case 0 até 9 basicamente incrementamos a string com um novo caractere e dentro dos cases 10 e 11 realizamos uma tentativa de acesso e apagamos o último caractere respectivamente.

- Função validarAcesso

Dentro da função validar acesso, iremos realizar a validação da senha, comparando a senha digitada pelo usuário e a senha padrão. Para isso, iremos simplesmente comparar a nossa string senha com o define SENHAVALIDA, caso o valor seja igual, mostramos a mensagem "Acesso Autorizado", aguardamos um total de 3 segundos e voltamos a tela de acesso. Caso contrário mostramos a mensagem "Acesso Negado" aguardamos um total de 3 segundos e voltamos a tela de acesso.

void validarAcesso(){

  if (senha == SENHAVALIDA){
     tft.fillScreen(PRETO);
     tft.setCursor(10,100);
     tft.setTextColor(VERDE);
     tft.setTextSize(3);
     tft.print("Acesso Autorizado");
     delay(3000);
     telaInicial();
  }
  else{ // Caso contrário
     tft.fillScreen(PRETO);
     tft.setCursor(40,100);
     tft.setTextColor(VERMELHO); 
     tft.setTextSize(3); 
     tft.print("Acesso Negado"); 
     delay(3000); 
     telaInicial();
  }
  
}
Tela de acesso negado
Tela de acesso autorizado

 

- Função apagarUltimocaractere()

Já a função apagarUltimocaractere será responsável por apagar o último digito feito pelo usuário, para fazer isso iremos simplesmente verificar se a senha é maior que zero. Caso seja apagamos o último caractere digitado pegando o tamanho total da string através da função length e removendo o último caractere através da função remove().

void apagarUltimocaractere(){
  if (senha.length()>0){
    senha.remove (senha.length () - 1);
  }
}

Desafio

Como dito anteriormente, a função esperaSoltar, pode ser melhorada para que o código não trave enquanto o usuário mantiver o botão pressionado. O desafio deste tutorial será exatamente pensar numa lógica para que isso aconteça.

Considerações Finais

Este tutorial, teve como objetivo mostrar como podemos utilizar o touchscreen disponível na shield ftf, passando pelo processo de calibração e uso final da funcionalidade. Espero que tenham gostado do conteúdo apresentado, sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.


Circuito Integrado Ponte H L293D - Controlando motor DC no Arduino

Controlando motor DC com o CI Ponte H L293D

Neste tutorial, você aprenderá a controlar motores DC utilizando o Circuito Integrado (CI) ponte H L293D. Aqui nós abordaremos a função dos CI's, o uso de uma ponte H e finalizaremos com a utilização do CI ponte H L293D em conjunto com um Arduino UNO.

O que é um CI?

CI é uma abreviação para Circuito Integrado. Hoje em dia, podemos encontrar Os circuitos integrados em quase todos os equipamentos eletrônicos e é inegável que eles revolucionaram o mundo da eletrônica. Os circuitos integrados foram inventados Em meados do século XX, com o avanço da área da computação.Os CI's vieram para reduzir o espaço que os componentes eletrônicos dos computadores ocupavam, incorporando miniaturas de diversos componentes: transistores, diodos, resistores e capacitores, em uma pequena lâmina de silício.

O que é uma ponte H?

Na robótica, para locomoção de robôs, os motores de corrente contínua ou motores DC (direct current), são muito utilizados. Esses motores demandam de uma corrente superior à que as portas do Arduino conseguem fornecer, portanto, se estes forem utilizados usado de forma incorreta, podem acabar danificando a porta em questão e até mesmo a placa como um todo.

As portas do Arduino podem fornecer uma corrente máxima de 40mA nas portas digitais.

Motor DC

O problema da alta corrente poderia facilmente ser resolvido com uso de transistores, porém, no momento em que quiséssemos realizar a inversão do motor teríamos um problema em função da quantidade de transistores requerida. Basicamente, a movimentação de um motor DC ocorre quando este é  submetido a uma corrente contínua, no entanto, caso a polaridade da alimentação do mesmo seja alterada, este passará a se movimentar no sentido contrário. Dessa forma para cumprir este objetivo, nós utilizamos o circuito ponte H, que por sua vez, consiste em quatro transistores necessários para a realização da inversão da polaridade.

Usando uma Ponte H para controlar motores

A ponte H é uma configuração eletrônica que permite controlar a direção e a velocidade de motores DC. É chamada de "ponte" porque, visualmente, se assemelha a uma ponte em esquemas elétricos, e "H" devido à sua forma.

O que pode ser feito com uma Ponte H

Com uma ponte H, podemos controlar a direção de rotação de um motor DC simplesmente invertendo a polaridade de sua alimentação. Além disso, usando modulação por largura de pulso (PWM), podemos controlar a velocidade do motor.

Modelos mais conhecidos de Ponte H

Existem diversos CI's populares que contêm uma ponte H, como o L298 e o L293. O L298 é capaz de controlar motores mais potentes em comparação ao L293D, mas ambos são amplamente usados em projetos de robótica e automação.

Como funciona a ponte H?

Legenda

As pontes H consistem em um conjunto de quatro chaves que são acionadas de forma alternada. De acordo com a configuração entre as chaves, temos o motor se movimentando em um sentido, no sentido contrário, ou desligado.

Quando as quatro chaves estão abertas, o motor está desligado, como mostra o exemplo da esquerda. Quando o par S1-S3 estiver acionado, isto é, quando as chaves em questão estiverem fechadas, o motor girará em um sentido, como mostra o exemplo do centro. Em contrapartida, quando o par S2-S4 estiver acionado, o motor girará em sentido contrário, como mostra o exemplo da direita.

Circuito integrado Ponte H L293D

O CI L293D é utilizado com o propósito de possibilitar o controle de motores e a velocidade dos mesmos. As vantagens do uso desse CI são a baixa complexidade e a presença de dois circuitos ponte H, isto é, pode-se utilizá-lo no controle de dois motores simultaneamente. Na figura abaixo podemos ver a pinagem do CI.

Legenda

Os pinos Enable são utilizados para habilitar as portas de saída e também podem ser utilizados para controle da velocidade do motor. O CI L293D pode suportar dois motores para controle simultâneo, neste caso, liga-se cada porta do motor em uma porta de saída do mesmo lado.

Diferenças entre o L293D e o L298

O L293D e o L298 são dois drivers de motor muito populares. O L293D é mais compacto e possui dois circuitos ponte H, enquanto o L298 é mais robusto e pode lidar com correntes mais altas. Uma vantagem do L293D é que ele possui diodos de proteção internos, enquanto no L298, eles precisam ser adicionados externamente.

Aplicações do L293D

O L293D é versátil e pode ser usado para controlar motores DC e motores de passo. Além disso, ele pode ser encontrado em shields e módulos, tornando sua implementação mais fácil e rápida. Usar um shield ou módulo facilita a conexão com plataformas como o Arduino e também oferece proteções adicionais ao circuito.

Shields e Módulos

Existem shields e módulos disponíveis no mercado que integram o L293D, facilitando a conexão com microcontroladores. Usar esses módulos simplifica o processo de montagem e oferece proteções adicionais, como diodos e capacitores. No entanto, em aplicações específicas, pode ser mais vantajoso criar seu próprio circuito.


Mãos à obra - Controlando motor DC - CI Ponte H L293D

Agora, vamos testar o CI L293D para fazermos a inversão dos motores A e B.

Componentes necessários

Para esse exemplo, utilizaremos:

Montando o projeto

Prossiga com a montagem para os dois motores conforme esquema abaixo. Em seguida, abordaremos a montagem do circuito para uso de um único motor.

Garanta que seu Arduino e a fonte externa estejam desligados durante a montagem.

Esquema de montagem do L293D com Arduino Uno
Esquema de montagem do L293D com Arduino Uno com dois motores

Esquema de montagem do L293D com Arduino Uno com um motor
Esquema de montagem do L293D com Arduino Uno com um motor

Conectando o Arduino ao computador

Conecte seu Arduino ao computador e abra a IDE Arduino.

Primeiramente, selecionaremos qual placa e porta você deseja usar para fazer o upload do programa no Arduino. Dentro do Arduino IDE, clique no menu Ferramentas(tools) e abra o submenu Placa(Board) e selecione a placa que você usará no projeto.

 

Em seguida, no menu Ferramentas(Tools) e abra o submenu Porta(Port). Clique na porta que seu Arduino está conectado. Geralmente aparece o nome da placa Arduino: “COM3 (Arduino/Genuino Uno)”.

Programando

Crie um no programa (sketch) e salve com o nome de “controle_motores”.

Para controlarmos os motores é necessário o uso da biblioteca específica.

-Instalando a biblioteca

Para download da biblioteca, clique aqui >> Biblioteca L293D

Descompacte a pasta "Firmware". Em seguida, basta mover a pasta para o local:

Windows: “Meus documentos\Arduino\libraries”

Mac: “Documents/Arduino/libraries”

Depois desse processo, a biblioteca estará disponível em “Sketch -> Incluir Biblioteca” na próxima vez que o IDE for aberto.

-Código exemplo

Com a biblioteca instalada e o programa salvo, escreva o seguinte código nela.

//Controlando motores DC com L293D
#include "Arduino.h"
#include "DCMDriverL293D.h"

#define ENABLE_1  13
#define IN_1  12
#define IN_2  11
#define ENABLE_2  10
#define IN_3  9
#define IN_4  8

DCMDriverL293D Motor(ENABLE_1,IN_1,IN_2,ENABLE_2,IN_3,IN_4);

void setup() 
{
   
}
void loop() 
{
    
    Motor.setMotorA(200,1);//gira um lado em um sentido
    delay(2000);
    Motor.setMotorA(200,0);//gira em sentido contrário
    delay(2000);
    Motor.stopMotors(); //para os motores
    delay(2000);
    Motor.setMotorB(200,1);//gira o outro lado em um sentido
    delay(2000);
    Motor.setMotorB(200,0);//gira em sentido contrário
    delay(2000);
    Motor.stopMotors();
    delay(2000);
    }

Colocando pra funcionar

Se seu projeto está com tudo certo, teremos os motores realizando os movimentos:

  • Motor A gira em um sentido por dois segundos,
  • Motor A gira pelo sentido oposto por dois segundos,
  • Motores param por dois segundos,
  • Motor B gira em um sentido por dois segundos,
  • Motor B gira pelo sentido oposto por dois segundos,
  • Motores param por dois segundos.

Entendendo a fundo

Entendendo o Software

No software, começamos com a inclusão das bibliotecas necessárias.

#include "Arduino.h" 
#include "DCMDriverL293D.h"

Depois definimos os pinos que estão conectados ao CI.

#define ENABLE_1 13 
#define IN_1 12 
#define IN_2 11 
#define ENABLE_2 10 
#define IN_3 9
#define IN_4 8

Então definimos ao Arduino o uso dos motores por:

DCMDriverL293D Motor(ENABLE_1,IN_1,IN_2,ENABLE_2,IN_3,IN_4);

Movimentando os motores

Para fazermos os motores se movimentarem precisamos informar sua direção e sua velocidade:

Motor.setMotorA(200,1);//gira um lado em um sentido 
delay(2000);

Nesta movimentação dos motores, se alterarmos o primeiro parâmetro entre 0 e 255, alteraremos sua velocidade, e se alterarmos o segundo parâmetro entre 0 e 1, alteramos sua direção de giro. Para movimentar o outro motor é necessário apenas trocar setMotorA por setMotorB.

 


Considerações finais

Esperamos que se divirtam com seus motores e seus projetos de robótica. Deixe suas dúvidas, sugestões, ou até mesmo a foto do seu projeto nos comentários.

Mais detalhes em instalação de bibliotecas em DHT11 e DHT22 | Sensor de umidade e Temperatura com Arduino.

Entenda mais sobre protoboard's em Como usar uma Protoboard?


Controle de Tensão AC com Arduino e TRIAC

Controle de Tensão AC utilizando Arduino e TRIAC

Neste tutorial, ensinaremos a você como controlar o valor de tensão de cargas AC utilizando arduino, no qual será possível ver o resultado observando a variação de luminosidade de uma lâmpada incandescente. Para o controle de potência será utilizado um componente chamado TRIAC, no qual será abordado sobre seu funcionamento e aplicação no decorrer desse tutorial.

Esse tipo de controle é amplamente utilizado, desde controlar a temperatura de uma estufa, até controlar a velocidade de algum equipamento. Ventiladores de teto que possuem a opção de mudar sua velocidade por meio de um potenciômetro apresentam um sistema no qual também é empregado o controle de potência, onde chamamos o sistema que pode efetuar esse controle de dimmer.

Dimmer de ventilador

Antes de irmos para a parte prática de montagem e programação do arduino, devemos entender alguns conceitos que nos farão compreender a fundo o que está ocorrendo, possibilitando fazer melhorias e corrigir possíveis problemas que o circuito apresentar. Começaremos falando sobre o que é Corrente Alternada.

kit robotica educacional com Arduino ESP ou Microbit

Corrente Alternada (AC)

Defini-se como a corrente elétrica no qual ocorre a mudança no sentido da corrente em função do tempo, assumindo valores tanto positivos quanto negativos. Sua forma de onda em grande parte das situações se assemelha a uma senoide, como pode ser visto logo abaixo. Isso se deve ao fato de a forma de onda da tensão variar de maneira que se assemelhe a uma senoide, e como a corrente assume valores em função da relação V = R · I, a corrente acaba assumindo uma forma semelhante.

Senoide correspondendo a forma de onda da corrente

Potência Elétrica

É definida como a quantidade de energia consumida em uma determinada variação do tempo. É dado em Watts (W), que corresponde a quantidade de energia por segundo (joule/segundo).

Potência = Tensão · Corrente

Quando se trata de circuitos de corrente alternada, a potência elétrica se divide em três outras grandezas elétricas, que são: potência ativa, reativa e aparente.

Triângulo das potências

Potência Ativa

É a parte da potência convertida em trabalho de fato. Corresponde ao que foi realmente consumido para a realização do que foi proposto. Sua unidade de medida é em W (Watts) e sua fórmula é dada por:

P = V · I · cosΦ

Potência Reativa

Corresponde a parte da potência que é perdida nas excitações de campos magnéticos e elétricos. Sua unidade de medida é em VAr (Volt Ampère reativo).

Q = V · I · senΦ

Potência Aparente

Trata-se da potência total consumida pela carga. Corresponde a soma vetorial das potências ativa e reativa. Sua unidade de medida é em VA (Volt Ampère) e sua fórmula é dada por:

S = V · I

Fator de Potência

Dentro da área da elétrica, existem termos dados a certas características que os circuitos apresentam, que são eles: resistivo, capacitivo e indutivo.

Circuitos resistivos são compostos basicamente por resistores, no qual eles não apresentam nenhuma influência sobre as formas de onda da corrente e da tensão.

Formas de onda em um circuito puramente resistivo

Circuitos capacitivos são compostos por capacitores, e apresentam a característica de afetar a forma de onda da corrente de tal forma que faça com que ela seja 90º adiantada em relação a tensão. Ou seja, as formas de onda agora apresentam uma defasagem entre si, no qual a forma de onda da tensão está defasada (atrasada) em 90º da forma de onda da corrente.

Formas de onda em um circuito puramente capacitivo

Circuitos indutivos são compostos por indutores, e apresentam um comportamento semelhando ao do circuito capacitivo, porém com uma diferença, de que agora a corrente é que está defasada em 90º da forma de onda da tensão.

Formas de onda em um circuito puramente indutivo

Esse ângulo de defasagem entre a forma de onda da tensão e corrente dá origem ao que chamamos de Fator de Potência, que equivale ao cosseno do ângulo de defasagem entre a tensão e a corrente.

O que são Controladores de Tensão AC?

Consiste em um circuito que controla a tensão, possibilitando controlar indiretamente a corrente e a potência de uma carga AC por meio de dispositivos semicondutores de potência, como: SCR, TRIAC, Mosfet, IGBT. Por meio do controle do valor da tensão de entrada, é possível controlar a potência média entregue a carga, e com isso controlar certas ações de equipamentos.

Exemplo de formas de onda após a ação de um semicondutor de potência

Esse controle é efetuado distorcendo a forma de onda entregue a carga, como a imagem indica logo acima, no qual definindo o ângulo de disparo, parte da forma de onda antes do disparo "sumirá", pois o TRIAC não estará em condução, fazendo com que a tensão média entregue a carga diminua.

Com isso encerramos a parte teórica introdutória ao tutorial. Mais ao final do tutorial serão feitas explicações mais profundas a respeito dos acontecimentos ocorridos no circuito.

Mãos à obra - Controlando a Luminosidade de uma Lâmpada Incandescente

Componentes necessários

Para a realização da atividade prática proposta por esse tutorial, serão necessários:

  • 1 x Arduino;
  • 1 x Protoboard;
  • 1 x TRIAC;
  • "" x resistores de ""Ω;
  • "" x capacitores de ""μF;
  • Jumpers.

O modelo de TRIAC utilizado é o BTA41 600b. Seu datasheet pode ser visto clicando aqui.

Montando o projeto

 

Programando

 

Colocando pra funcionar

 


Entendendo a fundo

Hardware

Neste tópico serão abordados os componentes utilizados no circuito bem como suas características.

TRIAC

É um dispositivo semicondutor capaz de controlar a passagem de corrente em dois sentidos. Possui o comportamento semelhante a dois SCRs ligados em antiparalelo, no qual ele só passará a conduzir corrente entre os terminais A1 e A2 quando houver um pulso de corrente no terminal do gate. O TRIAC para de conduzir assim que a tensão entre seus terminais cair abaixo da tensão de manutenção (próximo de zero). Clique aqui para visualizar o datasheet do componente.

TRIAC modelo BTA41 600b

O controle de tensão é feito atuando diretamente na forma de onda da tensão, no qual por meio de um semicondutor de potência é possível deformar a forma de onda, alterando com isso os valores de corrente e tensão da carga. Tomemos como exemplo a senoide e o circuito de exemplo logo abaixo.

Forma de onda senoidal
Circuito de exemplo

Por meio do controle da condução de corrente AC, o TRIAC

Optoacoplador

É um dispositivo isolador óptico no qual apresenta um LED e um fototransistor internamente, onde quando há passagem de corrente pelo LED, fará com que o fototransistor passe a conduzir.

Optoacoplador modelo 4N26
Representação de um optoacoplador

Detecção da Passagem por Zero

Agora que sabemos que o TRIAC deixa de conduzir no momento em que a tensão cai para abaixo da tensão de manutenção, sabemos que a cada mudança de semiciclo (positivo para negativo e vice-versa) o TRIAC deixará de conduzir, retornando ao funcionamento aós um pulso de corrente no gate. Com isso, devemos estabelecer um sistema de controle em que após o TRIAC parar de conduzir, o arduino permita com que ele volte a conduzir.

Uma forma de solucionarmos isso é por meio de um circuito de detecção de zero, no qual esse circuito indicará ao arduino o momento em que a forma de onda passa pela tensão de 0 V, mostrando que o TRIAC deixou de conduzir, permitindo ao arduino acionar novamente o TRIAC no ângulo desejado.

O circuito de detecção de zero desenvolvido para este tutorial pode ser visualizado logo abaixo.

(CIRCUITO DETECTOR DE ZERO)

--- Explicação ---

Circuito para Disparo do TRIAC

Software

Considerações finais


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