Uma rede sem fio local (e pessoal) porreta é sem dúvida a Bluetooth (BT). Hoje em nosso dia-a-dia é comum encontrar-nos com celulares, aparelhos de som, cameras, etc., entrelaçados com a ajuda da famosa “luzinha azul”

No mundo do IoT e da automação em geral, é muito comum deparar-nos com controles remotos via celulares utilizando tecnologia BT. Isso é devido a 3 componentes básicos mas muito importantes:

  1. Plataforma de desenvolvimento para Android
  2. Módulos BT baratos e acessíveis (Como por exemplo o HC-06)
  3. E claro, o velho e bom Arduino....

Neste tutorial, vou desenvolver algumas idéias de como controlar as saídas de um Arduíno através de um celular de maneira a mover um Robot, acionar lâmpadas em uma casa, etc.

No mercado é comum encontrar módulos de BT 3.0  “Master-Slave” como o HC-05  e “Slaves” como o HC-06. Já mais recentemente, apareceram os HC-08 e HC-10 que trabalham com tecnologia BT 4.0 ou BLE (“Bluetooth Low Energy”). Os módulos BLE são os únicos que podem ser conectados a um Iphone, pois infelizmente a Apple não fornece suporte a ao BT 3.0.

Para os projetos discutidos aqui, usarei um HC-06 que é bem popular e barato (Bye, bye, Iphone, vamos de Android!). O Módulo é alimentado com 5V o que faz com que ele seja facilmente conectado a um Arduino UNO por exemplo, para receber e transmitir informações a outros dispositivos como um PC ou um telefone celular. Seus pinos de transmissão e recepção podem ser conectados diretamente ao UNO, não havendo a necessidade de se utilizar divisores de tensão como vimos no caso do ESP8266.

Na prática, o HC-06 deve ser ligado diretamente aos pinos 0 e 1 do Arduino (Serial):

  • HC06-Tx ao Arduino pin 0 (Rx)
  • HC06-Rx ao Arduino pin 1 (Tx)

Ao se usar a entrada serial por HW do UNO é muito importante lembrar-se que o HC-06 não pode estar fisicamente conectado aos pinos 0 e 1 durante a carga do programa, isso porque o USB também usa essa mesma serial.  Uma maneira simples de se contornar esse probleminha (se seu projeto não utiliza muitos GPIOs do UNO) é usar uma porta serial por SW através da library SoftwareSerial (a mesma que usamos no caso do ESP8266). Em nosso caso aqui, usaremos os pinos 10 e 11 do UNO (Tx, Rx respectivamente).

O passo seguinte será escrever um codigo bem simples para se poder testar, programar e inicializar o HC-o6:

Para iniciar, incluir a Library Software Serial, definindo a variável “BT” como a nova porta serial.

#include <SoftwareSerial.h>
SoftwareSerial BT(10, 11); // RX, TX
String command = ""; // Stores response of bluetooth device

void setup()
{
  Serial.begin(9600);
  Serial.println("Type AT commands!");
  BT.begin(9600); // HC-06 usually default baud-rate
}

Em seguida vem o corpo principal do código que simplesmente espera por dados vindos do BT e uma vez que eles chegem, os mesmos são escritos no Serial Monitor. Da mesma maneira, se podem enviar comandos AT desde o monitor serial até o módulo HC-06.

void loop()
{
  if (BT.available()) // Read device output if available.
  {
    while(BT.available()) // While there is more to be read, keep reading.
   {
     delay(10); //Delay added to make thing stable
     char c = BT.read(); //Conduct a serial read
     command += c; //build the string.
    }
    Serial.println(command);
    command = ""; // No repeats
  }
  if (Serial.available())
  {
    delay(10); // The DELAY! ********** VERY IMPORTANT *******
    BT.write(Serial.read());
   }
}

Uma vez carregado o programa, faça alguns testes básicos. Por exemplo:,

  • Envie “AT“, o módulo deverá responder “OK“.
  • Pergunte a versão do Firmware: “AT+VERSION”, o módulo deverá responser, por exemplo: “linvorV1.8“.
  • Com o HC-06 é possível definir um nome para o módulo por exemplo: “AT+NAMEMJRoBot_BT_HC06“.  Mas diferente de outros módulos, voce não conseguirá saber qual é o nome que está definido para o módulo. Ao se enviar o comando anterior, o HC-06 responderá simplesmente: “OKsetname”.
  • Em geral, o HC-o6 vem de fábrica com o password (ou PIN): 1234. Voce poderá definir um novo com o comando AT: AT+PINxxxx onde ‘xxxx‘ serão 4 números.

OK! Módulo conectado ao UNO e funcionando. Hora de lançar mão do velho e bom celular Android!!!

Existem muitas apps na loja da Google que podem ser utilizadas. Vou sugerir duas delas, por serem as que usarei em meus tutoriais. Essas apps foram desenvolvidas por mim utilizando o MIT Application2 tool (ver projeto aqui) e estão disponíveis sem custo na loja da Google:

  1. MJRoBoT II BT Control
  2. MJRoBot BT Digital Analog Voice Control

O App MJR0Bot II foi desenvolvido para comandar Robots. Ele basicamente envia um caracter para cada comando de direção, modos AUTO/MANUAL, velocidade + e velocidade-. Alem de permitir o envio de mensagens em modo texto.

    

 O App. MJRoBot Digital Analog Voice Control, envia comandos para acionamento digitais (ligar/desligar) tanto por botões como por voz e comandos numéricos para controle de PWMs (0-255).

Faça o Download de qualquer uma das duas Apps, vá ao set-up do celular e procure o modulo BT fazendo a conexão (entre com o PIN 1234 ou algum outro definido por você).  Isso deverá ser feito uma única vez, pois o celular guardará os dados de conexão. Uma vez que o celular e o HC-06 estão conversando, é só usar as APPs.

A partir da segunda vez, ao lançar-se a app, o modulo BT estará desconectado.

Acione o botão de BT, para que o app informe dos modulos disponíveis:

Selecione o nome do módulo (No caso é esse com o HC-06 ao final).

O App então mostrará “CONNECTED”, informando que está “pared” com o HC-06

A partir daí, é só ir acionando os botões do APP e observar no Monitor Serial, o que é que o APP está enviando.

Por exemplo, acionando “ON” e “OFF” sequencialmente para os 4 devices, no caso da APP MJRoBot Digital Analog Voice Control, o resultado seria:

dev1on
dev1off
dev2on
dev2off
dev3on
dev3off
dev4on
dev4off

Agora que já temos um App para o Android e sabemos como funciona um modulo BT, vamos colocar a mão na massa e criar algo de util!

Controlando as saídas do Arduino.

Vamos construir o circuito abaixo:

A idéia será usar o App MJRoBot Digi/Ana/Voice Ctrl para acender e apagar os LEDS e também controlar a intensidade dos mesmos usando PWM.

Estaremos relacionando:

  • Device 1: "dev1on/dev1off" ==> LED Red ==> Pin 3 do UNO
  • Device 2: "dev2on/dev2off" ==> LED Yellow ==> Pin 5 do UNO
  • Device 3: "dev3on/dev3off" ==> LED Green==> Pin 6 do UNO
  • Device 4: "dev4on/dev4off" ==> LED Blue==> Pin 9 do UNO

Ou seja, ao acionar o botão “ON” relacionado ao “Device 1”, a mensagem de texto “dev1on”será enviada ao Arduino. Ao receber essa mensagem, o LED vermelho deverá acender e assim por diante.

Observe que os 4 pinos são pinos com capacidade de gerar PWM. Isso é importante para a utilização dos “sliders” da App, que enviarão valores para controlar a intensidade dos LEDs via PWM:

  • Dev A0: "r/ 0-255" ==> LED Red ==> Pin 3 do UNO
  • Dev A1: "y/ 0-255" ==> LED Yellow ==> Pin 5 do UNO
  • Dev A2: "g/ 0-255" ==> LED Green==> Pin 6 do UNO
  • Dev A3: "b/ 0-255" ==> LED Blue==> Pin 9do UNO

No caso dos controles deslizantes (“sliders”), antes dos valores para controle do PWM (0 a 255), um caracter será enviado para que o Arduino saiba de que “slider” estará chegando o comando.

O Código:

Setup inicial:

#include <SoftwareSerial.h>

SoftwareSerial BT(10, 11); //TX, RX respectively
String device;

const int dev1 = 3; //PWM
const int dev2 = 5; //PWM
const int dev3 = 6; //PWM
const int dev4 = 9; //PWM

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

  pinMode(dev1, OUTPUT);
  pinMode(dev2, OUTPUT);
  pinMode(dev3, OUTPUT);
  pinMode(dev4, OUTPUT);
}

Podemos dividir a parte principal do programa em 4 blocos:

  1. Espera dos comandos BT e construção da variável “device”
  2. Acionamento dos LEDS a partir dos botões
  3. Acionamento dos LEDS a partir de comandos de voz
  4. Controle do intensidade dos LEDs via Sliders

void loop()
{
  while (BT.available()) //Check if there is an available byte to read
  {
    delay(10); //Delay added to make thing stable
    char c = BT.read(); //Conduct a serial read
    device += c; //build the string.
  }
  if (device.length() > 0)
  {
    Serial.println(device);
    // Button control:
    if (device == "dev1on") {digitalWrite(dev1, HIGH);}
    else if (device == "dev1off") {digitalWrite(dev1, LOW);}
    else if (device == "dev2on") {digitalWrite(dev2, HIGH);}
    else if (device == "dev2off") {digitalWrite(dev2, LOW);}
    else if (device == "dev3on") {digitalWrite(dev3, HIGH);}
    else if (device == "dev3off") {digitalWrite(dev3, LOW);}
    else if (device == "dev4on") {digitalWrite(dev4, HIGH);}
    else if (device == "dev4off") {digitalWrite(dev4, LOW);}

   // Voice control:
   else if (device == "ligar um" || device == "Ligar 1") {digitalWrite(dev1, HIGH);}
   else if (device == "desligar um" || device == "desligar 1") {digitalWrite(dev1, LOW);}
   else if (device == "ligar som" || device == "Ligar som") {digitalWrite(dev2, HIGH);}
   else if (device == "desligar som" || device == "Desligar som") {digitalWrite(dev2, LOW);}
   else if (device == "ligar TV" || device == "Ligar TV") {digitalWrite(dev3, HIGH);}
   else if (device == "desligar TV" || device == "Desligar TV") {digitalWrite(dev3, LOW);}
   else if (device == "ligar quarto" || device == "Ligar quarto") {digitalWrite(dev4, HIGH);}
   else if (device == "desligar quarto" || device == "Desligar quarto") {digitalWrite(dev4, LOW);}

   // Slider control:
   char colour = device[0];
   int value = device[2];
   Serial.print(" ");
   Serial.println(value);
   if ( colour == 'r')
   {
      analogWrite(dev1, value); // use value to set PWM for LED brightness
   }
   if ( colour == 'y')
   {
      analogWrite(dev2, value); // use value to set PWM for LED brightness
   }
   if ( colour == 'g')
   {
     analogWrite(dev3, value); // use value to set PWM for LED brightness
   }
   if ( colour == 'b')
   {
     analogWrite(dev4, value);
   }
   device=""; //Reset the variable
   }
}

Deixo aqui o link para os códigos usados neste tutorial:

Link para os códigos Arduino

No vídeo abaixo, uma demonstração da porção programa acima (botões & Slider):

Vídeo demo comando por botões e Slider

O controle de dispositivos IoT por voz é uma tendência nos dias de hoje. Conseguir este tipo de controle com o conjunto Arduino/HC-06/Android é extremamente simples. Os dispositivos Android já possuem essa característica “de fábrica”. No App que desenvolvi, apenas acrescentei um botão que faz com que o Android “escute” um comando e o envie em formato texto para o Arduino. O codigo se encarrega de “ler” a string que chega.

Em vermelho, ressalto no código alguns possíveis comandos de voz. Ao receber por  “Ligar TV” por exemplo, o LED verde (correspondente ao device 3) acenderá (em vez do LED podíamos ter uma relé que ligaria a TV).

No vídeo abaixo, uma pequena demonstração do controle por voz:

Vídeo demo de comandos por voz.

Bom, acredito que já é possível ver o enorme potencial do controle de “coisas” usando BT/Android/Arduino. Em meus próximos posts estarei desenvolvendo Robots que poderão ser controlados remotamente como vimos aqui.

Para mais tutoriais, demos, vídeos, etc. visite meu blog:

MJRoBot.org

Um abraço e até mais!

Exibições: 11286

Responder esta

Respostas a este tópico

Marcelo, bom dia,

Muito bom post, parabéns.

Mais uma matéria muito boa para os Garagistas.

J.Antonio

Obrigado José Antônio. Minha ideia é ir passando para a frente o que vou descobrindo nesse mundo maravilhoso da eletrônica!!!! O duro é que tem tanta coisa faxinaste que é difícil escolher o que estudar!!!!!!!! ;-)

Bom dia, Parabéns pelo post me ajudou muito. Você sabe quala distância que pega o Hc-08?

Neste anuncio diz aproximadamente 100m. Pode me dar sua opinião Obrigado.

http://www.vinitronica.com.br/pd-1db7d9-modulo-bluetooth-ble-4-0-hm...

Não consigo receber de volta os comandos AT...

TEM ALGUMA IDEIA DO QUE SEJA, ELE PISCA NORMALMENTE

RSS

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2017   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço