logo-site-sefid
Search
Close this search box.
راه اندازی ماژول mpu6050 با آردوینو

راه اندازی ماژول MPU6050 با آردوینو

راه اندازی ماژول mpu6050 با آردوینو

 

MPU6050 Module Gyroscope

در این آموزش نحوه استفاده از سنسور شتاب سنج و ژیروسکوپ MPU6050 با Arduino را فرا خواهیم گرفت. ابتدا من نحوه کار MPU6050 و نحوه خواندن داده ها از آن را توضیح خواهم داد و سپس دو مثال عملی ارائه خواهیم داد تا با راه اندازی ماژول MPU6050 با آردوینو آشنا شوید.

چگونه کار می کند

MPU6050 IMU دارای هر دو شتاب سنج 3 محوره و ژیروسکوپ 3 محوره است که روی یک تراشه قرار گرفته است.

ژیروسکوپ سرعت چرخشی یا سرعت تغییر موقعیت زاویه ای را با گذشت زمان ، در امتداد محور X ، Y و Z اندازه گیری می کند. این ماژول از فناوری MEMS و اثر Coriolis برای اندازه گیری استفاده می کند ، اما برای جزئیات بیشتر در مورد آن می توانید آموزش خاص نحوه کار سنسورهای MEMS را بررسی کنید خروجی های ژیروسکوپ بر حسب درجه در ثانیه است ، بنابراین برای بدست آوردن موقعیت زاویه ای فقط باید سرعت زاویه ای را ادغام کنیم.

۰۵۴۵۵۴ scaled e1683206938435

از طرف دیگر شتاب سنج MPU6050 شتاب را به همان روشی که در فیلم قبلی برای سنسور شتاب سنج ADXL345 توضیح داده شده اندازه گیری می کند. به طور خلاصه ، می تواند شتاب گرانشی را در طول 3 محور اندازه گیری کند و با استفاده از برخی از ریاضیات مثلثات می توان زاویه قرارگیری سنسور را محاسبه کرد. بنابراین ، اگر داده های شتاب سنج و ژیروسکوپ را با هم ترکیب کنیم ، می توانیم اطلاعات دقیق در مورد جهت گیری سنسور بدست آوریم.

MPU6050 IMU به دلیل 6 خروجی یا 3 خروجی شتاب سنج و 3 خروجی ژیروسکوپ ، دستگاه ردیابی حرکت شش محوره یا دستگاه 6 DoF (شش درجه آزادی) نیز نامیده می شود. افراد علاقمند جهت شرکت در دوره های آموزش رباتیک میتوانند به صورت آنلاین در این دوره ها ثبت نام نمایند.

آردوینو و MPU6050

بیایید نگاهی بیندازیم که چگونه می توانیم داده های سنسور MPU6050 را با استفاده از آردوینو متصل کنیم و بخوانیم. ما از پروتکل I2C برای برقراری ارتباط با Arduino استفاده می کنیم بنابراین برای اتصال آن فقط دو سیم به علاوه دو سیم برای برق رسانی نیاز داریم.

آردوینو و  MPU6050
آردوینو و MPU6050

می توانید اجزای مورد نیاز برای این آموزش آردوینو را از پیوندهای زیر دریافت کنید:

MPU6050 IMU

Arduino nano

شیلد آردوینو نانو

MPU6050 کد آردوینو

در اینجا کد آردوینو برای خواندن داده ها از سنسور MPU6050 وجود دارد. در زیر کد می توانید شرح جزئیاتی از آن را پیدا کنید.

/*
Arduino and MPU6050 Accelerometer and Gyroscope Sensor Tutorial
by Dejan, https://howtomechatronics.com
*/
#include <Wire.h>
const int MPU = 0x68; // MPU6050 I2C address
float AccX, AccY, AccZ;
float GyroX, GyroY, GyroZ;
float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ;
float roll, pitch, yaw;
float AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ;
float elapsedTime, currentTime, previousTime;
int c = 0;
void setup() {
Serial.begin(19200);
Wire.begin(); // Initialize comunication
Wire.beginTransmission(MPU); // Start communication with MPU6050 // MPU=0x68
Wire.write(0x6B); // Talk to the register 6B
Wire.write(0x00); // Make reset - place a 0 into the 6B register
Wire.endTransmission(true); //end the transmission
/*
// Configure Accelerometer Sensitivity - Full Scale Range (default +/- 2g)
Wire.beginTransmission(MPU);
Wire.write(0x1C); //Talk to the ACCEL_CONFIG register (1C hex)
Wire.write(0x10); //Set the register bits as 00010000 (+/- 8g full scale range)
Wire.endTransmission(true);
// Configure Gyro Sensitivity - Full Scale Range (default +/- 250deg/s)
Wire.beginTransmission(MPU);
Wire.write(0x1B); // Talk to the GYRO_CONFIG register (1B hex)
Wire.write(0x10); // Set the register bits as 00010000 (1000deg/s full scale)
Wire.endTransmission(true);
delay(20);
*/
// Call this function if you need to get the IMU error values for your module
calculate_IMU_error();
delay(20);
}
void loop() {
// === Read acceleromter data === //
Wire.beginTransmission(MPU);
Wire.write(0x3B); // Start with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU, 6, true); // Read 6 registers total, each axis value is stored in 2 registers
//For a range of +-2g, we need to divide the raw values by 16384, according to the datasheet
AccX = (Wire.read() << 8 | Wire.read()) / 16384.0; // X-axis value
AccY = (Wire.read() << 8 | Wire.read()) / 16384.0; // Y-axis value
AccZ = (Wire.read() << 8 | Wire.read()) / 16384.0; // Z-axis value
// Calculating Roll and Pitch from the accelerometer data
accAngleX = (atan(AccY / sqrt(pow(AccX, 2) + pow(AccZ, 2))) * 180 / PI) - 0.58; // AccErrorX ~(0.58) See the calculate_IMU_error()custom function for more details
accAngleY = (atan(-1 * AccX / sqrt(pow(AccY, 2) + pow(AccZ, 2))) * 180 / PI) + 1.58; // AccErrorY ~(-1.58)
// === Read gyroscope data === //
previousTime = currentTime; // Previous time is stored before the actual time read
currentTime = millis(); // Current time actual time read
elapsedTime = (currentTime - previousTime) / 1000; // Divide by 1000 to get seconds
Wire.beginTransmission(MPU);
Wire.write(0x43); // Gyro data first register address 0x43
Wire.endTransmission(false);
Wire.requestFrom(MPU, 6, true); // Read 4 registers total, each axis value is stored in 2 registers
GyroX = (Wire.read() << 8 | Wire.read()) / 131.0; // For a 250deg/s range we have to divide first the raw value by 131.0, according to the datasheet
GyroY = (Wire.read() << 8 | Wire.read()) / 131.0;
GyroZ = (Wire.read() << 8 | Wire.read()) / 131.0;
// Correct the outputs with the calculated error values
GyroX = GyroX + 0.56; // GyroErrorX ~(-0.56)
GyroY = GyroY - 2; // GyroErrorY ~(2)
GyroZ = GyroZ + 0.79; // GyroErrorZ ~ (-0.8)
// Currently the raw values are in degrees per seconds, deg/s, so we need to multiply by sendonds (s) to get the angle in degrees
gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg/s * s = deg
gyroAngleY = gyroAngleY + GyroY * elapsedTime;
yaw = yaw + GyroZ * elapsedTime;
// Complementary filter - combine acceleromter and gyro angle values
roll = 0.96 * gyroAngleX + 0.04 * accAngleX;
pitch = 0.96 * gyroAngleY + 0.04 * accAngleY;
// Print the values on the serial monitor
Serial.print(roll);
Serial.print("/");
Serial.print(pitch);
Serial.print("/");
Serial.println(yaw);
}
void calculate_IMU_error() {
// We can call this funtion in the setup section to calculate the accelerometer and gyro data error. From here we will get the error values used in the above equations printed on the Serial Monitor.
// Note that we should place the IMU flat in order to get the proper values, so that we then can the correct values
// Read accelerometer values 200 times
while (c < 200) {
Wire.beginTransmission(MPU);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU, 6, true);
AccX = (Wire.read() << 8 | Wire.read()) / 16384.0 ;
AccY = (Wire.read() << 8 | Wire.read()) / 16384.0 ;
AccZ = (Wire.read() << 8 | Wire.read()) / 16384.0 ;
// Sum all readings
AccErrorX = AccErrorX + ((atan((AccY) / sqrt(pow((AccX), 2) + pow((AccZ), 2))) * 180 / PI));
AccErrorY = AccErrorY + ((atan(-1 * (AccX) / sqrt(pow((AccY), 2) + pow((AccZ), 2))) * 180 / PI));
c++;
}
//Divide the sum by 200 to get the error value
AccErrorX = AccErrorX / 200;
AccErrorY = AccErrorY / 200;
c = 0;
// Read gyro values 200 times
while (c < 200) {
Wire.beginTransmission(MPU);
Wire.write(0x43);
Wire.endTransmission(false);
Wire.requestFrom(MPU, 6, true);
GyroX = Wire.read() << 8 | Wire.read();
GyroY = Wire.read() << 8 | Wire.read();
GyroZ = Wire.read() << 8 | Wire.read();
// Sum all readings
GyroErrorX = GyroErrorX + (GyroX / 131.0);
GyroErrorY = GyroErrorY + (GyroY / 131.0);
GyroErrorZ = GyroErrorZ + (GyroZ / 131.0);
c++;
}
//Divide the sum by 200 to get the error value
GyroErrorX = GyroErrorX / 200;
GyroErrorY = GyroErrorY / 200;
GyroErrorZ = GyroErrorZ / 200;
// Print the error values on the Serial Monitor
Serial.print("AccErrorX: ");
Serial.println(AccErrorX);
Serial.print("AccErrorY: ");
Serial.println(AccErrorY);
Serial.print("GyroErrorX: ");
Serial.println(GyroErrorX);
Serial.print("GyroErrorY: ");
Serial.println(GyroErrorY);
Serial.print("GyroErrorZ: ");
Serial.println(GyroErrorZ);
}

شرح کد: بنابراین ابتدا باید کتابخانه Wire.h را که برای ارتباطات I2C استفاده می شود ، قرار دهیم و متغیرهای مورد نیاز برای ذخیره داده ها را تعریف کنیم.

در بخش تنظیمات ، ما باید کتابخانه Wire.h را مقداردهی کنیم و حسگر را از طریق کلید پاور سنسور را مجدد راه اندازی کنیم. برای انجام این کار باید نگاهی به دیتا شیت سنسور بیندازیم که از آنجا می توانیم آدرس ثبت را ببینیم.

MPU6050-Power-Management-Register
MPU6050-Power-Management-Register

همچنین ، اگر بخواهیم ، می توانیم با استفاده از رجیسترهای پیکربندی ، دامنه Full-Scale Range را برای شتاب سنج و ژیروسکوپ انتخاب کنیم. برای این مثال ، ما از دامنه پیش فرض + – 2g برای شتاب سنج و 250 درجه در ثانیه برای ژیروسکوپ استفاده خواهیم کرد ، بنابراین این قسمت از کد را کامنت می گذارم.

// Configure Accelerometer Sensitivity - Full Scale Range (default +/- 2g)
Wire.beginTransmission(MPU);
Wire.write(0x1C); //Talk to the ACCEL_CONFIG register (1C hex)
Wire.write(0x10); //Set the register bits as 00010000 (+/- 8g full scale range)
Wire.endTransmission(true);
// Configure Gyro Sensitivity - Full Scale Range (default +/- 250deg/s)
Wire.beginTransmission(MPU);
Wire.write(0x1B); // Talk to the GYRO_CONFIG register (1B hex)
Wire.write(0x10); // Set the register bits as 00010000 (1000deg/s full scale)
Wire.endTransmission(true);
*/

در بخش حلقه با خواندن داده های شتاب سنج شروع می کنیم. داده های هر محور در دو بایت یا رجیستر ذخیره می شود و می توانیم آدرس این رجیسترها را از صفحه داده سنسور ببینیم.

MPU6050-imu-accelerometer-data
MPU6050-imu-accelerometer-data

برای خواندن همه آنها ، ما با اولین ثبت نام شروع می کنیم و با استفاده از تابع requiestFrom () درخواست می کنیم که هر 6 ثبت کننده را برای محورهای X ، Y و Z بخوانیم. سپس داده های هر مقدار را می خوانیم ، و چون خروجی ها دو به دو مکمل هستند ، آنها را به طور مناسب ترکیب می کنیم تا مقادیر صحیح را بدست آوریم.

// === Read acceleromter data === //
Wire.beginTransmission(MPU);
Wire.write(0x3B); // Start with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU, 6, true); // Read 6 registers total, each axis value is stored in 2 registers
//For a range of +-2g, we need to divide the raw values by 16384, according to the datasheet
AccX = (Wire.read() << 8 | Wire.read()) / 16384.0; // X-axis value
AccY = (Wire.read() << 8 | Wire.read()) / 16384.0; // Y-axis value
AccZ = (Wire.read() << 8 | Wire.read()) / 16384.0; // Z-axis value

برای بدست آوردن مقادیر خروجی از -1 G به + 1 G ، مناسب برای محاسبه زاویه ها ، خروجی را بر حساسیت انتخاب شده قبلی تقسیم می کنیم.

accel-sens
accel-sens

در آخر ، با استفاده از این دو فرمول ، زاویه های رول و گام را از داده های شتاب سنج محاسبه می کنیم.

// Calculating Roll and Pitch from the accelerometer data
accAngleX = (atan(AccY / sqrt(pow(AccX, 2) + pow(AccZ, 2))) * 180 / PI) - 0.58; // AccErrorX ~(0.58) See the calculate_IMU_error()custom function for more details
accAngleY = (atan(-1 * AccX / sqrt(pow(AccY, 2) + pow(AccZ, 2))) * 180 / PI) + 1.58; // AccErrorY ~(-1.58)

بعد ، با استفاده از همان روش داده های ژیروسکوپ را بدست می آوریم.

gyro-regs
gyro-regs

شش مقدار ژیروسکوپ را می خوانیم ، داده های آنها را به طور مناسب ترکیب می کنیم و آنها را بر روی حساسیت انتخاب شده قبلی تقسیم می کنیم تا خروجی بر حسب درجه در ثانیه بدست آید.

// === Read gyroscope data === //
previousTime = currentTime; // Previous time is stored before the actual time read
currentTime = millis(); // Current time actual time read
elapsedTime = (currentTime - previousTime) / 1000; // Divide by 1000 to get seconds
Wire.beginTransmission(MPU);
Wire.write(0x43); // Gyro data first register address 0x43
Wire.endTransmission(false);
Wire.requestFrom(MPU, 6, true); // Read 4 registers total, each axis value is stored in 2 registers
GyroX = (Wire.read() << 8 | Wire.read()) / 131.0; // For a 250deg/s range we have to divide first the raw value by 131.0, according to the datasheet
GyroY = (Wire.read() << 8 | Wire.read()) / 131.0;
GyroZ = (Wire.read() << 8 | Wire.read()) / 131.0;
gyro-sens
gyro-sens

در اینجا می توانید متوجه شوید که من مقادیر خروجی را با مقادیر خطای کوچک محاسبه شده تصحیح می کنم ، که من توضیح می دهم چگونه آنها را در یک دقیقه بدست می آوریم. بنابراین چون خروجی ها بر حسب درجه در ثانیه هستند ، اکنون باید آنها را با زمان ضرب کنیم تا فقط درجه بگیریم. مقدار زمان قبل از هر تکرار خواندن با استفاده از تابع millis () گرفته می شود.

// Correct the outputs with the calculated error values
GyroX = GyroX + 0.56; // GyroErrorX ~(-0.56)
GyroY = GyroY - 2; // GyroErrorY ~(2)
GyroZ = GyroZ + 0.79; // GyroErrorZ ~ (-0.8)
// Currently the raw values are in degrees per seconds, deg/s, so we need to multiply by sendonds (s) to get the angle in degrees
gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg/s * s = deg
gyroAngleY = gyroAngleY + GyroY * elapsedTime;
yaw = yaw + GyroZ * elapsedTime;

در آخر ، ما شتاب سنج و داده های ژیروسکوپ را با استفاده از یک فیلتر مکمل ترکیب می کنیم. در اینجا ، ما 96٪ از اطلاعات ژیروسکوپ را می گیریم زیرا بسیار دقیق است و از نیروهای تاثیر نمیگیرد. سمت پایین ژیروسکوپ قسمتی است که دریفت می شود ، یا با گذشت زمان خطایی را در خروجی ایجاد می کند. بنابراین ، در دراز مدت ، ما از داده های شتاب سنج استفاده می کنیم ، در این حالت 4٪ از داده ها و این به اندازه کافیست تا برای خطای دریفت ژیروسکوپ را از بین ببرد.

// Complementary filter - combine acceleromter and gyro angle values
roll = 0.96 * gyroAngleX + 0.04 * accAngleX;
pitch = 0.96 * gyroAngleY + 0.04 * accAngleY;

با این حال ، چون نمی توانیم انحراف را از داده های شتاب سنج محاسبه کنیم ، نمی توانیم فیلتر مکمل را روی آن پیاده سازی کنیم.

قبل از اینکه نگاهی به نتایج بیندازیم ، بگذارید سریع نحوه نحوه گرفتن مقادیر تصحیح خطا را توضیح دهم. برای محاسبه این خطاها می توانیم تابع دلخواه calculate_IMU_error () را در حالی که سنسور در حالت ثابت قرار دارد فراخوانی کنیم. در اینجا ما 200 قرائت برای همه خروجی ها انجام می دهیم ، آنها را جمع می کنیم و آنها را بر 200 تقسیم می کنیم. همانطور که سنسور را در حالت ثابت نگه می داریم ، مقادیر خروجی مورد انتظار باید 0 باشد. بنابراین ، با این محاسبه می توان میانگین خطای سنسور را بدست آورد .

void calculate_IMU_error() {
// We can call this funtion in the setup section to calculate the accelerometer and gyro data error. From here we will get the error values used in the above equations printed on the Serial Monitor.
// Note that we should place the IMU flat in order to get the proper values, so that we then can the correct values
// Read accelerometer values 200 times
while (c < 200) {
Wire.beginTransmission(MPU);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU, 6, true);
AccX = (Wire.read() << 8 | Wire.read()) / 16384.0 ;
AccY = (Wire.read() << 8 | Wire.read()) / 16384.0 ;
AccZ = (Wire.read() << 8 | Wire.read()) / 16384.0 ;
// Sum all readings
AccErrorX = AccErrorX + ((atan((AccY) / sqrt(pow((AccX), 2) + pow((AccZ), 2))) * 180 / PI));
AccErrorY = AccErrorY + ((atan(-1 * (AccX) / sqrt(pow((AccY), 2) + pow((AccZ), 2))) * 180 / PI));
c++;
}
//Divide the sum by 200 to get the error value
AccErrorX = AccErrorX / 200;
AccErrorY = AccErrorY / 200;
c = 0;
// Read gyro values 200 times
while (c < 200) {
Wire.beginTransmission(MPU);
Wire.write(0x43);
Wire.endTransmission(false);
Wire.requestFrom(MPU, 6, true);
GyroX = Wire.read() << 8 | Wire.read();
GyroY = Wire.read() << 8 | Wire.read();
GyroZ = Wire.read() << 8 | Wire.read();
// Sum all readings
GyroErrorX = GyroErrorX + (GyroX / 131.0);
GyroErrorY = GyroErrorY + (GyroY / 131.0);
GyroErrorZ = GyroErrorZ + (GyroZ / 131.0);
c++;
}
//Divide the sum by 200 to get the error value
GyroErrorX = GyroErrorX / 200;
GyroErrorY = GyroErrorY / 200;
GyroErrorZ = GyroErrorZ / 200;
// Print the error values on the Serial Monitor
Serial.print("AccErrorX: ");
Serial.println(AccErrorX);
Serial.print("AccErrorY: ");
Serial.println(AccErrorY);
Serial.print("GyroErrorX: ");
Serial.println(GyroErrorX);
Serial.print("GyroErrorY: ");
Serial.println(GyroErrorY);
Serial.print("GyroErrorZ: ");
Serial.println(GyroErrorZ);
}

ما مقادیر را به سادگی روی مانیتور سریال چاپ می کنیم و پس از شناختن آنها ، می توانیم آنها را همانطور که قبلا نشان داده شده است ، برای محاسبه رول و گام و همچنین برای 3 خروجی ژیروسکوپ ، آنها را در کد پیاده کنیم.

 

سرانجام ، با استفاده از تابع Serial.print می توان مقادیر Roll ، Pitch و Yaw را روی مانیتور سریال چاپ کرد و بررسی کرد که آیا سنسور به درستی کار می کند یا خیر.

ردیابی جهت گیری MPU6050 – تجسم سه بعدی

در مرحله بعدی ، برای ساختن نمونه تجسم سه بعدی ، ما فقط باید این داده هایی را که Arduino از طریق پورت سریال در محیط توسعه پردازش ارسال می کند ، بپذیریم. در اینجا کد کامل پردازش وجود دارد:

/*
Arduino and MPU6050 IMU - 3D Visualization Example 
by Dejan, https://howtomechatronics.com
*/
import processing.serial.*;
import java.awt.event.KeyEvent;
import java.io.IOException;
Serial myPort;
String data="";
float roll, pitch,yaw;
void setup() {
size (2560, 1440, P3D);
myPort = new Serial(this, "COM7", 19200); // starts the serial communication
myPort.bufferUntil('\n');
}
void draw() {
translate(width/2, height/2, 0);
background(233);
textSize(22);
text("Roll: " + int(roll) + " Pitch: " + int(pitch), -100, 265);
// Rotate the object
rotateX(radians(-pitch));
rotateZ(radians(roll));
rotateY(radians(yaw));
// 3D 0bject
textSize(30); 
fill(0, 76, 153);
box (386, 40, 200); // Draw box
textSize(25);
fill(255, 255, 255);
text("www.HowToMechatronics.com", -183, 10, 101);
//delay(10);
//println("ypr:\t" + angleX + "\t" + angleY); // Print the values to check whether we are getting proper values
}
// Read data from the Serial Port
void serialEvent (Serial myPort) { 
// reads the data from the Serial Port up to the character '.' and puts it into the String variable "data".
data = myPort.readStringUntil('\n');
// if you got any bytes other than the linefeed:
if (data != null) {
data = trim(data);
// split the string at "/"
String items[] = split(data, '/');
if (items.length > 1) {
//--- Roll,Pitch in degrees
roll = float(items[0]);
pitch = float(items[1]);
yaw = float(items[2]);
}
}
}

در اینجا داده های دریافتی از Arduino را می خوانیم و آنها را در متغیرهای مناسب Roll ، Pitch و Yaw قرار می دهیم. در حلقه اصلی ، ما از این مقادیر برای چرخش شی 3D استفاده می کنیم ، در این حالت این یک جعبه ساده است که روی آن رنگ و متن خاصی وجود دارد.

اگر طرح را اجرا کنیم ، می توانیم ببینیم که سنسور MPU6050 چقدر برای ردیابی جهت گیری مناسب است. شی 3d جهت گیری سنسور را کاملاً دقیق ردیابی می کند و همچنین بسیار حساس است.

همانطور که اشاره کردم ، تنها سمت پایین این است که Yaw به مرور زمان رانش می کند زیرا ما نمی توانیم از فیلتر مکمل آن استفاده کنیم. برای بهبود این مورد ما باید از یک سنسور اضافی استفاده کنیم. این معمولاً یک مغناطیس سنج است که می تواند به عنوان تصحیح طولانی مدت برای حرکت دریچه ژیروسکوپ استفاده شود. با این حال ، MPU6050 در واقع یک ویژگی به نام Digital Motion Processor دارد که برای محاسبات پردازشی داده استفاده می شود و قادر به از بین بردن رانش Yaw است.

در اینجا همان مثال سه بعدی با استفاده از پردازشگر حرکت دیجیتال وجود دارد. می توانیم بدون رانش Yaw ببینیم که ردیابی جهت گیری اکنون چقدر دقیق است. پردازنده همچنین می تواند اعداد چهار تائی را که برای نشان دادن جهت و چرخش اجسام در سه بعد استفاده می شود محاسبه و خروجی دهد. در این مثال ما در واقع از اعداد چهار تائی برای نشان دادن جهت استفاده می کنیم .

با این وجود ، بدست آوردن این داده ها از حسگر کمی پیچیده تر از آنچه قبلا توضیح دادیم است. اول از همه ، ما باید سیم اضافی را به یک پین دیجیتال آردوینو وصل کنیم. این یک پین وقفه است که برای خواندن این نوع داده از MPU6050 استفاده می شود.

Arduino-and-MPU6050-DMP-Interrupt-pin-circuit
Arduino-and-MPU6050-DMP-Interrupt-pin-circuit

کد نیز کمی پیچیده تر است ، به همین دلیل است که ما می خواهیم از کتابخانه i2cdevlib توسط جف روبرگ استفاده کنیم. این کتابخانه را می توان از GitHub بارگیری کرد و من پیوندی را در مقاله وب سایت در آن قرار خواهم داد.

پس از نصب کتابخانه ، می توانیم نمونه MPU6050_DMP6 را از کتابخانه باز کنیم. این مثال با توضیحات برای هر سطر به خوبی توضیح داده شده است.

MPU6050_DMP6-Library-example
MPU6050_DMP6-Library-example

در اینجا می توانیم نوع خروجی مورد نظر ، اعداد چهارتایی ، زاویه های اویلر ، انحراف ، پیچ و رول ، مقدار شتاب یا کواترنیوم را برای تجسم سه بعدی انتخاب کنیم. این کتابخانه همچنین شامل یک طرح پردازشی برای مثال تجسم سه بعدی است. من فقط آن را اصلاح کردم تا مانند مثال قبلی جعبه شکل بگیرد. این کد پردازش تجسم سه بعدی است که با مثال MPU6050_DPM6 کار می کند ، برای خروجی انتخاب شده “OUTPUT_TEAPOT”:

/*
Arduino and MPU6050 IMU - 3D Visualization Example 
by Dejan, https://howtomechatronics.com
*/
import processing.serial.*;
import java.awt.event.KeyEvent;
import java.io.IOException;
Serial myPort;
String data="";
float roll, pitch,yaw;
void setup() {
size (2560, 1440, P3D);
myPort = new Serial(this, "COM7", 19200); // starts the serial communication
myPort.bufferUntil('\n');
}
void draw() {
translate(width/2, height/2, 0);
background(233);
textSize(22);
text("Roll: " + int(roll) + " Pitch: " + int(pitch), -100, 265);
// Rotate the object
rotateX(radians(-pitch));
rotateZ(radians(roll));
rotateY(radians(yaw));
// 3D 0bject
textSize(30); 
fill(0, 76, 153);
box (386, 40, 200); // Draw box
textSize(25);
fill(255, 255, 255);
text("www.HowToMechatronics.com", -183, 10, 101);
//delay(10);
//println("ypr:\t" + angleX + "\t" + angleY); // Print the values to check whether we are getting proper values
}
// Read data from the Serial Port
void serialEvent (Serial myPort) { 
// reads the data from the Serial Port up to the character '.' and puts it into the String variable "data".
data = myPort.readStringUntil('\n');
// if you got any bytes other than the linefeed:
if (data != null) {
data = trim(data);
// split the string at "/"
String items[] = split(data, '/');
if (items.length > 1) {
//--- Roll,Pitch in degrees
roll = float(items[0]);
pitch = float(items[1]);
yaw = float(items[2]);
}
}
}

بنابراین در اینجا با استفاده از تابع serialEvent اعداد چهار تایی دریافت شده از Arduino را دریافت می کنیم و در حلقه اصلی از آنها برای چرخش شی 3D استفاده می کنیم. اگر طرح را اجرا کنیم ، می توانیم ببینیم که اعداد چهارتایی برای چرخش اجسام در سه بعد چقدر خوب هستند.

د نهایت لازم به ذکر است چنانچه علاقمند به رباتیک و تکنولوژی های نوین میباشید میتوانید با اخذ نمایندگی رباتیک از طریق صنایع آموزشی چالیک به یک درآمد بسیار خوب در این حوزه دست پیدا کنید و به این شکل از علاقمندی خود درآمد کسب کنید. افرادد علاقمند میتوانند با کارشناسان ما در بخش نمایندگی صنایع آموزشی چالیک تماس بگیرند.

برای درک بهتر این پروژه میتوانید ویدیوی زیر را تماشا کنید:

رضا قنبری
متخصص آموزش رباتیک

رضا قنبری هستم متخصص آموزش رباتیک با بیش از 10 سال سابقه فعالیت در ایران

این مطلب را به اشتراک بگذارید

دسته بندی نشده

ماژول WIFI

ماژول WIFI قبل از خواندن این مقاله بهتر است در نظر داشته باشید مقالاتی که با عنوان ماژول در سایت قرار گرفته اند از مقالات

ماژول آمپلی فایر

ماژول آمپلی فایر قبل از خواندن این مقاله بهتر است در نظر داشته باشید مقالاتی که با عنوان ماژول در سایت قرار گرفته اند از

ماژول سنسور مجاورت خازنی

ماژول سنسور مجاورت خازنی قبل از خواندن این مقاله بهتر است در نظر داشته باشید مقالاتی که با عنوان ماژول در سایت قرار گرفته اند

3 دیدگاه دربارهٔ «راه اندازی ماژول MPU6050 با آردوینو»

  1. برای حذف داده های شتاب زمین از روی داده های سنسور چیکار میشه کرد؟
    در حالت سکون هم شتاب میده

    1. علی محمدی

      باید در کد نویسی تغییرات ایجاد کنید به زودی از این سنسور پروژه های دیگه هم قرار داده میشه در سایت اما کاملترین کدنویسی و راه اندازی این سنسور در بخش راکت های مدل توضیح داده خواهد شد تا خطا رو تقریبا به صفر برسونیم

    2. همچنین میتوانید مراجعه کنید به مقاله ی راه اندازی ماژول MPU6050 با آردوینو UNO (البته فعلا اون مقاله انتشار داده نشده تقریبا ۱۳ روز دیگه در سایت انتشار داده میشه)

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *