Baixe o app para aproveitar ainda mais
Prévia do material em texto
Automação com Arduino via Bluetooth Micros Controladores 17/09/2020 Flavio Eduardo Caminski No mundo da automação em geral, é muito comum deparar-nos com controles remotos via celulares utilizando tecnologia BT. Isso é devido a 2 componentes básicos mas muito importantes: 1. Plataforma de desenvolvimento para OS ANDROID 2. Módulos BT baratos e acessíveis (Como por exemplo o HC-06) como controlar as saídas de um Arduíno através de um celular de maneira a acionar qualquer equipamento elétrico eletrônico No mercado é comum encontrar módulos de BT 3.0 “Master-Slave” como o HC-05 e “Slaves” como o HC-06. Para esse projeto aqui, usarei um HC-06 que é bem popular e barato. 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 código 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 cheguem, 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á responder, 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. Você poderá definir um novo com o comando AT: AT+PINxxxx onde ‘xxxx‘ serão 4 números. Módulo conectado ao ARDUINO e funcionando. Próximo passo baixar um aplicativo para celular Android. Existem dois aplicativos que funcionam bem: 1. MJRoBot II BT Control 2. MJRoBot BT Digital Analog Voice Control O App MJR0Bot II foi desenvolvido para comandar Robôs. Ele basicamente envia um caractere 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 um dos dois 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 módulos 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á pareado 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 Controlando as saídas do Arduino. 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. 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 9 do 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); //RX, TX 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()) { 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);} 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 == "desligarTV" || 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);} 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 brigh } if ( colour == 'y') { analogWrite(dev2, value); // use value to set PWM for LED brightness } if ( colour == 'g') { analogWrite(dev3, value); } if ( colour == 'b') { analogWrite(dev4, value); } device=""; //Reset the variable } }
Compartilhar