• ESP32 e MPU6050

    Aprenda a utilizar o sensor MPU6050 junto ao microcontrolador ESP32

Introdução

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! 🚀

Esquema Elétrico

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 ) GPIO 21 ( SDA )  da placa ESP32. Na imagem que segue podemos ver o esquema eletrônico para esse projeto de forma completa. 

ESP32

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.

Programação da ESP32

Arduino
				/*
 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é! 🚀

Roberto Sérgio

Estudante de Ciência da Computação na Universidade Federal do Ceará, Membro do subsistema da Eletrônica do GDAe.🚀