Manual

do

Maker

.

com

Como fazer um Beacon com Arduino

Como fazer um Beacon com Arduino

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.

Dispositivo BLE

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.

Caraterísticas técnicas

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

Wiring

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:

01b-hm-10-300x275.webp

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).

02b-hm-10-pro_mini-300x102.webp

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:

03b-arduino_pro_mini.webp

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.

Todas as conexões são TX->RX e RX->TX

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+STARTInicializaçã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+RENEWFactory setup
AT+RESETReset
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!

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.