תוכן עניינים:
2025 מְחַבֵּר: John Day | [email protected]. שונה לאחרונה: 2025-01-13 06:57
ברוכים הבאים לאתר ההוראה הראשון שלי אי פעם! אני מקווה שתמצא את זה אינפורמטיבי. אנא אל תהסס להשאיר משוב בין אם הוא חיובי או שלילי.
פרויקט זה נועד לייצר מפלס מים דיגיטלי מבוסס arduino ו- MPU6050. בעוד שהעיצוב והקוד המוגמר הם שלי, הרעיון המקורי וחלק גדול מהקוד שעבדתי ממנו אינם. אני לא עוסק בגניבה, אז אני יותר משמח לתת קרדיט למי שהרעיונות שבניתי עליהם. 2 האנשים העיקריים שאני רוצה לזעוק אליהם הם פול מקווחורר של יוטיובר וסדנת DroneBot. אני כולל קישורים אליהם ב- PDF הקישורים השימושיים שלי ב- YouTube. תודה גם ל- EEEnthusiast על הסרטון האינפורמטיבי שלו על השימוש ב- MPU6050 כולל הגדרה וקריאה מהמודול ללא ספרייה חיצונית (הקישור שלו נמצא באותו PDF).
הפרויקט שהפקתי, עובד 'כפי שהוא' ומדויק לפיות, בהחלט עד 45% לכל כיוון. אתה יכול להשתמש בו בדיוק כפי שעיצבתי אותו, או שתוכל להתאים אותו לטעמך. החכמים מכם תשימו לב שהפרויקט שלי נראה כמעט זהה לזה שהפיק סדנת DroneBot, אך היו סמוכים ובטוחים, ישנם הבדלים משמעותיים, במיוחד בכל הנוגע לקוד לחישוב זוויות, בתוספת המתקן לאחסון ערכי כיול ב- Eeprom!
כמה תכונות שיעירו את התיאבון שלך:
זוויות פיצ' אנד רול זמינות עד 0.1 מעלות.
זיהוי אוטומטי של כיוון יחידת הג'ירו (אופקית או אנכית)
כיול מלא עם תוצאות המאוחסנות אוטומטית ב- eeprom
חיווי LED מ -2 עד +2 מעלות (ניתן לשנות בקוד)
אינדיקציה קולית נוספת לרמה (ניתן להפעיל/לכבות אותה בזבוב)
משטח קומפקטי הדורש רכיבים מינימליים
בואו נתחיל.
אספקה
פרויקט זה (כפי שהוא) משתמש בפריטים הבאים:
1 x ארדואינו ננו (שלי הוא שיבוט)
1 x מודול ג'יירו/תאוצה מד MPU6050
1 x LCD - חיבור 16 x 2 + I2C
1 x לחץ כדי ליצור מתג
1 x זמזם פיז'ו
1 x LED ירוק
2 x LED צהוב
2 x נוריות LED אדומות
נגדים 5 x 220 אוהם
כבלי מגשר שונים
לוח לחם
ספק כוח (שלי השתמש בבנק כוח USB של 5 וולט, כאשר הוא לא מחובר למחשב האישי שלי, אך תוכל להשתמש בסוללה המחוברת כראוי)
שלב 1: המעגל
בהנחה שיש לך את כל הרכיבים, יהיה עליך לבנות את לוח הלחם שלך.
אני מציג את ההתקנה שלי כמדריך, אך החיבורים הם כדלקמן:
סיכת Arduino D2 מתחברת לצד אחד של מתג הדחיפה. הצד השני של מתג הדחיפה מתחבר לאדמה
סיכת Arduino D3 מתחברת לצד אחד של הנגד של 220 אוהם. צד אחר של הנגד מתחבר לעיצוב של LED אדום. קתודה של LED אדום יורדת לקרקע.
סיכת Arduino D4 מתחברת לצד אחד של הנגד של 220 אוהם. צד אחר של הנגד מתחבר לעיצוב של LED צהוב. קתודה של LED צהוב יורדת לקרקע.
סיכת Arduino D5 מתחברת לצד אחד של הנגד של 220 אוהם. צד אחר של הנגד מתחבר לעיצוב של LED ירוק. קתודה של LED ירוק יורדת לקרקע.
סיכת Arduino D6 מתחברת לצד אחד של הנגד של 220 אוהם. צד אחר של הנגד מתחבר לעיצוב של LED צהוב. קתודה של LED צהוב יורדת לקרקע.
סיכת Arduino D7 מתחברת לצד אחד של הנגד של 220 אוהם. צד אחר של הנגד מתחבר לעיצוב של LED אדום. קתודה של LED אדום יורדת לקרקע.
סיכת Arduino D8 מתחברת לצד אחד של זמזם Piezo. צד אחר של הבאזר מתחבר לאדמה.
סיכת Arduino A4 מתחברת לסיכות SDA ב- MPU6050 ו- LCD.
סיכת Arduino A5 מתחברת לסיכות SCL ב- MPU6050 ול- LCD
הספק 5V ו- Gnd עבור MPU6050 ו- LCD מגיעים מהסיכות Arduino Nano 5v ו- GND בהתאמה.
לאחר השלמתו, הוא אמור להיות דומה להתקנה שלי המוצגת. שמתי blu tak מתחת ל- MPU6050 כדי לעצור אותו וגם על ה- LCD כדי לשמור אותו על קצה לוח הלחם.
שלב 2: הקוד
הקוד המצורף הוא הקוד בו השתמשתי לפרויקט זה. הספרייה היחידה שיש לך בעיה היא
ספריית LiquidCrystal_I2C.h כשייבאתי את זה כשהתחלתי לעבוד עם LCD. למרבה הצער, יש כמה ספריות המשתמשות באותה הצהרה #include, אך שונות במקצת. אם יש לך בעיות עם שלך, מצא קוד LCD אחר שעובד עבורך ושנה את הקוד בהתאם. סביר להניח שזו ההתקנה השונה. כל פקודות 'ההדפסה' צריכות לפעול באופן זהה.
כל הקוד קיבל הערות ובהנחה שעשיתי את זה נכון, יהיה גם סרטון שמסביר הכל, אבל הנה כמה נקודות שחשוב לשים לב אליהן:
LiquidCrystal_I2C lcd (0x27, 16, 2);
הקוד לעיל הוא ההתקנה של ה- LCD שלי. אם הספרייה שלך שונה, ייתכן שיהיה עליך לשנות לא רק את הספרייה שלך, אלא גם את השורה הזו.
{lcd.setCursor (0, 1); lcd.print ("אופקי!"); אוריינטציה = HORIZONTAL; // קרא את נתוני acc ו- gyro הגולמיים מ- MPU-6050 1000 פעמים עבור (int cal_int = 0; cal_int <1000; cal_int ++) {read_mpu_6050_data (); // הוסף את קיזוז gyro x למשתנה gyro_x_cal gyro_x_cal += gyro_x; // הוסף את קיזוז gyro y למשתנה gyro_y_cal gyro_y_cal += gyro_y; // הוסף את קיזוז gyro z למשתנה gyro_z_cal gyro_z_cal += gyro_z; // הוסף את הקיזוז acc x למשתנה acc_x_cal acc_x_cal += acc_x; // הוסף את הקיזוז acc y למשתנה acc_y_cal acc_y_cal += acc_y; } // חלק את כל התוצאות ב -1000 כדי לקבל קיזוז ממוצע gyro_x_cal /= 1000.0; gyro_y_cal /= 1000.0; gyro_z_cal /= 1000.0; acc_x_cal /= 1000.0; acc_y_cal /= 1000.0; אופק כיול = 255; eeprom_address = 0; EEPROM.put (eeprom_address, HorizonalCalibration); eeprom_address += sizeof (int); EEPROM.put (eeprom_address, gyro_x_cal); eeprom_address += sizeof (float); EEPROM.put (eeprom_address, gyro_y_cal); eeprom_address += sizeof (float); EEPROM.put (eeprom_address, gyro_z_cal); eeprom_address += sizeof (float); EEPROM.put (eeprom_address, acc_x_cal); eeprom_address += sizeof (float); EEPROM.put (eeprom_address, acc_y_cal); eeprom_address += sizeof (float); // שים לב שאנחנו לא מאחסנים קיזוז עבור acc_z, בגלל כוח הכבידה! עיכוב (500); }
בלוק הקוד לעיל מבוצע לשגרת הכיול. קוד זה מיועד לכיול אופקי. יש כמעט קוד זהה לכיול האנכי (שים לב, הקוד יודע אם ה- MPU6050 שלך מותקן אופקית או אנכית!). MPU6050, נקרא 1000 פעמים. הערכים המתאימים מתווספים במצטבר ואז נחלקים ב -1000 כדי לתת ערך 'קיזוז' ממוצע. ערכים אלה מאוחסנים לאחר מכן ב eeprom ננו. כל ערכי הכיול האופקי נשמרים החל מכתובת eeprom 0. כל הערכים האנכיים מאוחסנים מתחילה בכתובת eeprom 24. הכיול חייב להתבצע על משטח ישר לחלוטין, אחרת אין משמעותם.
/ * * השורות הבאות מעבדות את הנתונים הגולמיים כדי לשנות אותן לזוויות הניתנות לפלט ל- LCD ולנורות LED. * הערך של 4096, שנתוני ההאצה מתחלקים בו נלקח מתוך גליון הנתונים של MPU6050 והוא מבוסס על קצב הדגימה. * הערך של 9.8 הוא כוח הכבידה * הפונקציה atan2 היא ממודול המתמטיקה ומשמשת לחישוב הזוויות מהנתונים הנתונים */thetaM = -atan2 ((acc_x/4096.0) /9.8, (acc_z/4096.0) /9.8) /2/3.141592656 * 360; // נתונים גולמיים phiM = -atan2 ((acc_y/4096.0) /9.8, (acc_z/4096.0) /9.8) /2/3.141592656 * 360; // נתונים גולמיים dt = (millis ()-millisOld)/1000.; millisOld = millis (); / * * סעיף זה משתמש בנתוני הג'ירו כדי להפוך את המערכת להגיבה יותר * הערך של 65.5, אשר נתוני הג'ירו מחולקים לפיו נלקח מתוך גליון הנתונים של MPU6050 והוא מבוסס על קצב המדגם */ תטא = (תטא+(gyro_y/ 65.5)*dt)*.96 + thetaM*.04; // מסנן נמוך לעבור phi = (phi + (gyro_x/65.5)*dt)*.96 + phiM*.04; //מסנן מעביר נמוך
הקוד לעיל הוא החומר שמחשב את הזוויות. אני מקווה שההערות נותנות תובנה קטנה כיצד זה עובד, אך להסבר מעמיק יותר, עיין בסרטון של פול מק'והורטר שמקושר אליו בקובץ ה- PDF המצורף. מה שאני אגיד הוא שאתה יכול לשנות את קצב הדגימה של הג'ירו ומד התאוצה (אשר מתבצע בתת -שגרת ההתקנה MPU6050 בתחתית הקוד שלי). אם תשנה את קצב המדגם, עליך גם לשנות עד כמה הנתונים הגולמיים מחולקים. עבור נתוני מד התאוצה, הערך הנוכחי הוא 4096. עבור הג'ירו הערך הנוכחי הוא 65.5.
עיין בדפי הנתונים המצורפים והסרטון של EEEntusiast (קישור ב- PDF המצורף) למידע מעמיק יותר על האופן שבו ערכי הדגימה והקיזוז נמצאים.
שלב 3: השלבים הבאים
בשלב זה יהיה בתקווה להפוך את הפרויקט הזה, אבל מה עכשיו?
ראשית, למה בעצם לא לבנות אותו לרמה שאתה יכול להשתמש בו. אתה יכול לקנות מפלס זול (וודא שזה סוג הקופסה) שתוכל להתאים, או אם יש לך את הערכה, הדפס מפלס/קופסה משלך.
אולי תשחק עם קצב הדגימות של הג'ירו ומד התאוצה כדי לראות אם הם עובדים טוב יותר בקצב אחד מאשר אחר.
נסה לחדד את הקוד עוד יותר. לדוגמה, כיום, מעבר ל -45 מעלות, הזווית המוצהרת גסה בלשון המעטה. האם יש דרך לעקוף את זה?
אם יש לך שאלות, לא משנה כמה פשוטות הן עשויות להיראות, אנא שאל. אם אוכל לעזור, אעזור.
אם אתה אוהב את זה להוראה, אנא עשה לייק, כך שאדע.
אם אתה עושה את זה, אנא הראה לי (במיוחד אם זה במקרה עבודה).
תודה