O módulo Bluetooth é outra forma interessante de controlar nossos projetos a distância. Seja por meio de aplicativos ou do próprio Arduino, podemos comunicar com esse módulo e criar sistemas que não precisam de fios. Portanto, neste post, vamos aprender a comunicar com o módulo HC-05 (mesma coisa para o HC-06) utilizando o Arduino.

Na parte 2 ensinarei como utilizar algum aplicativo para fazer essa comunicação.


O que é

O HC-05 ou o HC-06 são plaquinhas que permitem criar e utilizar uma rede sem fio Bluetooth facilmente. A imagem abaixo mostra o HC-05:

Modulo HC-05 bluetooth

A plaquinha cuida de toda a parte da rede Bluetooth e nos resta apenas cuidar da parte de quais dados enviar e quais receber. Para comunicar com o HC-05 ou o HC-06, nós utilizamos a comunicação serial. Ou seja, utilizamos um pino para transmitir dados e outro para receber. Vamos ver os pinos do HC-05 para entender melhor (mesma coisa para o HC-06):

Pinos Modulo HC-05

Como é possível ver na imagem, existem 6 pinos, que são:

  • +5V: pino que deve ser ligado no 5v do Arduino ou em uma fonte de 5v.
  • GND: pino que deve ser ligado no GND do Arduino ou no GND de uma fonte.
  • TX: pino que transmite os dados da placa Bluetooth.
  • RX: pino que recebe os dados que vem do Arduino.
    • Repare que ao lado deste pino está escrito “LEVEL: 3.3V”. Isso significa que o pino só trabalha com 3.3V. Mais adiante entenderemos a importância disso.
  • EN: pino que altera entre o modo de dados e o modo de comandos AT
    • Não precisa conectá-lo em nada, pois, por padrão, ele já fica no modo de dados.
    • Entretanto, conecte ele no 5v para o modo de comandos AT e no GND para o modo de dados.
  • STATE: pino conectado ao LED vermelho da plaquinha
    • Ele pode ser usado para informar se a comunicação Bluetooth está funcionando. Mais a frente você verá que o LED fica piscando rapidamente caso não houver nenhum dispositivo conectado.

Sendo mais específico, nós precisamos apenas conectar um dispositivo na rede Bluetooth criada pelo HC-05 e então mandar dados entre o dispositivo e o Arduino. Nos tópicos abaixo veremos como fazer isso.


Como utilizar

Ligação do TX e RX

No tópico acima, já falei um pouco sobre os pinos, faltou especificar a conexão dos pinos TX e RX. Como disse anteriormente, os pinos TX e RX são da comunicação serial do módulo Bluetooth. Então, se utilizarmos os pinos padrões de comunicação serial do Arduino (pino 0 e 1), nós teremos um problema. Isso pois esses dois pinos são utilizados pelo computador para comunicar com o Arduino, e utilizá-los pode atrapalhar a comunicação.

O que temos que fazer então é ligar os pinos TX e RX em outros dois pinos. Assim, criar uma comunicação serial utilizando a biblioteca SoftwareSerial. Portanto, vou ligar o pino TX do módulo Bluetooth no pino 10 do Arduino e o RX no pino 11 do Arduino.

Entretanto, ainda temos mais um problema para resolver. Lembra o escrito falando “LEVEL:3.3v” ao lado do pino RX do HC-05? Pois é, como os pinos do Arduino se comunicam apenas com 0v (sinal de nível baixo) ou 5v (sinal de nível alto), temos que fazer algo para diminuir a tensão de 5v para 3.3v. A forma mais simples de fazer isso é utilizar um divisor de tensão.

Não existe apenas uma forma correta de criar o divisor de tensão. Você pode utilizar valores diferentes de resistores, desde que a tensão da saída seja PRÓXIMA de 3.3v. Recomendo utilizar algum aplicativo ou site para fazer este cálculo para você. A configuração que escolhi foi utilizar um resistor de 470Ω em série com um de 820Ω que dá uma saída de ~3.2v.

Com o divisor de tensão calculado corretamente, é só conectar a saída dele no RX do módulo Bluetooth e a entrada no pino 11 do Arduino (no caso é o TX do Arduino).

Circuito

Conforme o que foi dito acima, temos:

circuito HC-05 bluetooth

Basicamente, o Vcc do HC-05 está conectado no 5v do Arduino e o GND do HC-05 está conectado no GND do Arduino. O TX do módulo está ligado direto no pino 10 do Arduino. Por fim, o pino 11 do Arduino está ligado na ponta do resistor de 470Ω e a outra ponta dele está ligada no resistor de 820Ω. Nesta ponta, há um fio sendo ligado no pino RX do HC-05. E a outra ponta do resistor de 820Ω está ligada no GND.

Caso você preferir, abaixo está a imagem do esquemático com uma visão simplificada do mesmo circuito:

Esquemático circuito HC-05

Se você fizer toda a ligação, talvez você consiga apenas enxergar e conectar na rede bluetooth do HC-05, mas nada além disso. Para enviar e receber dados, teremos que programar o Arduino, conforme os tópicos abaixo.

Criando a comunicação serial

Tendo em vista o que disse anteriormente, precisamos utilizar a biblioteca SoftwareSerial para criar novos pinos para a comunicação serial. Para fazer isso é bem simples, é necessário apenas dois comandos no início do código:

1
2
#include <SoftwareSerial.h>
SoftwareSerial bluetooth(10, 11); // RX, TX do Arduino

O primeiro comando importa a biblioteca SoftwareSerial. Já o segundo, cria a comunicação com nome “bluetooth” e atribui os pinos 10 e 11 a ela. O primeiro pino que está dentro do parêntesis se refere ao RX do Arduino e o segundo ao TX do Arduino. Lembrando que, na comunicação serial, o RX de um dispositivo está conectado no TX do outro. Pois, um dispositivo recebe dados no pino que o outro transfere. Sendo assim, o pino 10 é o que está conectado o TX do HC-05 e o pino 11 o RX do HC-05.

Feito isso, falta apenas inicializar a comunicação utilizando o comando “begin”, assim como quando você deseja utilizar o monitor serial. Como nós vamos enviar e receber dados com o Arduino, vou inicializar tanto a comunicação serial que acabamos de criar, quanto a comunicação padrão do monitor serial:

1
2
3
4
5
6
void setup(){  
  Serial.begin(9600);  
  Serial.println("Digite algo para enviar por bluetooth:");  //Printa uma frase no monitor serial para saber que está tudo pronto

  bluetooth.begin(9600);  
}

Repare que a velocidade de comunicação está configurada para 9600. Vi, em muitos sites, utilizarem velocidades diferentes como 115200, mas a de 9600 foi a que funcionou para mim. Se não for o seu caso, mude e faça alguns testes até achar a velocidade certa. Vale mencionar que a velocidade de 38400 é a velocidade para entrar no modo de comandos AT (tópico mais adiante).

Pronto, agora resta apenas a parte fácil que é enviar e receber dados por meio dos seriais que nós criamos.

Enviando comandos por Bluetooth

Agora precisamos enviar dados do Arduino para um dispositivo que está conectado no HC-05 pelo Bluetooth. Para isso, é só enviar a informação que queremos pelo serial utilizando o comando “write”:

bluetooth.write(“informação desejada”);

Simples assim. Entretanto, para testar de uma forma melhor nosso programa, vou fazer um código (dentro do void loop) que pega tudo o que digitamos no monitor serial e envia pelo Blueooth. Se você leu o post ensinando a usar o monitor serial, você sabe que é bem simples.

O comando chave aqui é o Serial.available() que nos informa se há algum byte para ser lido na comunicação serial. Portanto, se houver algum dado para ser lido, nós simplesmente enviamos esse dado pelo bluetooth. O comando para leitura do que está sendo enviado é o Serial.read(). Juntando os dois, temos:

1
2
3
4
5
// Lê os dados do serial do Arduino e envia por Bluetooth
if (Serial.available()>0) {  // Se existem dados para leitura
  delay(10);
  bluetooth.write(Serial.read());  
}

O código acima está inserido dentro do void loop.

Recebendo comandos por Bluetooth

A leitura dos dados que são recebidos pelo Bluetooth é mais complicada. Isso porque os dados não são enviados de uma só vez como é o caso de quando enviamos pelo monitor serial. Os dados possuem um certo atraso. Portanto, precisamos criar uma lógica que vai lendo os dados até que um pulador de linha seja encontrado (\n). O pulador de linha será nosso indicador de fim de uma informação.

Por exemplo, do meu celular eu envio a frase “oi, tudo bem”. O código saberá que o fim da frase é depois do “bem” por causa do pulador de linha (\n) enviado no fim dela. O que precisamos fazer então é o seguinte: verifico constantemente se algum dado foi recebido pelo bluetooth; se sim eu leio o dado e armazeno em duas variáveis, uma que vai guardando tudo o que está sendo lido e outra que guarda o que foi lido agora; com isso, testo se o dado recebido foi um pulador de linha; se sim, imprimo a variável que está guardando todos os dados e limpo ela; senão, o programa segue sem fazer nada:

1
2
3
4
5
6
7
8
9
10
11
// Lê os dados do bluetooth
if (bluetooth.available()>0) { // Se existem dados para leitura
   
  b1 = bluetooth.read(); //Variável para armazenar o dado atual
  command += b1; //Variável para armazenar todos os dados
   
  if (b1 == '\n'){ //Se o dado atual for um pulador de linha (\n)
    Serial.print(command); //Printa o comando
    command = ""; //Limpa o comando para futuras leituras
  }
}

E, precisamos também criar as nossas duas variáveis no início do código (logo depois de criar o serial):

String command = “”;
char b1;

Código completo com envio e recebimento de dados

Abaixo está o código completo com o envio e recebimento de dados para você testar as funcionalidades do HC-05 ou o HC-06.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <SoftwareSerial.h>
 
SoftwareSerial bluetooth(10, 11); // RX, TX do Arduino
String command = "";
char b1;
   
void setup()  
{  
  Serial.begin(9600);  
  Serial.println("Digite algo para enviar por bluetooth:");  //Printa uma frase no monitor serial para saber que está tudo pronto
  bluetooth.begin(9600);  
}  
   
void loop()  
{  
  // Lê os dados do serial do Arduino e envia por Bluetooth
  if (Serial.available()>0) {  // Se existem dados para leitura
    delay(10);
    bluetooth.write(Serial.read());  
  }  
 
  // Lê os dados do bluetooth
  if (bluetooth.available()>0) { // Se existem dados para leitura
   
    b1 = bluetooth.read(); //Variável para armazenar o dado atual
    command += b1; //Variável para armazenar todos os dados
   
    if (b1 == '\n'){ //Se o dado atual for um pulador de linha (\n)
      Serial.print(command); //Printa o comando
      command = ""; //Limpa o comando para futuras leituras
    }
  }
}

Como conectar e testar

Por fim, resta apenas testar o código e ver se está tudo funcionando. Depois de fazer o upload do código completo para a plaquinha, você precisa de um programa ou aplicativo de terminal para enviar simples mensagens por Bluetooth. Recomendo este aplicativo para Android, mas você pode escolher outro pesquisando “bluetooth terminal” na loja de aplicativos.

Antes de iniciar o aplicativo, é necessário abrir as comunicações bluetooth do celular e procurar o HC-05. Quando encontrá-lo, mande parear o dispositivo e utilize a senha padrão “1234”. Veja as imagens abaixo do procedimento:

Pareando o HC-05 com o celular
O nome do dispositivo no seu caso deve ser algo como “H-C-2010-06-01”. O meu está diferente, pois alterei usando os comandos AT

Pareando o HC-05 com o celular

Agora, inicie o aplicativo no seu celular e abra o monitor serial do Arduino. Dentro do aplicativo selecione o HC-05 e uma tela com um terminal irá aparecer. Nessa tela você pode tanto visualizar os dados recebidos pelo Arduino, quanto enviar dados para ele. Portanto, envie informações pelo monitor serial e veja se irão aparecer no aplicativo do celular. Faça o contrário e veja se irão aparecer no monitor serial.

Antes do dispositivo ser pareado, o LED vermelho do HC-05 fica piscando rapidamente. Depois do pareamento e de conectá-lo pelo aplicativo, o LED pisca a cada 5 segundos mais ou menos.

Se não sair como o esperado, revise a ligação dos fios, o código do Arduino ou o pareamento com o HC-05.


Como usar os comandos AT

O módulo HC-05 possui um modo de configurações, que te permite mudar vários parâmetros dele, como o nome ou a velocidade de comunicação. O HC-06 possui algumas limitações quanto aos comandos que podem ser utilizados, quando comparado com o HC-05.

Meu objetivo neste ponto é ensinar a acessar o modo e não mostrar quais são todos os comandos existentes. Para isso, mostrarei um site com a lista de todos os existentes.

Circuito

De acordo com testes que fiz, o circuito é o mesmo lá de cima. Embora o pino Enable altere entre o modo de dados e o modo AT, não fez diferença para mim. Se o procedimento a seguir não funcionar, basta ligar o pino EN no 5v.

Programação

O código é exatamente o mesmo, com a diferença que a velocidade de comunicação é 38400 e não 9600.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <SoftwareSerial.h>
 
SoftwareSerial bluetooth(10, 11); // RX, TX do Arduino
String command = "";
char b1;
   
void setup()  
{  
  Serial.begin(38400);  
  Serial.println("Digite algo para enviar por bluetooth:");  //Printa uma frase no monitor serial para saber que está tudo pronto
  bluetooth.begin(38400);  
}  
   
void loop()  
{  
  // Lê os dados do serial do Arduino e envia por Bluetooth
  if (Serial.available()>0) {  // Se existem dados para leitura
    delay(10);
    bluetooth.write(Serial.read());  
  }  
 
  // Lê os dados do bluetooth
  if (bluetooth.available()>0) { // Se existem dados para leitura
   
    b1 = bluetooth.read(); //Variável para armazenar o dado atual
    command += b1; //Variável para armazenar todos os dados
   
    if (b1 == '\n'){ //Se o dado atual for um pulador de linha (\n)
      Serial.print(command); //Printa o comando
      command = ""; //Limpa o comando para futuras leituras
    }
  }
}

Procedimento

Para entrar no modo AT, você precisa seguir um simples procedimento:

  1. Depois de ter feito upload do código para o Arduino, desconecte o 5v do HC-05.
  2. Segure pressionado o botão que fica na plaquinha do HC-05.
  3. Enquanto o botão está sendo pressionado, conecte o 5v novamente.
  4. Solte o botão.

Com isso, o LED vermelho do módulo ficara piscando uma única vez a cada 3 segundos mais ou menos. Isso significa que o procedimento deu certo. Senão, tente de novo ou use a dica que dei na parte do circuito, de ligar o pino EN no 5v.

Por fim, abra o monitor serial, mude a velocidade para 38400 e a configuração ao lado para “Ambos, NL e CR” conforme a imagem:

Modo AT do HC-05

Em seguida digite “AT”. Se houve uma resposta dizendo “OK”, é porque você está no modo AT. Agora é só digitar os comandos que você deseja.

O HC-06 não possui o botão que mencionei. Então, se você realmente quer acessar o modo AT, você deverá soldar um por conta própria.

Comandos

Existem uma série de comandos, mas vou mostrar alguns dos principais.

  • AT+VERSION?
    • Retorna a versão do módulo.
  • AT+ORGL
    • Reseta o módulo para as configurações padrões (nome, velocidade…).
  • AT+NAME?
    • Informa o nome do dispositivo.
  • AT+NAME=NOMEDESEJADO
    • Altera o nome do dispositivo.
  • AT+UART?
    • Informa a velocidade de comunicação do módulo e os parâmetros de bit de parada e paridade.
  • AT+UART=VELOCIDADE,BITDEPARADA,PARIDADE
    • Altera os parâmetro de velocidade, bit de para e paridade
    • Ex. da minha configuração: AT+UART=9600,0,0

Acesse este site para ver mais comandos disponíveis para o HC-05.

 

Agora, você já pode criar projetos com dispositivos que se comunicam sem fio. Na parte 2 deste post, mostro como criar um aplicativo para comunicar com o HC-05.

Módulo Bluetooth – Criando aplicativo – Parte 2