В этой статье мы рассмотрим как измерить угол наклона с помощью модуля MPU6050 и STM32F103C8. Это можно сделать, просто подключив 6-осевой гироскоп/акселерометр MPU6050 к плате STM32. Акселерометр будет передавать на плату STM32 силы ускорения вдоль осей X, Y и Z. Нам нужно преобразовать эти значения в трехмерный угол X, Y, Z, чтобы определить трехмерную ориентацию датчика. Измеренный угол наклона выводится на экран OLED дисплея.
Гироскоп измеряет скорость вращения или скорость изменения углового положения с течением времени по осям X, Y и Z. Он использует технологию MEMS и эффект Кориолиса для проведения измерений. Выходные данные гироскопа выражаются в градусах в секунду, поэтому для получения углового положения нам просто нужно интегрировать угловую скорость.
Ранее на нашем сайте мы рассматривали подключение модуля MPU6050 к следующим микроконтроллерам (платам):
Необходимые компоненты
- Плата разработки STM32F103C8 (STM32 Blue Pill) (купить на AliExpress).
- Модуль акселерометра и гироскопа MPU6050 (купить на AliExpress).
- OLED дисплей с интерфейсом I2C и диагональю экрана 0.96 дюйма (купить на AliExpress - для данного проекта выбирайте вариант дисплея с 4 контактами).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Датчик гироскопа/акселерометра MPU6050
Датчик InvenSense MPU-6050 содержит акселерометр MEMS и гироскоп MEMS в одном чипе. Он очень точный, так как поддерживает 16-битное аналого-цифровое преобразование для каждого канала. Поэтому он одновременно захватывает каналы x, y и z. Датчик использует шину I2C для взаимодействия с Arduino.
MPU-6050 не дорогой, особенно учитывая тот факт, что он сочетает в себе и акселерометр, и гироскоп.
Распиновка MPU6050
Модуль MPU-6050 имеет 8 контактов:
INT: контакт цифрового выхода прерывания.
AD0: контакт младшего разряда адреса ведомого устройства I2C. Это 0-й бит в 7-битном адресе ведомого устройства. При подключении к VCC он считывается как логическая единица, и адрес ведомого устройства изменяется.
XCL: вспомогательный контакт последовательной синхронизации. Этот контакт используется для подключения других датчиков с интерфейсом I2C к контакту SCL к MPU-6050.
XDA: вспомогательный контакт последовательных данных. Этот контакт используется для подключения других датчиков с интерфейсом I2C к контакту SDA к MPU-6050.
SCL: контакт последовательной синхронизации. Подключите этот контакт к контакту SCL микроконтроллера.
SDA: контакт последовательных данных. Подключите этот контакт к контакту SDA микроконтроллера.
GND: контакт общего провода (земли). Подключите этот контакт к общему проводу схемы.
VCC: контакт питания. Подключите этот контакт к источнику питания +5 В постоянного тока.
3-осевой гироскоп
MPU6050 состоит из 3-осевого гироскопа с технологией микроэлектромеханической системы (MEMS). Он используется для определения скорости вращения по осям X, Y, Z, как показано на рисунке ниже.
3-осевой акселерометр
MPU6050 состоит из 3-осевого акселерометра с технологией микроэлектромеханики (MEMS). Он используется для определения угла наклона или уклона по осям X, Y и Z, как показано на рисунке ниже.
Схема проекта
Схема подключения акселерометра/гироскопа MPU6050 к плате STM32F103C8 (Blue Pill) представлена на следующем рисунке. Схему можно собрать на макетной плате.
MPU6050 и OLED-дисплей являются модулями I2C. Поэтому нам нужно всего 2 провода для их сопряжения с платой STM32. Итак, подключите контакты последовательных данных (SDA) к контакту B7 платы STM32F103C8, а контакты синхронизации (SCL) к контакту B6 платы STM32F103C8. Подайте питание 3,3 В на оба модуля.
Исходный код программы
Код программы для сопряжения модуля MPU6050 с платой STM32 приведены ниже. Для компиляции кода нам понадобится несколько библиотек. Поэтому скачайте библиотеки по ссылкам ниже и добавьте их в Arduino IDE.
- Adafruit_SSD1306: https://github.com/adafruit/Adafruit_SSD1306
- Adafruit_GFX: https://github.com/adafruit/Adafruit-GFX-Library
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); const int MPU_addr=0x68; int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ; int minVal=265; int maxVal=402; double x; double y; double z; void setup(){ Wire.begin(); Wire.beginTransmission(MPU_addr); Wire.write(0x6B); Wire.write(0); Wire.endTransmission(true); Serial.begin(9600); if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306 allocation failed")); for(;;); // Don't proceed, loop forever } display.display(); delay(2); display.clearDisplay(); display.clearDisplay(); display.setTextColor(WHITE); display.setTextSize(2); display.setCursor(0,5); display.print("MPU Angles"); display.display(); delay(3000); } void loop() { Wire.beginTransmission(MPU_addr); Wire.write(0x3B); Wire.endTransmission(false); Wire.requestFrom(MPU_addr,14,true); AcX=Wire.read()<<8|Wire.read(); AcY=Wire.read()<<8|Wire.read(); AcZ=Wire.read()<<8|Wire.read(); int xAng = map(AcX,minVal,maxVal,-90,90); int yAng = map(AcY,minVal,maxVal,-90,90); int zAng = map(AcZ,minVal,maxVal,-90,90); x= RAD_TO_DEG * (atan2(-yAng, -zAng)+PI); y= RAD_TO_DEG * (atan2(-xAng, -zAng)+PI); z= RAD_TO_DEG * (atan2(-yAng, -xAng)+PI); Serial.print("AngleX= "); Serial.println(x); Serial.print("AngleY= "); Serial.println(y); Serial.print("AngleZ= "); Serial.println(z); Serial.println("-----------------------------------------"); display.clearDisplay(); display.setTextSize(2); display.setCursor(0,0); display.print("X: "); display.println(x); display.setTextSize(2); display.setCursor(0,20); display.print("Y: "); display.println(y); display.setTextSize(2); display.setCursor(0,40); display.print("Z: "); display.println(z); display.display(); delay(1000); } |
Тестирование работы проекта
Итак, как только код загружен в плату, вы можете нажать на последовательный монитор, чтобы проверить работу проекта. Вам нужно наклонить гироскоп/акселерометр MPU6050, чтобы определить угловое положение осей X, Y и Z.
Также же измеренные углы наклона можно наблюдать и на экране OLED-дисплея.
69 просмотров