Aprenda a utilizar o sensor MPU6050 junto ao microcontrolador ESP32
Dentro do subsistema de eletrônica da GDAe, fizemos a escolha estratégica de utilizar a placa ESP32 como nosso microcontrolador. A razão é clara: a ESP32 é capaz de suportar todas as atividades necessárias, incluindo a coleta de dados de sensores, armazenamento de informações e, em breve, a comunicação (um tópico que discutiremos em detalhes no próximo post ).
Um dos sensores mais essenciais em nosso kit de ferramentas é o MPU6050, que oferece a capacidade de coletar dados de movimento e orientação. Essa combinação da placa ESP32 e do MPU6050 nos permite explorar todo o potencial do nosso projeto, mantendo um alto desempenho sem sobrecarregar recursos. Fique ligado para as emocionantes atualizações que estão por vir! 🚀
O sensor MPU6050 ,também como o BMP280 ,utiliza o protocolo de comunicação I2C. Sendo assim, também não é necessário muito trabalho para conecta-lo a placa ESP32. Pasta você conectar a alimentação VCC (5V ou 3.3V) e GND (0V) e em seguida utilizar os pinos GPIO 22 ( SLC ) e GPIO 21 ( SDA ) da placa ESP32. Na imagem que segue podemos ver o esquema eletrônico para esse projeto de forma completa.
Fonte: Circuit Schools
Depois que temos o hardware montado podemos começar a programar a placa ESP32 para obter os dados do sensor. Nessa parte vamos utilizar a biblioteca da Adafruit que facilita bastante o uso de sensores padrão Adafruit e que usam a plataforma I2C. O GitHub dessa biblioteca pode se encontrada aqui. É importante citar que utilizamos um filtro de Média Móvel para diminuir o ruído existente nos dados.
/*
Teste do sensor MPU6050 com o microcontrolador ESP32 e
filtragem dos dados pelo filtro Média Móvel.
OBS: Nesse código só utilizamos um dados (aceleracao no eixo x)
mas o código pode ser facilmente alterado para todos os 7 dados que
o sensor pode nos enviar.
Testado: Não
*/
#include <Wire.h> // Biblioteca para o protocolo de cominicação I2C
#define MPU_endereco 0x68 // Endereço do sensor
#define TAMANHO_FILTRO 50 // Quantidade de amostras consideradas pelo filtro
// Variável para armazenar a leitura do valor da aceleração no
// eixo x feita pelo sensor
int16_t ax, axf;
// Protótipos das funções
void iniciarMPU();
void leituraMPU();
void leituraFiltroMPU();
void setup()
{
delay(10000); // Atraso para limpar Monitor Serial e preparar teste
Serial.begin(115200); // Iniciando porta Serial
iniciarMPU(); // Rotina para iniciar sensor
}
void loop() {
leituraFiltroMPU(); // Lendo o valor do sensor com o filtro de Média Móvel
// Para obter o valor em m/s^2 é necessário fazer a conversão de sinal analógico
// para aceleração (esse sensor está calibrado em +/- 2g)
Serial.print("ax = ");
Serial.print(axf);
}
void iniciarMPU()
{
Wire.begin(); // Inicia a comunicação I2C
Wire.beginTransmission(MPU_endereco); // Começa a transmitir os dados para o sensor
Wire.write(0x6B); // Registrador (PWR_MGMT_1)
Wire.write(0); // Manda 0 e "acorda" o MPU6050
Wire.endTransmission(true); // Finaliza a transmição
}
void leituraMPU()
{
Wire.beginTransmission(MPU_endereco); // Começa a transmitir os dados para o sensor
Wire.write(0x3B); // Registrador dos dados medidos (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU_endereco, 14, true); // Faz um "pedido" para ler 14 registradores,
// que serão os registrados com os dados medidos
ax = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
}
/*
Função que implementa a Média Móvel.
Média Móvel: é uma tecnica de filtragem de sinal que dinimui o ruído existente nos dados
brutos do sensor. Foi implementada a Média Móvel Simples a qual utiliza a média das últimas
N medidas para calcular o valor real mais provével.
*/
void leituraFiltroMPU()
{
static int i = 0, j = TAMANHO_FILTRO - 1; // Algoritmo de Two-Pointers (i, j)
static int16_t aux[TAMANHO_FILTRO], soma = 0; // Vetor com valores intermediários e soma com somas intermediárias
leituraMPU(); // Leitura bruta do sensor (possivelmente com ruído de sinal)
axf = soma + ax - aux[i]; // Atualização da soma dos N = TAMANHO_FILTRO últimas medidadas
aux[j] = ax; // Adicionando a mais nova medida na soma
j++; j %= TAMANHO_FILTRO; // Atualizando j, note que é um vetor circular
i++; i %= TAMANHO_FILTRO; // Atualizando i, note que é um vetor circular
soma = axf; // Atualizando a soma
}
Fonte: Autor
Obrigado por ler esse post até aqui. Não perca os próximos posts com cada vez mais informações e curiosidades sobre a Programação Embarcada e outras atividades do GDAe. Dale eletrônica e foguete não tem ré! 🚀
Estudante de Ciência da Computação na Universidade Federal do Ceará, Membro do subsistema da Eletrônica do GDAe.🚀