Bemerkung

Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten.

Warum beitreten?

  • Expertenunterstützung: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams.

  • Lernen & Teilen: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern.

  • Exklusive Vorschauen: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken.

  • Spezialrabatte: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.

  • Festliche Aktionen und Gewinnspiele: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.

👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [ hier ] und treten Sie heute bei!

QMC5883L

Überblick

In diesem Tutorial befassen wir uns mit dem GY-87 IMU-Modul und konzentrieren uns auf das QMC5883L-Magnetometer. Der erste Teil des Tutorials führt Sie durch die Kalibrierung des QMC5883L-Magnetometers, was für genaue Messungen des Magnetfelds unerlässlich ist. Sie lernen, wie man einen Kalibrierungssketch auf Arduino hochlädt, eine Echtzeit-Kalibrierung durchführt und diese Einstellungen in Ihren Projekten anwendet. Der zweite Teil des Tutorials behandelt die Initialisierung des MPU6050 (Beschleunigungsmesser und Gyroskop) und QMC5883L auf einem Arduino Uno unter Verwendung der Adafruit MPU6050- und QMC5883LCompass-Bibliotheken. Sie erfahren, wie man Sensordaten liest und auf dem Seriellen Monitor anzeigt, was eine grundlegende Fähigkeit für Anwendungen in Navigation, Bewegungstracking und Orientierungserkennung ist.

Benötigte Komponenten

Für dieses Projekt benötigen wir die folgenden Komponenten.

Es ist definitiv praktisch, ein komplettes Kit zu kaufen, hier ist der Link:

Name

ARTIKEL IN DIESEM KIT

LINK

Elite Explorer Kit

300+

Elite Explorer Kit

Sie können die Komponenten auch separat über die untenstehenden Links kaufen.

KOMPONENTENBESCHREIBUNG

KAUF-LINK

Arduino Uno R4 WiFi

-

Jumperkabel

KAUFEN

GY-87 IMU-Modul

-

Verdrahtung

../_images/09-gy87_bb1.png

Schaltplan

../_images/09_basic_gy87_schematic.png

Bibliothek installieren

Bemerkung

Um die Bibliothek zu installieren, verwenden Sie den Arduino Library Manager.

  • Suchen Sie nach „Adafruit MPU6050“ und installieren Sie

    Bei der Installation jeder Bibliothek stellen Sie bitte sicher, dass die Installation aller Abhängigkeiten ausgewählt wird.

    ../_images/09-add_lib_tip.png
  • Suchen Sie nach „QMC5883LCompass“ und installieren Sie

QMC5883L kalibrieren

Bemerkung

  • Sie können die Datei 09-gy87_compass_calibration.ino direkt unter dem Pfad elite-explorer-kit-main\basic_project\09-gy87_compass_calibration öffnen.

  • Oder kopieren Sie diesen Code in die Arduino IDE.

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}

Nachdem Sie den Code hochgeladen haben, öffnen Sie den seriellen Monitor. Befolgen Sie die Anweisungen im seriellen Monitor, um QMC5883L zu kalibrieren. Wenn Sie aufgefordert werden, den Sensor zu bewegen, wird die Kalibrierungsmethode „Achterfigur“ empfohlen. Alternativ können Sie den Sensor einfach parallel zum Boden halten und ihn im Uhrzeigersinn oder gegen den Uhrzeigersinn drehen, bis der serielle Monitor meldet, dass die Kalibrierung abgeschlossen ist.

../_images/09_calibrate_qmc5883l.png

Sobald alle Kalibrierungsdaten gesammelt wurden, wird das Sketch Ihnen einige Codezeilen geben, die wie compass.setCalibrationOffsets(-375.00, -179.00, 85.00); und compass.setCalibrationScales(1.04, 0.96, 1.01); aussehen. Kopieren Sie diesen Code. Es ist empfehlenswert, ihn für zukünftige Referenzen zu speichern.

Bei Verwendung von QMC5883L: Öffnen Sie den Sketch Ihres Projekts und fügen Sie die kopierte Codezeile direkt unter den Aufruf compass.init() ein. So wie hier:

void initializeQMC5883L() {

  compass.init();

  // You should replace the code below according to your calibration results
  compass.setCalibrationOffsets(-375.00, -179.00, 85.00);
  compass.setCalibrationScales(1.04, 0.96, 1.01);

}

Code

Bemerkung

Magnetometer müssen kalibriert(QMC5883L kalibrieren) werden, bevor sie als Kompass verwendet werden können, und müssen waagerecht gehalten und fern von Eisenobjekten, magnetisierten Materialien und stromführenden Drähten gehalten werden.

Bemerkung

  • Sie können die Datei 09-gy87_qmc5883l.ino direkt unter dem Pfad elite-explorer-kit-main\basic_project\09-gy87_qmc5883l öffnen.

  • Oder kopieren Sie diesen Code in die Arduino IDE.

  • Fügen Sie den Code, den Sie aus den Kalibrierungsschritten erhalten haben, unter die Zeile compass.init() in der Funktion initializeQMC5883L() ein.

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}

Code-Analyse

  1. Einbinden von Bibliotheken und Initialisieren von Sensoren Dieser Abschnitt enthält die notwendigen Bibliotheken für die MPU6050- und QMC5883L-Sensoren und initialisiert ihre Objekte.

    #include <Adafruit_MPU6050.h>
    #include <Adafruit_Sensor.h>
    #include <Wire.h>
    #include <QMC5883LCompass.h>
    
    Adafruit_MPU6050 mpu;
    QMC5883LCompass compass;
    
  2. Setup-Funktion

    Initialisiert die serielle Kommunikation, den MPU6050-Sensor und setzt den MPU6050 in den I2C-Bypass-Modus, um direkten Zugriff auf das QMC5883L-Magnetometer zu ermöglichen. Anschließend wird das QMC5883L-Magnetometer initialisiert.

    void setup() {
      // Initialize the serial communication with a baud rate of 9600
      Serial.begin(9600);
    
      // Initialize the MPU6050 sensor (accelerometer and gyroscope)
      initializeMPU6050();
    
      // Enable I2C bypass on MPU6050 to directly access the QMC5883L magnetometer
      mpu.setI2CBypass(true);
    
      // Initialize the QMC5883L magnetometer sensor
      initializeQMC5883L();
    }
    
  3. Loop-Funktion

    Liest kontinuierlich Daten vom QMC5883L-Magnetometer und gibt sie auf dem Seriellen Monitor aus.

    void loop() {
      printQMC5883L();
      delay(500);
    }
    
  4. Initialisieren der QMC5883L-Funktion

    Initialisiert und kalibriert das QMC5883L-Magnetometer. Die Kalibrierungswerte sollten auf Grundlage spezifischer Kalibrierungsdaten angepasst werden.(QMC5883L kalibrieren)

    void initializeQMC5883L() {
      compass.init();
    
      // You should replace the code below according to your calibration results
      compass.setCalibrationOffsets(-549.00, -66.00, 160.00);
      compass.setCalibrationScales(0.97, 1.02, 1.02);
    }
    
  5. QMC5883L-Daten drucken Funktion

    Diese Funktion liest die X-, Y-, Z-Werte und den Azimut des Magnetometers und druckt sie auf den Seriellen Monitor.

    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();
    }