Manual
do
Maker
.
com
Esse é o primeiro artigo sobre Beacon com Arduino que escrevo e começo de cara falando que o Arduino é dispensável para a finalidade de beacon, porém se você não tem um adaptador FTDI, utilizar o Arduino é uma das alternativas. Já escrevi um artigo explicando como configurar um Raspberry Pi 3 para transformá-lo em um Beacon nesse tutorial (e nesse caso sim, fundamental pois o BLE é onboard). Também discorri a respeito de Beacons nesse outro post. Recomendo a leitura de ambos porque são ricos em detalhes.
Apenas para introduzir o assunto, Beacons são pontos de referência, como faróis de navegação em ilhas ou costas marítimas. Um Beacon é utilizado para atingir uma localização, ou guiar-se por ela. No caso de um Beacon digital, utiliza-se para telemetria, pois sua precisão chega a 1 ou 2 centímetros de distância.
Originalmente o protocolo foi desenvolvido pela Apple e criou-se então o iBeacon, que se trata de um recurso oferecido a partir da versão 4.0 do Bluetooth, o chamado BLE (Bluetooth Low Energy). No primeiro post citado (no primeiro parágrafo) explico minuciosamente o formato da mensagem composta como parâmetro para o comando HCI do Linux e é no mínimo útil você saber o que está fazendo, portanto, recomendo que leia para entender bem o conceito, se porventura não teve um contato prévio com Beacons.
O HM-10 (esse dispositivo BLE que comprei) é um módulo de comunicação serial que aceita comandos AT quando desconectado. Quando conectado, não é possível enviar comandos AT pela serial, mas ainda é possível fazê-lo pela conexão wireless ('wireless' como 'sem fio', não confunda com WiFi). As informações pertinentes a esse dispositivo podem ser encontradas (obviamente) em seu datasheet. Não é necessário mais do que isso para fazer o Beacon, o mais importante é saber que (conforme informação do vendedor) esse dispositivo trabalha tanto à 3.3V, portanto a interconexão deve ser ter um divisor de tensão em seu RX, caso venha a fazer interface com um Arduino à 5V. Ainda, sua alimentação deve vir diretamente de uma fonte 3.3V e apesar do baixo consumo, não estou certo quanto à estabilidade desse dispositivo operando com a referência de 3.3V advinda do Arduino, portanto se possível, use uma alimentação dedicada ou uma alimentação compartilhada com o respectivo Arduino.
As especificações desse dispositivo são surpreendentes, considero um dos melhores dispositivos BLE serial da atualidade. Confira:
Bluetooth LE 4.0.Sem limitações de bytes in/out.Frequência de operação à 2.4GHz banda ISM.Método de modulação: GFSK(Gaussian Frequency Shift Keying).Range da frequência RF: -23dbm, -6dbm, 0dbm, 6dbm, modificáveis por comandos AT.Comando AT+POWE. Explico mais adiante, mas é relacionado ao dBm.Velocidade assíncrona/assíncrona: 6KBConta com autenticação e criptografiaServiço central e periférico UUID FFE0,FFE1Consumo: +3.3V@50mADistância comprovada: 100 metros em espaço aberto com iphone4s !Consumo em sleep de 400uA~1.5mA e 8.5mA quando ativo.Trabalha à temperaturas de –5 ~ +65 graus celsiusDimensões: 26.9mm x 13mm x 2.2 mm |
Não há segredos, mas como no exemplo estou utilizando o Arduino Leonardo, obrigatoriamente deve-se colocar um divisor de tensão entre o RX do BLE e o TX do Arduino. As conexões são basicamente TX,RX, VCC e GND. Estou utilizando o Arduino Leonardo por dispor de duas interfaces seriais nativas, mas nada o impede de fazer o beacon com Arduino UNO utilizando softserial. O wiring ficou desse modo:
Para fazer o beacon com Arduino Pro Mini 3.3V@8MHz as coisas ficam muito mais simplificadas, porém deve-se ter muita atenção na alimentação. O VCC é para tensão regulada, já chegando limpo 3.3V, portanto seria até recomendável um capacitor para dar uma filtrada antes de entrar na board. Já se a alimentação for de origem diferente do HM-10, você poderá alimentar entre 3.5V até 12V na entrada RAW, pois a board possui um regulador de tensão conectado a esse pino. Não se incomode com a interconexão de TX e RX pois o nível lógico continuará sendo 3.3V. Se você quiser fazer uma interface com o computador e a outra com o Arduino Pro Mini, use o FTDI no header de 6 pinos e use software serial em quaisquer 2 pinos digital selecionados por você. Talvez (e somente "talvez") eu mostre no video um exemplo de beacon com Arduino Pro Mini (mas para isso, você precisará inscrever-se no nosso canal do YouTube).
De forma alguma detenha algum tipo de dúvida. Se ainda não ficou claro a questão de pinout e alimentação, refira-se à seguinte descrição antes de tentar fazer seu beacon com Arduino Pro Mini:
Antes que eu decida fazer o wiring com ESP8266 nesse mesmo post, deixe-me passar adiante (é tentador enquanto escrevo).
Conectei o HM-10 primeiramente ao notebook através do meu FTDI (jumpeado para 3.3V), conectando apenas TX, RX, VCC e GND. Tem uma coisa que as pessoas se equivocam, então acho válido entrar nesse detalhe.
Não importa o protocolo, sempre que tiver RX e TX, a conexão entre os dispositivos é sempre 'cruzada'. Isso porque TX é "Transmission" e RX é "Receiver"; logo, um transmite, o outro recebe e vice-versa. Enfatizando, não ligue TX para TX e RX para RX que não vai funcionar.
Usei diversos comandos AT para experimentar, porque não achei nada relacionado ao HM-10 que fosse realmente suscinto. Meu módulo passou a ser enxergado após um último comando, mas até então eu fiz as seguintes execuções, que você pode fazer também conforme desejar. Consultas são feitas com interrogação e modificações com o parâmetro colado ao comando, em substituição à interrogação.
AT+ADTY? | Consulta os modos. |
0 = responde a scan e é conectavel1 = só o ultimo dispositivo conectado em 1.28 segundos2 = somente anuncio e resposta a scan3 = somente anuncio | |
0 é o default e deve ser mantido para o pretendido. | |
AT+BATT? | Consulta bateria. Não entendi bem, o resultado dá uma |
variação na casa dos 70%, mas estou conectado ao FTDI, | |
na USB com 500mA. | |
AT+BAUD? | Consulta baud rate. A resposta é 1 byte, sendo: |
0---------96001---------192002---------384003---------576004---------1152005---------48006---------24007---------12008---------230400Default: 0(9600), tratando-se da conexão serial. | |
AT+START | Inicialização imediata do dispositivo |
AT+IBE0? | Consulta da primeira parte do UUID. A modificação consiste |
de 8 bytes. Ex.: | |
AT+IBE012345678 | |
AT+IBE1? | Modificação da segunda e terceira parte do UUID |
AT+IBE3? | Modificação do final da UUID |
AT+MARJ? | Mudar o Major. Ex.: AT+MARJ0x0102 |
AT+MINO? | Mudar o Minor |
AT+NAME? | Modifica o nome do dispositivo. Ex.:AT+NAMEDobitAoByte |
AT+PCTL? | Configura força do sinal, sendo:0 = normal1 = máximoMáximo é o padrão. |
AT+PIO1? | Configura o modo de sinalização do LED. |
0 = 500ms blink1 = off desconectado, high conectado | |
AT+PASS? | PIN de 6 bytes. Default é 000000 |
AT+POWE? | Consulta dBm, sendo: |
0 = -23dbm1 = -6dbm2 = dbm3 = 6dbm | |
AT+RENEW | Factory setup |
AT+RESET | Reset |
AT+SHOW? | permite descoberta, sendo 1 para habilitar e 0 para desabilitar. |
O padrão é 0. |
O UUID default é 74278BDA-B644-4520-8F0C-720EAF059935. Basicamente, mudei a primeira parte conforme exemplificado na tabela acima. Mudei o nome e executei uma pequena sequência de comandos AT:
AT+IBEA1
AT+START
AT+SHOW1
AT+FILT0
AT+DELO1 (ou AT+DELO2 para só broadcast)
Perceba que eu não configurei praticamente "nada", a tabela acima foi mais focada no tópico "beacon com Arduino", mas tem muitos outros parâmetros importantes que são utilizados para a conexão, propriamente dita. A melhor opção é configurar o dispositivo por FTDI, mas vou demonstrar a interação com o Arduino Leonardo para o caso de você não ter um FTDI. De qualquer modo, perceba que o dispositivo tem total independência de uma MCU/CPU e pode ser facilmente utilizado como um beacon conectado a uma bateria. Ideal para um dos projetos citado no primeiro artigo sobre beacon.
Tratando-se de comunicação AT, é bastante simples interagir com o módulo BLE e para tal esse simples sketch que segue é tudo o que você precisará para a prova de conceito, caso não tenha um FTDI.
#include <SoftwareSerial.h>
//RX,TX: caso de arduino com 1 serial apenas
SoftwareSerial Serial1(7, 8);
void setup(){
Serial.begin(9600);
Serial1.begin(9600);
Serial.println("Digite o comando AT:");
}
void loop(){
if (Serial1.available()){
Serial.write(Serial1.read());
}
if (Serial.available()){
Serial1.write(Serial.read());
}
}
Mais uma vez, os ajustes finos podem ser feitos guiando-se pelo tutorial de beacon onde explico como compor a string utilizando hci no Raspbian.
Inscreva-se no nosso canal Manual do Maker Brasil no YouTube.
Próximo post a caminho!
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.