راه اندازی ماژول mpu6050 با آردوینو
در این آموزش نحوه استفاده از سنسور شتاب سنج و ژیروسکوپ MPU6050 با Arduino را فرا خواهیم گرفت. ابتدا من نحوه کار MPU6050 و نحوه خواندن داده ها از آن را توضیح خواهم داد و سپس دو مثال عملی ارائه خواهیم داد تا با راه اندازی ماژول MPU6050 با آردوینو آشنا شوید.
چگونه کار می کند
MPU6050 IMU دارای هر دو شتاب سنج 3 محوره و ژیروسکوپ 3 محوره است که روی یک تراشه قرار گرفته است.
ژیروسکوپ سرعت چرخشی یا سرعت تغییر موقعیت زاویه ای را با گذشت زمان ، در امتداد محور X ، Y و Z اندازه گیری می کند. این ماژول از فناوری MEMS و اثر Coriolis برای اندازه گیری استفاده می کند ، اما برای جزئیات بیشتر در مورد آن می توانید آموزش خاص نحوه کار سنسورهای MEMS را بررسی کنید خروجی های ژیروسکوپ بر حسب درجه در ثانیه است ، بنابراین برای بدست آوردن موقعیت زاویه ای فقط باید سرعت زاویه ای را ادغام کنیم.
از طرف دیگر شتاب سنج MPU6050 شتاب را به همان روشی که در فیلم قبلی برای سنسور شتاب سنج ADXL345 توضیح داده شده اندازه گیری می کند. به طور خلاصه ، می تواند شتاب گرانشی را در طول 3 محور اندازه گیری کند و با استفاده از برخی از ریاضیات مثلثات می توان زاویه قرارگیری سنسور را محاسبه کرد. بنابراین ، اگر داده های شتاب سنج و ژیروسکوپ را با هم ترکیب کنیم ، می توانیم اطلاعات دقیق در مورد جهت گیری سنسور بدست آوریم.
MPU6050 IMU به دلیل 6 خروجی یا 3 خروجی شتاب سنج و 3 خروجی ژیروسکوپ ، دستگاه ردیابی حرکت شش محوره یا دستگاه 6 DoF (شش درجه آزادی) نیز نامیده می شود. افراد علاقمند جهت شرکت در دوره های آموزش رباتیک میتوانند به صورت آنلاین در این دوره ها ثبت نام نمایند.
آردوینو و MPU6050
بیایید نگاهی بیندازیم که چگونه می توانیم داده های سنسور MPU6050 را با استفاده از آردوینو متصل کنیم و بخوانیم. ما از پروتکل I2C برای برقراری ارتباط با Arduino استفاده می کنیم بنابراین برای اتصال آن فقط دو سیم به علاوه دو سیم برای برق رسانی نیاز داریم.
می توانید اجزای مورد نیاز برای این آموزش آردوینو را از پیوندهای زیر دریافت کنید:
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 را مقداردهی کنیم و حسگر را از طریق کلید پاور سنسور را مجدد راه اندازی کنیم. برای انجام این کار باید نگاهی به دیتا شیت سنسور بیندازیم که از آنجا می توانیم آدرس ثبت را ببینیم.
همچنین ، اگر بخواهیم ، می توانیم با استفاده از رجیسترهای پیکربندی ، دامنه 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); */
در بخش حلقه با خواندن داده های شتاب سنج شروع می کنیم. داده های هر محور در دو بایت یا رجیستر ذخیره می شود و می توانیم آدرس این رجیسترها را از صفحه داده سنسور ببینیم.
برای خواندن همه آنها ، ما با اولین ثبت نام شروع می کنیم و با استفاده از تابع 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 ، مناسب برای محاسبه زاویه ها ، خروجی را بر حساسیت انتخاب شده قبلی تقسیم می کنیم.
در آخر ، با استفاده از این دو فرمول ، زاویه های رول و گام را از داده های شتاب سنج محاسبه می کنیم.
// 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;
در اینجا می توانید متوجه شوید که من مقادیر خروجی را با مقادیر خطای کوچک محاسبه شده تصحیح می کنم ، که من توضیح می دهم چگونه آنها را در یک دقیقه بدست می آوریم. بنابراین چون خروجی ها بر حسب درجه در ثانیه هستند ، اکنون باید آنها را با زمان ضرب کنیم تا فقط درجه بگیریم. مقدار زمان قبل از هر تکرار خواندن با استفاده از تابع 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 استفاده می شود.
کد نیز کمی پیچیده تر است ، به همین دلیل است که ما می خواهیم از کتابخانه i2cdevlib توسط جف روبرگ استفاده کنیم. این کتابخانه را می توان از GitHub بارگیری کرد و من پیوندی را در مقاله وب سایت در آن قرار خواهم داد.
پس از نصب کتابخانه ، می توانیم نمونه MPU6050_DMP6 را از کتابخانه باز کنیم. این مثال با توضیحات برای هر سطر به خوبی توضیح داده شده است.
در اینجا می توانیم نوع خروجی مورد نظر ، اعداد چهارتایی ، زاویه های اویلر ، انحراف ، پیچ و رول ، مقدار شتاب یا کواترنیوم را برای تجسم سه بعدی انتخاب کنیم. این کتابخانه همچنین شامل یک طرح پردازشی برای مثال تجسم سه بعدی است. من فقط آن را اصلاح کردم تا مانند مثال قبلی جعبه شکل بگیرد. این کد پردازش تجسم سه بعدی است که با مثال 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 استفاده می کنیم. اگر طرح را اجرا کنیم ، می توانیم ببینیم که اعداد چهارتایی برای چرخش اجسام در سه بعد چقدر خوب هستند.
د نهایت لازم به ذکر است چنانچه علاقمند به رباتیک و تکنولوژی های نوین میباشید میتوانید با اخذ نمایندگی رباتیک از طریق صنایع آموزشی چالیک به یک درآمد بسیار خوب در این حوزه دست پیدا کنید و به این شکل از علاقمندی خود درآمد کسب کنید. افرادد علاقمند میتوانند با کارشناسان ما در بخش نمایندگی صنایع آموزشی چالیک تماس بگیرند.
برای درک بهتر این پروژه میتوانید ویدیوی زیر را تماشا کنید:
3 دیدگاه دربارهٔ «راه اندازی ماژول MPU6050 با آردوینو»
برای حذف داده های شتاب زمین از روی داده های سنسور چیکار میشه کرد؟
در حالت سکون هم شتاب میده
باید در کد نویسی تغییرات ایجاد کنید به زودی از این سنسور پروژه های دیگه هم قرار داده میشه در سایت اما کاملترین کدنویسی و راه اندازی این سنسور در بخش راکت های مدل توضیح داده خواهد شد تا خطا رو تقریبا به صفر برسونیم
همچنین میتوانید مراجعه کنید به مقاله ی راه اندازی ماژول MPU6050 با آردوینو UNO (البته فعلا اون مقاله انتشار داده نشده تقریبا ۱۳ روز دیگه در سایت انتشار داده میشه)