O Arduino pode comunicar-se com outros dispositivos (Smartphone, computador ou algum outro microcontrolador) via conexão Bluetooth utilizando um módulo HC-05 (mestre/escravo). Desse modo, é possível conectar a sua placa Arduino a outros sistemas, para enviar e receber dados. A comunicação por Bluetooth possibilita, por exemplo, controlar o seu robô por meio de uma aplicação para Smartphone, exibir as medidas de um sensor no seu computador ou ainda permitir que outros robôs comuniquem-se entre si.
Leia antes: Comunicação Serial com Arduino
Equipamento:
- Computador
- 2 x placas Arduino UNO
- 2 x cabos USB para conectar o Arduino ao computador
- 2 x módulos Bluetooth HC-05 ZS-040 (ou 1 módulo HC-06 e 1 módulo HC-05)
- Cabos Dupont M/F
Apresentação do módulo Bluetooth HC-05
O módulo Bluetooth HC-05 apresenta 6 pinos que permitem realizar a conexão.
- 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
- Status retorna 1 quando o módulo é conectado
- Key ou EN precisam estar alimentados para entrar no modo de configuração e não pode estar conectados para entrar em modo de comunicação.
A particularidade do módulo Bluetooth HC-05 é que pode ser utilizado em modo escravo (caso em que será equivalente a um módulo HC-06, com a mesma forma de utilização) ou em modo mestre, o que significa que pode conectar-se a um outro módulo Bluetooth (HC-06, HC-05 em modo escravo ou outro) de forma autônoma, sem ação externa.
Esquema de ligação para configuração
ATENÇÃO:
- Utilizamos os pinos 2 e 3 para a comunicação serial com o Arduino UNO. Em função da placa escolhida, esses pinos podem ser incompatíveis com a comunicação SoftwareSerial. Em especial no caso das placas Mega, Micro e Leonardo. Verifique a documentação.
- Como o nível lógico do módulo Bluetooth é 3,3V, recomendamos usar um divisor de tensão para reduzir a tensão de 5V do Arduino. (1k de resistência entre pin3 e Rx; 2k Ohm entre Rx e GND).
Configuração do módulo HC-05
A configuração do módulo Bluetooth pode ser interessante para verificar o seu funcionamento e para modificar os seus parâmetros, sobretudo se quiser utilizá-lo no modo master. O módulo deve estar alimentado, mas não emparelhado, e o pino Key/EN deve estar alimentado a 3V quando o módulo for aceso. Quando o módulo estiver em modo de configuração, o LED se acenderá por dois segundos a intervalos de dois segundos.
Abra o monitor serial do Arduino e certifique-se de que a opção de fim de linha esteja a exibir “Nova Linha” e que a taxa de transferência esteja regulada a 9600.
Observe que o módulo Bluetooth HC-05 entra no modo AT com uma taxa de transferência (baud rate) de 38400 bps.
Código de configuração
Para gerir a comunicação com o módulo HC-05, utilizamos a biblioteca SoftwareSerial.h, que permite criar uma porta serial distinta da utilizada pela porta USB. O código abaixo permite modificar as configurações do módulo HC-05 (nome, código PIN, taxa de transmissão (baud rate), etc.) e localizar informações como o número da versão do firmware.
#include <SoftwareSerial.h>
#define rxPin 2
#define txPin 3
#define baudrate 38400
String msg;
SoftwareSerial hc05(rxPin ,txPin);
void setup(){
pinMode(rxPin,INPUT);
pinMode(txPin,OUTPUT);
Serial.begin(9600);
Serial.println("ENTER AT Commands:");
hc05.begin(baudrate);
}
void loop(){
readSerialPort();
if(msg!="") hc05.println(msg);
if (hc05.available()>0){
Serial.write(hc05.read());
}
}
void readSerialPort(){
msg="";
while (Serial.available()) {
delay(10);
if (Serial.available() >0) {
char c = Serial.read(); //gets one byte from serial buffer
msg += c; //makes the string readString
}
}
}
Para uma boa comunicação, certifique-se de seleccionar a taxa de transmissão correta no monitor serial, bem como “nova linha” (NL) nas configurações de comunicação.
Comandos de configuração
Além da vantagem de poder se utilizado como módulo mestre, o módulo Bluetooth HC-05 também permite conhecer as configurações salvas.
Em geral, ao digitar no monitor serial AT+<command>?, obtém-se o valor registrado no módulo (ex: AT+PSWD? para descobrir o código PIN do módulo). Ao inserir a linha AT+<command>=<Param>, é possível definir um valor para o módulo (ex: AT+PWSD=0000 para alterar o código PIN para 0000).
Veja abaixo alguns comandos AT básicos:
- Para testar a comunicação, digite AT no monitor serial da IDE do Arduino. Se tudo estiver bem, o módulo deverá responder OK.
- Para verificar o nome do módulo, digite AT+NAME=<Param> no módulo. Ele deverá responder OK. (Ex: Para alterar o nome do módulo para BTM1, digite AT+NAME=BTM1)
- Para alterar o código PIN do módulo, digite AT+PSWD=<Param> . O módulo deverá responder OK. (Ex: se quiser alterar o PIN para 0000, digite AT+PSWD=0000)
- AT+ROLE=<Param> para modificar a função do módulo para mestre ou escravo (Ex: para transformar o módulo em mestre, AT+ROLE=1).
- Para modificar a velocidade de transmissão do módulo (somente se necessário), digite AT+UART=<Param1>,<Param2>,<Param3>, sendo Param1, 2 e 3 as configurações de comunicação serial: o baud rate, o bit de parada e o bit de paridade, respectivamente. (Em modo padrão, 9600,0,0. Ex: se quiser alterar a taxa de transmissão para 115200, digite AT+UART=115200,0,0).
Veja outros comandos AT para o módulo Bluetooth HC-05 neste link.
ATENÇÃO: Existem diferentes versões do módulo HC-05 e a lista de comandos AT pode variar, assim como os procedimentos. Verifique o número de série marcado no módulo e a versão do firmware, digitando o comando AT+VERSION?. No nosso caso, o módulo HC-05 é da série ZS-040 e da versão 2.0-20100601.
N.B.: Se não funcionar, verifique a conexão e a condutividade dos cabos e a taxa de transmissão (baud rate).
Se tiver dificuldades para configurar o seu módulo Bluetooth HC-05, pode deixar um comentário abaixo.
Configuração do módulo escravo
Para o módulo escravo, pode alterar o nome digitando AT+NAME=HC05-Slave e escolher as configurações de comunicação e a senha que desejar. Certifique-se de que eles são iguais aos dos módulo master.
- AT retorna OK
- AT+NAME=HC05-Slave
- AT+UART=9600,0,0
- AT+ROLE=0
- Insira AT+ADDR para obter o endereço do módulo escravo (no nosso caso, +ADDR:98d3:32:21450e)
Também é possível utilizar um módulo HC-06 como módulo escravo.
Configuração do módulo mestre
Para o módulo mestre, será preciso modificar a função do módulo e escolher as mesmas configurações de comunicação que para o módulo escravo.
- AT retorna OK
- AT+NAME=HC05-Master
- AT+UART=9600,0,0
- AT+ROLE=1
- É preciso salvar o endereço do módulo escravo para que o módulo mestre consiga parear: AT+BIND=98d3,32,21450e (substitua os dois pontos “:” por vírgulas “,”)
Esquema de ligação para a comunicação
No modo de comunicação, o pino Key/EN não pode estar alimentado.
Código de comunicação
Com os módulos já configurados, poderá desconectar o pino Key ou EN, carregar os código abaixo nas suas placas Arduino e acender novamente o módulo HC-05 para entrar em modo de comunicação.
Assim como para o módulo HC-06, nós utilizamos a biblioteca SoftwareSerial.h. Aqui estão algumas das suas funções:
- SoftwareSerial hc05(Rx,Tx) para definir a porta serial e os pinos que servirão para a comunicação
- hc05.begin() para definir a taxa de transmissão
- hc05.available() para verificar se os dados estão disponíveis no buffer da porta serial
- hc05.read() para ler os dados da porta serial, um byte por vez
- hc05.print() para enviar uma cadeia de caracteres em ASCII
- hc05.write() para enviar dados, um byte por vez.
- hc05.flush() para esvaziar os dados do buffer.
Código Mestre
#include <SoftwareSerial.h>
SoftwareSerial ArduinoSlave(2, 3);
String answer;
String msg;
void setup() {
Serial.begin(9600);
Serial.println("ENTER Commands:");
ArduinoSlave.begin(9600);
}
void loop() {
//Read command from monitor
readSerialPort();
//Read answer from slave
while (ArduinoSlave.available()) {
delay(10);
if (ArduinoSlave.available() > 0) {
char c = ArduinoSlave.read(); //gets one byte from serial buffer
answer += c; //makes the string readString
}
}
//Send data to slave
if (msg != "") {
Serial.print("Master sent : ");
Serial.println(msg);
ArduinoSlave.print(msg);
msg = "";
}
//Send answer to monitor
if (answer != "") {
Serial.print("Slave recieved : ");
Serial.println(answer);
answer = "";
}
}
void readSerialPort() {
while (Serial.available()) {
delay(10);
if (Serial.available() > 0) {
char c = Serial.read(); //gets one byte from serial buffer
msg += c; //makes the string readString
}
}
Serial.flush();
}
Código Escravo
#include <SoftwareSerial.h>
SoftwareSerial ArduinoMaster(2, 3);
String msg;
void setup() {
Serial.begin(9600);
ArduinoMaster.begin(9600);
}
void loop() {
readSerialPort();
// Send answer to master
if (msg != "") {
Serial.print("Master sent : " );
Serial.println(msg);
ArduinoMaster.print(msg);
msg = "";
}
}
void readSerialPort() {
while (ArduinoMaster.available()) {
delay(10);
if (ArduinoMaster.available() > 0) {
char c = ArduinoMaster.read(); //gets one byte from serial buffer
msg += c; //makes the string readString
}
}
ArduinoMaster.flush();
}
Ao abrir os dois monitores seriais correspondentes e digitar um comando no monitor da placa mestre, poderá ver o seguinte resultado: a placa mestre envia uma cadeia de caracteres que a placa escrava recebe e reenvia. Assim se verifica que a comunicação está a funcionar nos dois sentidos.
Se tiver dificuldade para configurar ou comunicar com o seu módulo Bluetooth HC-05, pode contactar-nos ou deixar um comentário.
Aplicação
E então, o que faria se a sua placa Arduino pudesse comunicar-se com outros sistemas? Escreva-nos um comentário.
