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

הדגמת קלטת אטמוספרי Arduino/ MS5611 GY63 GY86 הפגנה: 4 שלבים (עם תמונות)
הדגמת קלטת אטמוספרי Arduino/ MS5611 GY63 GY86 הפגנה: 4 שלבים (עם תמונות)
Anonim
מדידת קלטת אטמוספרי ארדואינו/ הדגמת MS5611 GY63 GY86
מדידת קלטת אטמוספרי ארדואינו/ הדגמת MS5611 GY63 GY86

זה באמת ברומטר/מד גובה אבל תראה את הסיבה לכותרת על ידי הסתכלות על הסרטון.

חיישן הלחץ MS5611, שנמצא בלוחות הפריצה של Arduino GY63 ו- GY86, מספק ביצועים מדהימים. ביום רגוע הוא ימדוד את הגובה שלך עד 0.2 מ '. זה למעשה למדוד את המרחק מהראש שלך לחלל החיצון ולחסור אותו ממרחק כפות הרגליים שלך לחלל החיצון (על ידי מדידת לחץ - כלומר משקל האוויר מעל). למכשיר המרהיב הזה יש טווח שימדוד בנוחות את גובה האוורסט - ויכול גם למדוד עד כמה סנטימטרים.

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

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

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

שימו לב ללוח GY63 יש רק חיישן לחץ MS5611. ה- GY86 נקרא לוח 10 מעלות של חופש וכולל גם מד תאוצה 3 צירים, ג'ירו 3 צירים ומגנטומטר 3 צירים רק בכמה דולרים נוספים.

אתה תצטרך:

1. Arduino UNO (או אחר עם pinout רגיל) וכבל ה- USB שלו

2. לוח פריצה GY63 או GY86

3. 4 דופונט מוביל זכר -נקבה - או חוט מחבר

4. מגן לוח מקשים Arduino LCD

5. סוללה 9v ועופרת

6. רצועת שקעים 2.54 מ מ (אופציונלי אך מומלץ)

הכנה

הורד את Arduino IDE (סביבת פיתוח משולבת) מ:

כמה קטעים טכניים לעניין

MS5611 מספק את הביצועים הנהדרים שלו על ידי ממוצע של מספר רב של מדידות. הוא יכול לבצע 4096 מדידות אנלוגיות של 3 בתים (24 ביט) תוך 8ms בלבד ולתת את הערך הממוצע. הוא צריך למדוד את הלחץ והטמפרטורה, כך שניתן לתקן את נתוני הלחץ לטמפרטורה פנימית. מכאן שהוא יכול לספק כ -60 זוגות קריאות לחץ וטמפרטורה בשנייה.

גליון הנתונים זמין בכתובת:

התקשורת היא באמצעות I2C. כך שחיישני I2C אחרים יכולים לשתף את האוטובוס (כפי שקורה בלוח GY86 10DOF שבו כל השבבים נמצאים על I2C).

שלב 1: קבל ספריית MS5611

רבים מחיישני Arduino משתמשים בספרייה סטנדרטית הכלולה ב- Arduino IDE או מסופקים עם קובץ zip עם ספרייה הניתנת להתקנה בקלות. זה נוטה שלא להיות במקרה של חיישני MS5611. עם זאת חיפוש מצא: https://github.com/gronat/MS5611 הכולל ספרייה עבור MS5611, כולל ביצוע תיקון הטמפרטורה.

אופציה 1

עבור לאתר למעלה, לחץ על 'שיבוט או הורדה' ובחר 'הורד ZIP'. זה אמור להעביר את MS5611-master.zip לספריית ההורדות שלך. כעת, אם תרצה, העבר אותו לתיקייה שבה תוכל למצוא אותה בעתיד. אני משתמש בספרייה בשם 'נתונים' שנוספה לתיקיות ה- Arduino שלי.

למרבה הצער, קובץ ה- zip שהורדת אינו כולל סקיצות דוגמא וזה יהיה נחמד להוסיף את הספרייה ודוגמאות ל- IDE של Arduino. ישנה דוגמא מינימלית בקובץ README.md שניתן להעתיק ולהדביק אותו בשרטוט ולשמור אותו. זוהי דרך אחת לצאת לדרך.

אפשרות 2

כדי להקל על הפעלת הקוד במדריך זה הוספתי את הדוגמא המינימלית למעלה ואת הדוגמאות המוצגות כאן לספרייה וצירפתי להלן קובץ zip שיותקן ב- Arduino IDE.

הורד את קובץ ה- zip למטה. העבר את זה לתיקייה טובה יותר אם תרצה.

הפעל את Arduino IDE. לחץ על סקיצה> כלול ספרייה> הוסף קובץ zip ובחר את הקובץ. הפעל מחדש את IDE. כעת תותקן הספרייה ב- IDE בתוספת כל הדוגמאות המוצגות כאן. בדוק על ידי לחיצה על קובץ> דוגמאות >> MS5611-master. יש לרשום שלוש סקיצות.

שלב 2: חבר את החיישן ל- Arduino ובדוק

חבר את החיישן ל- Arduino ובדוק
חבר את החיישן ל- Arduino ובדוק
חבר את החיישן ל- Arduino ובדוק
חבר את החיישן ל- Arduino ובדוק

לוחות GY63/GY86 מגיעים בדרך כלל עם כותרות אך לא מולחמות. אז זוהי בחירה שלך להלחם את הכותרות במקומן ולהשתמש בלדים מסוג Dupont זכר-נקבה, או (כפי שהחלטתי) מוליכות הלחמה ישירות ללוח ולהוסיף סיכות להוביל כדי לחבר את הארדואינו. האפשרות השנייה טובה יותר אם אתה חושב שתרצה אולי להלחים את הלוח לפרויקט מאוחר יותר. הראשון טוב יותר אם אתה רוצה להשתמש בלוח לניסויים. הרבה יותר קל לא להלחיץ לידים מכותרת סיכה.

החיבורים הנדרשים הם:

GY63/GY86 Arduino

VCC - 5v Power GND - GND Ground SCL - A5 I2C שעון> SDA - נתוני A4 I2C

חבר את לוח החיישנים ל- Arduino כאמור ולחבר את Arduino למחשב/מחשב נייד באמצעות כבל ה- USB שלו. כסו גם את החיישן בחומר אטום/שחור. החיישן רגיש לאור (כפי שקורה ברוב חיישן מסוג זה).

הפעל את Arduino IDE. נְקִישָׁה:

קובץ> דוגמאות >> MS5611-master> MS5611data2serial.

מופע חדש של IDE יופיע עם הסקיצה. לחץ על כפתור ההעלאה (חץ ימינה).

לאחר מכן הפעל את המגרש הטורי - לחץ על כלים> מגשש סידורי ובמידת הצורך הגדר את השידור ל- 9600. הנתונים הנשלחים הם הלחץ ב- Pascals. לאחר שנייה בערך זה יגדל מחדש והרמה והורדה של החיישן באומר 0.3 מ 'אמורה להראות כהורדה והרמה של עקבות (גובה נמוך יותר הוא לחץ גבוה יותר).

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

משוואת המסננים היא:

ערך = ערך + K (ערך חדש)

כאשר 'ערך' הוא הנתונים המסוננים, ו'חדש 'הוא המדד האחרון שנמדד. אם K = 1 אין סינון. עבור ערכים נמוכים יותר של K הנתונים מוחלקים עם קבוע זמן של T/K כאשר T הוא הזמן בין הדגימות. כאן T הוא סביב 17ms כך שערך של 0.1 נותן קבוע זמן של 170ms או סביב 1/6s.

ניתן להוסיף את המסנן על ידי:

הוסף משתנה לנתונים המסוננים לפני ההתקנה ():

מצוף מסונן = 0;

לאחר מכן הוסף את משוואת המסנן לאחר הלחץ =…. קַו.

מסונן = מסונן + 0.1*(מסונן בלחץ);

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

אם (מסונן! = 0) {

מסונן = מסונן + 0.1*(מסונן בלחץ); } אחר {מסונן = לחץ; // קריאה ראשונה אז הגדר מסונן לקריאה}

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

לבסוף עלינו לשנות 'לחץ' ל'מסונן 'בהצהרת Serial.println כדי שנראה את הערך המסונן.

הלמידה הטובה ביותר מושגת על ידי ביצוע השינויים לעיל באופן ידני. עם זאת כללתי אותם בדוגמה MS5611data2serialWfilter. אז אם יש בעיות אפשר לטעון את הדוגמה.

כעת העלה את הקוד ל- Arduino וראה את השיפור. ראה עלילה שנייה למעלה וציין כי סולם Y מורחב x2.

נסה ערך נמוך יותר עבור קבוע המסנן, נניח 0.02 במקום 0.1, וראה את ההבדל. הנתונים חלקים יותר אך עם תגובה איטית יותר. זוהי פשרה שיש לחפש בעת שימוש במסנן פשוט זה. המאפיין זהה למסנן RC (התנגדות וקיבול) הנמצא בשימוש נרחב במעגלים אלקטרוניים.

שלב 3: הפוך אותו לעצמאי

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

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

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

וודא שאין גשרים בהלחמה בעת הלחמתם על הלוח.

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

הכינו גם את הסוללה והעופרת. המצאתי את ההובלה שלי מחלקים בפח האשפה שלי אבל הם זמינים גם ב- eBay - כולל אפשרות נחמדה הכוללת ארגז סוללות ומתג. חפש על 'PP3 2.1mm lead'.

הצריכה הנוכחית היא סביב 80ma. מכאן שאם אתה רוצה לרוץ יותר מכמה דקות, שקול סוללה גדולה יותר של 9V מאשר ה- PP3.

שלב 4: הוסף קוד לגובה ול- LCD

Image
Image

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

בתחילת הסקיצה הוסיפו את ספריית התצוגה וספרו אילו סיכות משמשות:

#לִכלוֹל

// לאתחל את הספרייה עם המספרים של סיכות הממשק LiquidCrystal lcd (8, 9, 4, 5, 6, 7);

בשלב הבא נצטרך כמה משתנים ופונקציה לקריאת לחצני לוח המקשים. כל אלה מחוברים לכניסת A0 אנלוגית. כל כפתור נותן מתח אחר ל- A0. חיפוש על 'קוד לחצני מגן arduino lcd' מצא קוד טוב ב:

www.dfrobot.com/wiki/index.php/Arduino_LCD_KeyPad_Shield_(SKU:_DFR0009)#Sample_Code

הוסף קוד זה לפני ההתקנה ():

// הגדר כמה ערכים המשמשים את הלוח והלחצנים

int lcd_key = 0; int adc_key_in = 0; #define btnRIGHT 0 #define btnUP 1 #define btnDOWN 2 #define btnLEFT 3 #define btnSELECT 4 #define btnNONE 5 // קרא את הכפתורים int read_LCD_buttons () {adc_key_in = analogRead (0); // קרא את הערך מהחיישן // הלחצנים שלי בעת קריאה מרוכזים בערכים אלה: 0, 144, 329, 504, 741 // אנו מוסיפים בערך 50 לערכים אלה ובודקים אם אנו קרובים אם (adc_key_in> 1000) החזר btnNONE; // אנו הופכים את זה לאפשרות הראשונה מסיבות מהירות מכיוון שזו תהיה התוצאה הסבירה ביותר אם (adc_key_in <50) תחזיר btnRIGHT; if (adc_key_in <250) החזר btnUP; אם (adc_key_in <450) החזר btnDOWN; אם (adc_key_in <650) החזר btnLEFT; if (adc_key_in <850) החזר btnSELECT; החזר btnNONE; // כאשר כל האחרים נכשלים, החזר את זה …}

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

float mtr;

צף ref = 0;

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

יש להגדיר את ההפניה לקריאת הלחץ הראשונה כך שנתחיל בגובה אפס וכאשר נלחץ על כפתור SELECT. הוסף, לאחר קוד המסנן, ולפני המשפט Serial.println:

אם (ref == 0) {

ref = מסונן/12.0; } אם (read_LCD_buttons () == btnSELECT) {ref = מסונן/12.0; }

לאחר מכן הוסף את חישוב הגובה:

mtr = ref - מסונן/12.0;

לבסוף שנה את הצהרת Serial.println לשלוח 'mtr' במקום 'מסונן', והוסף קוד לשליחת 'mtr' אל ה- LCD:

Serial.println (mtr); // שלח לחץ באמצעות סדרה (UART)

lcd.setCursor (0, 1); // שורה 2 lcd.print (mtr);

כל השינויים כאן כלולים בדוגמה MS5611data2lcd. טען את זה כמו בשלב 2.

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

אז הוסף מונה אחרי כל ההגדרות המשתנות האחרות בתחילת המערכון (למשל אחרי float ref = 0;):

int i = 0;

לאחר מכן הוסף קוד להוספת 'i' והצהרה 'אם' להפעלה כאשר הוא מגיע ל -20 ולאחר מכן החזר אותו לאפס והעבר את הפקודות Serial ו- lcd בתוך המשפט 'if' כך שהן מבוצעות רק כל קריאה 20:

i += 1;

אם (i> = 20) {Serial.println (mtr); // שלח לחץ באמצעות סדרתי (UART) lcd.setCursor (0, 1); // שורה 2 lcd.print (mtr); i = 0; }

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

פרויקט זה אמור לתת נקודת מוצא טובה למשל לברומטר דיגיטלי. למי שרוצה לשקול שימוש בדגמי RC - חפש OpenXvario אחר קוד המאפשר מד גובה ומדדים עבור מערכות טלמטריה Frsky ו- Turnigy 9x.

מוּמלָץ: