Projetos

MotionDriver da InvenSense no STM32CubeIDE

Eletrogate 22 de junho de 2023

Introdução

Neste post, mostramos como utilizar a biblioteca oficial da fabricante da MPU6050 para movimentar um retângulo virtual com a placa BluePill. A leitura dos posts abaixo é de grande valia para a compreensão do projeto implementado.


MotionDriver da Invensense

A biblioteca oficial da fabricante, baixada em https://invensense.tdk.com/developers/download/emd-5-1-3/ – requer login-, foi implementada para placas de desenvolvimento da Invensense. Entretanto, seu código pode, facilmente, ser adaptado para a BluePill. Todas as alterações pertinentes feitas nos arquivos fonte e cabeçalhos estão, nestes, explicadas por comentários. Esta implementação utiliza as funções com bloqueio disponibilizadas na HAL para a interface I₂C. O tempo de espera máximo para a conclusão destas funções está configurado para 1000 ms. Isso pode ser alterado nos arquivos da biblioteca e uma função para seleção deste parâmetro pode ser criada, se necessário. A biblioteca adaptada pode ser baixada em https://github.com/eletrogate/cubeIDE-MotionDriver. Para utilizá-la em um projeto:

  • Localize, na pasta descompactada ou no repositório local, o diretório core-driver-eMPL;
pasta core-driver-eMPL destacada no diretório raiz do repositório local

pasta core-driver-eMPL destacada no diretório raiz do repositório local

  • Copie-o e cole-o no diretório raiz de seu projeto;
diretório da biblioteca destacado na raiz do projeto

diretório da biblioteca destacado na raiz do projeto

A pasta será exibida no gerenciador de arquivos do IDE:

diretório da biblioteca exibido no gerenciador de arquivos do IDE

diretório da biblioteca exibido no gerenciador de arquivos do IDE

  • Acesse Project → Properties;

    menu Properties selecionado na aba Project

    menu Properties selecionado na aba Project

  • neste, selecione C/C++ General → Paths and Symbols → Includes → Add → Is a workspace path → Workspace… → core-driver-eMPL → OK → OK
opções para inclusão do cabeçalho destacadas (1)

opções para inclusão do cabeçalho destacadas (1)

opções para inclusão do cabeçalho destacadas (2)

opções para inclusão do cabeçalho destacadas (2)

  • após, selecione C/C++ General → Paths and Symbols → Source Location → Add Folder… → core-driver-eMPL → OK → Apply and Close
opções para inclusão do código fonte destacadas

opções para inclusão do código-fonte destacadas

Para utilizar os recursos da biblioteca em seu código, insira, na divisão

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */

as diretivas

#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h"

Obs.: esta implementação da biblioteca está pré-configurada para uso junto à mpu6050. Para utilizar outro sensor, altere a diretiva #define MPU6050, na linha 159 do inv_mpu.c


Recursos da Biblioteca

Para operar e monitorar o sensor por meio das funções disponibilizadas por esta biblioteca, deve-se, no mínimo:

  • habilitar, no nome_do_projeto.ioc, uma interface i2c;
  • selecionar esta interface pela função int mpu_set_i2c(I2C_HandleTypeDef *i2c_selecionada)
  • iniciar o módulo pela função int mpu_init(struct int_param_s *int_param) -nesta implementação, a estrutura int_param_s não é utilizada;
  • habilitar os sensores desejados pela função int mpu_set_sensors(unsigned char sensors);

Em adição, para habilitar e utilizar o DMP do módulo, é necessário:

  • definir a matriz de orientação do sensor, como em
    static signed char orientacaoDoSensor[9] = { 1, 0, 0,
                                                 0, 1, 0,
                                                 0, 0, 1 };
  • carregar o firmware do processador digital de movimentos pela função int dmp_load_motion_driver_firmware(void);
  • calcular, utilizando static inline unsigned short inv_orientation_matrix_to_scalar(const signed char *mtx) com a matriz de orientação como argumento, o inteiro correspondente a esta;
  • calcular, utilizando int dmp_set_orientation(unsigned short orient)com o valor retornado pela função anterior como argumento, a orientação da mpu em seu sistema;
  • habilitar, utilizando a função int dmp_enable_feature(unsigned short mask), os recursos desejados;
  • inicializar o DMP pela função int mpu_set_dmp_state(unsigned char enable);

Os valores processados pelo DMP são disponibilizados, exclusivamente, pela fila de transmissão FIFO do módulo. Para lê-los, utilize a função int dmp_read_fifo(short *gyro, short *accel, long *quat, unsigned long *timestamp, short *sensors, unsigned char *more)

Todas as funções da biblioteca são explicadas no documento EmbeddedMotionDriver-APISpecification_pdf, baixado junto à biblioteca original.


Aplicativo para Teste

A fabricante disponibiliza, junto à biblioteca, um programa para teste da implementação do usuário. Este está escrito conforme as especificações da Python (< 3). Para este post, adaptamos o código-fonte deste programa para a sintaxe da Python (≥ 3); retiramos o suporte a recursos que não utilizaremos, em prol de simplicidade, e adaptamos a interpretação do quaternião à orientação do módulo no sistema. A versão adaptada é acessada na pasta motion-driver-client, encontrada na raiz do repositório do projeto.

pasta com o aplicativo adaptado destacada na raiz do repositório

pasta com o aplicativo adaptado destacada na raiz do repositório

Para executá-lo, é necessário ter um interpretador de Python (≥ 3) instalado. O passo-a-passo para instalação é encontrado em https://wiki.python.org/moin/BeginnersGuide/Download. Após instalar o interpretador, é necessário, também, instalar os módulos utilizados pela aplicação. Para isso, siga as instruções em https://pypi.org/project/pyserial/ e https://www.pygame.org/wiki/GettingStarted.


Diagrama do Circuito para o Projeto com MotionDriver da InvenSense no STM32CubeIDE

Conexões do circuito transmissor. Da BluePill, são conectados B6; B7; A10; A11; A13; 3v3; 5V; GND a, respectivamente, SCL e SDA da MPU; TX e RX do HC-05; INT da MPU; VCC da MPU, positivo de um capacitor eletrolítico e um terminal do capacitor cerâmico; Vout+ do conversor step-up, Vcc do HC-05 e positivo do outro capacitor eletrolítico; negativo ou GND de todos os demais componentes.

Conexões do circuito transmissor

Conexões do circuito receptor. São feitas as conexões básicas entre o conversor USB-UART e o módulo bluetooth.

Conexões do circuito receptor


Configuração dos Módulos HC-05

Para este projeto, algumas configurações são necessárias em cada módulo bluetooth. Para configurar cada um, conecte-o ao conversor USB-UART conforme o diagrama abaixo.

Conexões do circuito de configuração dos módulos bluetooth. A única adição em relação ao circuito receptor é uma conexão entre o pino Vcc do conversor USB-UART e o pino EN do módulo bluetooth.

Conexões do circuito de configuração dos módulos bluetooth

Após montar este circuito, conecte-o ao computador e abra um terminal com recursos para comunicação UART, como o monitor serial do Arduino IDE. Então, configure-o para

  • incluir, ao fim de todas as mensagens, os caracteres especiais de nova linha e retorno do carro;
  • transmitir e interpretar os dados conforme 38400 bits como taxa de transmissão.

Daí, para configurar o módulo do circuito transmissor, envie, nesta ordem, os seguintes comandos:

  • AT+ADDR?
  • AT+ROLE=0
  • AT+CMODE=0
  • AT+UART=115200,0,0
  • AT+ROLE?
  • AT+CMODE?
  • AT+UART?

É esperado que, ao fim, o terminal exiba algo como o que é visto na imagem abaixo.

Terminal após configuração do módulo transmissor.

Terminal após configuração do módulo transmissor

Entretanto, a primeira mensagem recebida será diferente, porque o endereço de cada módulo é distinto dos demais.

Concluída a configuração deste, desconecte, do computador, o circuito de configuração; substitua o módulo recém configurado pelo módulo do circuito receptor e conecte, novamente, o circuito ao PC.

Então, para configurar o módulo do circuito transmissor, envie, nesta ordem, os seguintes comandos:

  • AT+ROLE=1
  • AT+CMODE=0
  • AT+UART=115200,0,0
  • AT+BIND=X1X2X3X4,X5X6,X7X8X9X10X11X12 (em que Xn corresponde ao n-ésimo dígito do endereço retornado na primeira mensagem da configuração do módulo do circuito transmissor e cada “:” é substituído por uma “,”. Para o pareamento com nosso módulo, por exemplo, o comando é AT+BIND=98D3,31,F5358A)
  • AT+ROLE?
  • AT+CMODE?
  • AT+UART?
  • AT+BIND?

É esperado que, ao fim, o terminal exiba algo como o que é visto na imagem abaixo.

Terminal após configuração do módulo receptor.

Terminal após configuração do módulo receptor

Concluída a configuração de ambos os módulos, desconecte, do PC o circuito de configuração; desfaça a conexão entre o pino Vcc do módulo conversor USB-UART e o barramento em que se conecta o pino EN do módulo bluetooth, transformando o circuito de configuração no circuito receptor, e conecte cada módulo ao respectivo circuito.


Acesso ao Projeto pelo STM32CubeIDE

Para acessar o projeto deste post, mesmo que esse não esteja no diretório padrão de projetos do IDE,

  • abra o IDE;
  • abra o menu File → Open Projects from File System…

    Caminho para o menu de acesso a projetos externos ao diretório padrão.

    Caminho para o menu de acesso a projetos externos ao diretório padrão

  • Abra o menu de seleção Directory…; selecione a pasta do projeto; marque, caso esteja desmarcada, a caixa seletora referente à pasta e, por fim, clique em Finish.

    Procedimento no menu de acesso ao projeto.

    Procedimento no menu de acesso ao projeto

Para carregar o código, com o projeto aberto, a bateria desconectada do circuito transmissor e a BluePill conectada ao computador pelo ST-LINK V2,

  • abra, clicando na respectiva seta, o menu Build;
  • selecione 2 Release;
  • abra, clicando na respectiva seta, o menu Run;
  • acesse o menu 1 STM32 C/C++ Application

    Seleção de modo de compilação e carregamento.

    Seleção de modo de compilação e carregamento

  • selecione o Qualifier em que consta a pasta Release;
  • clique em OK.

    Etapa final do carregamento do programa.

    Etapa final do carregamento do programa

Após o carregamento, desconecte a BluePill do ST-LINK.


Demonstração e Conclusão

Quando o aplicativo for executado, o programa receptor deve estar conectado ao computador. Se nenhum argumento for passado na chamada do processo, este tentará abrir a primeira porta da lista de conexões ativas. Caso queira especificar a porta a ser aberta, execute, na pasta do aplicativo, o comando python3 .\motion-driver-client.py PORTA_A_SER_USADA

Em nossa montagem, o conversor aumentador de tensão está fixado sobre uma camada de fita isolante e uma camada de fite dupla-face. Este não deve ser fixado diretamente sobre os contatos da protoboard. Se for, poderá danificar qualquer parte do sistema.

Com esta implementação da biblioteca, muitos projetos podem utilizar mais recursos da MPU6050.

Referências:


Sobre o Autor


Eduardo Henrique

Formado técnico em mecatrônica no CEFET-MG, atualmente estuda Engenharia de Controle e Automação na UFMG.


Eletrogate

22 de junho de 2023

A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.

Conheça a Metodologia Eletrogate e Lecione um Curso de Robótica nas Escolas da sua Região!

Eletrogate Robô

Cadastre-se e fique por
dentro de novidades!