Гироскопический датчик MPU6050 имеет достаточно много функций в своем составе. Он включает в себя микро электромеханический акселерометр (измеритель ускорения), микро электромеханический гироскоп и датчик температуры. Датчик обеспечивает высокую точность преобразования аналоговых значений в цифровые поскольку имеет на каждом канале 16-битный АЦП (аналого-цифровой преобразователь). Этот модуль способен одновременно обрабатывать информацию сразу по трем осям (каналам): x, y и z. Он имеет интерфейс I2C для взаимодействия с другими устройствами. Это один из немногих компактных модулей на рынке, который имеет в своем составе и гироскоп, и акселерометр. Этот модуль находит широкое применение в таких устройствах как дроны, роботы, датчики движения. Также этот модуль иногда называют гироскопом или трехосевым акселерометром.
В этой статье мы рассмотрим подключение датчика (гироскопа) MPU6050 к плате Arduino и будем отображать поступающие от него значения на ЖК дисплее 16x2.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Гироскопический датчик (гироскоп) MPU-6050 (купить на AliExpress).
- ЖК дисплей 16х2 (купить на AliExpress).
- Потенциометр 10 кОм (купить на AliExpress).
- Соединительные провода.
- Макетная плата.
- USB кабель.
- Источник питания
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Гироскопический датчик (гироскоп) MPU-6050
MPU-6050 представляет собой 8-пиновый 6-осевой гироскоп и акселерометр на едином чипе. По умолчанию данный модуль работает по интерфейсу I2C, но можно задействовать и интерфейс SPI. В нашем проекте мы будем использовать интерфейс (режим) I2C и в этом режиме нам понадобятся контакты SDA и SCL модуля.
Распиновка MPU-6050:
Vcc – контакт для подачи питающего напряжения постоянного тока;
GND – земля модуля;
SDA – это контакт используется для передачи данных между модулем mpu6050 и микроконтроллером;
SCL – вход синхронизации;
XDA – линия передачи данных (опциональная) по протоколу I2C для конфигурирования и считывания данных с внешних датчиков (не используется в нашем проекте);
XCL – вход синхронизации протокола I2C для конфигурирования и считывания данных с внешних датчиков (не используется в нашем проекте);
ADO – I2C Slave Address LSB (не используется в нашем проекте);
INT – контакт прерывания для индикации готовности данных.
Общие принципы работы проекта
В этом проекте мы будем показывать на экране ЖК дисплея данные температуры, гироскопа и акселерометра, считываемые с датчика MPU6050. С этого датчика можно считывать "сырые" (row values) и нормированные значения, но "сырые" значения нестабильны, поэтому на экране ЖК дисплея мы будем показывать нормированные значения.
Сначала на ЖК дисплее мы будем показывать температуру, затем через 10 секунд будем показывать данные гироскопа и еще через 10 секунд данные акселерометра.
Работа схемы
Схема подключения гироскопа MPU6050 к плате Arduino представлена на следующем рисунке.
Наш проект мы запитали по кабелю USB от компьютера. Потенциометр 10 кОм используется для регулировки яркости ЖК дисплея. У датчика MPU6050 мы задействовали 5 контактов:
- контакт питания – к контакту 3.3v платы Arduino;
- землю – к земле платы Arduino;
- контакты SCL и SDA датчика MPU6050 – к контактам A4 и A5 платы Arduino;
- контакт прерывания (INT) MPU6050 – к контакту прерывания 0 (D2) платы Arduino.
Контакты RS, RW и EN ЖК дисплея непосредственно подключены к контактам 8, gnd и 9 платы Arduino. Контакты данных ЖК дисплея подключены к контактам 10, 11, 12 и 13 платы Arduino.
Объяснение работы программы для Arduino
В нашем проекте для взаимодействия с гироскопом MPU6050 мы использовали специальную библиотеку (MPU6050 library) для работы с ним. Скачайте ее по приведенной ссылке с сервиса GitHub и установите ее в вашу Arduino IDE.
Перед загрузкой нашей программы (приведенной в конце статьи) в плату Arduino вы можете протестировать работу примеров, которые идут вместе со скачанной библиотекой. Также в программе мы должны подключить библиотеку для работы с ЖК дисплеем и сообщить плате Arduino, к каким ее контактам подключен ЖК дисплей.
1 2 3 4 |
#include<LiquidCrystal.h> LiquidCrystal lcd(8,9,10,11,12,13); #include <Wire.h> #include <MPU6050.h> |
В функции setup мы инициализируем подключенные устройства и показываем приветственное сообщение на экране ЖК дисплея.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void setup() { lcd.begin(16,2); lcd.createChar(0, degree); Serial.begin(9600); Serial.println("Initialize MPU6050"); while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G)) { lcd.clear(); lcd.print("Device not Found"); Serial.println("Could not find a valid MPU6050 sensor, check wiring!"); delay(500); } count=0; mpu.calibrateGyro(); mpu.setThreshold(3); |
В функции loop мы будем последовательно вызывать три функции каждые 10 секунд для отображения на экране ЖК дисплее данных температуры, гироскопа и акселерометра. Эти три функции, соответственно, называются tempShow, gyroShow и accelShow.
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 |
void loop() { lcd.clear(); lcd.print("Temperature"); long st=millis(); Serial.println("Temperature"); while(millis()<st+period) { lcd.setCursor(0,1); tempShow(); } lcd.clear(); lcd.print("Gyro"); delay(2000); st=millis(); Serial.println("Gyro"); while(millis()<st+period) { lcd.setCursor(0,1); gyroShow(); } lcd.clear(); lcd.print("Accelerometer"); delay(2000); st=millis(); |
Гироскоп и акселерометр датчика MPU6050 вместе используются для определения местоположения и ориентации какого либо устройства. Гироскоп использует силу тяжести для определения местоположения по осям x, y и z, а акселерометр анализирует изменения направления движения объекта. На нашем сайте мы уже рассматривали другие проекты с применением акселерометра, вы их можете посмотреть по этой ссылке.
Далее приведен полный код программы.
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 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
#include<LiquidCrystal.h> // библиотека для работы с ЖК дсиплеем LiquidCrystal lcd(8,9,10,11,12,13); // номера контактов, к которым подключен ЖК дисплей #include <Wire.h> #include <MPU6050.h> // библиотека для работы с датчиком MPU6050 (ссылка для ее скачивания приведена в тексте статьи) #define period 10000 MPU6050 mpu; int count=0; char okFlag=0; byte degree[8] = { 0b00000, 0b00110, 0b01111, 0b00110, 0b00000, 0b00000, 0b00000, 0b00000 }; // символ градуса void setup() { lcd.begin(16,2); lcd.createChar(0, degree); Serial.begin(9600); // инициализируем последовательный порт для работы на скорости 9600 бод/с Serial.println("Initialize MPU6050"); while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G)) { //если нет соединения с MPU6050, выдаем предупреждающие сообщения lcd.clear(); lcd.print("Device not Found"); Serial.println("Could not find a valid MPU6050 sensor, check wiring!"); delay(500); } count=0; mpu.calibrateGyro(); // калибровка гироскопа mpu.setThreshold(3); lcd.clear(); lcd.print("MPU6050 Interface"); lcd.setCursor(0,1); lcd.print(" Circuit Digest"); delay(2000); lcd.clear(); } void loop() { lcd.clear(); lcd.print("Temperature"); long st=millis(); Serial.println("Temperature"); while(millis()<st+period) { lcd.setCursor(0,1); tempShow(); } lcd.clear(); lcd.print("Gyro"); delay(2000); st=millis(); Serial.println("Gyro"); while(millis()<st+period) { lcd.setCursor(0,1); gyroShow(); } lcd.clear(); lcd.print("Accelerometer"); delay(2000); st=millis(); Serial.println("Accelerometer"); while(millis()<st+period) { lcd.setCursor(0,1); accelShow(); } } void tempShow() //данные температуры { float temp = mpu.readTemperature(); Serial.print(" Temp = "); Serial.print(temp); Serial.println(" *C"); lcd.clear(); lcd.print("Temperature"); lcd.setCursor(0,1); lcd.print(temp); lcd.write((byte)0); lcd.print("C"); delay(400); } void gyroShow() //данные гироскопа { //lcd.setCursor(0,0); lcd.clear(); lcd.print(" X Y Z"); Vector rawGyro = mpu.readRawGyro(); Vector normGyro = mpu.readNormalizeGyro(); lcd.setCursor(0,1); lcd.print(normGyro.XAxis,1); lcd.setCursor(6,1); lcd.print(normGyro.YAxis,1); lcd.setCursor(12,1); lcd.print(normGyro.ZAxis,1); Serial.print(" Xnorm = "); Serial.print(normGyro.XAxis); Serial.print(" Ynorm = "); Serial.print(normGyro.YAxis); Serial.print(" Znorm = "); Serial.println(normGyro.ZAxis); delay(200); } void accelShow() // данные акселерометра { // lcd.setCursor(0,0); lcd.clear(); lcd.print(" X Y Z"); Vector rawAccel = mpu.readRawAccel(); Vector normAccel = mpu.readNormalizeAccel(); lcd.setCursor(0,1); lcd.print(normAccel.XAxis,1); lcd.setCursor(6,1); lcd.print(normAccel.YAxis,1); lcd.setCursor(12,1); lcd.print(normAccel.ZAxis,1); Serial.print(" Xnorm = "); Serial.print(normAccel.XAxis); Serial.print(" Ynorm = "); Serial.print(normAccel.YAxis); Serial.print(" Znorm = "); Serial.println(normAccel.ZAxis); delay(200); } |
Можно ли подключить его к телефону и заставить с него собирать данные(поворот и остальное) если можно то как?
Конечно, самый простой способ сделать это, на мой взгляд, с помощью Bluetooth модуля HC-05 (HC-06), подключенного к плате Arduino, и какого-нибудь приложения на смартфоне, которое может считывать данные с Bluetooth соединения. Можете посмотреть вот этот проект измерителя уровня (там рассматривается в точности такая проблема) или посмотреть все проекты на нашем сайте, использующие Bluetooth (среди них наверняка найдете подходящее для себя приложение).