Сенсорный модуль MPU6050 состоит из акселерометра и гироскопа в одной микросхеме. Он содержит 16 битный АЦП для каждого канала. Таким образом, он может считывать данные по каналам осей x, y и z одновременно. Датчик использует I2C-шину для взаимодействия с Arduino или любым другим микроконтроллером. Сенсорный модуль MPU-6050 используется во многих приложениях, таких как дроны, роботы, датчики движения.
В сегодняшней статье мы собираемся связать акселерометр и гироскоп MPU6050 с ESP32 и выводить предоставляемые значения об ускорении и угловой скорости через веб-сервер.
Для начала подключим MPU6050 к ESP32. Принципиальная схема подключения акселерометра / гироскопа MPU6050 к ESP32 приведена далее.
MPU6050 связывается с ESP32 по протоколу I2C, поэтому нам нужно только два провода для взаимодействия ESP32 и MPU6050. Контакты SCL и SDA MPU6050 подключены к контактам D22 и D21 ESP32, а контакты VCC и GND MPU6050 подключены к 3,3 В и заземлению ESP32.
На модуле MPU6050 все выводы подписаны.
MPU6050 основан на технологии микромеханических систем (MEMS). Этот датчик имеет 3-осевой акселерометр, 3-осевой гироскоп и встроенный датчик температуры. Его можно использовать для измерения таких параметров, как ускорение, скорость, ориентация, смещение и т. д. Модуль MPU6050 имеет небольшие размеры и низкое энергопотребление, высокую повторяемость, высокую устойчивость к ударам и низкую цену. MPU6050 поставляется с шиной I2C и может легко взаимодействовать с другими датчиками, такими как магнитометры и микроконтроллеры.
Программа для взаимодействия ESP32 с MPU6050 проста. Полный код с комментариями приведен далее.
#include <Wire.h>
#include <WiFi.h>
const int MPU_addr=0x68; // I2C-адрес MPU-6050
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
// Информация о сети WiFi.
const char *ssid = "Galaxy-M20"; // Введите название сети WiFi
const char *pass = "ac312124"; // Введите пароль сети WiFi
WiFiServer server(80);
void setup(){
Serial.begin(115200);
Wire.begin();
Wire.beginTransmission(MPU_addr);
Wire.write(0x6B); // регистр PWR_MGMT_1
Wire.write(0); // установить в ноль (будит MPU-6050)
Wire.endTransmission(true);
Serial.println("Wrote to IMU");
Serial.println("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print("."); // печатать ... пока не подключится
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address is : ");
Serial.println(WiFi.localIP());
server.begin();
Serial.println("Server started");
}
void loop(){
mpu_read();
WiFiClient client = server.available();
if (client)
{
Serial.println("new client");
String currentLine = ""; //Хранение входящих данных в строке
while (client.connected())
{
if (client.available()) //если есть доступные данные клиента
{
char c = client.read(); // читать байт
if (c == '\n') // проверить наличие символа новой строки,
{
if (currentLine.length() == 0) //если строка пуста, это означает конец HTTP-запроса клиента
{
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% \">Accelerometer Values: ");
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% \">Gyroscope Values: ");
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; // вырваться из цикла while:
}
else
{ // если вы получили новую строку, очистите currentLine:
currentLine = "";
}
}
else if (c != '\r')
{ // если получили что-то еще, кроме символа возврата каретки,
currentLine += c; // добавить это в конец currentLine
}
}
}
}
}
void mpu_read(){
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B); // начинаем с регистра 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr,14,true); // запросить всего 14 регистров
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("Accelerometer Values: \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("\nGyroscope Values: \n");
Serial.print("GyX: "); Serial.print(GyX); Serial.print("\nGyY: "); Serial.print(GyY); Serial.print("\nGyZ: "); Serial.print(GyZ);
Serial.print("\n");
delay(3000);
}
Подключите ESP32 к ноутбуку и загрузите код. Не забудьте правильно выбрать плату и порт. Убедитесь, что ваш ноутбук подключен к той же сети Wi-Fi, что и ESP32. После загрузки кода откройте последовательный монитор. Измените скорость передачи данных последовательного монитора на 115200. Вы увидите IP-адрес и значения акселерометра и гироскопа, скопируйте этот IP-адрес и вставьте его в браузер. Теперь вы увидите значения гироскопа и акселерометра MPU6050 на веб-странице, как показано далее на следующем изображении.
Теперь вы можете использовать эти значения для создания чего-нибудь классного, например, самобалансирующегося робота, робота-манипулятора и т.д.
© digitrode.ru