תוכן עניינים:

MPU 6050 Gyro, תקשורת מד תאוצה עם Arduino (Atmega328p): 5 שלבים
MPU 6050 Gyro, תקשורת מד תאוצה עם Arduino (Atmega328p): 5 שלבים

וִידֵאוֹ: MPU 6050 Gyro, תקשורת מד תאוצה עם Arduino (Atmega328p): 5 שלבים

וִידֵאוֹ: MPU 6050 Gyro, תקשורת מד תאוצה עם Arduino (Atmega328p): 5 שלבים
וִידֵאוֹ: Как использовать акселерометр и гироскоп MPU-6050 с кодом Arduino 2024, נוֹבֶמבֶּר
Anonim
MPU 6050 Gyro, תקשורת מד תאוצה עם Arduino (Atmega328p)
MPU 6050 Gyro, תקשורת מד תאוצה עם Arduino (Atmega328p)
MPU 6050 ג'ירו, תקשורת מד תאוצה עם Arduino (Atmega328p)
MPU 6050 ג'ירו, תקשורת מד תאוצה עם Arduino (Atmega328p)
MPU 6050 Gyro, תקשורת מד תאוצה עם Arduino (Atmega328p)
MPU 6050 Gyro, תקשורת מד תאוצה עם Arduino (Atmega328p)

ל- MPU6050 IMU יש גם תאוצה 3 צירים וגם גירוסקופ 3 צירים המשולבים בשבב אחד.

הג'ירוסקופ מודד את מהירות הסיבוב או את קצב השינוי של המיקום הזוויתי לאורך זמן, לאורך ציר X, Y ו- Z.

תפוקות הג'ירוסקופ הן במעלות לשנייה, כך שכדי לקבל את המיקום הזוויתי אנחנו רק צריכים לשלב את מהירות הזווית.

מצד שני, מד התאוצה MPU6050 מודד תאוצה על ידי מדידת האצת הכבידה לאורך 3 הצירים ובאמצעות קצת מתמטיקה טריגונומטרית נוכל לחשב את הזווית שבה החיישן ממוקם. לכן, אם נמזג, או נשלב את מד התאוצה ונתוני הג'ירוסקופ נוכל לקבל מידע מדויק מאוד על כיוון החיישן.

ג'ירוסקופ בעל 3 צירים MPU-6050 מורכב מגירוסקופ בעל 3 צירים אשר יכול לזהות מהירות סיבוב לאורך ציר x, y, z עם טכנולוגיית מערכת מיקרו אלקטרו מכנית (MEMS). כאשר החיישן מסתובב לאורך כל ציר נוצרת רטט עקב אפקט קוריוליס המתגלה על ידי ה- ADM של MEMS. 1000, +/- 2000 הם טווח הפלט המלא. מהירות זוויתית נמדדת לאורך כל ציר בדרגה ליחידה שנייה.

קישור שימושי: …………….

לוח ארדואינו: ……….

MPU6050 IMU ……………

שלב 1: מודול MPU-6050

מודול MPU-6050
מודול MPU-6050

מודול MPU-6050 כולל 8 סיכות,

INT: הפסק סיכת פלט דיגיטלית.

AD0: I2C Slave Address LSB pin. זוהי הכתובת ה -0 בכתובת העבד של 7 סיביות של המכשיר. אם הוא מחובר ל- VCC אז הוא נקרא כהגיון אחד ושינויי כתובת העבדים.

XCL: סיכת שעון סידורי עזר. סיכה זו משמשת לחיבור חיישני SCL אחרים המאפשרים ממשק I2C ל- MPU-6050.

XDA: סיכת נתונים עזריים. סיכה זו משמשת לחיבור חיישני SDA אחרים המאפשרים ממשק I2C ל- MPU-6050.

SCL: סיכת שעון סידורי. חבר את הסיכה הזו לסיכת SCL של בקרי המיקרו. SDA: סיכת נתונים סידוריים. חבר סיכה זו לסיכת SDA של מיקרו -בקרים.

GND: סיכה טחונה. חבר את הסיכה לחיבור הארקה.

VCC: סיכת אספקת חשמל. חבר את הפין הזה לאספקה +5V DC. למודול MPU-6050 יש כתובת Slave (כאשר AD0 = 0, כלומר הוא לא מחובר ל- Vcc) כמו, כתובת Slave Write (SLA+W): 0xD0

כתובת קריאת עבדים (SLA+R): 0xD1

שלב 2: חישובים

חישובים
חישובים

נתוני חיישן ג'ירוסקופ ומד תאוצה של מודול MPU6050 מורכבים מנתוני גלם של 16 סיביות בצורת השלמה של 2.

נתוני חיישן הטמפרטורה של מודול MPU6050 מורכבים מנתוני 16 סיביות (לא בצורה משלימה של 2).

עכשיו נניח שבחרנו,

  • - טווח תאוצה בקנה מידה מלא של +/- 2 גרם עם גורם רגישות של 16, 384 LSB (ספירה)/גרם.
  • - טווח גירוסקופ מלא בקנה מידה של +/- 250 °/s עם גורם סולם רגישות של 131 LSB (ספירה)/°/s. לאחר מכן,

כדי לקבל נתונים גולמיים של חיישן, עלינו לבצע תחילה השלמה של 2 על נתוני חיישנים של מד תאוצה וג'ירוסקופ. לאחר קבלת נתוני גלם חיישן אנו יכולים לחשב תאוצה ומהירות זוויתית על ידי חלוקת נתוני גלם של חיישן עם גורם הסולם הרגישות שלהם כדלקמן-

ערכי מד תאוצה ב- g (כוח g)

  • האצה לאורך ציר ה- X = (נתוני גלם של ציר X ציר X/16384) ז.
  • תאוצה לאורך ציר Y = (נתוני גלם ציר Y תאוצה/16384) ז.
  • האצה לאורך ציר Z = (נתוני גלם ציר Z תאוצה/16384) ז.

ערכי גירוסקופ ב- °/s (תואר לשנייה)

  • מהירות זוויתית לאורך ציר ה- X = (נתוני הגלם של ציר ה- Gyroscope X/131) °/s.
  • מהירות זוויתית לאורך ציר Y = (נתוני גלם של ציר Y גירוסקופ/131) °/s.
  • מהירות זוויתית לאורך ציר Z = (נתוני גלם של ציר Gyroscope Z/131) °/s.

ערך הטמפרטורה ב- °/c (תואר לכל צלזיוס)

טמפרטורה במעלות C = ((נתוני חיישן טמפרטורה)/340 + 36.53) °/ג.

לדוגמה, נניח, לאחר השלמה של 2 'אנו מקבלים מד תאוצה X צירים ערך גולמי = +15454

ואז Ax = +15454/16384 = 0.94 גרם.

יותר,

אז אנחנו יודעים שאנחנו פועלים ברגישות של +/- 2G ו- +/- 250deg/s אבל איך הערכים שלנו תואמים את אותן האצות/זוויות.

אלה שני גרפים בקו ישר ואנחנו יכולים להבין מהם שבמשך 1G נקרא 16384 ובמשך 1 מעלות/שנייה נקרא 131.07 (למרות שה -07 יקבל התעלמות עקב בינאריות) הערכים האלה פשוט נבדקו על ידי ציור ה- גרף קו ישר עם 2G ב 32767 ו- -2G ב -32768 ו -250/-250 באותם ערכים.

אז עכשיו אנחנו יודעים את ערכי הרגישות שלנו (16384 ו -131.07) אנחנו רק צריכים למנות את הקיזוזים מהערכים שלנו ואז להתחלק ברגישות.

אלה יעבדו מצוין עבור ערכי X ו- Y אך כפי שה- Z נרשם ב 1G ולא 0 נצטרך להוריד מינוס 1G (16384) לפני שנחלק לפי הרגישות שלנו.

שלב 3: חיבורי MPU6050-Atmega328p

חיבורי MPU6050-Atmega328p
חיבורי MPU6050-Atmega328p
חיבורי MPU6050-Atmega328p
חיבורי MPU6050-Atmega328p
חיבורי MPU6050-Atmega328p
חיבורי MPU6050-Atmega328p

פשוט חבר כל דבר כפי שניתן בתרשים…

החיבורים ניתנים כדלקמן:-

MPU6050 Arduino Nano

סיכת החוצה 5 V VCC

סיכת קרקע GND

פין SDA A4 // נתונים טוריים

פין SCL A5 // שעון סדרתי

חישוב המגרש והגליל: גליל הוא הסיבוב סביב ציר ה- x והמגרש הוא הסיבוב לאורך ציר y.

התוצאה היא ברדיאנים. (להמיר למעלות על ידי הכפלת 180 וחלוקה ב- pi)

שלב 4: קודים והסברים

קודים והסברים
קודים והסברים

/*

מדריך Arduino ו- MPU6050 תאוצה וחיישן גירוסקופ מאת Dejan, https://howtomechatronics.com */#include const int MPU = 0x68; // MPU6050 I2C כתובת float AccX, AccY, AccZ; float GyroX, GyroY, GyroZ; float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ; גליל צף, המגרש, יאו; צף AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ; float elapsedTime, currentTime, previousTime; int c = 0; הגדרת void () {Serial.begin (19200); Wire.begin (); // אתחל תקשורת Wire.beginTransmission (MPU); // התחל תקשורת עם MPU6050 // MPU = 0x68 Wire.write (0x6B); // שוחח עם הרשמה 6B Wire.write (0x00); // בצע איפוס - מקם 0 לרשום 6B Wire.endTransmission (true); // לסיים את השידור/* // הגדר רגישות למד תאוצה - טווח קנה מידה מלא (ברירת מחדל +/- 2g) Wire.beginTransmission (MPU); Wire.write (0x1C); // דבר עם רשם ACCEL_CONFIG (1C hex) Wire.write (0x10); // הגדר את סיביות הרישום כ- 00010000 (+/- 8 גרם טווח בקנה מידה מלא) Wire.endTransmission (true); // הגדר את רגישות הג'ירו - טווח קנה מידה מלא (ברירת מחדל +/- 250deg/s) Wire.beginTransmission (MPU); Wire.write (0x1B); // דבר עם רשם GYRO_CONFIG (1B hex) Wire.write (0x10); // הגדר את סיביות הרישום כ- 00010000 (1000deg/s בקנה מידה מלא) Wire.endTransmission (true); עיכוב (20); */ // התקשר לפונקציה זו אם אתה צריך לקבל את ערכי השגיאה של IMU עבור המודול שלך calc_IMU_error (); עיכוב (20); } לולאת חלל () {// === קרא נתוני מאיץ === // Wire.beginTransmission (MPU); Wire.write (0x3B); // התחל ברישום 0x3B (ACCEL_XOUT_H) Wire.endTransmission (שקר); Wire.requestFrom (MPU, 6, true); // קראו 6 רשמים בסך הכל, כל ערך ציר מאוחסן ב -2 רגיסטרים // לטווח של +-2 גרם, עלינו לחלק את הערכים הגולמיים ב- 16384, על פי גליון הנתונים AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; // ערך ציר ה- X AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; // ערך ציר Y AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // ערך ציר Z // חישוב גליל ומגרש מנתוני תאוצה accAngleX = (atan (AccY / sqrt (pow (AccX, 2) + pow (AccZ, 2))) * 180 / PI) - 0.58; // AccErrorX ~ (0.58) עיין בפונקציה המותאמת אישית calc_IMU_error () לפרטים נוספים accAngleY = (atan (-1 * AccX / sqrt (pow (AccY, 2) + pow (AccZ, 2))) * 180 / PI) + 1.58; // AccErrorY ~ (-1.58) // === קרא נתוני גירוסקופ === // previousTime = currentTime; // הזמן הקודם נשמר לפני הזמן בפועל קריאת currentTime = millis (); // הזמן הנוכחי בפועל קריאה elapsedTime = (currentTime - previousTime) / 1000; // חלקו ב- 1000 כדי לקבל שניות Wire.beginTransmission (MPU); Wire.write (0x43); // נתוני גירו כתובת הרשמה ראשונה 0x43 Wire.endTransmission (שקר); Wire.requestFrom (MPU, 6, true); // קראו 4 רגידים בסך הכל, כל ערך ציר מאוחסן ב- 2 רגיסטרים GyroX = (Wire.read () << 8 | Wire.read ()) / 131.0; // בטווח של 250 מעלות/ s עלינו לחלק תחילה את ערך הגלם ב- 131.0, על פי גליון הנתונים GyroY = (Wire.read () << 8 | Wire.read ())/ 131.0; GyroZ = (Wire.read () << 8 | Wire.read ()) / 131.0; // תקן את הפלט עם ערכי השגיאה המחושבים GyroX = GyroX + 0.56; // GyroErrorX ~ (-0.56) GyroY = GyroY - 2; // GyroErrorY ~ (2) GyroZ = GyroZ + 0.79; // GyroErrorZ ~ (-0.8) // נכון לעכשיו הערכים הגולמיים הם במעלות לשניות, deg/s, ולכן עלינו להכפיל במספרים (s) כדי לקבל את הזווית במעלות gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg/s * s = deg gyroAngleY = gyroAngleY + GyroY * elapsedTime; yaw = yaw + GyroZ * elapsedTime; // מסנן משלים - לשלב גלגול ערכי זווית acceleromter וג'ירו = 0.96 * gyroAngleX + 0.04 * accAngleX; המגרש = 0.96 * gyroAngleY + 0.04 * accAngleY; // הדפס את הערכים במסך הטורי Serial.print (roll); Serial.print ("/"); Serial.print (גובה); Serial.print ("/"); Serial.println (יאו); } void calcul_IMU_error () {// אנו יכולים לקרוא לתפקיד זה בקטע ההתקנה כדי לחשב את מד התאוצה ושגיאת נתוני הג'ירו. מכאן נקבל את ערכי השגיאה המשמשים את המשוואות שלעיל מודפסים על הצג הסידורי. // שימו לב שעלינו למקם את ה- IMU שטוח על מנת לקבל את הערכים הנכונים, כך שנוכל לערכים הנכונים // קראו את ערכי מד התאוצה 200 פעמים בעוד (c <200) {Wire.beginTransmission (MPU); Wire.write (0x3B); Wire.endTransmission (שקר); 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; // סכום כל הקריאות 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 ++; } // חלקו את הסכום ב- 200 כדי לקבל את ערך השגיאה AccErrorX = AccErrorX /200; AccErrorY = AccErrorY / 200; c = 0; // קראו את ערכי הג'ירו 200 פעמים בעוד (c <200) {Wire.beginTransmission (MPU); Wire.write (0x43); Wire.endTransmission (שקר); Wire.requestFrom (MPU, 6, true); GyroX = Wire.read () << 8 | Wire.read (); GyroY = Wire.read () << 8 | Wire.read (); GyroZ = Wire.read () << 8 | Wire.read (); // סכום כל הקריאות GyroErrorX = GyroErrorX + (GyroX / 131.0); GyroErrorY = GyroErrorY + (GyroYr / 131.0); GyroErrorZ = GyroErrorZ + (GyroZ / 131.0); c ++; } // חלקו את הסכום ב- 200 כדי לקבל את ערך השגיאה GyroErrorX = GyroErrorX /200; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // הדפס את ערכי השגיאה ב- 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); } ------------------------------------------------- ---------------------------------------------- תוצאות:-X = Y = Z = ---------------------------------------------------- ----------------------------------------------- הערה חשובה: -----------------

בחלק הלולאה אנו מתחילים בקריאת נתוני מד התאוצה. הנתונים עבור כל ציר מאוחסנים ב -2 בתים או אוגרים ואנו יכולים לראות את כתובות הרישומים הללו מתוך גליון הנתונים של החיישן.

על מנת לקרוא את כולם, אנו מתחילים עם הרישום הראשון, ובאמצעות הפונקציה requiestFrom () אנו מבקשים לקרוא את כל 6 הרישומים לציר X, Y ו- Z. לאחר מכן אנו קוראים את הנתונים מכל רגיסטר, ומכיוון שהפלטים משלימים שניים, אנו משלבים אותם כראוי כדי לקבל את הערכים הנכונים.

שלב 5: הבנת זווית הטיה

מד תאוצה

כוח הכבידה של כדור הארץ הוא תאוצה קבועה שבה הכוח תמיד מצביע למרכז כדור הארץ.

כאשר מד התאוצה מקביל לכוח הכבידה, התאוצה הנמדדת תהיה 1G, כאשר מד התאוצה בניצב לכוח הכבידה, הוא ימדוד 0G.

ניתן לחשב את זווית ההטיה מההאצה הנמדדת באמצעות משוואה זו:

θ = sin-1 (האצה נמדדת / האצת כוח הכבידה)

Gyro (חיישן קצב aka) משמש למדידת המהירות הזוויתית (ω).

על מנת לקבל את זווית ההטיה של רובוט, עלינו לשלב את הנתונים מהג'ירו כפי שמוצג במשוואה להלן:

ω = dθ / dt, θ = ∫ ω dt

היתוך חיישן ג'ירו ומד תאוצה לאחר לימוד המאפיינים של ג'ירו ומד תאוצה, אנו יודעים שיש להם את נקודות החוזק והחולשה שלהם. לזווית ההטיה המחושבת מנתוני מד התאוצה יש זמן תגובה איטי, בעוד שזווית ההטיה המשולבת מנתוני הג'ירו נתונה להיסחפות לאורך זמן. במילים אחרות, אנו יכולים לומר כי נתוני מד התאוצה מועילים לטווח ארוך ואילו נתוני הג'ירו שימושיים לטווח הקצר.

קישור להבנה טובה יותר: לחץ כאן

מוּמלָץ: