Прикажување на податоци од MPU-6050 сензорот на LCD 1602 или LCD2004 со Arduino
Во ова упатство, ќе научиме како да прикажуваме податоци од сензорот MPU-6050 на LCD 1602 или LCD2004 користејќи Arduino. MPU-6050 е разноврсен сензор кој комбинира 3-оски жироскоп и 3-оски акцелерометар, што го прави идеален за различни апликации како откривање движење и ориентација. Со поврзување на овој сензор со LCD екран, можеме да визуелизираме податоци во реално време, вклучувајќи агли и температура.

Како што напредуваме низ овој проект, ќе ги покриеме потребните хардверски компоненти, деталите за поврзување и имплементацијата на кодот. Ова ќе ви помогне да разберете како да го поставите MPU-6050 и да го прикажете неговиот излез на LCD. За дополнително појаснување на кодот, задолжително погледнете го видеото (во видеото на 00:00).
Објаснување на хардверот
Примарните компоненти за овој проект се Arduino плочата, сензорот MPU-6050 и LCD екранот (1602 или 2004). Arduino служи како микроконтролер кој ги обработува податоците од MPU-6050 и ги испраќа до LCD.
Сензорот MPU-6050 користи I2C комуникација за испраќање податоци до Arduino. Вклучува акцелерометар и жироскоп, кои му овозможуваат да детектира движење и ориентација. LCD екранот се користи за прикажување на аглите добиени од податоците на сензорот. Тој се поврзува со Arduino исто така преку I2C, што ја поедноставува жиците и комуникацијата.
Детали од техничката документација
| Производител | Invensense |
|---|---|
| Број на дел | MPU-6050 |
| Логички/IO напон | 3.3 V / 5 V |
| Напон на напојување | 3.3 V до 5 V |
| Стапка на излезни податоци | 1 kHz (макс.) |
| Опсег на температура | -40 до +85 °C |
| Пакет | QFN |
| Белешки / варијанти | Интегриран жироскоп и акцелерометар |
- Обезбедете соодветно напојување во рамките на специфицираниот опсег на напон.
- Користете pull-up отпорници на I2C линиите ако е потребно.
- Проверете ја I2C адресата за компатибилност со вашата поставеност.
- Калибрирајте го сензорот за точни читања.
- Бидете внимателни со жиците за да избегнете кратки споеви.
Инструкции за поврзување

За да го поврзете MPU-6050 со Arduino, започнете со поврзување на VCC пинот од MPU-6050 со 5V пинот на Arduino. Потоа, поврзете го GND пинот од MPU-6050 со еден од GND пиновите на Arduino. За I2C комуникација, поврзете го SDA пинот од MPU-6050 со аналогниот пин A4 на Arduino, и поврзете го SCL пинот со аналогниот пин A5.
За LCD екранот, поврзете го VCC пинот со 5V пинот на Arduino и GND пинот со GND пинот на Arduino исто така. Поврзете го SDA пинот од LCD со истиот A4 пин што се користи за MPU-6050, и SCL пинот од LCD со A5 пинот. На овој начин, и MPU-6050 и LCD ги делат истите I2C линии, што ја поедноставува жиците.

Осигурете се дека врските се сигурни и дека нема лабави жици. Ако вашиот LCD или сензор не се вклучи, проверете ги жиците и врските.
Примери на код и објаснување
Во кодот, започнуваме со вклучување на потребните библиотеки за MPU-6050 и LCD:
#include
#include
#include
Овде, креираме инстанци и за MPU-6050 и за LCD. MPU-6050 се иницијализира со `Wire` библиотеката за I2C комуникација, додека LCD е поставен со неговата адреса и димензии.
Во функцијата setup, ги иницијализираме сензорот и LCD:

void setup() {
Serial.begin(9600);
Wire.begin();
mpu6050.begin();
lcd.begin();
lcd.backlight();
lcd.clear();
}
Овој код поставува сериска комуникација за дебагирање, ја иницијализира I2C комуникацијата и го подготвува LCD за прикажување. Позадинското осветлување се вклучува за да се направи екранот видлив.
Во функцијата loop, континуирано читаме податоци од MPU-6050 и ги прикажуваме на LCD:
void loop() {
mpu6050.update();
lcd.clear();
lcdDisplay(mpu6050.getAngleX(), mpu6050.getAngleY(), mpu6050.getAngleZ());
delay(100);
}
Овој фрагмент ги ажурира податоците од сензорот и го чисти LCD за нови читања на секои 100 милисекунди. Функцијата `lcdDisplay` се повикува за да ги прикаже аглите на LCD.
За целосно разбирање, ве молиме погледнете го соодветното видео каде што е демонстриран целиот код (во видеото на 00:00).
Демонстрација / Што да очекувате
Кога сè е правилно поставено, LCD треба да ги прикажува аглите за X, Y и Z оските во реално време. Можете да го навалите сензорот MPU-6050 за да ги видите промените на екранот. Ако наидете на проблеми, проверете за обратен поларитет во вашите жици или осигурете се дека I2C адресите се правилно поставени.
Следењето на вредностите на LCD ќе ви овозможи да видите како сензорот реагира на движење и промени во ориентацијата. Ако вредностите изгледаат статични или неточни, проверете ги врските и осигурете се дека сензорот функционира правилно.
/*
*
* This code is basic usage of the MPU-6050 accelerometer and gyroscope.
* Running this code, you will get angles only.
* The angles at X, Y, and Z are displayed on the LCD2004-I2C display module.
*
* Library and code have been taken from:
* https://github.com/tockn/MPU6050_tockn
*
* Updated by Ahmad Shamshiri on July 07, 2018 at 13:43 in Ajax, Ontario, Canada
* for Robojax.com
* Get this code from Robojax.com
* Watch video instruction for this code at: https://youtu.be/ixe--SXemp8
*
* You will need to watch two videos before following the instructions in this video:
* 1-MPU6050 Introduction video and code: https://youtu.be/uhh7ik02aDc
* 2-LCD1602 with I2C module video and code: https://youtu.be/q9YC_GVHy5A
*/
#include <MPU6050_tockn.h>
#include <Wire.h>
MPU6050 mpu6050(Wire);
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 for a 20 chars and 4 line display
LiquidCrystal_I2C lcd(0x27, 20, 4);
void setup() {
Serial.begin(9600);
Wire.begin();
mpu6050.begin();
mpu6050.calcGyroOffsets(false);
// initialize the LCD,
lcd.begin();
// Turn on the backlight and print a message.
lcd.backlight();
lcd.clear();
lcd.setCursor (0,0); //
lcd.print("Robojax MPU-6050");
lcd.setCursor (0,1); //
lcd.print("Please Wait - 3");
lcd.setCursor (0,1); //
delay(1000);
lcd.print("Please Wait - 2");
delay(1000);
lcd.setCursor (0,1); //
lcd.print("Please Wait - 1");
delay(1000);
}
void loop() {
mpu6050.update();
Serial.print("angleX : ");
Serial.print(mpu6050.getAngleX());
Serial.print("\tangleY : ");
Serial.print(mpu6050.getAngleY());
Serial.print("\tangleZ : ");
Serial.println(mpu6050.getAngleZ());
lcd.clear();// clearn previous values from screen
lcdDisplay(
mpu6050.getAngleX(), // send angle X
mpu6050.getAngleY(), // send angle Y
mpu6050.getAngleZ() // send angle Z
);
delay(100);
}// loop end
/*
* Written by Ahmad Shamshiri for Robojax.com
* lcdDisplay(float x, float y, float z)
* displays value and title on LCD2004-I2C display
* How to use:
* just pass the three values and it will display them.
* lcdDisplay(mpu6050.getAngleX() , mpu6050.getAngleY() , mpu6050.getAngleZ() )
*/
void lcdDisplay(float x, float y, float z)
{
// Robojax.com MPU6050 Demo with LCD2004-I2C Display
lcd.setCursor (0,0); //
lcd.print("Robojax MPU-6050");
lcd.setCursor (0,1); //character zero, line 1
lcd.print("Angle X:");
lcd.setCursor (9,1); //
lcd.print(x);
lcd.setCursor (0,2); //character zero, line 2
lcd.print("Angle Y:");
lcd.setCursor (9,2); //
lcd.print(y);
lcd.setCursor (0,3); //character zero, line 3
lcd.print("Angle Z:");
lcd.setCursor (9,3); //
lcd.print(z);
}
/*
*
* This code is basic usage of the MPU-6050 accelerometer and gyroscope.
*
* This code displays data on the LCD2004 display based on
* the option you set. See below.
*
*
* Library and code have been taken from:
* https://github.com/tockn/MPU6050_tockn
*
* Updated by Ahmad Shamshiri on July 03, 2018 in Ajax, Ontario, Canada
* for Robojax.com
* Get this code from Robojax.com
* Watch video instructions for this code at: https://youtu.be/ixe--SXemp8
*
* You will need to watch two videos before following the instructions in this video:
* 1-MPU6050 Introduction video and code: https://youtu.be/uhh7ik02aDc
* 2-LCD1602 with I2C module video and code: https://youtu.be/q9YC_GVHy5A
*/
#include <MPU6050_tockn.h>
#include <Wire.h>
MPU6050 mpu6050(Wire);
long timer = 0;
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 for a 20 chars and 4 line display
LiquidCrystal_I2C lcd(0x27, 20, 4);
int typeSelect = 6;// select type . See below
String type[]={ "GyroAng and Ang",// select 0
"GyroAng and Acc",// select 1
"GyroAng and Gyro",// select 2
"AccAng and Acc",// select 3
"AccAng & Gyro",// select 4
"AccAng and Ang",// select 5
"Angle and Temp"// select 6
};
void setup() {
Serial.begin(9600);
Wire.begin();
mpu6050.begin();
mpu6050.calcGyroOffsets(true);
// initialize the LCD,
lcd.begin();
// Turn on the backlight and print a message.
lcd.backlight();
}
void loop() {
mpu6050.update();
if(millis() - timer > 1000){
Serial.println("=======================================================");
Serial.print("temp : ");Serial.println(mpu6050.getTemp());
Serial.print("accX : ");Serial.print(mpu6050.getAccX());
Serial.print("\taccY : ");Serial.print(mpu6050.getAccY());
Serial.print("\taccZ : ");Serial.println(mpu6050.getAccZ());
Serial.print("gyroX : ");Serial.print(mpu6050.getGyroX());
Serial.print("\tgyroY : ");Serial.print(mpu6050.getGyroY());
Serial.print("\tgyroZ : ");Serial.println(mpu6050.getGyroZ());
Serial.print("accAngleX : "); Serial.print(mpu6050.getAccAngleX());
Serial.print("\taccAngleY : ");Serial.println(mpu6050.getAccAngleY());
Serial.print("gyroAngleX : ");Serial.print(mpu6050.getGyroAngleX());
Serial.print("\tgyroAngleY : ");Serial.print(mpu6050.getGyroAngleY());
Serial.print("\tgyroAngleZ : ");Serial.println(mpu6050.getGyroAngleZ());
Serial.print("angleX : ");Serial.print(mpu6050.getAngleX());
Serial.print("\tangleY : ");Serial.print(mpu6050.getAngleY());
Serial.print("\tangleZ : ");Serial.println(mpu6050.getAngleZ());
Serial.println("=======================================================\n");
timer = millis();
}// if
lcd.clear();// clearn previous values from screen
switch (typeSelect)
{
case 0:// display GyroAngle and Angle
lcdDisplay(mpu6050.getGyroAngleX(),mpu6050.getGyroAngleY(),mpu6050.getGyroAngleZ(),
mpu6050.getAngleX(),mpu6050.getAngleY(),mpu6050.getAngleZ()
);
break;
case 1:// display GyroAngle and Acceleration value
lcdDisplay(mpu6050.getAngleX(),mpu6050.getAngleY(),mpu6050.getAngleZ(),
mpu6050.getAccX(),mpu6050.getAccY(),mpu6050.getAccZ()
);
break;
case 2:// display GyroAngle and Gyroscope value
lcdDisplay(mpu6050.getAngleX(),mpu6050.getAngleY(),mpu6050.getAngleZ(),
mpu6050.getGyroX(),mpu6050.getGyroY(),mpu6050.getGyroZ()
);
break;
case 3:// display Acceleration Angle and Acceleration value
lcdDisplay(mpu6050.getAccAngleX(),mpu6050.getAccAngleY(),0.0,
mpu6050.getAccX(),mpu6050.getAccY(),mpu6050.getAccZ()
);
break;
case 4:// display Acceleration Angle and Gyro value
lcdDisplay(mpu6050.getAccAngleX(),mpu6050.getAccAngleY(), 0.0,
mpu6050.getGyroX(),mpu6050.getGyroY(),mpu6050.getGyroZ()
);
break;
case 5:// display Acceleration Angle and Angle
lcdDisplay(mpu6050.getAccAngleX(),mpu6050.getAccAngleY(), 0.0,
mpu6050.getAngleX(),mpu6050.getAngleY(),mpu6050.getAngleZ()
);
break;
case 6:// display angle and Temperature
lcdDisplay(mpu6050.getAngleX(),mpu6050.getAngleY(),mpu6050.getAngleZ(),
mpu6050.getTemp(), 0.0, 0.0
);
break;
}// switch end
delay(100);
}// loop
/*
* Written by Ahmad Shamshiri for Robojax.com
* lcdDisplay(lcdDisplay(float x, float y, float z, float x1, float y1, float z1)
* displays values and titles on the LCD2004-I2C display.
* How to use:
* just pass the 6 values and it will display them.
lcdDisplay(mpu6050.getAccAngleX(),mpu6050.getAccAngleY(),mpu6050.getAccAngleZ(),
mpu6050.getAngleX(),mpu6050.getAngleY(),mpu6050.getAngleZ()
);
*/
void lcdDisplay(float x, float y, float z, float x1, float y1, float z1)
{
// Robojax.com MPU6050 Demo with LCD2004-I2C Display
lcd.setCursor (0,0); //
lcd.print(type[typeSelect]);
lcd.setCursor (17,0); //
String dis = "("+String(typeSelect)+")";
lcd.print(dis);
if(typeSelect !=6){
lcd.setCursor (0,1); //character zero, line 1
lcd.print("X:");
lcd.setCursor (2,1); //
lcd.print(x);
/////////////////////
lcd.setCursor (10,1); //character zero, line 1
lcd.print("X1:");
lcd.setCursor (13,1); //
lcd.print(x1);
lcd.setCursor (0,2); //character zero, line 2
lcd.print("Y:");
lcd.setCursor (2,2); //
lcd.print(y);
////////////////////////
lcd.setCursor (10,2); //character zero, line 1
lcd.print("Y1:");
lcd.setCursor (13,2); //
lcd.print(y1);
lcd.setCursor (0,3); //character zero, line 3
lcd.print("Z:");
lcd.setCursor (2,3); //
lcd.print(z);
//////////////////////
lcd.setCursor (10,3); //character zero, line 3
lcd.print("Z1:");
lcd.setCursor (13,3); //
lcd.print(z1);
}else{
lcd.setCursor (0,1); //character zero, line 1
lcd.print("X:");
lcd.setCursor (2,1); //
lcd.print(x);
/////////////////////
lcd.setCursor (10,1); //character zero, line 1
lcd.print("TMP: ");
lcd.setCursor (15,1); //
lcd.print(x1);
lcd.setCursor (0,2); //character zero, line 2
lcd.print("Y:");
lcd.setCursor (2,2); //
lcd.print(y);
lcd.setCursor (0,3); //character zero, line 3
lcd.print("Z:");
lcd.setCursor (2,3); //
lcd.print(z);
}
}
Ресурси и референци
-
НадворешноGet the library from GitHubgithub.com
-
НадворешноManufacturer websiteinvensense.com
Датотеки📁
Arduino библиотеки (zip)
-
Arduino library for MPU9250
robojax-MPU9250-master.zip3.38 MB
Fritzing датотека
-
LCD LCD1602-I2C module with 4 wires
LCD1602-I2C.fzpz0.01 MB -
MPU-6050 Board GY-521
MPU-6050 Board GY-521.fzpz0.01 MB -
LCD2004-I2C
LCD2004-I2C.fzpz0.02 MB
Други датотеки
-
LCD1602 LiquidCrystal Library
robojax-LCD1602_LiquidCrystal.zip -
MPU6050_tockn-masterArduino library for the MPU6050 accelerometer and gyroscope module. Provides functions to read acceleration, gyro, and temperature data, with calibration and angle calculation. Designed for easy integration into motion-sensing projects.
robojax-MPU6050_tockn-master.zip