Cerca codice

Visualizzazione dei dati del sensore MPU-6050 su LCD 1602 o LCD2004 con Arduino

Visualizzazione dei dati del sensore MPU-6050 su LCD 1602 o LCD2004 con Arduino

In questo tutorial impareremo come visualizzare i dati del sensore MPU-6050 su un LCD 1602 o LCD2004 usando Arduino. L'MPU-6050 è un sensore versatile che combina un giroscopio a 3 assi e un accelerometro a 3 assi, rendendolo ideale per varie applicazioni come il rilevamento del movimento e l'orientamento. Collegando questo sensore a un display LCD, possiamo visualizzare i dati del sensore in tempo reale, inclusi angoli e temperatura.

Man mano che progrediamo in questo progetto, tratteremo i componenti hardware necessari, i dettagli del cablaggio e l'implementazione del codice. Questo ti aiuterà a capire come configurare il MPU-6050 e visualizzarne l'uscita su un LCD. Per ulteriori chiarimenti sul codice, assicurati di guardare il video (nel video a 00:00).

Hardware spiegato

I componenti principali per questo progetto sono la scheda Arduino, il sensore MPU-6050 e il display LCD (1602 o 2004). L'Arduino funge da microcontrollore che elabora i dati provenienti dal sensore MPU-6050 e li invia al display LCD.

Il sensore MPU-6050 utilizza la comunicazione I2C per inviare dati all'Arduino. Include un accelerometro e un giroscopio, che gli permettono di rilevare il movimento e l'orientamento. Il display LCD viene utilizzato per mostrare gli angoli ricavati dai dati del sensore. Anche questo si collega all'Arduino tramite I2C, il che semplifica il cablaggio e la comunicazione.

Dettagli della scheda tecnica

ProduttoreInvensense
Numero di parteMPU-6050
Tensione logica/I/O3.3 V / 5 V
Tensione di alimentazioneda 3.3 V a 5 V
Velocità di trasmissione dei dati in uscita1 kHz (massimo)
Intervallo di temperatura-40 a +85 °C
PacchettoQFN
Note / variantiGiroscopio e accelerometro integrati

  • Assicurarsi di fornire un'alimentazione adeguata entro l'intervallo di tensione specificato.
  • Usare resistori di pull-up sulle linee I2C se necessario.
  • Verifica l'indirizzo I2C per la compatibilità con la tua configurazione.
  • Calibrare il sensore per misurazioni accurate.
  • Fate attenzione al cablaggio per evitare cortocircuiti.

Istruzioni di cablaggio

arduino_wiring_MPU-6050_LCD2004_bb

Per collegare l'MPU-6050 all'Arduino, inizia collegando il pin VCC dell'MPU-6050 al pin 5V dell'Arduino. Successivamente, collega il pin GND dell'MPU-6050 a uno dei pin GND dell'Arduino. Per la comunicazione I2C, collega il pin SDA dell'MPU-6050 al pin analogico A4 dell'Arduino e collega il pin SCL al pin analogico A5.

Per il display LCD, collega il pin VCC al pin 5V dell'Arduino e il pin GND al pin GND dell'Arduino. Collega il pin SDA del LCD allo stesso pin A4 usato per l'MPU-6050 e il pin SCL del LCD al pin A5. In questo modo sia l'MPU-6050 che il LCD condividono le stesse linee I2C, semplificando il cablaggio.

Assicurati che le connessioni siano sicure e che non ci siano fili allentati. Se il tuo LCD o il sensore non si accende, ricontrolla il cablaggio e le connessioni.

Esempi di codice e guida passo passo

Nel codice, iniziamo includendo le librerie necessarie per l'MPU-6050 e per il display LCD:

#include 
#include 
#include 

Qui creiamo istanze sia dell'MPU-6050 sia dell'LCD. L'MPU-6050 viene inizializzato con la libreria Wire per la comunicazione I2C, mentre l'LCD viene configurato con il suo indirizzo e le sue dimensioni.

Nella funzione setup, inizializziamo il sensore e l'LCD:

void setup() {
  Serial.begin(9600);
  Wire.begin();
  mpu6050.begin();
  lcd.begin();
  lcd.backlight();
  lcd.clear();
}

Questo codice configura la comunicazione seriale per il debug, inizializza la comunicazione I2C e prepara l'LCD per la visualizzazione. La retroilluminazione viene accesa per rendere visibile il display.

Nella funzione loop(), leggiamo continuamente i dati dall'MPU-6050 e li visualizziamo sul display LCD:

void loop() {
  mpu6050.update();
  lcd.clear();
  lcdDisplay(mpu6050.getAngleX(), mpu6050.getAngleY(), mpu6050.getAngleZ());
  delay(100);
}

Questo frammento aggiorna i dati del sensore e pulisce il display LCD per nuove letture ogni 100 millisecondi. La funzione lcdDisplay viene chiamata per mostrare gli angoli sul display LCD.

Per una comprensione completa, si prega di guardare il video corrispondente in cui viene mostrato il codice completo (nel video a 00:00).

Dimostrazione / Cosa aspettarsi

Quando tutto è impostato correttamente, il display LCD dovrebbe visualizzare gli angoli degli assi X, Y e Z in tempo reale. Puoi inclinare il sensore MPU-6050 per vedere le variazioni sul display. Se riscontri problemi, controlla che la polarità nei collegamenti non sia invertita o assicurati che gli indirizzi I2C siano impostati correttamente.

Monitorare i valori sul display LCD ti permetterà di vedere come il sensore risponde ai movimenti e ai cambiamenti di orientamento. Se i valori appaiono statici o errati, verifica le connessioni e assicurati che il sensore funzioni correttamente.

Immagini

arduino_wiring_MPU-6050_LCD2004_bb
arduino_wiring_MPU-6050_LCD2004_bb
LCD2004_display-3
LCD2004_display-3
LCD2004_display-1
LCD2004_display-1
LCD2004_display-2
LCD2004_display-2
119-Arduino code for MPU-6050 accelerometer and gyroscope sensor (angles only)
Lingua: C++
/*
 * 
 * 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);   
 
}
120-Arduino code for the MPU-6050 accelerometer and gyroscope sensor (all data)
Lingua: C++
/*
 * 
 * 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);   

  
    }
 
}

File📁

Librerie Arduino (zip)

File Fritzing

Altri file