Uma rede sem fio local (e pessoal) porreira é sem dúvida a Bluetooth (BT). Hoje em nosso dia-a-dia é comum encontrar-nos com telemóveis, aparelhos de som, câmeras, 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 telemóveis utilizando tecnologia BT. Isso é devido a 2 componentes básicos mas muito importantes:
- Plataforma de desenvolvimento para OS ANDROID
- Módulos BT baratos e acessíveis (Como por exemplo o HC-06)
Neste tutorial, vou desenvolver algumas ideias de como controlar as saídas de um Arduino através de um telemóvel 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.
a 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 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()) // receive data if available. { while(BT.available()) // "keep receiving". { 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); 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 nos tutoriais deste blog. Essas apps foram desenvolvidas por mim utilizando o MIT Application2 tool (veja projeto aqui) e estão disponíveis sem custo na loja da Google:
MJRoBot II BT Control
MJRoBot BT Digital Analog Voice Control
MJRoBot BT IconO 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 MJR0Bot BT Digi/Ana/Voice Ctrl, 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 ideia será usar o App MJRoBot Digi/Ana/Voice Ctrl para acender e apagar os LEDS e também controlar a intensidade dos mesmos.
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 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:
- Espera dos comandos BT e construção da variável “device”
- Acionamento dos LEDS a partir dos botões
- Acionamento dos LEDS a partir de comandos de voz
- Controle do intensidade dos LEDs via Sliders
void loop() { while (BT.available()) { 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 } }
No vídeo abaixo, uma demonstração da porção programa acima (botões & 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 desenvolví, 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:
Artigo disponibilizado por MJRobot.org
Todos os produtos utilizados neste artigo podem ser encontrados na Loja de Eletrónica e Robótica – ElectroFun.
Gostaram deste artigo? Deixem o vosso comentário no formulário a baixo e partilhem com os vossos amigos.
Não se esqueçam de fazer like na nossa Página no Facebook.
Podem ainda colocar as vossas dúvidas no nosso Forum da Comunidade Arduino em Portugal ou no nosso Grupo no Facebook Arduino Portugal – Qual o teu projeto?