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:
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):
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:
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:
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:
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:
- Depois de ter feito upload do código para o Arduino, desconecte o 5v do HC-05.
- Segure pressionado o botão que fica na plaquinha do HC-05.
- Enquanto o botão está sendo pressionado, conecte o 5v novamente.
- 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:
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.
Olá, não entendi com junto o app que criei para android, na parte 2, com o código daqui que inserimos, na plataforma do arduino. Como e onde esse duas coisas se juntam? O app da segunda parte roda em qualquer android?
Olá. A parte 1 foi mais para explicar como ocorre a comunicação entre o módulo Bluetooth com o Arduino e vice-versa. Todos os dados que são enviados pelo celular chegam no módulo Bluetooth que repassa eles para o Arduino pelos dados seriais do Bluetooth (a parte que tem o bluetooth.available()>0).
Na parte 2 tem um código pronto para o Arduino mostrando como acionar o LED a partir do aplicativo criado. Se quiser testar apenas copie o código de lá e cole no Arduino. No caso do aplicativo que ensinei criar, os botões basicamente mandam um texto via Bluetooth. Esse texto é recebido pelo Arduino que executa algum comando de acordo com o texto recebido. Se o texto recebido pelo Arduino for “LIGAR”, ele liga o LED, e, se for “DESLIGAR”, ele desliga o LED. Dê uma olhadinha no código do Arduino que está no final da parte 2.
De qualquer forma, recomendo você ler as duas partes novamente com calma, pois é bastante conteúdo para absorver de uma vez e ainda é necessário um pouco de conhecimento no AppInventor para entender melhor o que o aplicativo está fazendo.
Em relação a sua última pergunta, o app roda em qualquer sistema Android a partir da versão 2.3, de acordo com a página oficial.
Muitíssimo obrigado. Todos os procedimentos deram certo utilizei os resistores de divisão diferentes 2 de 1k em série = 2K de um lado no meio o pino de saída do Bluetooth e do outro lado um de 1k. obtive 3.2 de tensão de saída. Rodou perfeitamente. Com barreira ele faz de 10 a 15m e em campo aberto ele chega a 30m de distância.
Eu é que agradeço pelo feedback, Marcel! Os resistores podem ser diferentes mesmo, o importante é dar +-3.3V no pino do Bluetooth. E é interessantíssimo saber essas informações de distância, não sabia que chegava tão longe. Da até pra comandar um drone haha.
Verdade. Estou quase finalizando o projeto do qual eu utilizo o módulo para receber variáveis do módulo de sensor de distância ultrasonico. E do sensor de temperatura. Onde um veículo faz o mapeamento do local utilizando variáveis de coordenadas. No final eu copio esses dados jogo para planilha Excel e crio um gráfico. Qualquer coisa se quiser disponibilizar o projeto em seu site. Só entrar em contato pelo email. marcelamorim2010@hotmail.com
Que projeto legal! Fiquei bem interessado em ver ele funcionando. Tenho uma ideia interessante: Por que você não faz um vídeo ou produz um conteúdo escrito mostrando o projeto? Aí você me manda o link e eu divulgo na página do Facebook. Tenho certeza que muita gente ia achar interessante também!
Bom dia, eu copiei o codigo mas so que qdo escrevo no serial do arduino eu recebo simbolos no celular, tipo 80 80 ,f8 ,>…nao coresponde ao texto escrito… me ajude por favor.Agradeco!!
Boa tarde, Alex. Tente substituir o comando “bluetooth.write(…)” por “bluetooth.print(…)” e veja se o seu problema é resolvido. Se não resolver, me mande um print do código do seu aplicativo por email (mundoprojetado@gmail.com) que eu poderei te ajudar melhor.
Eu nunca comento nada, mas dessa vez foi necessário. Autor muito obrigado nao sei nem como agradecer se tiver algum local para doações para a pagina me passe por favor
Olá, Luiz. Muitíssimo obrigado pelo seu comentário e pelo seu interesse em ajudar! Fico muito contente em saber que você ficou bastante satisfeito. Não há nenhum local para doações no site, mas você me ajudaria bastante compartilhando o site com pessoas que se interessam na área e também trazendo críticas construtivas. Abraço!
Boa noite
Gostaria de saber como poderia alterar o nome de uma placa de audio bluetooth, gostaria de alterar na própria placa para sempre ter este novo nome, meu interesse não é alterar no meu telemovel, porque somente seria alterado no meu equipamento, quero alterar o nome no próprio hardware.
O controlador de audio que a placa que usa é ” ISSC IS1686S”
Boa tarde, Pedro
Infelizmente, eu não serei capaz de te ajudar, porque o procedimento de alterar o nome é bem específico do chip que faz a comunicação Bluetooth. No caso deste post, o modulo do HC-05 como um todo, apresenta comandos AT bem diretos para fazer a alteração do nome. No caso do, IS1686S, parece haver uma interface serial (UART) para você dar alguns comandos e fazer a mudança do nome. Entretanto, eu só consegui encontrar o datasheet de um controlador similar, o IS1678S (pág 15). Então não dá pra saber o comando correto para alterar o nome, mas você pode tentar seguir o datasheet do IS1678S para ver se consegue alguma coisa. Mas adianto que este procedimento não deve ser nada fácil.
Boa Noite! entao, eu estoucom um modulo bluetooth que possui Rx e Tx, a minha duvida e: tem como colocar uma usb nela? pq a usb tem o cabo verde e branco de dados, se eu fosse fazer qual seria a ligaçao alguem saberia me dizer?
Olá, Kauan. Infelizmente não é possível fazer isso diretamente, porque os pinos RX e TX são da comunicação UART (serial assíncrona). Apesar do USB normalmente possuir 2 fios de dados, estes não são compatíveis com a comunicação UART, pois a comunicação USB é bem mais complexa e cheia de regras. Entretanto, você pode usar um módulo que converte os sinais de UART/USART para USB. Eles podem ser encontrados procurando por “módulo conversor TTL para USB” (ou vice-versa). Normalmente você vê esses módulos sendo utilizados para programar o Arduino Pro mini.