Nota

Ciao, benvenuto nella community di appassionati di SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino e ESP32 insieme ad altri appassionati.

Perché unirsi?

  • Supporto esperto: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra community e del nostro team.

  • Impara e condividi: Scambia suggerimenti e tutorial per migliorare le tue competenze.

  • Anteprime esclusive: Ottieni accesso anticipato agli annunci di nuovi prodotti e anteprime.

  • Sconti speciali: Goditi sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni festive e giveaway: Partecipa a giveaway e promozioni festive.

👉 Pronto a esplorare e creare con noi? Clicca [Qui] e unisciti oggi stesso!

QMC5883L

Panoramica

In questo tutorial esploreremo il modulo IMU GY-87, concentrandoci sul magnetometro QMC5883L. La prima parte del tutorial ti guiderà nella calibrazione del magnetometro QMC5883L, essenziale per misurazioni accurate del campo magnetico. Imparerai come caricare uno sketch di calibrazione su Arduino, eseguire la calibrazione in tempo reale e applicare queste impostazioni nei tuoi progetti. La seconda parte del tutorial copre l’inizializzazione dell’MPU6050 (accelerometro e giroscopio) e del QMC5883L su un Arduino Uno utilizzando le librerie Adafruit MPU6050 e QMC5883LCompass. Imparerai come leggere e visualizzare i dati dei sensori sul Serial Monitor, una competenza fondamentale per applicazioni in navigazione, tracciamento dei movimenti e rilevamento dell’orientamento.

Componenti necessari

In questo progetto, abbiamo bisogno dei seguenti componenti.

È sicuramente conveniente acquistare un kit completo, ecco il link:

Nome

OGGETTI IN QUESTO KIT

LINK

Elite Explorer Kit

300+

Elite Explorer Kit

Puoi anche acquistarli separatamente dai link sottostanti.

INTRODUZIONE AI COMPONENTI

LINK PER L’ACQUISTO

Arduino Uno R4 WiFi

-

Cavi Jumper

ACQUISTA

Modulo IMU GY-87

-

Cablaggio

../_images/09-gy87_bb1.png

Schema elettrico

../_images/09_basic_gy87_schematic.png

Installazione della libreria

Nota

Per installare la libreria, usa il Gestore Librerie di Arduino.

  • Cerca «Adafruit MPU6050» e installa.

    Durante l’installazione di ogni libreria, assicurati di selezionare l’installazione di tutte le dipendenze.

    ../_images/09-add_lib_tip.png
  • Cerca «QMC5883LCompass» e installa.

Calibrare QMC5883L

Nota

  • Puoi aprire direttamente il file 09-gy87_compass_calibration.ino nel percorso elite-explorer-kit-main\basic_project\09-gy87_compass_calibration.

  • Oppure copia questo codice nell’IDE di Arduino.

09-gy87_compass_calibration.ino
 1/*
 2  This code is used to calibrate the QMC5883L magnetometer in the gy-87 module.
 3
 4  Upload this calibration sketch onto your Arduino to provide calibration for 
 5  your QMC5883L chip. After upload, run the serial monitor and follow the directions.
 6  When prompted, copy the last line into your project's actual sketch.
 7
 8  Board: Arduino Uno R4
 9  Component: GY-87 IMU Module
10  Library: https://github.com/adafruit/Adafruit_MPU6050  (Adafruit MPU6050 by Adafruit)
11           https://github.com/mprograms/QMC5883LCompass  (QMC5883LCompass by MPrograms)
12           https://github.com/adafruit/Adafruit-BMP085-Library  (Adafruit BMP085 Library by Adafruit)
13*/
14
15#include <Adafruit_MPU6050.h>
16#include <QMC5883LCompass.h>
17
18Adafruit_MPU6050 mpu;
19QMC5883LCompass compass;
20
21void setup() {
22  Serial.begin(9600);
23  
24  initializeMPU6050();
25
26  // Enable I2C bypass on MPU6050 to directly access the QMC5883L magnetometer
27  mpu.setI2CBypass(true);
28
29  compass.init();
30  
31  Serial.println("This will provide calibration settings for your QMC5883L chip. When prompted, move the magnetometer in all directions until the calibration is complete.");
32  Serial.println("Calibration will begin in 5 seconds.");
33  delay(5000);
34
35  Serial.println("CALIBRATING. Keep moving your sensor...");
36  compass.calibrate();
37
38  Serial.println("DONE. Copy the lines below and paste it into your projects sketch.);");
39  Serial.println();
40  Serial.print("compass.setCalibrationOffsets(");
41  Serial.print(compass.getCalibrationOffset(0));
42  Serial.print(", ");
43  Serial.print(compass.getCalibrationOffset(1));
44  Serial.print(", ");
45  Serial.print(compass.getCalibrationOffset(2));
46  Serial.println(");");
47  Serial.print("compass.setCalibrationScales(");
48  Serial.print(compass.getCalibrationScale(0));
49  Serial.print(", ");
50  Serial.print(compass.getCalibrationScale(1));
51  Serial.print(", ");
52  Serial.print(compass.getCalibrationScale(2));
53  Serial.println(");");
54}
55
56void loop() {
57  delay(1000);
58}
59
60void initializeMPU6050() {
61  // Check if the MPU6050 sensor is detected
62  if (!mpu.begin()) {
63    Serial.println("Failed to find MPU6050 chip");
64    while (1)
65      ;  // Halt if sensor not found
66  }
67  Serial.println("MPU6050 Found!");
68
69  // set accelerometer range to +-8G
70  mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
71
72  // set gyro range to +- 500 deg/s
73  mpu.setGyroRange(MPU6050_RANGE_500_DEG);
74
75  // set filter bandwidth to 21 Hz
76  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
77
78  Serial.println("");
79  delay(100);
80}

Dopo aver caricato il codice, apri il monitor seriale. Segui le istruzioni nel monitor seriale per calibrare il QMC5883L. Quando ti viene chiesto di muovere il sensore, si consiglia di utilizzare il metodo di calibrazione a 8. In alternativa, mantieni semplicemente il sensore parallelo al suolo e ruotalo in senso orario o antiorario fino a quando il monitor seriale indica che la calibrazione è completa.

../_images/09_calibrate_qmc5883l.png

Una volta raccolti tutti i dati di calibrazione, lo sketch ti fornirà un codice simile a compass.setCalibrationOffsets(-375.00, -179.00, 85.00); e compass.setCalibrationScales(1.04, 0.96, 1.01);. Copia questo codice. Potresti volerlo salvare per riferimento futuro.

Quando utilizzi il QMC5883L: apri lo sketch del tuo progetto e incolla la linea di codice copiata direttamente sotto la chiamata compass.init(). Proprio così:

void initializeQMC5883L() {

  compass.init();

  // Sostituisci il codice sottostante con i risultati della tua calibrazione
  compass.setCalibrationOffsets(-375.00, -179.00, 85.00);
  compass.setCalibrationScales(1.04, 0.96, 1.01);

}

Codice

Nota

I magnetometri devono essere calibrati (Calibrare QMC5883L) prima di poter essere utilizzati come bussole e devono essere mantenuti livellati durante l’uso e tenuti lontani da oggetti di ferro, materiali magnetizzati e fili portatori di corrente.

Nota

  • Puoi aprire direttamente il file 09-gy87_qmc5883l.ino nel percorso elite-explorer-kit-main\basic_project\09-gy87_qmc5883l.

  • Oppure copia questo codice nell’IDE di Arduino.

  • Inserisci il codice ottenuto dai passaggi di calibrazione sotto la linea di codice compass.init() nella funzione initializeQMC5883L().

09-gy87_qmc5883l.ino
  1/*
  2  This Arduino code interfaces with the GY-87 IMU  module, focusing specifically on 
  3  the QMC5883L magnetometer for measuring magnetic field data. It initializes the 
  4  QMC5883L sensor and continuously outputs its readings, including directional data, 
  5  to the Serial Monitor.
  6  
  7  Board: Arduino Uno R4
  8  Component: GY-87 IMU Module
  9  Library: https://github.com/adafruit/Adafruit_MPU6050  (Adafruit MPU6050 by Adafruit)
 10           https://github.com/mprograms/QMC5883LCompass  (QMC5883LCompass by MPrograms)
 11*/
 12
 13// Include required libraries
 14#include <Adafruit_MPU6050.h>
 15#include <Adafruit_Sensor.h>
 16#include <Wire.h>
 17#include <QMC5883LCompass.h>
 18
 19// Initialize sensor objects
 20Adafruit_MPU6050 mpu;
 21QMC5883LCompass compass;
 22
 23void setup() {
 24  // Initialize the serial communication with a baud rate of 9600
 25  Serial.begin(9600);
 26
 27  // Initialize the MPU6050 sensor (accelerometer and gyroscope)
 28  initializeMPU6050();
 29
 30  // Enable I2C bypass on MPU6050 to directly access the QMC5883L magnetometer
 31  mpu.setI2CBypass(true);
 32
 33  // Initialize the QMC5883L magnetometer sensor
 34  initializeQMC5883L();
 35}
 36
 37
 38void loop() {
 39  // Print QMC5883L data
 40  printQMC5883L();
 41
 42  delay(500);
 43}
 44
 45void initializeQMC5883L() {
 46  compass.init();
 47
 48  // You should replace the code below according to your calibration results
 49  compass.setCalibrationOffsets(-549.00, -66.00, 160.00);
 50  compass.setCalibrationScales(0.97, 1.02, 1.02);
 51}
 52
 53void printQMC5883L() {
 54
 55  Serial.println();
 56  Serial.println("QMC5883L ------------");
 57
 58  int x, y, z, a;
 59  char myArray[3];
 60
 61  compass.read();
 62
 63  x = compass.getX();
 64  y = compass.getY();
 65  z = compass.getZ();
 66
 67  a = compass.getAzimuth();
 68
 69  compass.getDirection(myArray, a);
 70
 71  Serial.print("X: ");
 72  Serial.print(x);
 73
 74  Serial.print(" Y: ");
 75  Serial.print(y);
 76
 77  Serial.print(" Z: ");
 78  Serial.print(z);
 79
 80  Serial.print(" Azimuth: ");
 81  Serial.print(a);
 82
 83  Serial.print(" Direction: ");
 84  Serial.print(myArray[0]);
 85  Serial.print(myArray[1]);
 86  Serial.println(myArray[2]);
 87
 88  Serial.println("QMC5883L ------------");
 89  Serial.println();
 90}
 91
 92void initializeMPU6050() {
 93  // Check if the MPU6050 sensor is detected
 94  if (!mpu.begin()) {
 95    Serial.println("Failed to find MPU6050 chip");
 96    while (1)
 97      ;  // Halt if sensor not found
 98  }
 99  Serial.println("MPU6050 Found!");
100
101  // set accelerometer range to +-8G
102  mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
103
104  // set gyro range to +- 500 deg/s
105  mpu.setGyroRange(MPU6050_RANGE_500_DEG);
106
107  // set filter bandwidth to 21 Hz
108  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
109
110  Serial.println("");
111  delay(100);
112}

Analisi del Codice

  1. Includere le Librerie e Inizializzare i Sensori Questa sezione include le librerie necessarie per i sensori MPU6050 e QMC5883L e inizializza i loro oggetti.

    #include <Adafruit_MPU6050.h>
    #include <Adafruit_Sensor.h>
    #include <Wire.h>
    #include <QMC5883LCompass.h>
    
    Adafruit_MPU6050 mpu;
    QMC5883LCompass compass;
    
  2. Funzione di Setup

    Inizializza la comunicazione seriale, il sensore MPU6050 e imposta l’MPU6050 in modalità bypass I2C per consentire l’accesso diretto al magnetometro QMC5883L. Successivamente, inizializza il magnetometro QMC5883L.

    void setup() {
      // Inizializza la comunicazione seriale con una velocità di trasmissione di 9600 baud
      Serial.begin(9600);
    
      // Inizializza il sensore MPU6050 (accelerometro e giroscopio)
      initializeMPU6050();
    
      // Abilita il bypass I2C su MPU6050 per accedere direttamente al magnetometro QMC5883L
      mpu.setI2CBypass(true);
    
      // Inizializza il sensore magnetometro QMC5883L
      initializeQMC5883L();
    }
    
  3. Funzione Loop

    Legge continuamente i dati dal magnetometro QMC5883L e li stampa sul Monitor Seriale.

    void loop() {
      printQMC5883L();
      delay(500);
    }
    
  4. Funzione di Inizializzazione del QMC5883L

    Inizializza e calibra il magnetometro QMC5883L. I valori di calibrazione devono essere regolati in base ai dati di calibrazione specifici.(Calibrare QMC5883L)

    void initializeQMC5883L() {
      compass.init();
    
      // Sostituisci il codice sottostante con i risultati della tua calibrazione
      compass.setCalibrationOffsets(-549.00, -66.00, 160.00);
      compass.setCalibrationScales(0.97, 1.02, 1.02);
    }
    
  5. Funzione di Stampa dei Dati del QMC5883L

    Questa funzione legge i valori X, Y, Z e l’azimuth del magnetometro, quindi li stampa sul Monitor Seriale.

    void printQMC5883L() {
    
      Serial.println();
      Serial.println("QMC5883L ------------");
    
        int x, y, z, a;
        char myArray[3];
    
        compass.read();
    
        x = compass.getX();
        y = compass.getY();
        z = compass.getZ();
    
        a = compass.getAzimuth();
    
        compass.getDirection(myArray, a);
    
        Serial.print("X: ");
        Serial.print(x);
    
        Serial.print(" Y: ");
        Serial.print(y);
    
        Serial.print(" Z: ");
        Serial.print(z);
    
        Serial.print(" Azimuth: ");
        Serial.print(a);
    
        Serial.print(" Direction: ");
        Serial.print(myArray[0]);
        Serial.print(myArray[1]);
        Serial.println(myArray[2]);
    
      Serial.println("QMC5883L ------------");
      Serial.println();
    }