- רכיבים נדרשים:
- תרשים מעגל והסבר: -
- קבלת נתוני מיקום מ- GPS:
- צעדים לממשק GPS עם מיקרו-בקר PIC: -
- הסבר קוד:
GPS הוא הצורה הקצרה של מערכת המיקום הגלובלית. זוהי מערכת המספקת גובה מדויק, קו רוחב, קו רוחב, זמן UTC ומידע רב נוסף שנלקח מ -2, 3, 4 או יותר לווינים. כדי לקרוא נתונים מ- GPS, אנחנו זקוקים למיקרו-בקר וכבר התממשקנו GPS עם Arduino ועם Raspberry Pi.
בחרנו במודול GPS G7020 אשר מיוצר על ידי U-blox. נקבל אורך ורוחב של מיקום מסוים מלווין ונציג אותם על גבי LCD תווים בגודל 16x2. אז כאן נתממש GPS עם מיקרו-בקר PIC16F877A באמצעות שבב.
רכיבים נדרשים:
- Pic16F877A - חבילת PDIP40
- לוח לחם
- פיקיט -3
- מתאם 5V
- LCD JHD162A
- מודול GPS uBLOX-G7020
- חוטים לחיבור ציוד היקפי.
- 4.7k נגדים
- סיר 10k
- קריסטל 20mHz
- 2 יחידות קבלים קרמיים של 33pF
תרשים מעגל והסבר: -
LCD בעל אופי של 16X2 מחובר על פני מיקרו-בקר PIC16F877A, שבו RB0, RB1, RB2 מחוברים בהתאמה לסיכת ה- LCD שהיא RS, R / W ו- E. RB4, RB5, RB6 ו- RB7 מחוברים על פני 4 פינים D4, D5 של LCD., D6, D7. ה- LCD מחובר במצב 4 ביט או במצב נגיסה. למידע נוסף על ממשק LCD עם מיקרו-בקר PIC.
מתנד קריסטל של 20 מגה-הרץ עם שני קבלים קרמיים של 33pF המחוברים על פני פין OSC1 ו- OSC2. זה יספק תדר שעון קבוע של 20 מגה-הרץ למיקרו-בקר.
מודול GPS uBlox-G7020, לקבל ולהעביר נתונים באמצעות UART. PIC16F877A כולל מנהל התקן אחד של USART בתוך השבב, אנו נקבל נתונים ממודול ה- GPS על ידי USART, כך שיתבצע חיבור צולב מהסיכה של מיקרו-בקר Rx לסיכת ה- Tx של ה- GPS וסיכת הקבלה של USART המחוברת על פני סיכת השידור של ה- GPS.
ל- uBlox-G7020 יש קוד צבע לסיכות. הסיכה החיובית או 5V היא בצבע אדום, הסיכה השלילית או GND היא בצבע שחור וסיכת השידור היא בצבע כחול.
חיברתי את כל זה בקרש הלחם.
קבלת נתוני מיקום מ- GPS:
בואו נראה כיצד לממשק GPS באמצעות USART ונראה את התוצאה ב- LCD בגודל 16x2 תווים.
המודול ישדר נתונים בכמה מחרוזות בקצב שידור 9600. אם נשתמש במסוף UART עם קצב שידור 9600, נראה את הנתונים המתקבלים באמצעות GPS.
מודול GPS שולח את נתוני מיקום מעקב בזמן אמת בפורמט NMEA (ראה צילום המסך לעיל). פורמט NMEA מורכב ממספר משפטים, בהם להלן ארבעה משפטים חשובים. פירוט נוסף על משפט NMEA ועל פורמט הנתונים שלו ניתן למצוא כאן.
- $ GPGGA: נתוני תיקון מערכת מיקום גלובלית
- $ GPGSV: לווייני GPS בתצוגה
- $ GPGSA: GPS DOP ולוויינים פעילים
- $ GPRMC: נתוני GPS / תחבורה ציבורית מינימליים מומלצים
למידע נוסף על נתוני GPS ומחרוזות NMEA כאן.
אלה הנתונים שהתקבלו על ידי GPS כאשר הם מחוברים בקצב שידור 9600.
$ GPRMC, 141848.00, A, 2237.63306, N, 08820.86316, E, 0.553,, 100418,,, A * 73 $ GPVTG,, T,, M, 0.553, N, 1.024, K, A * 27 $ GPGGA, 141848.00, 2237.63306, N, 08820.86316, E, 1,03,2.56,1.9, M, -54.2, M,, * 74 $ GPGSA, A, 2,06,02,05,,,,,,,,,,,,, 2.75, 2.56,1.00 * 02 $ GPGSV, 1,1,04,02,59,316,30,05,43,188,25,06,44,022,23,25,03,324, * 76 $ GPGLL, 2237,63306, N, 08820.86316, E, 141848.00, A, A * 65
כאשר אנו משתמשים במודול GPS למעקב אחר מיקום כלשהו, אנו זקוקים רק לקואורדינטות ונוכל למצוא זאת במחרוזת $ GPGGA. רק מחרוזת $ GPGGA (Global Positioning System Fix Data) משמשת בעיקר בתוכניות ומתעלמים ממחרוזות אחרות.
$ GPGGA, 141848.00,2237.63306, N, 08820.86316, E, 1,03,2.56,1.9, M, -54.2, M,, * 74
מה הפירוש של קו זה?
משמעות השורה הזו היא: -
1. מחרוזת מתחילה תמיד בסימן "$"
2. GPGGA מייצג נתוני תיקון מערכת מיקום גלובלי
3. "," פסיק מציין את ההפרדה בין שני ערכים
4. 141848.00: שעון GMT בשעה 14 (שעה): 18 (דקות): 48 (שניות): 00 (ms)
5. 2237.63306, N: קו רוחב 22 (מעלה) 37 (דקות) 63306 (שניות) צפון
6. 08820.86316, E: קו אורך 088 (תואר) 20 (דקות) 86316 (שניות) מזרח
7. 1: תקן כמות 0 = נתונים לא חוקיים, 1 = נתונים תקפים, 2 = תיקון DGPS
8. 03: מספר הלוויינים שנצפו כרגע.
9. 1.0: HDOP
10. 2.56, M: גובה (גובה מעל פני הים במטר)
11. 1.9, M: גובה הגיאואידים
12. * 74: סכום בדיקה
אז אנחנו צריכים מס '5 ומס' 6 כדי לאסוף מידע על מיקום המודול או היכן הוא ממוקם.
צעדים לממשק GPS עם מיקרו-בקר PIC: -
- הגדר את התצורות של המיקרו-בקר הכוללות תצורת מתנד.
- הגדר את היציאה הרצויה עבור LCD כולל רישום TRIS.
- חבר את מודול ה- GPS למיקרו-בקר באמצעות USART.
- אתחל את המערכת USART במצב קבלה רציף, עם קצב שידור 9600 ו- LCD עם מצב 4 ביט.
- קח שני מערכי תווים בהתאם לאורך קו רוחב ואורך.
- קבל טיפוס אחד בכל פעם ובדוק אם הוא התחיל מ- $ או לא.
- אם $ קבל אז זה מחרוזת, עלינו לבדוק את GPGGA, את 5 האותיות ואת הפסיק.
- אם מדובר ב- GPGGA, נדלג על הזמן ונחפש את קו הרוחב והאורך, אנו נאחסן את קו הרוחב והאורך במערך שני תווים עד שלא נקבל N (צפון) ו- E (מזרח).
- נדפיס את המערך ב- LCD.
- נקה את המערך.
הסבר קוד:
בואו נסתכל על הקוד שורה אחר שורה. השורות הראשונות נועדו להגדרת סיביות תצורה שהוסברו במדריך הקודם ולכן אני מדלג עליהן לעת עתה. הקוד השלם ניתן בסוף הדרכה זו.
חמש שורות אלה משמשות לכלול קבצי כותרת ספרייה, lcd.h ו- eusart.h מיועדים ל- LCD ו- USART בהתאמה. ו- xc.h מיועד לקובץ כותרת של מיקרו-בקר.
#לִכלוֹל
בשנת void main () פונקציה, system_init () ; פונקציה משמשת לאתחול LCD ו- USART.
בטל ראשי (ריק) { TRISB = 0x00; // הגדרה כ- system_init () פלט ;
ה- lcd_init (); ו- EUSART_Intialize (); נקרא משתי הספריות lcd.h ו- eusart.h
בטל system_init (בטל) { lcd_init (); // זה יאותחל את ה- lcd EUSART1_Initialize (); // זה יאותחל את ה- Eusart }
בשינה בעוד לולאה נשבור את מחרוזת GPGGA כדי לקבל את האורך ואת הרוחב לתאם. אנו מקבלים ביט אחד בכל פעם ומשווים אותו לתווים בודדים הקיימים במחרוזת GPGGA.
אנו שוברים את הקודים שנקבל: -
incomer_data = EUSART1_Read (); // בדוק את המחרוזת '$ GPGGA' / * ------------------------------ שלב אחר שלב למצוא את קו GPGGA- --------------------------- * / if (incomer_data == '$') {// הצהרה ראשונה של נתוני ה- GPS מתחילה עם $ sign incomer_data = EUSART1_Read (); // אם הראשון אם יתממש אז השלב הבא אם (incomer_data == 'G') { incomer_data = EUSART1_Read (); אם (incomer_data == 'P'); { incomer_data = EUSART1_Read (); אם (incomer_data == 'G'); { incomer_data = EUSART1_Read (); אם (incomer_data == 'G') { incomer_data = EUSART1_Read (); אם (incomer_data == 'A') { incomer_data = EUSART1_Read (); אם (incomer_data == ',') {// הראשון, התקבל incomer_data = EUSART1_Read (); // בשלב זה הבדיקה הסופית בוצעה, GPGGA נמצא.
באמצעות קוד זה אנו מדלגים על זמן UTC.
בעוד (incomer_data! = ',') {// דילוג על שעון GMT incomer_data = EUSART1_Read (); }
קוד זה מיועד לאחסון נתוני קו רוחב ואורך במערך התווים.
incomer_data = EUSART1_Read (); קו רוחב = incomer_data; בעוד (incomer_data! = ',') { עבור (array_count = 1; incomer_data! = 'N'; array_count ++) { incomer_data = EUSART1_Read (); קו רוחב = incomer_data; // אחסן את נתוני Latitude } incomer_data = EUSART1_Read (); אם (incomer_data == ',') { עבור (array_count = 0; incomer_data! = 'E'; array_count ++) { incomer_data = EUSART1_Read (); קו אורך = incomer_data; // אחסן את נתוני האורך } }
ולבסוף הדפסנו אורך ורוחב על גבי LCD.
array_count = 0; lcd_com (0x80); // קו LCD בחירה אחת בעוד (array_count <12) {// מערך נתוני Latitude הוא 11 ספרות lcd_data (קו רוחב); // הדפס את מערך הנתונים של Latitude_count ++; } array_count = 0; lcd_com (0xC0); // שורת Lcd שנייה בחירה בעוד (array_count <13) {// מערך נתוני האורך הוא lcd_data בן 12 ספרות (אורך); // הדפס את מערך הנתונים של האורך_ספירה ++; }
כך אנו יכולים לממשק את מודול ה- GPS עם מיקרו-בקר PIC כדי לקבל את קו הרוחב והאורך של המיקום הנוכחי.
קבצי קוד מלאים וכותרות מובאות להלן.