Afișarea datelor senzorului MPU-6050 pe LCD 1602 sau LCD2004 cu Arduino
În acest tutorial, vom învăța cum să afișăm datele de la senzorul MPU-6050 pe un LCD 1602 sau LCD2004 folosind Arduino. MPU-6050 este un senzor versatil care combină un giroscop pe 3 axe și un accelerometru pe 3 axe, fiind ideal pentru diverse aplicații precum detectarea mișcării și orientarea. Conectând acest senzor la un afișaj LCD, putem vizualiza datele senzorului în timp real, inclusiv unghiurile și temperatura.

Pe măsură ce avansăm în acest proiect, vom acoperi componentele hardware necesare, detaliile de cablare și implementarea codului. Acest lucru te va ajuta să înțelegi cum să configurezi MPU-6050 și să afișezi ieșirea acestuia pe un LCD. Pentru clarificări suplimentare privind codul, asigură-te că urmărești videoclipul (în videoclip la 00:00).
Hardware Explicat
Componentele principale pentru acest proiect sunt placa Arduino, senzorul MPU-6050 și afișajul LCD (fie 1602, fie 2004). Arduino servește ca microcontroler care procesează datele de la MPU-6050 și le trimite către LCD.
Senzorul MPU-6050 utilizează comunicarea I2C pentru a trimite date către Arduino. Acesta include un accelerometru și un giroscop, care îi permit să detecteze mișcarea și orientarea. Afișajul LCD este folosit pentru a arăta unghiurile derivate din datele senzorului. Se conectează la Arduino tot prin I2C, ceea ce simplifică cablarea și comunicarea.
Detalii din Fișa Tehnică
| Producător | Invensense |
|---|---|
| Număr de piesă | MPU-6050 |
| Tensiune logică/IO | 3,3 V / 5 V |
| Tensiune de alimentare | 3,3 V până la 5 V |
| Rată de date de ieșire | 1 kHz (max) |
| Interval de temperatură | -40 până la +85 °C |
| Pachet | QFN |
| Note / variante | Giroscop și accelerometru integrate |
- Asigură o alimentare adecvată în intervalul de tensiune specificat.
- Folosește rezistențe de pull-up pe liniile I2C dacă este necesar.
- Verifică adresa I2C pentru compatibilitate cu configurația ta.
- Calibrează senzorul pentru citiri precise.
- Fii atent la cablare pentru a evita scurtcircuitele.
Instrucțiuni de Cablare

Pentru a cabla MPU-6050 la Arduino, începe prin conectarea pinului VCC al MPU-6050 la pinul 5V de pe Arduino. Apoi, conectează pinul GND al MPU-6050 la unul dintre pinii GND de pe Arduino. Pentru comunicarea I2C, conectează pinul SDA al MPU-6050 la pinul analogic A4 de pe Arduino și conectează pinul SCL la pinul analogic A5.
Pentru afișajul LCD, conectează pinul VCC la pinul 5V de pe Arduino și pinul GND la pinul GND de pe Arduino. Conectează pinul SDA al LCD-ului la același pin A4 folosit pentru MPU-6050 și pinul SCL al LCD-ului la pinul A5. Astfel, atât MPU-6050, cât și LCD-ul împart aceleași linii I2C, simplificând cablarea.

Asigură-te că conexiunile sunt sigure și că nu există fire slăbite. Dacă LCD-ul sau senzorul nu se alimentează, verifică din nou cablarea și conexiunile.
Exemple de Cod și Explicații
În cod, începem prin includerea bibliotecilor necesare pentru MPU-6050 și LCD:
#include
#include
#include
Aici, creăm instanțe atât pentru MPU-6050, cât și pentru LCD. MPU-6050 este inițializat cu biblioteca `Wire` pentru comunicarea I2C, în timp ce LCD-ul este configurat cu adresa și dimensiunile sale.
În funcția de configurare, inițializăm senzorul și LCD-ul:

void setup() {
Serial.begin(9600);
Wire.begin();
mpu6050.begin();
lcd.begin();
lcd.backlight();
lcd.clear();
}
Acest cod configurează comunicarea serială pentru depanare, inițializează comunicarea I2C și pregătește LCD-ul pentru afișare. Lumina de fundal este activată pentru a face afișajul vizibil.
În funcția de buclă, citim continuu datele de la MPU-6050 și le afișăm pe LCD:
void loop() {
mpu6050.update();
lcd.clear();
lcdDisplay(mpu6050.getAngleX(), mpu6050.getAngleY(), mpu6050.getAngleZ());
delay(100);
}
Acest fragment actualizează datele senzorului și șterge LCD-ul pentru citiri noi la fiecare 100 de milisecunde. Funcția `lcdDisplay` este apelată pentru a afișa unghiurile pe LCD.
Pentru o înțelegere completă, te rugăm să urmărești videoclipul corespunzător unde este demonstrat codul complet (în videoclip la 00:00).
Demonstrație / Ce să Te Aștepți
Când totul este configurat corect, LCD-ul ar trebui să afișeze unghiurile pentru axele X, Y și Z în timp real. Poți înclina senzorul MPU-6050 pentru a vedea schimbările pe afișaj. Dacă întâmpini probleme, verifică polaritatea inversată în cablare sau asigură-te că adresele I2C sunt setate corect.
Monitorizarea valorilor pe LCD îți va permite să vezi cum răspunde senzorul la mișcare și la schimbările de orientare. Dacă valorile par statice sau incorecte, verifică conexiunile și asigură-te că senzorul funcționează corect.
/*
*
* 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);
}
}
Resurse și referințe
-
ExternGet the library from GitHubgithub.com
-
ExternManufacturer websiteinvensense.com
Fișiere📁
Biblioteci Arduino (zip)
-
Arduino library for MPU9250
robojax-MPU9250-master.zip3.38 MB
Fișier 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
Alte fișiere
-
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