Manual

do

Maker

.

com

Bluetooth HC-06 no Arduino

Bluetooth HC-06 no Arduino

Das comunicações sem fio de curta distância, o bluetooth é uma boa opção (mesmo sendo o HC-06, que não é a melhor escolha), caso deseje interagir com MCUs que não possuam nenhum tipo de comunicação sem fio. Sugiro esse tipo de hardware para interagir com bluetooth porque se for o caso de utilizar WiFi, provavelmente um ESP8266-01 pode ser o suficiente para a necessidade de até 2 GPIO ou, em um projeto mais elaborado com GPIOs, um NodeMCU. A razão para minha sugestão de WiFi não se dá somente pela tecnologia sem fio, mas pela independência do dispositivo, que conta com um processador de 80MHz e um sistema operacional de tempo real (RTOS).

Diferentes módulos bluetooth

Considerando que você está lendo esse post porque realmente precisa configurar um módulo bluetooth desses, é interessante tomar ciência de que ele é inferior à versão 4.0, de forma que você não poderá utilizá-lo como um beacon. Se não sabe o que é um beacon, sugiro que leia esse outro post onde falo a respeito. Também nesse outro aqui, onde mostro a configuração de um Raspberry Pi como beacon e inclusive descrevo a linha de comando do HCI. Apenas para introduzí-lo, um beacon é uma forma de fazer telemetria com bluetooth.

Para esse post, o módulo utilizado é esse:

01a-bt-300x118.webp

Como você poderá notar, alguns modelos desse módulo possuem 6 pinos (como é o caso do HC-05), os quais ocupam as bordas que estão no topo e na base da imagem. Abaixo está o pino STATE e acima o pino ENABLE. Bem, se você adquiriu um HC-06 como eu, diria que se deu mal, porque ele só trabalha em modo slave, enquanto o HC-05 trabalha em master/slave, o que permite intercomunicação entre dispositivos.

Aquela "onda quadrada" à esquerda se trata da antena desse módulo. Esse dispositivo pode operar em tensões de 3.6V à 6V, mas seu nível lógico é 3.3V, portanto para utilizá-lo com dispositivos de nível lógico em 5V, será necessário utilizar no mínimo um divisor de tensão. Mas recomendo algumas leituras, caso não tenha intimidade com essa questão:

https://www.manualdomaker.com/article/buffer-nao-inversor-cd4060-com-esp8266-e-arduino-uno/

https://www.manualdomaker.com/article/arduino/conversor-de-nivel-logico-e-divisor-de-tensao

Inicialmente eu estava escrevendo o artigo com o objetivo de fazer a comunicação master/slave, até perceber que não seria possível. Tive que repassar todo o artigo para fazer as devidas modificações e já que ambos os módulos que adquiri funcionam apenas como slave, optei por comunicar com o Arduino Leonardo para mostrar a utilização de um divisor de tensão. Se utilizar qualquer board com o nível lógico à 3.3V, pode (e deve) remover o divisor de tensão.

Ainda falando de módulo bluetooth, vou aproveitar e mostrar o módulo do meu próximo post sobre beacon, de forma que seja um complemento a esse post:

02a-ble_01-199x300.webp

Como você pode notar, a aparência dele é mais "invocada", mas só poderei dar detalhes a respeito no respectivo post. Apenas não compre gato por lebre.

Wiring dos Arduino com o HC06 (ZS-040)

Aqui entra uma questão; o HC-05 tem marcado ZS-040 atrás, enquanto o HC-06 tem JY-MCU invés disso. Os que comprei estão marcados ZS-040, porém foi identiicado como HC-06 quando fiz um search pelo notebook:

03-ahc06_search-300x231.webp

Apenas para ilustrar mais claramente, fiz Ctrl+Chups em uma imagem bacana que achei no google images, que deixa bem claro o pinout e wiring desse módulo bluetooth HC06 e HC05.

04a-hc05-wiring-300x123.webp

Como eu ia fazer a comunicação master/slave, havia optado or utilizar uma board à 3.3V e a outra à 5V. A de menor tensão que eu havia escolhido era a Arduino Pro Mini, que as tenho em 3.3V e 5V. De qualquer modo, vale ilustrar, caso deseje utilizar uma dessas à 5V, invés do Arduino Leonardo.

05a-arduino_pro_mini-pinout-300x212.webp

Agora que já está claro a interconexão, vamos materializar a prova de conceito na protoboard. Como você pôde ver na primeira imagem no início do post, estou utilizando uma protoboard dupla, o que ajuda bastante com a questão de espaço, mas nada o impede de fazer como nesse desenho feito em Fritzing.

06a-bluetooth-master_slave-300x194.webp

A conexão é simples, como pode ser visto. Perceba que todos os dispositivos estão utilizando um terra comum. Claro que os dispositivos poderiam ser isolados em seus pares, mas aqui estou aproveitando a mesma protoboard. Outra possibilidade seria utilizar a borda superior para um par e a borda inferior para outra. Eu faria como na segunda opção, mas no esquema acima prezei pela clareza do wiring. Se utilizar o HC05 para fazer a comunicação master/slave, esse formato está perfeito. De qualquer modo deixei o exemplo do wiring com e sem divisor de tensão. No divisor de tensão utilizei 2 resistores, sendo R1=10kOhms e R2=20kOhms. Isso porque:

V\_o=\frac{R2}{R1+R2}.V

Código para comunicação com o bluetooth

O que eu mais gosto em dispositivos  seriais é justamente a simplicidade na comunicação. Por se tratar de serial, não será necessário incluir nenhuma biblioteca específica, bastando fazer a comunicação com o módulo através do envio de comandos AT, no caso do HC05. Com o HC06, só consegui testar o status.

Para o Arduino Pro Mini, a serial ficará disponível logo após "upar" o programa. Você pode incrementar um pouco mais e invés de deixar a comunicação serial isolada no Arduino Pro Mini, opte por utilizar softserial. Desse modo você terá duas seriais  nele. Se não desejar ter uma serial pra monitorar ou enviar comandos, claro que você pode usar o esquema acima tranquilamente (adaptando o código abaixo, claro). Já no Arduino Leonardo existem duas seriais disponíveis, portanto vou diferenciar o código.

Arduino Pro Mini

Primeiro o código para Arduino Pro Mini utilizando softserial.

#define SOFT_RX 8
#define SOFT_TX 7
#define SOFT_SERIAL_SPEED 9600

#include <SoftwareSerial.h>

SoftwareSerial SoftSerial(SOFT_RX, SOFT_TX);
char ch = ' ';

void setup(){
    Serial.begin(9600);
    Serial.println("Pronto para comandos");
    SoftSerial.begin(SOFT_SERIAL_SPEED);
}

void loop(){
    /* le de uma, imprime n outra, mas por ser byte a byte, nao deve-se
       esquecer de colocar \r\n (ou retorno de   carro e nova linha, ou
       CR/NL, ou como quiser chamar. Opcao no  rodape do monitor serial
       da IDE do Arduino)
    */
    if (SoftSerial.available()){
        ch = SoftSerial.read();
        Serial.write(ch);
    }
    if (Serial.available()){
        ch =  Serial.read();
        SoftSerial.write(ch);
    }
}

Com as conexões devidamente executadas, você deverá ver o módulo em um piscar constantemente, sendo ele um HC06 não pareado. Sempre, seja lá qual for o dispositivo que estiver utilizando comandos AT, mas sempre envie primeiro um comando de teste, digitando simplesmente 'AT'. Isso deverá retornar um 'OK'. Digo confiadamente isso porque o AT é um protocolo e se for implementado como tal, deve ter esse comando para o teste inicial da comunicação. E antes que alguém pergunte - sim - o ESP8266 também tem a implementação AT, variando (obviamente) os comandos pós-AT ('AT+COMANDO'). Um pouco mais adiante eu explico melhor e também deixo referência do documento.

Arduino Leonardo

De modo muito similar, duas interfaces seriais serão iniciadas também aqui, porém nesse caso ambas são interfaces físicas dedicadas, de forma que o softserial é dispensável. Apenas lembre-se que no Arduino Leonardo as interfaces são SerialSerial1, sendo que a Serial1 é a interface relacionada aos pinos 0 e 1 do lado digital, enquanto Serial é a comunicação entre o computador e a MCU.O código de exemplo é apenas a tradução do código acima e mais adiante disponho uma pequena comunicação AT.

#define SERIAL1_SPEED 9600
#define SERIAL_SPEED 9600

char ch = ' ';

void setup(){
    Serial.begin(SERIAL_SPEED);
    Serial1.begin(SERIAL1_SPEED);
    Serial.println("Pronto para comandos");
}

void loop(){
    //Bem mais simples com duas seriais, hum?
    if (Serial1.available()){
        ch = Serial1.read();
        Serial.write(ch);
    }
    if (Serial.available()){
        ch =  Serial.read();
        Serial1.write(ch);
    }
}

Comandos AT

Nesse datasheet você encontra todas as informações sobre o HC05 inclusive a lista completa dos comandos AT. Por ser uma lista imensa, não vejo sentido em descrever aqui todos os comandos, por isso só quero deixar um exclarecimento. O comando AT é formado por AT+COMANDO, sendo que COMANDO pode também receber parâmetro. Por exemplo, nome:

AT+NAME:DobitAoByte

O formato de resposta acontece de variar conforme o comando, mas para esse do nome deve retornar algo como:

+NAME:DobitAoByte
OK

Claro, se falhar, não será OK a resposta.

Comunicando com o módulo

Não consegui localmente mais do que a resposta para o comando AT, que pelo menos já indica a disponibilidade do dispositivo. Seguidamente, fiz a conexão com o meu smartphone ao dispositivo e manipulei o LED da própria board, que está no (já esquecido) pino 13. O código é basicamente o seguinte:

#define MY_LED 13
#define SERIAL_SPEED 9600
char ch;
String msg = "nothing yet...";
void setup(){
    Serial.begin(SERIAL_SPEED);
    Serial1.begin(SERIAL_SPEED);
    pinMode(MY_LED, OUTPUT);

    Serial1.println("Connected and running!");
}

void loop(){
    if (Serial1.available()){
        ch = Serial1.read();
        if (ch == '1'){
            digitalWrite(MY_LED, HIGH);
            msg = "LED is ON";
        }
        if (ch == '0'){
            digitalWrite(MY_LED, LOW);
            msg = "LED is OFF";
        }
        Serial.println(msg);
        Serial1.println(msg);
    }
}

No video (de 70 segundos apenas) você vê o funcionamento e um erro que cometi; coloquei a mensagem "LED is ON" nas duas condicionais, mas nada que desabone o video e/ou o tutorial. O programa utilizado foi o Bluetooth Terminal, gratuito no Google Play (para Android). Antes que me perguntem, o programa utilizado para fazer screencast do Android pode ser baixado no Play também, procurando por "screencast". O caso é que provavelmente as versões de Android anteriores ao Lollipop precisam de rooting (foi o meu caso, já que coloquei uma ROM da CyanogenMod).

Minha última observação é que alguns módulos vem com velocidade default de 38400, mas esse HC06 veio com a velocidade de 9600, como você vê na inicialização das seriais.

Quero também ressaltar que não importa o Arduino que esteja usando; você pode utilizar software serial e, se for o caso de nível lógico à 5V, utilize SEMPRE o divisor de tensão - apenas no RX do bluetooth. Se o nível lógico for 3.3V, dispense o divisor de tensão. A comunicação entre o TX do bluetooth e o RX do Arduino não utilizando divisor de tensão porque trata-se de uma comunicação unidirecional; TX apenas envia à 3.3V para o RX do Arduino. Também não é necessário utilizar um LLC porque 3.3V é o suficiente para que o Arduino reconheça o sinal.

O teste de comando AT com o HC06 eu fiz através de um adaptador FTDI, bastando digitar "AT" e imediatamente recebi a resposta "OK". O video mostra apenas a comunicação entre o smartphone e o bluetooth, fazendo com que o Arduino acenda o LED do pino 13.

https://youtu.be/A1ErLZd-Tm0

Inscreva-se no nosso canal Manual do Maker Brasil no YouTube.

Próximo post a caminho!

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.