ویژگی های ماژول IMU نه محور GY-87
ماژول IMU ده درجه آزادی و نه محور GY-87 یک ماژول با دقت بسیار بالا نسبت به مدلهای مشابه خود همچون MPU9250 است که میتواند شتاب، تغییر زاویه و میدان مغناطیسی را در سه محور x، y و z با دقت بالا در اختیار بگذارد. این ماژول در اصل از ترکیب 3 سنسور MPU6050 ،HMC5883L و یک سنسور دما و فشار بارومتریک تشکیل شده است. سنسور دما و فشار بارومتریک استفاده شده میتواند BMP180 یا BMP085 باشد. پروتکل ارتباطی این ماژول نیز I2C است که کار با این ماژول را ساده کرده است.
معرفی پایه های (پین اوت) ماژول GY-87
ماژول IMU ده درجه آزادی و نه محور GY-87 دارای 8 پایه به شرح زیر است:
- VCC_IN: تغذیه ماژول – 5 ولت
- 3V: تغذیه ماژول – 3.3 ولت
- GND: زمین
- SCL: پایه کلاک برای پروتکل I2C
- SDA: پایه دیتا برای پروتکل I2C
- FSYNC: ورودی دیجیتال سنکرون (تنظیم سرعت عملکرد I2C)
- INTA: خروجی دیجیتال وقفه آیسی MPU6050
- DRDY: پایه آماده بودن داده آیسی HMC5883L
پین اوت (Pinout) این ماژول را میتوانید در تصویر زیر مشاهده کنید.
لوازمی که به آن احتیاج دارید
قطعات مورد نیاز
نرم افزارهای کاربردی
راهاندازی ماژول IMU نه محور GY-87 با آردوینو
گام اول: سیم بندی
مطابق مدار زیر، ماژول را به آردوینو وصل کنید.
گام دوم: نصب کتابخانه
برای استفاده از هر یک از سنسورهای ماژول GY-87 نیاز به استفاده از کتابخانه مربوطه آن دارید. کتابخانههای MPU6050 ،HMC5883L_Simple و BMP085 را از لینکهای زیر دانلود کنید.
MPU6050 Library
HMC5883L_Simple Library
BMP085 Library
سپس به قسمت Include Library رفته و کتابخانهها را نصب کنید.
گام سوم: کد
کد زیر را روی برد آردوینو آپلود کنید. پس از آپلود کد، پنجره Serial Monitor را باز کنید.
/*
Modified on Mar 16, 2021
Modified by MehranMaleki from Arduino Examples
https://electro
peak.com/learn/
*/
#include "I2Cdev.h"
#include "MPU6050.h"
#include <Adafruit_BMP085.h>
#include <HMC5883L_Simple.h>
MPU6050 accelgyro;
Adafruit_BMP085 bmp;
HMC5883L_Simple Compass;
int16_t ax, ay, az;
int16_t gx, gy, gz;
#define LED_PIN 13
bool blinkState = false;
void setup() {
Serial.begin(9600);
Wire.begin();
// initialize devices
Serial.println("Initializing I2C devices...");
// initialize bmp085
if (!bmp.begin()) {
Serial.println("Could not find a valid BMP085 sensor, check wiring!");
while (1) {}
}
// initialize mpu6050
accelgyro.initialize();
Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
accelgyro.setI2CBypassEnabled(true); // set bypass mode for gateway to hmc5883L
// initialize hmc5883l
Compass.SetDeclination(23, 35, 'E');
Compass.SetSamplingMode(COMPASS_SINGLE);
Compass.SetScale(COMPASS_SCALE_130);
Compass.SetOrientation(COMPASS_HORIZONTAL_X_NORTH);
// configure Arduino LED for checking activity
pinMode(LED_PIN, OUTPUT);
}
void loop() {
Serial.print("Temperature = ");
Serial.print(bmp.readTemperature());
Serial.println(" *C");
Serial.print("Pressure = ");
Serial.print(bmp.readPressure());
Serial.println(" Pa");
// Calculate altitude assuming 'standard' barometric
// pressure of 1013.25 millibar = 101325 Pascal
Serial.print("Altitude = ");
Serial.print(bmp.readAltitude());
Serial.println(" meters");
Serial.print("Pressure at sealevel (calculated) = ");
Serial.print(bmp.readSealevelPressure());
Serial.println(" Pa");
Serial.print("Real altitude = ");
Serial.print(bmp.readAltitude(101500));
Serial.println(" meters");
// read raw accel/gyro measurements from device
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
// display tab-separated accel/gyro x/y/z values
Serial.print("a/g:\t");
Serial.print(ax); Serial.print("\t");
Serial.print(ay); Serial.print("\t");
Serial.print(az); Serial.print("\t");
Serial.print(gx); Serial.print("\t");
Serial.print(gy); Serial.print("\t");
Serial.println(gz);
float heading = Compass.GetHeadingDegrees();
Serial.print("Heading: \t");
Serial.println( heading );
// blink LED to indicate activity
blinkState = !blinkState;
digitalWrite(LED_PIN, blinkState);
delay(500);
}
در کد بالا اطلاعات مختلف همچون دما، فشار، ارتفاع از سطح دریا، شتاب و میدان مغناطیسی در سه محور از ماژول دریافت و در خروجی نمایش داده میشود.
خروجی کد به شکل زیر است.