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.
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:
pasta core-driver-eMPL destacada no diretório raiz do repositório local
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
menu Properties selecionado na aba Project
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 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
Para operar e monitorar o sensor por meio das funções disponibilizadas por esta biblioteca, deve-se, no mínimo:
int mpu_set_i2c(I2C_HandleTypeDef *i2c_selecionada)
int mpu_init(struct int_param_s *int_param)
-nesta implementação, a estrutura int_param_s não é utilizada;int mpu_set_sensors(unsigned char sensors)
;Em adição, para habilitar e utilizar o DMP do módulo, é necessário:
static signed char orientacaoDoSensor[9] = { 1, 0, 0, 0, 1, 0, 0, 0, 1 };
int dmp_load_motion_driver_firmware(void)
;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;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;int dmp_enable_feature(unsigned short mask)
, os recursos desejados;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.
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
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.
Conexões do circuito transmissor
Conexões do circuito receptor
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
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
Daí, para configurar o módulo do circuito transmissor, envie, nesta ordem, os seguintes comandos:
É esperado que, ao fim, o terminal exiba algo como o que é visto na imagem abaixo.
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:
É esperado que, ao fim, o terminal exiba algo como o que é visto na imagem abaixo.
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.
Para acessar o projeto deste post, mesmo que esse não esteja no diretório padrão de projetos do IDE,
Caminho para o menu de acesso a projetos externos ao diretório padrão
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,
Seleção de modo de compilação e carregamento
Etapa final do carregamento do programa
Após o carregamento, desconecte a BluePill do ST-LINK.
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:
|
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!