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

כיף ג'ירוסקופ עם טבעת ניאופיקסל: 4 שלבים (עם תמונות)
כיף ג'ירוסקופ עם טבעת ניאופיקסל: 4 שלבים (עם תמונות)

וִידֵאוֹ: כיף ג'ירוסקופ עם טבעת ניאופיקסל: 4 שלבים (עם תמונות)

וִידֵאוֹ: כיף ג'ירוסקופ עם טבעת ניאופיקסל: 4 שלבים (עם תמונות)
וִידֵאוֹ: ג'יירו 2024, נוֹבֶמבֶּר
Anonim
Image
Image

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

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

אני בונה את ההדרכה הזו בגלל העניין שראיתי בהוראה הראשונה שלי כאן (Gyroscope Led Control With Arduino). במדריך זה החלפתי את הלדים הפשוטים עם טבעת ניאופיקסל. הטבעת פשוטה יותר לשימוש באמצעות ספריית Adafruit והיא בהחלט מרהיבה יותר.

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

שלב 1: חובה

הַרכָּבָה
הַרכָּבָה

חלקים

1. Arduino pro mini 328p (eBay) 2 $

2. לוח לחם

3. ג'ירוסקופ MPU6050 (eBay) 1.2 $

4. טבעת לד LED 24 neopixel (Adafruit) 17 $

5. מארז סוללות 4 x AA עם 4 סוללות

6. כבלי מגשר בצורת U (אופציונלי). השתמשתי בכבלי המגשר האלה מכיוון שהם נראים טוב יותר על לוח הלחם, והנורות נראות יותר כך. אתה יכול למצוא קופסה של 140 ב- eBay במחיר של כ 4 $. אם אין לך כבלים אלה תוכל להחליף אותם בחוטי דופונט.

כלים:

1. מתאם USB FTDI טורי FT232RL לתכנות ה- arduino pro mini

2. Arduino IDE

כישורים: 1. הלחמה, עיין במדריך זה

3. תכנות בסיסי בארדואינו, הדרכה זו עשויה להיות שימושית

שלב 2: הרכבה

הַרכָּבָה
הַרכָּבָה

צירפתי את סכמטי הפריטים בפורמט fzz ותמונה שלו להדמיה קלה של החיבורים

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

- הלחמה של הסיכה החיובית

- הלחמה של הקרקע

- הלחמה של סיכת קלט הנתונים

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

3. מכינים את לוח הלחם.

- הניחו את טבעת הניאופיקסל, המיקרו -בקר והג'ירוסקופ על לוח הלחם כמו בתמונה

- מקם את כל החוטים השליליים: אל המיקרו -בקר, טבעת ניאופיקסל, ג'יירו

- הניחו את כל החוטים החיוביים: אל המיקרו -בקר, טבעת ניאופיקסל, ג'יירו

- מקם את כל חוטי הנתונים:

* SDA ו- SCL מהמיקרו -בקר לג'ירו

* הצמד D6 מהמיקרו -בקר לטבעת הניאופיקסל

- בדוק שוב את כל החיבורים לפני הפעלה

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

שלב 3: הקוד והכיול

ראשית עליך להוריד ולהתקין שתי ספריות:

1. ספריית Adafruit neopixel בשליטה ב- neopixel

2. ספריית MPU6050 לג'ירוסקופ

3. מקור ספריית I2CDev

הן שתי ספריות נהדרות שיעשו את העבודה הכבדה!

פרטים נוספים על הניאופיקסלים כאן

לאחר מכן הורד והתקן את הספרייה שלי מכאן או העתק אותה מלמטה:

#כלול "I2Cdev.h"

#include #include "MPU6050_6Axis_MotionApps20.h" #include "Wire.h" #define NEOPIXED_CONTROL_PIN 6 #define NUM_LEDS 24 const int MAX_ANGLE = 45; const int LED_OFFSET = 12; MPU6050 mpu; רצועת Adafruit_NeoPixel = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800); unsigned long lastPrintTime = 0; אתחול בול = שקר; // set true אם DMP init הצליח uint8_t mpuIntStatus; // מחזיק בתור סטטוס בפסיקה ממשית מ- MPU uint8_t devStatus; // סטטוס החזרה לאחר כל פעולת מכשיר (0 = הצלחה,! 0 = שגיאה) uint16_t packetSize; // גודל מנות DMP צפוי (ברירת המחדל היא 42 בתים) uint16_t fifoCount; // ספירת כל הבייטים הנמצאים כעת ב- FIFO uint8_t fifoBuffer [64]; // מאגר אחסון FIFO Quaternion q; // [w, x, y, z] מיכל הרבעון VectorFloat gravity; // [x, y, z] צף וקטור הכבידה ypr [3]; // [yaw, pitch, roll] מיכל yaw/pitch/roll ו- gravity וקטור נדיף bool mpuInterrupt = false; // מציין אם סיכת ההפרעה של MPU עלתה גבוה

הגדרת חלל ()

{Serial.begin (9600); Serial.println ("התוכנית התחילה"); אתחול = initializeGyroscope (); strip.begin (); } לולאת void () {if (! אתחול) {return; } mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); לַחֲזוֹר; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& כוח הכבידה, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & כוח הכבידה); redrawLeds (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }} hasFifoOverflown בוליאני (int mpuIntStatus, int fifoCount) {return mpuIntStatus & 0x10 || fifoCount == 1024; } void redrawLeds (int x, int y, int z) {x = אילוץ (x, -1 * MAX_ANGLE, MAX_ANGLE); y = אילוץ (y, -1 * MAX_ANGLE, MAX_ANGLE); אם (y 0) {lightLeds (y, z, 0, 5, 0, 89); } אחרת אם (y <0 ו- z 0 ו- z 0 ו- z> 0) {lightLeds (y, z, 20, 24, 89, 0); }} void lightLeds (int x, int y, int fromLedPosition, int toLedPosition, int fromAngle, int toAngle) {double angle = (atan ((double) abs (x) / (double) abs (y)) * 4068) / 71; int ledNr = map (angle, fromAngle, toAngle, fromLedPosition, toLedPosition); printDebug (x, y, ledNr, זווית); צבע uint32_t; for (int i = 0; i position + LED_OFFSET) {position return + LED_OFFSET; } עמדת החזרה + LED_OFFSET - NUM_LEDS; } void printDebug (int y, int z, int lightLed, int angle) {if (millis () - lastPrintTime <500) {return; } Serial.print ("a ="); Serial.print (זווית); Serial.print (";"); Serial.print ("ll ="); Serial.print (lightLed); Serial.print (";"); Serial.print ("y ="); Serial.print (y); Serial.print (";"); Serial.print ("z ="); Serial.print (z); Serial.println (";"); lastPrintTime = millis (); } bool initializeGyroscope () {Wire.begin (); TWBR = 24; mpu.initialize (); Serial.println (mpu.testConnection ()? F ("חיבור MPU6050 מוצלח"): F ("חיבור MPU6050 נכשל")); Serial.println (F ("אתחול DMP …")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("אתחול DMP נכשל (קוד")); Serial.println (devStatus); החזר false;} mpu.setDMPEnabled (true); Serial.println (F ("הפעלת זיהוי הפרעות (Arduino interrupt extern 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP מוכן! מחכה להפרעה ראשונה … ")); packetSize = mpu.dmpGetFIFOPacketSize (); החזר נכון;} חלל dmpDataReady () {mpuInterrupt = true;}

העלה את הקוד:

שימוש במתאם FTDI העלה את הקוד לארדואינו.

חבר את ספק הכוח (סוללות)

כִּיוּל:

הדבר החשוב ביותר לכייל כאן הוא קבוע "LED_OFFSET". בדוגמה שלי היא 12. אתה צריך להתאים את זה מ -0 עד 23 כך שאחרי הפעלת הלוח הדלק ידלק בכיוון בו אתה מטה את הלוח.

אם אתה רוצה לברר פרטים נוספים על אופן הפעולה, בדוק את השלב האחרון

שלב 4: איך זה עובד (אופציונלי)

איך זה עובד (אופציונלי)
איך זה עובד (אופציונלי)

ראשית קצת מידע על הג'ירוסקופ MPU6050. זהו ג'ירוסקופ MEMS (MEMS מייצג מערכות מיקרואלקטרומכניות).

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

הג'ירו מכיל גם מיקרו -בקר משלו לחישוב הגליל, המגרש והמפה באמצעות כמה מתמטיקה מהודרת.

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

ה- Neopixel הם נוריות RGB שניתן להתייחס אליהן בנפרד וכבולות להקות וטבעות. הם עובדים על 5V והם מכילים מעגלים משלהם, כך שאתה רק צריך להפעיל את הפיקסלים ולתקשר איתם באמצעות קו הנתונים. התקשורת מתבצעת עם קו נתונים יחיד המכיל שעון ונתונים (פרטים נוספים כאן). Adafruit מספקת ספרייה נקייה לאינטראקציה עם טבעות הניאופיקסל.

הקוד

בתוך הפונקציה l oop () נקראת ספריית MPU6050_6Axis_MotionApps20. כאשר לספרייה יש נתונים חדשים מה- gyroscpe היא מכנה redrawLeds (x, y, z) עם 3 ארגומנטים המייצגים yaw, pitch and roll

בתוך redrawLeds ():

- אנו מתמקדים בשני צירים: y, z

- אנו מגבילים את שני הצירים מ -MAX_ANGLE ל- +MAX_ANGLE, הגדרנו את הזווית המרבית ל -45 והיא ניתנת לשינוי

- אנו מחלקים 360 מעלות ל -4 רבעים וקוראים לפונקציות lightLeds () לכל אחת כדלקמן:

* y שלילי, z חיובי הרבע הראשון ישלוט על הלדים מ 0 עד 5, הזווית תהיה מ 0 עד 89

* y שלילי, z שלילי השליטה ברביע השני מוביל בין 6 ל -12, הזווית תהיה בין 89 ל -0

* …וכו

- בתוך הפונקציה lightLeds

* אני מחשב זווית על בסיס שני הצירים באמצעות ארקטנג'נט (בדוק את התמונה המצורפת)

* אני מחשב את מה שהוביל להראות באמצעות פונקציית מפת הארדואינו

* אני מאפס את רצועת הלדים מלבד שתי לדים, זה המתאים למיקום הלדים שחישבתי בעבר ומיקום לד לפני (כדי להראות אפקט דהייה)

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

* אני גם מדפיס את ציר הגרירה, מה של LED יש אור והזווית

המתמטיקה

צירפתי תמונה עם טבעת הלד והפונקציה הטריגונומטרית המשמשת לקביעת הזווית.

מוּמלָץ: