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+ |
Sie können die Komponenten auch separat über die untenstehenden Links kaufen.
KOMPONENTENBESCHREIBUNG |
KAUF-LINK |
|---|---|
- |
|
- |
Verdrahtung
Schaltplan
Bibliothek installieren
Bemerkung
Um die Bibliothek zu installieren, verwenden Sie den Arduino Library Manager.
QMC5883L kalibrieren
Bemerkung
Sie können die Datei
09-gy87_compass_calibration.inodirekt unter dem Pfadelite-explorer-kit-main\basic_project\09-gy87_compass_calibrationöffnen.Oder kopieren Sie diesen Code in die Arduino IDE.
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.
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.inodirekt unter dem Pfadelite-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 FunktioninitializeQMC5883L()ein.
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
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;
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(); }
Loop-Funktion
Liest kontinuierlich Daten vom QMC5883L-Magnetometer und gibt sie auf dem Seriellen Monitor aus.
void loop() { printQMC5883L(); delay(500); }
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); }
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(); }