MPU6050 Gyro Sensor Interface com Placa ESP32

Tempo de leitura: 5 minutes

O módulo do sensor MPU6050 consiste em um acelerômetro e giroscópio em um único chip. Ele contém 16 bits analógicos no conversor digital para cada canal. Portanto, ele pode capturar os canais x, y e z ao mesmo tempo. O sensor usa barramento I2C para interagir com o Arduino ou qualquer outro microcontrolador. O módulo sensor MPU-6050 usado em muitas aplicações, como drones, robôs, sensores de movimento. Este sensor também é chamado de giroscópio ou acelerômetro de eixo triplo. Anteriormente, usamos este módulo para construir muitos projetos baseados em MPU6050.

No artigo de hoje, faremos a interface do acelerômetro MPU6050 e do giroscópio com ESP32 e mostraremos os valores no servidor da Web. Ao longo deste artigo, darei uma introdução básica ao MPU6050 e demonstrarei como ele pode ser conectado a uma placa de desenvolvimento ESP32 e como seus valores podem ser exibidos na página da web.

 

Componentes necessários

ESP32 NodeMCU
Módulo de acelerômetro e giroscópio MPU6050
ProtoBoard
Fios de Ligação

 

Diagrama de circuito

Diagrama de circuito para interface do acelerômetro MPU6050 e módulo de giroscópio com ESP32 é fornecido abaixo.

O MPU6050 se comunica com o ESP32 por meio do protocolo I2C, portanto, precisamos apenas de dois fios para fazer a interface ESP32 e MPU6050. Os pinos SCL e SDA do MPU6050 são conectados aos pinos D22 e D21 do ESP32, enquanto os pinos VCC e GND do MPU6050 são conectados aos 3,3 V e GND do ESP32.

Módulo Sensor MPU6050

MPU6050 é baseado na tecnologia de sistemas micro-mecânicos (MEMS). Este sensor possui um acelerômetro de 3 eixos, um giroscópio de 3 eixos e um sensor de temperatura embutido. Ele pode ser usado para medir parâmetros como aceleração, velocidade, orientação, deslocamento, etc.

O módulo MPU6050 é pequeno em tamanho e tem baixo consumo de energia, alta repetição, alta tolerância a choques e baixos preços para o usuário. O MPU6050 vem com um barramento I2C e interface de barramento I2C auxiliar e pode interferir facilmente com outros sensores, como magnetômetros e microcontroladores.

 

Explicação do código

A parte de programação do MPU6050 ESP32 é simples. O código completo é fornecido no final da página. Aqui estamos explicando algumas partes importantes.

Como de costume, inicie o código incluindo todas as bibliotecas necessárias. A biblioteca Wire.h permite que você se comunique com dispositivos I2C/TWI, enquanto a biblioteca WiFi.h fornece rotinas específicas de Wi-Fi ESP32 que estamos chamando para se conectar à rede.

#include <Wire.h>
#include <WiFi.h>

Após incluir as bibliotecas, defina algumas variáveis para armazenar os valores do acelerômetro e do giroscópio.

int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;

Nas próximas linhas, digite seu nome e senha do Wi-Fi.

const char *ssid =  "Galaxy-M20";   // Digite o nome do seu Wi-Fi
const char *pass =  "ac312124";     // Digite sua senha de Wi-Fi

Dentro do loop void setup (), inicialize a taxa de transmissão, a biblioteca de fios, o servidor da Web e a transmissão de dados por meio do registro de gerenciamento de energia.

Serial.begin(115200);
Wire.begin();
Wire.beginTransmission(MPU_addr);
Wire.write(0x6B);
Wire.write(0);
server.begin();

Na função de loop, chamamos a função mpu_read para obter as leituras do acelerômetro e do giroscópio. Essas leituras serão enviadas para a página da Web usando a função client.println().

mpu_read();

Agora nas próximas linhas, verifique se algum cliente enviou uma solicitação HTTP ou não. Se o ESP32 obtiver qualquer solicitação do cliente, ela será armazenada em caractere e exibida no monitor serial.

WiFiClient client = server.available();
 if (client)
  {                            
    Serial.println("novo cliente");         
    String currentLine = "";                  
    while (client.connected())
    {           
      if (client.available())                 
      {               
        char c = client.read();               
        if (c == '\n')

Em seguida, projete a página da Web usando html e envie cada linha para a página da Web usando a função client.println(). A tag <style> é usada para alterar o texto e a cor de fundo. Você pode alterar as propriedades nas linhas abaixo

client.print("<html><title> ESP32 WebServer</title></html>");
client.print("<body bgcolor=\"#E6E6FA\"><h1 style=\"text-align: center; color: blue\"> ESP32 WebServer </h1>");
client.print("<p style=\"text-align: left; color: red; font-size:150% \">Valores do acelerômetro: ");
client.print("<p style=\"text-align: left; font-size:150% \">AcX: ");
client.print(AcX);
client.print("<br/>AcY: ");
client.print(AcY);
client.print("<br/>AcZ: ");
client.print(AcZ);
client.print("<p style=\"text-align: left; color: red; font-size:150% \">Valores do giroscópio: ");
client.print("<p style=\"text-align: left; font-size:150% \">GyX: ");
client.print(GyX);
client.print("<br/>GyY: ");
client.print(GyY);
client.print("<br/>GyZ: ");
client.print(GyZ);
client.print("</p></body>");

Dentro do loop mpu_read(), leia todos os seis registros para os eixos X, Y e Z do acelerômetro e do giroscópio.

AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)     
AcY=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
AcZ=Wire.read()<<8|Wire.read();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
GyX=Wire.read()<<8|Wire.read();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
GyY=Wire.read()<<8|Wire.read();  // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
GyZ=Wire.read()<<8|Wire.read();  // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)

Testando o MPU6050 ESP32

Conecte o ESP32 ao laptop e carregue o código. Não se esqueça de selecionar a placa e a porta corretamente.

Certifique-se de que seu laptop compartilhe a mesma rede Wi-Fi que o ESP32. Após fazer o upload do código, abra o monitor serial. Altere a taxa de transmissão do monitor serial para 115200. Você verá o endereço IP e os valores do acelerômetro e do giroscópio no monitor serial, copie este IP e cole-o no navegador. Agora você verá os valores do MPU6050 Gyro e do acelerômetro na página da web, conforme mostrado abaixo:

 

Código

#include <Wire.h>
#include <WiFi.h>
const int MPU_addr=0x68;  // endereço I2C do MPU-6050
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
// Informações da rede WiFi.
const char *ssid =  "Galaxy-M20"; // Insira seu nome de WiFi
const char *pass =  "ac312124";   // Insira sua senha WiFi
WiFiServer server(80);
void setup(){
 Serial.begin(115200);
 Wire.begin();
 Wire.beginTransmission(MPU_addr);
 Wire.write(0x6B);  // Registro PWR_MGMT_1
 Wire.write(0);     // definido como zero (ativa o MPU-6050)
 Wire.endTransmission(true);
 Serial.println("Escreveu para IMU");
 Serial.println("Conectando à ");
 Serial.println(ssid);
 WiFi.begin(ssid, pass);
 while (WiFi.status() != WL_CONNECTED)
 {
    delay(500);
    Serial.print(".");              // imprimir ... até não estar conectado
 }
 Serial.println("");
 Serial.println("WiFi conectado");
 Serial.println("Endereço IP é: ");
 Serial.println(WiFi.localIP());
 server.begin();
 Serial.println("Servidor iniciado");
}
void loop(){
  mpu_read();
  WiFiClient client = server.available();
  if (client) 
  {                             
    Serial.println("new client");          
    String currentLine = "";      //Armazenando os dados de entrada na string
    while (client.connected()) 
    {            
      if (client.available())     //se houver alguns dados do cliente disponíveis
      {                
          char c = client.read();              // ler um byte
          if (c == '\n')                       // verifique o caractere de nova linha,
          {                     
            if (currentLine.length() == 0)      //se a linha estiver em branco, significa que é o fim da solicitação HTTP do cliente
            {     
              client.print("<html><title> ESP32 WebServer</title></html>");
              client.print("<body bgcolor=\"#E6E6FA\"><h1 style=\"text-align: center; color: blue\"> ESP32 WebServer </h1>");
              client.print("<p style=\"text-align: left; color: red; font-size:150% \">Valores do acelerômetro: ");
              client.print("<p style=\"text-align: left; font-size:150% \">AcX: ");
              client.print(AcX);
              client.print("<br/>AcY: ");
              client.print(AcY);
              client.print("<br/>AcZ: ");
              client.print(AcZ);
              client.print("<p style=\"text-align: left; color: red; font-size:150% \">Valores do giroscópio: ");
              client.print("<p style=\"text-align: left; font-size:150% \">GyX: ");
              client.print(GyX);
              client.print("<br/>GyY: ");
              client.print(GyY);
              client.print("<br/>GyZ: ");
              client.print(GyZ);
              client.print("</p></body>");        
              break;  // sair do loop while:
            } else { // se você obteve uma nova linha, limpe currentLine:
              currentLine = "";
            }
          } else if (c != '\r') { // se você tiver qualquer outra coisa além de um caractere de retorno de carro,
            currentLine += c;     // adicione-o ao final da currentLine
          }
        }
      }
   }
}
void mpu_read(){
 Wire.beginTransmission(MPU_addr);
 Wire.write(0x3B);  // começando com o registro 0x3B (ACCEL_XOUT_H)
 Wire.endTransmission(false);
 Wire.requestFrom(MPU_addr,14,true);  // solicitar um total de 14 registros
 AcX=Wire.read()<<8|Wire.read();      // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
 AcY=Wire.read()<<8|Wire.read();      // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
 AcZ=Wire.read()<<8|Wire.read();      // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
 //Tmp=Wire.read()<<8|Wire.read();    // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
 GyX=Wire.read()<<8|Wire.read();      // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
 GyY=Wire.read()<<8|Wire.read();      // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
 GyZ=Wire.read()<<8|Wire.read();      // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
 Serial.print("Valores do acelerômetro: \n");
 Serial.print("AcX: "); 
 Serial.print(AcX); 
 Serial.print("\nAcY: "); 
 Serial.print(AcY); 
 Serial.print("\nAcZ: "); 
 Serial.print(AcZ);   
 //Serial.print("\nTemperature: " );  
 //Serial.print(Tmp);
 Serial.print("\nValores do giroscópio: \n");
 Serial.print("GyX: "); 
 Serial.print(GyX); 
 Serial.print("\nGyY: "); 
 Serial.print(GyY); 
 Serial.print("\nGyZ: "); 
 Serial.print(GyZ);
 Serial.print("\n");
 delay(3000);
}

 

No Link ao lado você encontra o código completo para facilitar seu entendimento. (Link)