注釈

こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。

参加する理由は?

  • エキスパートサポート:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。

  • 学び&共有:ヒントやチュートリアルを交換してスキルを向上させましょう。

  • 独占的なプレビュー:新製品の発表や先行プレビューに早期アクセスしましょう。

  • 特別割引:最新製品の独占割引をお楽しみください。

  • 祭りのプロモーションとギフト:ギフトや祝日のプロモーションに参加しましょう。

👉 私たちと一緒に探索し、創造する準備はできていますか?[ ここ]をクリックして今すぐ参加しましょう!

GY-87 IMUモジュール

GY-87モジュールは、MPU6050、QMC5883L、BMP180の3つのセンサーチップが装備されており、それぞれ独自の機能を提供します。MPU6050はジャイロスコープと加速度計を組み合わせて運動追跡を行い、QMC5883Lは方向感知用の磁力計として機能し、BMP180は気圧と温度を測定するために使用されます。これらはI2Cプロトコルを使用してArduinoと効果的に通信することができます。

これらのセンサーは、I2Cプロトコルを介してシームレスに統合されており、Arduinoのようなプラットフォームとの効率的な通信を確保しています。GY-87モジュールの各センサーは、固有のI2Cアドレスを通じてアクセスできます:MPU6050は0x68、QMC5883Lは0x0D、BMP180は0x77でアクセスします。

各センサーチップの個別チュートリアル:


これらの3つのチップを同時に使用したい場合は、以下の簡単な例があります:

../_images/09-gy87_bb1.png

注釈

  • ファイル 09-gy87.ino を直接 elite-explorer-kit-main\basic_project\09-gy87 のパスから開くことができます。

  • または、このコードをArduino IDEにコピーしてください。

注釈

ライブラリをインストールするには、Arduinoライブラリマネージャーを使用してください。

  • 「Adafruit MPU6050」 を検索してインストール

    各ライブラリをインストールする際は、すべての依存関係のインストールも選択してください。

    ../_images/09-add_lib_tip.png
  • 「Adafruit Unified Sensor」 を検索してインストール

  • 「QMC5883LCompass」 を検索してインストール

  • 「Adafruit BMP085 Library」 を検索してインストール

09-gy87.ino
  1/*
  2  This Arduino code is designed to work with the GY-87 IMU (Inertial Measurement Unit) module, 
  3  which is a multi-sensor module containing three individual sensors: MPU6050 (Accelerometer and Gyroscope), 
  4  QMC5883L Magnetometer, and BMP180 (Barometric Pressure and Temperature). The code initializes these 
  5  sensors and continuously prints their readings 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           https://github.com/adafruit/Adafruit-BMP085-Library  (Adafruit BMP085 Library by Adafruit)
 12*/
 13
 14// Include required libraries
 15#include <Adafruit_MPU6050.h>
 16#include <Adafruit_Sensor.h>
 17#include <Wire.h>
 18#include <Adafruit_BMP085.h>
 19#include <QMC5883LCompass.h>
 20
 21// Initialize sensor objects
 22Adafruit_MPU6050 mpu;
 23Adafruit_BMP085 bmp;
 24QMC5883LCompass compass;
 25
 26void setup() {
 27  // Initialize the serial communication with a baud rate of 9600
 28  Serial.begin(9600);
 29
 30  // Initialize the MPU6050 sensor (accelerometer and gyroscope)
 31  initializeMPU6050();
 32
 33  // Enable I2C bypass on MPU6050 to directly access the QMC5883L magnetometer
 34  mpu.setI2CBypass(true);
 35
 36  // Initialize the QMC5883L magnetometer sensor
 37  initializeQMC5883L();
 38
 39  // Initialize BMP180 barometric sensor
 40  initializeBMP180();
 41}
 42
 43
 44void loop() {
 45  // Print MPU6050 data
 46  printMPU6050();
 47
 48  // Print QMC5883L data
 49  printQMC5883L();
 50
 51  // Print BMP180 data
 52  printBMP180();
 53  
 54  delay(500);
 55}
 56
 57void initializeQMC5883L() {
 58
 59  compass.init();
 60
 61  // You should replace the code below according to your calibration results
 62  compass.setCalibrationOffsets(-458.00, -310.00, -362.00);
 63  compass.setCalibrationScales(0.79, 0.79, 2.19);
 64
 65}
 66
 67void printQMC5883L() {
 68
 69  Serial.println();
 70  Serial.println("QMC5883L ------------");
 71
 72	int x, y, z, a;
 73	char myArray[3];
 74	
 75	compass.read();
 76  
 77	x = compass.getX();
 78	y = compass.getY();
 79	z = compass.getZ();
 80	
 81	a = compass.getAzimuth();
 82
 83	compass.getDirection(myArray, a);
 84  
 85	Serial.print("X: ");
 86	Serial.print(x);
 87
 88	Serial.print(" Y: ");
 89	Serial.print(y);
 90
 91	Serial.print(" Z: ");
 92	Serial.print(z);
 93
 94	Serial.print(" Azimuth: ");
 95	Serial.print(a);
 96
 97	Serial.print(" Direction: ");
 98	Serial.print(myArray[0]);
 99	Serial.print(myArray[1]);
100	Serial.println(myArray[2]);
101
102  Serial.println("QMC5883L ------------");
103  Serial.println();
104}
105
106
107void initializeMPU6050() {
108  // Check if the MPU6050 sensor is detected
109  if (!mpu.begin()) {
110    Serial.println("Failed to find MPU6050 chip");
111    while (1)
112      ;  // Halt if sensor not found
113  }
114  Serial.println("MPU6050 Found!");
115
116  // set accelerometer range to +-8G
117  mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
118
119  // set gyro range to +- 500 deg/s
120  mpu.setGyroRange(MPU6050_RANGE_500_DEG);
121
122  // set filter bandwidth to 21 Hz
123  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
124
125  Serial.println("");
126  delay(100);
127}
128
129void printMPU6050() {
130
131  Serial.println();
132  Serial.println("MPU6050 ------------");
133
134  /* Get new sensor events with the readings */
135  sensors_event_t a, g, temp;
136  mpu.getEvent(&a, &g, &temp);
137
138  /* Print out the values */
139  Serial.print("Acceleration X: ");
140  Serial.print(a.acceleration.x);
141  Serial.print(", Y: ");
142  Serial.print(a.acceleration.y);
143  Serial.print(", Z: ");
144  Serial.print(a.acceleration.z);
145  Serial.println(" m/s^2");
146
147  Serial.print("Rotation X: ");
148  Serial.print(g.gyro.x);
149  Serial.print(", Y: ");
150  Serial.print(g.gyro.y);
151  Serial.print(", Z: ");
152  Serial.print(g.gyro.z);
153  Serial.println(" rad/s");
154
155  Serial.print("Temperature: ");
156  Serial.print(temp.temperature);
157  Serial.println(" degC");
158
159  Serial.println("MPU6050 ------------");
160  Serial.println();
161}
162
163void initializeBMP180() {
164  // Start BMP180 initialization
165  if (!bmp.begin()) {
166    Serial.println("Could not find a valid BMP180 sensor, check wiring!");
167    while (1)
168      ;  // Halt if sensor not found
169  }
170  Serial.println("BMP180 Found!");
171}
172
173void printBMP180() {
174  Serial.println();
175  Serial.println("BMP180 ------------");
176  Serial.print("Temperature = ");
177  Serial.print(bmp.readTemperature());
178  Serial.println(" *C");
179
180  Serial.print("Pressure = ");
181  Serial.print(bmp.readPressure());
182  Serial.println(" Pa");
183
184  // Calculate altitude assuming 'standard' barometric
185  // pressure of 1013.25 millibar = 101325 Pascal
186  Serial.print("Altitude = ");
187  Serial.print(bmp.readAltitude());
188  Serial.println(" meters");
189
190  Serial.print("Pressure at sealevel (calculated) = ");
191  Serial.print(bmp.readSealevelPressure());
192  Serial.println(" Pa");
193  Serial.println("BMP180 ------------");
194  Serial.println();
195}

注釈

磁力計は使用前にキャリブレーション(QMC5883Lの校正)が必要であり、使用時に水平に保持し、 鉄製品、磁化された材料、電流を運ぶワイヤーから離しておく 必要があります。

コードがArduino Uno R4に正常にアップロードされると、シリアルモニターが活動し始め、GY-87 IMUモジュールからのセンサーデータが連続して表示されます。このモジュールには、加速度計とジャイロスコープの読み取りを行うMPU6050、磁力計の読み取りを行うQMC5883L、気圧と温度の読み取りを行うBMP180の3つの個別のセンサーが組み込まれています。