نمایش دادههای حساس(حس کننده) MPU-6050 بر روی LCD 1602 یا LCD2004 با آردوینو
در این آموزش یاد میگیریم چگونه دادههای حساس(حس کننده) MPU-6050 را با استفاده از Arduino روی نمایشگر LCD 1602 یا LCD2004 نمایش دهیم. MPU-6050 یک حساس(حس کننده) چندکاره است که یک ژیروسکوپ سهمحوره و یک شتابسنج سهمحوره را با هم ترکیب میکند و آن را برای کاربردهای مختلفی مانند تشخیص حرکت و تعیین جهتگیری مناسب میسازد. با اتصال این حساس(حس کننده) به نمایشگر LCD میتوانیم دادههای حساس(حس کننده) را بهصورت زمان واقعی مشاهده کنیم، از جمله زاویهها و دما.

همانطور که در طول این پروژه پیش میرویم، اجزای سختافزاری لازم، جزئیات سیمکشی و پیادهسازی شِفر (کود) را بررسی خواهیم کرد. این به شما کمک میکند تا بفهمید چگونه MPU-6050 را راهاندازی کرده و خروجی آن را روی یک LCD نمایش دهید. برای روشنتر شدن شِفر (کود)، حتماً ویدیو را در زمان 00:00 مشاهده کنید.
توضیح سختافزار
اجزای اصلی این پروژه برد آردوینو، حساس(حس کننده) MPU-6050 و نمایشگر LCD (یا 1602 یا 2004) هستند. آردوینو بهعنوان میکروکنترلری عمل میکند که دادهها را از MPU-6050 پردازش کرده و به LCD ارسال میکند.
حساس(حس کننده) MPU-6050 از ارتباط I2C برای ارسال دادهها به آردوینو استفاده میکند. این حساس(حس کننده) شامل یک شتابسنج و یک ژیروسکوپ است که به آن امکان حس کردن حرکت و جهتگیری را میدهد. نمایشگر LCD برای نشاندادن زاویههایی که از دادههای حساس(حس کننده) بهدست آمدهاند استفاده میشود. این نمایشگر نیز از طریق I2C به آردوینو متصل میشود که سیمکشی و ارتباط را سادهتر میکند.
جزئیات برگه مشخصات
| تولیدکننده | اینونسنس |
|---|---|
| شماره قطعه | MPU-6050 |
| ولتاژ منطق/ورودی-خروجی | 3.3 ولت / 5 ولت |
| ولتاژ تغذیه | 3.3 ولت تا 5 ولت |
| نرخ داده خروجی | 1 kHz (حداکثر) |
| دامنهٔ دما | -40 تا +85 °C |
| بسته | کیو اف ان |
| یادداشتها / انواع | ژیروسکوپ و شتابسنج یکپارچه |
- از تأمین برق مناسب در محدوده ولتاژ مشخص شده اطمینان حاصل کنید.
- در صورت لزوم از مقاومتهای پولآپ روی خطوط I2C استفاده کنید.
- آدرس I2C را برای سازگاری با پیکربندی خود بررسی کنید.
- برای قرائتهای دقیق، حساس(حس کننده) را کالیبره کنید.
- در سیمکشی مراقب باشید تا از ایجاد اتصال کوتاه جلوگیری کنید.
دستورالعملهای سیمکشی

برای سیمکشی MPU-6050 به آردوینو، با اتصال پایه VCC ماجیول MPU-6050 به پایه 5V روی آردوینو شروع کنید. سپس پایه GND MPU-6050 را به یکی از پایههای GND روی آردوینو وصل کنید. برای ارتباط I2C، پایه SDA MPU-6050 را به پایه آنالوگ A4 آردوینو و پایه SCL را به پایه آنالوگ A5 متصل کنید.
برای نمایشگر LCD، پایه VCC را به پایه 5V روی آردوینو و پایه GND را نیز به پایه GND روی آردوینو وصل کنید. پایه SDA نمایشگر را به همان پایه A4 که برای MPU-6050 استفاده میشود وصل کنید و پایه SCL نمایشگر را به پایه 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);
}
این قطعه شِفر (کود) دادههای حساس(حس کننده) را بهروزرسانی میکند و هر 100 میلیثانیه السیدی را برای خوانشهای جدید پاک میکند. تابع lcdDisplay فراخوانی میشود تا زاویهها را روی السیدی نمایش دهد.
برای درک کامل، لطفاً ویدیوی مربوطه را تماشا کنید که شِفر (کود) کامل در آن نمایش داده شده است (در ویدیو در 00:00).
نمایش / چه انتظاری باید داشته باشید
وقتی همهچیز بهدرستی تنظیم شده باشد، السیدی باید زاویههای محورهای 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);
}
}
منابع و مراجع
-
خارجیوبسایت تولیدکنندهinvensense.com
-
خارجیکتابخانه را از گیتهاب دریافت کنیدgithub.com
فایلها📁
کتابخانههای آردوینو (zip)
-
کتابخانه آردوینو برای MPU9250
robojax-MPU9250-master.zip3.38 MB
فایل فریزینگ
-
ماجیول LCD LCD1602-I2C با ۴ سیم
LCD1602-I2C.fzpz0.01 MB -
برد MPU-6050 GY-521
MPU-6050 Board GY-521.fzpz0.01 MB -
LCD2004-I2C
LCD2004-I2C.fzpz0.02 MB
سایر فایلها
-
کتابخانه LiquidCrystal LCD1602
robojax-LCD1602_LiquidCrystal.zip