Desenvolvendo aplicações com o BlueST-SDK e Raspberry Pi

Olá pessoal, esse é meu primeiro artigo no Portal Embarcados! Resolvi compartilhar um pouco do que tenho aprendido trabalhando com a placa Raspberry Pi, SensorTile e o BlueST-SDK. Espero que gostem!

Introdução

O objetivo desse artigo é apresentar o BlueST-SDK da STMicroeletronics e como utilizar sua versão para Linux. Para isso, o desenvolvimento da comunicação Bluetooth Low Energy (BLE) entre a placa Raspberry Pi 3B e a placa SensorTile será demonstrado, conforme a figura a seguir.

BlueST-SDK
Figura 1 – Projeto prático.

Neste projeto, dados de acelerômetro são transmitidos pela SensorTile por meio do protocolo BLE BlueST e a Raspberry, com o BlueST-SDK instalado, consegue ter acesso facilmente a esses dados. O sensor acelerômetro foi escolhido pela vasta gama de aplicações que ele possibilita, como a medição de inclinação de objetos,  monitoramento de queda e caminhada, análise preditiva de vibrações em equipamentos industriais, e reconhecimento de ações.

Como pré-requisito para leitura desse artigo, é interessante ter um conhecimento prévio do funcionamento da comunicação BLE (serviços, características, GATT, GAP, etc). Esse artigo do Embarcados é uma ótima leitura para conhecer mais sobre essa tecnologia!

Antes de apresentar a parte prática deste artigo, as próximas seções detalham o que é o BlueST-SDK, o protocolo BlueST e como ter acesso aos dados trocados pelos devices nessa comunicação.

O que é o BlueST-SDK e o protocolo BlueST?

O BlueST-SDK é uma biblioteca multiplataforma que possibilita a comunicação BLE entre dispositivos que implementam o protocolo BlueST da STM.  Ele suporta as plataformas Android, IOS e Linux (com Python) e possui uma interface de programação comum entre elas, facilitando e acelerando o desenvolvimento de aplicações. 

Figura 2 – Plataformas compatíveis com o BlueST-SDK. Fonte: BlueST-SDK

A documentação do BlueST-SDK inclui exemplos de como utilizá-lo, quais placas são compatíveis com o mesmo e todas as especificações do protocolo BlueST.

O protocolo BlueST, por sua vez, foi desenvolvido para padronizar o formato dos dados e todos os UUIDs (identificador único universal) de serviços e características BLE implementados nas placas que são compatíveis com ele. O UUID de características desse protocolo, por exemplo, deve seguir o padrão XXXXXXXX-0001-11e1-ac36-0002a5d5c51b e seu formato de dado deve ser:

LengthName
2Timestamp
>1First feature data
>1Second feature data
Tabela 1  – Formato de dado de Características. Fonte: Manual UM2496.

Cada mensagem tem seus primeiros 2 bytes reservados para timestamp e o restante para dados da mensagem em si. Como o tamanho máximo de uma mensagem BLE é 20 bytes, o espaço reservado para dados nesse protocolo é 18 bytes!

Para o nosso projeto, o SDK listará os serviços da SensorTile procurando a caraterística padronizada do acelerômetro (0x00800000-0001-11e1-ac36-0002a5d5c51b), com o objetivo de possibilitar a exportação (acesso) de dados pela a Raspberry. Os dados de acelerômetro consistem em seus três eixos (x, y, e z). Considerando o formato do protocolo, os dados se dispõe da seguinte forma:

 
Bytes Description
0
Timestamp
1
2
X (int16)
3
4
Y (int16)
5
6
Z (int16)
7

Tabela 2 – Formato de dado do Acelerômetro. Fonte: Manual UM2496.

O protocolo BlueST já possuí implementado toda a gerência de dados provenientes de diversos tipos de sensores, como por exemplo os sensores inerciais (acelerômetro, giroscópio e magnetômetro) e ambientais (temperatura e humidade). Além das definições nativas de como lidar com dados exportados desses sensores, ele é também extensível para gerenciar dados definidos e personalizados pelo próprio usuário.

Classes Principais

As classes principais do BlueST SDK são: Manager, Node e Feature. Cada uma delas tem uma interface Listener respectiva com callbacks que são executados de forma assíncrona por threads executando em background.

BlueST-SDK
Figura 3 – Principais classes e Listeners do BlueST-SDK.

A classe Manager é responsável pelo controle do processo de descoberta de dispositivos, iniciando e terminando-o. Ela notifica que um nó foi descoberto por meio da classe ManagerListener

A classe Node é a representação de um dispositivo (nó) remoto. Ela é responsável por gerenciar o nó BLE, alocando os recursos necessários para o seu funcionamento. Para notificar a atualização de status de um nó (e.g., conectando, conectado, desconectando), utiliza a classe NodeListener. 

Já a classe Feature, representa os dados exportados por um nó. O usuário é notificado sobre um novo dado por meio da classe FeatureListener.

Fluxo de Comunicação

Tendo em mente o funcionamento das classes principais, podemos traçar o seguinte fluxo de comunicação simplificado:

BlueST-SDK
Figura 4 – Fluxo de Comunicação.

A primeira etapa do processo de conexão, consiste na fase de descoberta. Nela, a Raspberry procura por dispositivos BLE que estejam indicando sua presença por meio de mensagens de advertisement. A partir do momento que a Raspberry encontra o dispositivo desejado (SensorTile), envia uma requisição de conexão ao mesmo e, com a conexão criada, o processo de descoberta de serviços e habilitação de características disponíveis podem ser iniciados. Em seguida, é possível a Raspberry requisitar ou enviar dados para as features que foram descobertas.

As próximas seções vão descrever as etapas práticas do projeto: materiais necessários, como pode ser feita a programação na SensorTile, configuração da Raspberry, implementação de códigos utilizando o SDK e como comunicar placas.

Materiais Necessários

Os materiais necessários para reprodução do projeto são:

  • Kit SensorTile;
  • Gravador ST Link V2;
  • Raspberry Pi 3B;
  • Jumpers.

SensorTile

A SensorTile (STEVAL-STLCS01V1) é uma placa da STMicroeletronics que embarca sensores inerciais, um microfone e um barômetro; além de possuir um processador de rede BLE (BlueNRG-MS). Seu microprocessador é um STM32 baseado na arquitetura ARM Cortex-M4. Ela possui um kit de prototipagem, o STEVAL-STLKT01V1 que permite rápido desenvolvimento de aplicações. Para saber mais sobre a Sensortile e seu kit, leia esse artigo do embarcados.

Figura 5 – Kit Sensortile. Fonte: Manual UM2101.

Para esse artigo, vamos utilizar a SensorTile soldada em sua placa cradle (STLCR01V1). Entretanto, o projeto também funciona com a Sensortile acoplada em sua placa de expansão (STLCX01V1).  Esta última opção pode ser interessante se você não deseja soldar a placa (processo bem delicado), mas apenas realizar um teste rápido!

Em relação a programação da placa, vamos utilizar o firmware padrão de fábrica que já vem instalado nela (FP-SNS-ALLMEMS1). Ele encontra-se, no momento que escrevo esse artigo, na versão 4.1.0. 

Caso você nunca tenha gravado um firmware na placa e já esteja com a versão atualizada, pode seguir para a próxima seção! Do contrário, siga as instruções para gravá-lo na SensorTile.

  1. Baixe o pacote FP-SNS-ALLMEMS1;
  2. Descompacte o arquivo e vá para a pasta Binary, seguindo o path .\Projects\STM32L476RG-SensorTile\Applications\ALLMEMS1\Binary;
  3. Vamos utilizar o binário STM32L476RG-SensorTile_ALLMEMS1_BL_v4.1.0, localizado dentro da pasta Binary;
  4. Em seguida, baixe e instale o ST Link Utility, vamos utilizá-lo para gravar o binário na SensorTile;
  5. Para gravação do binário, vamos utilizar um ST Link V2 e o barramento SDW. Dessa forma, o seguinte circuito de gravação deve ser montado:
Figura 6 – Ligações para gravação de firmware.

Nesse circuito, as ligações que devem ser feitas entre a SensorTile e o gravador, estão sinalizadas por meio de cores. Pinos com cores iguais entre as placas, indicam as conexões entre elas!

  1. Ligue o gravador a SensorTile. Note que, mesmo alimentada por meio da conexão USB, a SensorTile acoplada ao cradle board precisa também estar com a bateria conectada, conforme a figura:
BlueST-SDK
Figura 7 – Alimentação de circuito de gravação.
  1. Abra o ST Link Utility e carregue o binário do passo 3, por meio da aba ‘File’;
  2. Insira o endereço 0x08000000, que é destinado ao Bootloader, no campo Address;
  3. Grave o binário por meio da aba Target -> Program e clique em Start:
BlueST-SDK
Figura 8 – Processo de gravação.
  1. Reinicie a placa. 

Em caso de sucesso, após um pequeno delay, o LED da SensorTile deverá começar a piscar (luz vermelha), indicando que as mensagens de advertisements estão sendo enviadas e que seu firmware foi gravado com sucesso! Caso você tenha tido algum problema nesse processo, cheque a alimentação e repita os passos anteriores. Para mais informações sobre o processo de gravação, acesse este guia.

Raspberry Pi 3B

A versão Python (3.5) do BlueST SDK faz uso da biblioteca bluepy disponível no Linux para conectar-se a dispositivos BLE. Dessa forma, para instalar o SDK, primeiro deve-se instalar a bluepy. É necessário também instalar o pacote futures, responsável pelo funcionamento das threads que funcionam como callbacks das classes Listeners. No terminal da Raspberry, digite os seguintes comandos:

Após essas instalações, o próximo passo consiste em baixar os códigos localizados em meu repositório do github. Para a implementação desses scripts, utilizei exemplos disponíveis na documentação do SDK. Organizei-os em quatro scripts para tornar o passo a passo do experimento mais didático. Os quatro scripts .py consistem em:

  • ble_interfaces: contém todos os listeners e os respectivos callbacks das classes principais do SDK;
  • find_mac_address: permite encontrar o endereço MAC da placa que você deseja iniciar a conexão BLE;
  • list_available_features: arquivo que lista os serviços disponíveis na placa em que a conexão foi estabelecida;
  • ble_get_acc_data: responsável por exportar as features do acelerômetro, tem como saída sua coordenadas.

Os últimos três scripts podem ser executados independentemente uns dos outros. Eles utilizam o ble_interfaces.py para descobrir nós BLE, atualizar o status desses nós e para identificar quando as features dos mesmos tiveram seus dados atualizados. Entretanto, para conseguir utilizar todas as funcionalidades dos scripts list_available_features.py e ble_get_acc_data.py, deve-se descobrir primeiramente o endereço MAC do nó (SensorTile) que se deseja obter os dados. Para isso, ligue a SensorTile e, no terminal da Raspberry, execute o script find_mac_address.py:

A tela do seu terminal deve ser exibida de forma semelhante a da figura:

BlueST-SDK
Figura 9 – Encontrando o MAC.

O endereço MAC da SensorTile é o endereço entre os colchetes do dispositivo AM1V410, que recebe essa nomenclatura por se referir ao firmware 4.1.0 do package padrão. Com esta informação poderemos utilizar os próximos scripts. Observe que nesse firmware padrão, a SensorTile entra em modo sleep em 20 segundos. Caso nenhum device seja encontrado, reinicie a SensorTile (colocando-a em modo de operação) e execute o script novamente.

Para consultar quais as features disponíveis para exportação na SensorTile, edite o valor da constante SENSORTILE_MAC_ADDRESS do script list_available_features.py, substituindo pelo endereço que você acabou de descobrir:

Salve as alterações realizadas no script e execute-o:

A seguinte tela deve ser exibida:

BlueST-SDK
Figura 10 – Listando as Features disponíveis.

Como pode ser visto, o firmware padrão da SensorTile já possuí implementado várias features disponíveis para exportação. Dentre elas, vamos acessar a feature Accelerometer. Para isto, utilizaremos o script ble_get_acc_data.py. O processo de edição da constante do endereço MAC deve também ser repetido para este script. Após isso, basta executá-lo para obter as coordenadas de acelerômetro. Como este script é o principal resultado de nosso experimento, vamos olhar com mais detalhes seu método main:

Como pode ser observado, primeiramente, é criado um gerenciador de conexão Bluetooth, responsável por descobrir devices que implementam o protocolo BlueST. Após a descoberta dos dispositivos, se o MAC da SensorTile for encontrado, um node listener será atribuído a ele, iniciando a conexão BLE, do contrário, a aplicação será encerrada. 

Com a conexão estabelecida, a interface da classe FeatureListener passará a ser utilizada, sendo responsável por obter os dados das features exportadas por meio de notificações disparadas em seu callback de atualização (on_update). O callback on_update, por sua vez, do script ble_interfaces.py, foi modificado para lidar com os dados de acelerômetro:

Sempre que notificações de dados novos chegam ao callback, o script principal ble_get_acc_data.py tem acesso a elas. Lembre-se que, para obter os dados, o SensorTile não pode ter entrado em modo sleep. Caso isso tenha ocorrido, reinicie-o e digite:

O terminal da Raspberry deve exibir os seguintes dados de acelerômetro em formato de lista, contendo as três coordenadas [x, y, z]:

BlueST-SDK
Figura 11 – Coordenadas do Acelerômetro.

Observe que, em nenhum momento, do nosso código tivemos que implementar o processo de decodificação da mensagem recebida da SensorTile. O SDK já se encarrega desse trabalho, convertendo os dados brutos, em formato hexadecimal, para valores decimais! 

Conclusão

A demonstração do projeto funcionando em tempo real pode ser vista no vídeo a seguir:

Agora que você já sabe como exportar as features do protocolo BlueST por meio de seu SDK, pode testar acessar os dados de outros sensores, como o giroscópio e o magnetômetro, obtendo assim os dados necessários para, por exemplo, calcular a orientação de um corpo no espaço, aplicando os dados obtidos em projetos de robótica e Inteligência Artificial!

Referências

STMicroeletronics. User manual UM2496: Getting started with the BlueST protocol and SDK. Rev 2. Fevereiro 2020.

STMicroeletronics. User manual UM2101: Getting started with the STEVAL-STLKT01V1 SensorTile integrated development platform. Rev 5. Março 2019.

Gomes, Felipe. SensorTile Sensor Data Monitoring Using a Raspberry Pi. Hackster.io. Acesso em: Setembro de 2020. Disponível em: <https://www.hackster.io/felipsz/sensortile-sensor-data-monitoring-using-a-raspberry-pi-7a3663?f=1>.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Comunicações » Desenvolvendo aplicações com o BlueST-SDK e Raspberry Pi
Comentários:
Notificações
Notificar
guest
0 Comentários
Inline Feedbacks
View all comments
Talvez você goste:

Séries

Menu