בהדרכות קודמות למדנו כיצד לממשק מודול GPS למחשב וכיצד לעקוב אחר רכב באמצעות GSM ו- GPS. בנינו גם מערכת התראות על תאונות רכב באמצעות ארדואינו ומד תאוצה. כאן אנו שוב בונים את אותו הפרויקט, אך הפעם ישמשו משטח שיגור MSP430 וחיישן רטט לאיתור תאונות דרכים. אז הפרויקט הזה יספר גם על ממשק חיישן רטט עם לוח השיגור MSP430. תוכל למצוא פרויקטים נוספים של MSP430 כאן.
כאן מודול חיישן הרטט מגלה את הרטט של הרכב ושולח אות ל- MSP430 Launchpad. ואז MSP430 מביא נתונים ממודול ה- GPS ושולח אותם למשתמש הטלפון הנייד באמצעות SMS באמצעות מודול GSM. נורית נורית תידלק גם כאות התראת תאונה, ניתן להחליף נורית זו על ידי אזעקה כלשהי. מיקום התאונה נשלח בצורה של קישור Google Map, הנגזר מקו הרוחב והאורך ממודול ה- GPS. ראה את סרטון ההדגמה בסוף.
מודול GPS שולח את הנתונים הקשורים למיקום המעקב בזמן אמת, והוא שולח כל כך הרבה נתונים בפורמט NMEA (ראה צילום המסך למטה). פורמט NMEA מורכב מכמה משפטים, בהם אנו זקוקים למשפט אחד בלבד. משפט זה מתחיל מ- $ GPGGA ומכיל את הקואורדינטות, הזמן ומידע שימושי אחר. זה GPGGA נקרא Data תקן מערכת מיקום גלובלית. למידע נוסף על משפטים של NMEA וקריאת נתוני GPS כאן.
אנו יכולים לחלץ קואורדינטות ממחרוזת $ GPGGA על ידי ספירת הפסיקים במחרוזת. נניח שאתה מוצא מחרוזת $ GPGGA ושומר אותו במערך, ואז ניתן למצוא את Latitude לאחר שתי פסיקים ואת קו האורך ניתן למצוא אחרי ארבע פסיקים. כעת, ניתן להכניס קו רוחב ואורך זה למערכים אחרים.
להלן מחרוזת $ GPGGA, יחד עם תיאורו:
$ GPGGA, 104534.000,7791.0381, N, 06727.4434, E, 1,08,0.9,510.4, M, 43.9, M,, * 47 $ GPGGA, HHMMSS.SSS, קו רוחב, N, קו אורך, E, FQ, NOS, HDP, גובה, M, גובה, M,, נתוני בדיקה
מזהה |
תיאור |
$ GPGGA |
נתונים לתיקון מערכת מיקום גלובלית |
HHMMSS.SSS |
זמן בפורמט של דקה שעה שניות ומילישניות. |
קו רוחב |
קו רוחב (קואורדינטות) |
נ |
כיוון N = צפון, S = דרום |
קו אורך |
קו אורך (קואורדינטות) |
ה |
כיוון E = מזרח, W = מערב |
FQ |
תקן נתוני איכות |
NOS |
מספר לוויינים בשימוש |
HDP |
דילול אופקי של דיוק |
גוֹבַה |
גובה (מטר מעל פני הים) |
M |
מטר |
גוֹבַה |
גוֹבַה |
סכום בדיקה |
נתוני בדיקת בדיקה |
מודול GSM
ה- SIM900 הוא מודול GSM / GPRS מרובע-פס אשר ניתן להטמיע בו בקלות על ידי הלקוח או התחביב. מודול GSM SIM900 מספק ממשק סטנדרטי בתעשייה. SIM900 מספק ביצועי GSM / GPRS 850/900/1800 / 1900MHz עבור קול, SMS, נתונים עם צריכת חשמל נמוכה. זה זמין בקלות בשוק.
- SIM900 תוכנן באמצעות מעבד שבב יחיד המשלב ליבת AMR926EJ-S
- מודול GSM / GPRS בעל ארבע רצועות בגודל קטן.
- GPRS מופעל
פקודות AT
AT פירושו תשומת לב. פקודה זו משמשת לשליטה במודול ה- GSM. ישנן כמה פקודות להתקשרות והודעות שהשתמשנו בהן ברבות מפרויקטי ה- GSM הקודמים שלנו עם Arduino. לבדיקת מודול GSM השתמשנו בפקודה AT. לאחר קבלת מודול ה- GSM של פיקוד ה- AT הגיב עם אישור. זה אומר שמודול ה- GSM עובד בסדר. להלן כמה פקודות AT שהשתמשנו כאן בפרויקט זה:
ATE0 להפעלת הד
AT + CNMI = 2,2,0,0,0
ATD
AT + CMGF = 1
AT + CMGS = "מספר נייד"
>> עכשיו נוכל לכתוב את ההודעה שלנו
>> לאחר כתיבת הודעה
Ctrl + Z שולח פקודת הודעה (26 בעשרוני).
ENTER = 0x0d ב- HEX
(למידע נוסף על מודול GSM, בדוק כאן את פרויקטי ה- GSM השונים שלנו עם מיקרו-בקרים שונים)
מודול חיישן רטט
בכך מערכת MSP430 תאונות התראת פרויקט, השתמשנו במודול רטט החיישן אשר מזהה תנודות או מודולציות פתאומית. מודול חיישני הרטט נותן פלט דיגיטלי לוגיקה HIGH / LOW בהתאם למודול. במקרה שלנו, השתמשנו במודול חיישן רטט לוגי פעיל. המשמעות היא שבכל פעם שחיישן הרטט יגלה רטט הוא ייתן היגיון HIGH למיקרו-בקר.
הסבר מעגל
חיבורי מעגלים של פרויקט מערכת התראה על תאונות רכב זה פשוט. כאן סיכת ה- Tx של מודול ה- GPS מחוברת ישירות למספר הסיכה הדיגיטלי P1_1 של MSP430 Launchpad (חומרת סידורי) ו- 5v משמש להפעלת מודול GPS. על ידי שימוש בספרייה הסדרתית של התוכנה כאן, אפשרנו תקשורת טורית על סיכה P_6 ו- P1_7, והפכנו אותם ל- Rx ו- Tx בהתאמה ומחוברים למודול ה- GSM. אספקת 12 וולט משמשת להפעלת מודול ה- GSM. רטט החיישן מחובר ב P1_3. נורית LED משמשת גם לציון זיהוי התאונה. שאר החיבורים מוצגים בתרשים המעגל.
הסבר על תכנות
התכנות לפרויקט זה קל למעט החלק GPS. הקוד השלם ניתן בסוף הפרויקט. כדי לכתוב או לקמפל את הקוד ב- MSP430 השתמשנו ב- Energia IDE התואם ל- Arduino. ניתן להשתמש ישירות ברוב פונקציית IDE של Arduino ב- Energia IDE זה.
אז קודם כל כללנו ספריות נדרשות והצהרנו על סיכות ומשתנים.
#לִכלוֹל
הפונקציה הנתונה משמשת לקריאת אות חיישן הרטט. פונקציה זו תסנן גם תנודות קטנות או שקריות.
#define count_max 25 char SensorRead (int pin) // read sw with debounce { char count_low = 0, count_high = 0; לעשות { עיכוב (1); אם (digitalRead (pin) == HIGH) { count_high ++; count_low = 0; } אחר { count_high = 0; count_low ++; } } תוך (count_low <count_max && count_high <count_max); אם (count_low> = count_max) להחזיר LOW; אחרת תחזיר HIGH; }
להלן פונקציה מזהה רעידות ולקרוא gpsEvent () פונקציה להשיג GPS לתאם ולבסוף להתקשר Send () פונקציה לשלוח SMS.
loop loop () { if (SensorRead (vibrationSensor) == HIGH) { digitalWrite (led, HIGH); gpsEvent (); לִשְׁלוֹחַ(); digitalWrite (led, LOW); עיכוב (2000); } }
פונקציה נתונה אחראית לקבל מחרוזות GPS ממודול ה- GPS, לחלץ מהם את הקואורדינטות ולהמיר אותן בתבנית עשרונית.
בטל gpsEvent () { char gpsString; מבחן char = "RMC"; i = 0; בעוד (1) { while (Serial.available ()) // נתונים סידוריים נכנסים מ- GPS { char inChar = (char) Serial.read (); gpsString = inChar; // אחסן נתונים נכנסים מ- GPS למחרוזת temperary str i ++; אם (i <4) { if (gpsString! = test) // בדוק אם מחרוזת ימין i = 0; }
דרגת int = 0; דרגה = gpsString-48; דרגה * = 10; דרגה + = gpsString-48; int minut_int = 0; minut_int = gpsString-48; דקה_ינט * = 10; minut_int + = gpsString-48; int minut_dec = 0; minut_dec + = (gpsString-48) * 10000; minut_dec + = (gpsString-48) * 1000; minut_dec + = (gpsString-48) * 100; minut_dec + = (gpsString-48) * 10; minut_dec + = (gpsString-48); לצוף דקות = ((לצוף) דקות_אינט + ((לצוף) דקות_דק / 100000.0)) / 60.0; קו רוחב = ((צף) מעלה + דקה);
ולבסוף, פונקציית Send () משמשת לשליחת ה- SMS למספר המשתמש שמוכנס בחלק זה של הקוד.
בטל שלח () { GSM.print ("AT + CMGS ="); GSM.print ('"'); GSM.print (" 961 **** 059 "); // הזן את מספר הטלפון הנייד שלך GSM.println ('"'); עיכוב (500); // GSM.print ("קו רוחב:"); // GSM.println (קו רוחב); GSM.println ("תאונה אירעה"); עיכוב (500); // GSM.print ("אורך:"); // GSM.println (logitude); GSM.println ("לחץ על קישור כדי לראות מיקום"); GSM.print ("http://maps.google.com/maps?&z=15&mrt=yp&t=k&q="); GSM.print (קו רוחב, 6); GSM.print ("+"); GSM.print (logitude, 6); GSM.write (26); עיכוב (4000); }
הקוד המלא וסרטון ההדגמה מופיע בהמשך, תוכלו לבדוק את כל הפונקציות בקוד.