MPU6050 Gyro Sensor Interface com Placa ESP32
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.
Conteudo
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)