תוכן עניינים:
- שלב 1: מודול MPU-6050
- שלב 2: חישובים
- שלב 3: חיבורי MPU6050-Atmega328p
- שלב 4: קודים והסברים
- שלב 5: הבנת זווית הטיה
וִידֵאוֹ: MPU 6050 Gyro, תקשורת מד תאוצה עם Arduino (Atmega328p): 5 שלבים
2024 מְחַבֵּר: John Day | [email protected]. שונה לאחרונה: 2024-01-30 09:12
ל- 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 כולל 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 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
היתוך חיישן ג'ירו ומד תאוצה לאחר לימוד המאפיינים של ג'ירו ומד תאוצה, אנו יודעים שיש להם את נקודות החוזק והחולשה שלהם. לזווית ההטיה המחושבת מנתוני מד התאוצה יש זמן תגובה איטי, בעוד שזווית ההטיה המשולבת מנתוני הג'ירו נתונה להיסחפות לאורך זמן. במילים אחרות, אנו יכולים לומר כי נתוני מד התאוצה מועילים לטווח ארוך ואילו נתוני הג'ירו שימושיים לטווח הקצר.
קישור להבנה טובה יותר: לחץ כאן
מוּמלָץ:
ג'ויסטיק USB MPU-6050 DIY: 5 שלבים
ג'ויסטיק USB MPU-6050 USB: בעזרת סימולטור טיסה של Microsoft 2020 הבנתי מהר עד כמה קשה להשתמש במקלדת כדי להעלות תכנית. כשחיפשתי באינטרנט לא הצלחתי למצוא ג'ויסטיק במחיר סביר לרכישה. רוב הקמעונאים המקוונים אזלו אותם במלאי. הפופולריות של M
חיישן Sistema De Prevenção De Deslizamentos Com MPU-6050: 6 שלבים
Sistema De Prevenção De Deslizamentos Com Sensor MPU-6050: O sensor MPU-6050 é um chip que possui um acelerômetro e um giroscópio tipo MEMS. São 3 eixos para o acelerômetro e 3 eixos para o giroscópio, sendo ao todo 6 graus de liberdade (6DOF)
Raspberry Pi - מדריך תאוצה 3 -ציר ADXL345 מדריך תאוצה: 4 שלבים
Raspberry Pi-מדד תאוצה 3 צירים ADXL345 מדריך תאוצה: ה- ADXL345 הוא מד תאוצה קטן ודק במיוחד בעל 3 צירים עם מדידה ברזולוציה גבוהה (13 סיביות) עד ± 16 גרם. נתוני הפלט הדיגיטליים מעוצבים כהשלמה של 16 סיביות ונגישים באמצעות ממשק דיגיטלי I2 C. הוא מודד את
רישום נתונים בזמן אמת MPU-6050/A0 עם Arduino ו- Android: 7 שלבים (עם תמונות)
רישום נתונים בזמן אמת MPU-6050/A0 עם Arduino ו- Android: התעניינתי להשתמש ב- Arduino ללמידת מכונות. כצעד ראשון, אני רוצה לבנות תצוגת נתונים ורשום בזמן אמת (או די קרוב לזה) באמצעות מכשיר אנדרואיד. אני רוצה ללכוד נתוני מד תאוצה מ- MPU-6050 אז אני מתכנן
מקדים* SPI ב- Pi: תקשורת עם מד תאוצה 3 צירים SPI באמצעות פטל פטל: 10 שלבים
מקדים* SPI ב- Pi: תקשורת עם מד תאוצה 3 צירים באמצעות SPI באמצעות פטל פטל: מדריך שלב אחר שלב כיצד להתקין את Raspbian ולתקשר עם מכשיר SPI באמצעות ספריית SPM bcm2835 (לא חבטה קצת!) זה עדיין מאוד ראשוני … אני צריך להוסיף תמונות טובות יותר של חיבור פיזי ולעבוד על חלק מהקוד המביך