É possível comunicar com o seu Arduino via conexão Bluetooth utilizando o módulo HC-06 (escravo). Isso permite conectar a placa Arduino a um outro sistema (Smartphone, computador ou outros microcontroladores), para receber e enviar dados. A comunicação por Bluetooth permite, por exemplo, controlar o seu robô por meio de uma aplicação para Smartphone ou receber os valores de um sensor no seu computador.
Leia antes: Comunicação Serial com Arduino
Equipamento
- Computador
- Arduino UNO
- Cabo USB para comunicar o Arduino ao computador
- Módulo Bluetooth HC-06
- Cabos Dupont M/F
Apresentação do módulo HC-06
O módulo Bluetooth HC-06 apresenta 4 pinos que permitem estabelecer a comunicação serial.
- VCC pino de alimentação. Tipicamente conectado ao pino 5V do Arduino.
- GND terra. Tipicamente conectado ao pino GND do Arduino
- RX pino de recepção. Tipicamente conectado ao pino de transmissão (TX) do Arduino
- TX pino de transmissão. Tipicamente conectado ao pino de recepção (RX) do Arduino
N.B.: Por tratar-se de um módulo escravo, o módulo HC-06 não pode conectar-se a outros dispositivos por si só. Para isso, é necessário usar um módulo mestre, como o módulo Bluetooth HC-05.
Esquema de ligação
Alguns módulos HC-06 funcionam em 3V3 e não suportam o nível de tensão de 5V no pino Rx. Neste caso, é necessária uma ponte divisora de tensão para converter o sinal lógico (resistência de 1k entre pin3 e Rx, e 2k Ohm entre Rx e GND).
ATENÇÃO: Utilizamos aqui os pinos 2 e 3 do Arduino UNO. Em função do microcontrolador utilizado, os pinos que servem para a comunicação SoftwareSerial podem ser diferentes. É o caso das placas Arduino Mega, Micro e Leonardo, especialmente. Verifique a documentação.
Configuração do módulo HC-06
A configuração do módulo Bluetooth pode ser interessante para testar o funcionamento do módulo e para modificar os seus parâmetros, sobretudo quando utilizamos diversos módulos. O módulo deve estar alimentado, mas não emparelhado (o LED deve piscar).
O código a seguir permite modificar o nome, o código PIN e a taxa de transmissão (baud rate) do módulo HC-06
#include <SoftwareSerial.h> SoftwareSerial hc06(2, 3); void setup() { //Initialize Serial Monitor Serial.begin(9600); Serial.println("ENTER AT Commands:"); //Initialize Bluetooth Serial Port hc06.begin(9600); } void loop() { //Write data from HC06 to Serial Monitor if (hc06.available()) { Serial.write(hc06.read()); } //Write from Serial Monitor to HC06 if (Serial.available()) { hc06.write(Serial.read()); } }
Para testar a comunicação, digite AT no monitor serial da IDE do Arduino. Certifique-se de seleccionar o baud rate correto (9600) e “Não fim de linha” (“No end line”) nas opções de comunicação. Se tudo estiver bem, o módulo deverá responder OK. Se não funcionar, certifique-se de que o módulo esteja bem conectado e verifique a sua versão.
Para modificar o nome do módulo, digite AT+NAMEnom_module. O módulo deverá responder OKsetname. (Ex: se quiser alterar o nome do módulo para BTM1, digite AT+NAMEBTM1)
Para modificar o código PIN do módulo, digite AT+PINxxxx. O módulo deverá responder OKsetPIN. (Ex: se quiser alterar o PIN para 0000, digite AT+PIN0000)
Para alterar a taxa de transmissão do módulo (somente se necessário), digite AT+BAUDx. Ex: se quiser alterar a baud rate para 9600, digite AT+BAUD4. O módulo deverá responder OK9600. (Obs.: 1 parar 1200, 2 para 2400, 3 para 4800, 4 para 9600, 5 para 19200, 6 para 38400, 7 para 57600, 8 para 115200)
ATENÇÃO: Existem diferentes versões do módulo HC-06 e a lista de comandos AT pode variar. Verifique bem o número de série marcado no módulo e a versão do firmware com o comando AT+VERSION.
Por exemplo, o módulo HC-06 da série ZS-040 na versão 3.0-20170609 retorna ERROR(0) quando enviamos o comando AT+NAMExxxx (sendo xxxx o novo nome do módulo). Os comandos AT para este módulo são:
- AT+NAME=xxxx para configurar o nome do módulo
- AT+PSWD:”xxxx” para configurar a senha do módulo
- AT+UART=115200,0,0 para configurar a taxa de transmissão
Se tiver dificuldade para configurar o seu módulo Bluetooth HC-06, pode deixar um comentário abaixo.
Emparelhamento
Feitas as configurações desejadas no módulo HC-06, poderá emparelhá-lo com o sistema que quiser, como faria com outro periférico Bluetooth qualquer. Seleccione o nome na lista dos periféricos detectados (no modo padrão: HC-06) e insira o código PIN que configurou anteriormente (no modo padrão: 1234). Isso feito, o LED do módulo deverá parar de piscar.
Código
Com o módulo emparelhado, poderá modificar o código a seguir para obter a funcionalidade desejada. No exemplo a seguir, supomos que uma aplicação enviará o comando ON ou OFF para o módulo Bluetooth para ativar uma função do código.
Para administrar o módulo HC-06, utilizamos a biblioteca SoftwareSerial.h, que gerencia as ligações seriais da placa Arduino. As funções importantes de se conhecer são:
- SoftwareSerial hc06(Rx,Tx) para definir a porta serial e os pinos que servirão para a comunicação
- hc06.begin() para definir a taxa de transmissão
- hc06.available() para testar se os dados estão disponíveis no buffer da porta serial
- hc06.read() para ler os dados da porta serial, um byte por vez
- hc06.print() para enviar uma cadeia de caracteres em ASCII
- hc06.write() para enviar dados, um byte por vez.
#include <SoftwareSerial.h> SoftwareSerial hc06(2,3); String cmd=""; float sensor_val=0; void setup(){ //Initialize Serial Monitor Serial.begin(9600); //Initialize Bluetooth Serial Port hc06.begin(9600); } void loop(){ //Read data from HC06 while(hc06.available()>0){ cmd+=(char)hc06.read(); } //Select function with cmd if(cmd!=""){ Serial.print("Command recieved : "); Serial.println(cmd); // We expect ON or OFF from bluetooth if(cmd=="ON"){ Serial.println("Function is on"); }else if(cmd=="OFF"){ Serial.println("Function is off"); }else{ Serial.println("Function is off by default"); } cmd=""; //reset cmd } // Simulate sensor measurement sensor_val=(float)random(256); // random number between 0 and 255 //Write sensor data to HC06 hc06.print(sensor_val); delay(100); }
Bônus: scan do baud rate
Se tiver dificuldade para encontrar a taxa de transmissão do seu módulo Bluetooth, aqui está um código que inicializa o módulo Bluetooth e envia o comando AT para cada valor de taxa de transmissão.
#include <SoftwareSerial.h> SoftwareSerial hc06(2, 3); void setup() { //Initialize Serial Monitor Serial.begin(9600); // scan scanBaudrate(); } void loop() {} void scanBaudrate() { unsigned long bauds[12] = {300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 74880, 115200, 230400, 250000}; for (int i = 0; i < 12; i++) { hc06.begin(bauds[i]); delay(10); Serial.print(F("Baudrate ")); Serial.println(bauds[i]); command("AT", 2000); } } String command(const char *toSend, unsigned long milliseconds) { String result; Serial.print("Sending: "); Serial.println(toSend); hc06.print(toSend); unsigned long startTime = millis(); Serial.print(F("Received: ")); while (millis() - startTime < milliseconds) { if (hc06.available()) { char c = hc06.read(); Serial.write(c); result += c; // append to the result string } } Serial.println(); // new line after timeout. return result; }
Quando o baud rate estiver correto, o módulo Bluetooth deverá responder OK. Este código permite saber facilmente se o seu módulo está a funcionar e qual a taxa de transmissão utilizada.
Aplicação
- Comunicar entre dois Arduinos via Bluetooth
- Controlar o seu robô com o seu Smartphone
- Receber os valores de um sensor no seu Smartphone
- Todos os nossos robôs podem ser controlados via Bluetooth.
Fontes
- Comunicação Serial com Arduino
- Módulo Bluetooth HC-06
- Criar uma aplicação para Smartphone com o App Inventor 2
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie
O meu modulo Bluetooth nao pisca. Comprei-o novo. Poderá estar avariado?
o LED se acende?
gostaria de fazer uma programação, onde o hc-06 enviava as informações de um sensor de batimento infravermelho MAX 30100, como eu faria?
O sensor MAX30100 utiliza comunicação I2C (SCL/SDA) enquanto o HC06 utiliza comunicação em série (Rx/Tx). É necessário fazer um gateway de i2c para série.
Wire.onReceive(receiveEvents);
void receiveEvents(int numBytes)
{
Serial.println(F(“—> eventos recebidos”));
n = Wire.read();
hc06.println(n);
}