Bluetooth HC-05 no Arduino: ligar, testar com uma letra e só depois criar comandos
Ligue o HC-05 com fios cruzados, divisor no RX e a mesma velocidade dos dois lados, e prove o canal com uma letra antes de inventar protocolo.
O LED do módulo pisca, o celular encontra "HC-05", pareia com a senha, e o monitor serial continua mudo. Você troca o aplicativo, reinstala a biblioteca, e nada. O HC-05 não manda comandos, manda bytes: é uma porta serial sem fio. Quase todo silêncio vem de três lugares: velocidade diferente nos dois lados, fios de transmissão e recepção ligados retos em vez de cruzados, e o pino de recepção do módulo recebendo 5 V direto.
A resposta curta: TX do Arduino vai no RX do módulo passando por um divisor de tensão, RX do Arduino vai no TX do módulo, terra comum, e o código abre a serial do módulo na velocidade de fábrica dele (em geral 9600). Mande a letra A do celular. Se ela aparecer inteira no Arduino, o canal existe e você pode pensar em comandos.
Por que o módulo fica mudo mesmo pareado
Parear é a conversa entre o rádio do celular e o rádio do módulo. Isso acontece sem o Arduino participar. O LED muda de ritmo, o celular mostra "conectado", e ainda assim nenhum byte precisa ter chegado à placa. Do lado do fio, o módulo é um conversor: o que chega pelo ar sai no pino TX dele, em serial, numa velocidade fixa.
Se o Arduino escuta a 38400 e o módulo fala a 9600, os bits chegam com o tempo errado e viram lixo, ou nada. Se TX está ligado em TX, os dois lados falam no mesmo fio e ninguém escuta. E se não há terra comum entre módulo e placa, os níveis de tensão não têm referência e a leitura vira loteria.
Uma limitação que pega muita gente: o HC-05 é Bluetooth clássico com perfil serial. Celulares Android costumam conversar com ele por aplicativos de terminal serial Bluetooth. O iPhone não oferece esse perfil serial para aplicativos comuns; com iPhone, o caminho costuma ser um módulo Bluetooth Low Energy. A parte de pareamento e papéis está em parear é configuração, não mágica permanente.
Como ligar o HC-05 no Arduino Uno
O exemplo que vai atravessar o texto: um Uno que acende o LED do pino 13 quando recebe A e apaga com a. Os pinos 0 e 1 do Uno são a serial ligada ao USB; se o módulo ficar neles, ele briga com o upload e com o monitor serial. Por isso o módulo vai nos pinos 10 e 11, usando a biblioteca SoftwareSerial, que já vem com a IDE.
- VCC do módulo no 5 V e GND no GND. As plaquinhas comuns do HC-05 trazem regulador e aceitam 5 V na alimentação. Confira na serigrafia ou no anúncio da sua placa; o chip em si trabalha em 3,3 V.
- TXD do módulo no pino 10 do Arduino. O sinal de 3,3 V que sai do módulo costuma ser lido como nível alto pelo Uno.
- Pino 11 do Arduino no RXD do módulo, passando por um divisor. Um resistor de 1 kΩ do pino 11 até o RXD, e um de 2 kΩ do RXD até o GND. A tensão no RXD fica em 5 × 2 / 3, cerca de 3,3 V.
- Não ligue nada nos pinos EN (ou KEY) e STATE por enquanto.
Sem o divisor, o módulo muitas vezes funciona. Funciona uma semana, um mês, e um dia começa a perder caracteres ou para. Os 5 V contínuos no pino de 3,3 V cobram a conta devagar.
O código da ponte com teste de uma letra
#include <SoftwareSerial.h>
// RX do Arduino no pino 10 (vem do TXD do módulo)
// TX do Arduino no pino 11 (vai ao RXD do módulo pelo divisor)
SoftwareSerial bt(10, 11);
const int PINO_LED = 13;
void setup() {
pinMode(PINO_LED, OUTPUT);
Serial.begin(9600);
bt.begin(9600);
Serial.println("Ponte pronta. Mande A ou a pelo celular.");
}
void loop() {
if (bt.available()) {
char c = bt.read();
// Aplicativos costumam mandar quebra de linha junto; ignore caracteres de controle.
if (c < ' ') {
return;
}
Serial.print("recebi: ");
Serial.println(c);
if (c == 'A') {
digitalWrite(PINO_LED, HIGH);
bt.println("LED ligado");
} else if (c == 'a') {
digitalWrite(PINO_LED, LOW);
bt.println("LED desligado");
} else {
bt.println("comando desconhecido");
}
}
// O que você digitar no monitor serial vai para o celular.
if (Serial.available()) {
bt.write(Serial.read());
}
}
Pareie o celular com o módulo (a senha de fábrica costuma ser 1234 ou 0000), abra um aplicativo de terminal serial Bluetooth, conecte e mande A. No monitor serial deve aparecer "recebi: A", e no celular, "LED ligado". Digite algo no monitor serial e veja chegar no telefone. Com os dois sentidos funcionando, o canal está provado.
Quando chega lixo em vez da letra
Caracteres estranhos no lugar do A quase sempre significam velocidade diferente. Muitos HC-05 saem de fábrica a 9600 no modo de dados, mas existem lotes e módulos já reconfigurados em outra velocidade. Teste 9600 primeiro; se vier lixo, tente 38400 no bt.begin.
Não confunda isso com o modo de comandos AT. Quando o módulo é ligado com o botão pressionado (ou o pino EN em nível alto), ele entra num modo de configuração em que responde a comandos como AT+ROLE?, e nesse modo a velocidade costuma ser 38400. Na maioria das placas, o LED piscando devagar, a cada dois segundos mais ou menos, indica esse modo. Piscando rápido, está esperando conexão. Se você está no modo AT, as letras que o celular manda não chegam do jeito que você espera.
Dois Arduinos: alguém precisa chamar
Com o celular, o módulo fica esperando e o telefone inicia a conexão. Entre dois HC-05, um deles precisa ser configurado como mestre, o lado que procura e conecta, e o outro fica como escravo, à espera. O papel se define no modo AT com AT+ROLE, e o mestre pode ser amarrado ao endereço do outro com AT+BIND. Dois módulos esperando é silêncio eterno com LED bonito.
Faça a configuração uma vez, anote o endereço de cada módulo numa etiqueta e teste com a mesma letra A antes de mandar frase. O HC-06, primo parecido, só trabalha como escravo; para o papel de mestre, precisa ser o HC-05.
Depois do A: um protocolo pequeno
Com o canal provado, decida o formato. Uma letra por comando resolve muita coisa. Se precisar de valores, use linhas terminadas em quebra de linha, como V120 para velocidade 120, e só processe a linha quando ela estiver completa. Responda sempre, nem que seja "ok" ou "erro": sem resposta, o celular não sabe se o comando chegou. A mesma lógica vale para o cabo USB, como em falar com o Arduino pela serial.
Alimentação também conta. O módulo consome mais no momento de parear; numa fonte fraca, compartilhada com motor, ele reinicia e o celular perde a conexão. Se isso acontecer, revise como alimentar o Arduino sem resetar.
Erros comuns
- Ligar TX no TX e RX no RX: os dois falam no mesmo fio e nada chega a lugar nenhum.
- Usar os pinos 0 e 1 do Uno para o módulo: o upload falha e o monitor serial mistura o que vem do USB com o que vem do Bluetooth.
- Dispensar o divisor no RXD: funciona no teste e o módulo degrada com o tempo.
- Velocidade diferente nos dois lados: chega lixo e você culpa o aplicativo.
- Esquecer o terra comum: leituras intermitentes, que somem quando você encosta no fio.
- Criar protocolo antes de provar o canal: você depura o parser quando o problema é o fio.
Checklist
- TXD do módulo no RX do Arduino e TX do Arduino no RXD do módulo.
- Divisor de tensão (1 kΩ e 2 kΩ) no RXD do módulo.
- GND do módulo ligado ao GND do Arduino.
- Módulo fora dos pinos 0 e 1 no Uno.
- Mesma velocidade no
bt.begine no módulo, testada com a letra A. - LED do módulo piscando no ritmo de modo de dados, não de modo AT.
- Resposta do Arduino aparecendo no celular, nos dois sentidos.
Mande a letra A pelo celular agora. Ela aparece inteira no monitor serial, ou aparece um símbolo estranho? Inteira, o canal existe. Estranha, mude a velocidade antes de mexer em qualquer outra coisa.
Referência: http://blog.filipeflop.com/wireless/tutorial-arduino-bluetooth-hc-05-mestre.html