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

למצוא את הדרך שלך עם GPS: 9 שלבים
למצוא את הדרך שלך עם GPS: 9 שלבים

וִידֵאוֹ: למצוא את הדרך שלך עם GPS: 9 שלבים

וִידֵאוֹ: למצוא את הדרך שלך עם GPS: 9 שלבים
וִידֵאוֹ: תפסתי אותה על חםםםם!!!!!! 2024, יולי
Anonim
למצוא את הדרך שלך עם GPS
למצוא את הדרך שלך עם GPS

תרגיל מהיר בהבנת ויישום נתוני GPS

  • הזמן הנדרש: שעתיים
  • עלות: 75-150 דולר

עבור יצרנים, זה הפך להיות זול למדי לשלב נתונים גיאו-מרחביים באיכות גבוהה בפרויקטים של אלקטרוניקה. ובשנים האחרונות, מודולי המקלט GPS (Global Positioning System) גדלו בהרבה יותר מגוונים, עוצמתיים וקלים לשילוב עם לוחות פיתוח כמו Arduino, PIC, Teensy ו- Raspberry Pi. אם חשבת לבנות סביב GPS, בחרת זמן טוב להתחיל.

שלב 1: איך זה עובד

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

כאשר מגיעה הודעת GPS, המקלט בודק תחילה את חותמת זמן השידור שלו כדי לראות מתי נשלחה. מכיוון שמהירותו של גל רדיו בחלל היא קבוע ידוע (ג), המקלט יכול להשוות זמני שידור וקבלה כדי לקבוע את המרחק שהאות עבר. ברגע שהוא קבע את מרחקו מארבעה לוויינים ידועים או יותר, חישוב המיקום שלו הוא בעיה פשוטה למדי של טריאנגולציה תלת -ממדית. אך כדי לעשות זאת במהירות ובדייקנות, המקלט חייב להיות מסוגל לחבוט מספרים עד 20 זרמי נתונים בו זמנית. מכיוון שלמערכת ה- GPS יש מטרה שפורסמה להיות שמיש בכל מקום על פני כדור הארץ, המערכת חייבת להבטיח כי לפחות ארבעה לוויינים. - רצוי יותר - גלויים בכל עת מכל נקודה על הגלובוס. כיום ישנם 32 לווייני GPS המבצעים ריקוד בכוריאוגרפיה מוקפדת בענן דליל בגובה 20, 000 קילומטרים.

שלב 2: עובדת מעריצים

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

שלב 3: תחילת העבודה

מתחילים
מתחילים

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

למתחילים, מודול ה- Ultimate GPS Breakout של Adafruit הוא בחירה טובה. יש הרבה מוצרים מתחרים בשוק, אבל האולטימטיבי הוא ביצועים יציבים במחיר סביר, עם חורי דרך גדולים שקל להלחם או להתחבר ללוח לחם.

ראשית, חבר את הקרקע והחשמל. במונחים של ארדואינו, פירוש הדבר לחבר את אחד מסיכות ה- GND של המיקרו -בקר ל- GND של המודול, ואת הסיכה +5V ל- VIN של המודול. כדי לנהל העברת נתונים, עליך גם לחבר את סיכות ה- TX וה- RX של המודול ל- Arduino. אני הולך לבחור באופן שרירותי סיכות Arduino 2 (TX) ו- 3 (RX) למטרה זו, למרות שהפינים 0 ו -1 נועדו במיוחד לשימוש כ"יציאה טורית של חומרה "או כ- UART. Why? מכיוון שאני לא רוצה לבזבז את ה- UART היחיד שיש למעבדי AVR הנמוכים האלה. ה- UART של Arduino מחובר לחיבור USB המשולב, ואני אוהב לשמור אותו מחובר למחשב שלי לצורך איתור באגים.

שלב 4: אצבע בזרם הנתונים

אצבע בזרם הנתונים
אצבע בזרם הנתונים

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

#כלול #הגדר RXPin 2

#define TXPin 3#הגדר GPSBaud 4800

#define ConsoleBaud 115200

// החיבור הטורי למכשיר ה- GPS SoftwareSerial ss (RXPin, TXPin);

הגדרת בטל () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("דוגמא ל- GPS 1");

Serial.println ("הצגת נתוני NMEA הגולמיים המועברים על ידי מודול GPS.");

Serial.println ("מאת מיקל הארט"); Serial.println ();

}

לולאת חלל ()

{if (ss.available ()> 0) // כאשר כל תו מגיע …

Serial.write (ss.read ()); //… כתוב אותו לקונסולה

}

הערה: הסקיצה מגדירה את סיכת הקבלה (RXPin) כ -2, למרות שאמרנו קודם לכן שסיכת השידור (TX) תחובר לסיכה 2. זהו מקור לבלבול נפוץ. RXPin הוא סיכת הקבלה (RX) מנקודת המבט של הארדואינו. מטבע הדברים, הוא חייב להיות מחובר לסיכת השידור (TX) של המודול, ולהיפך.

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

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

שלב 5: למצוא את עצמך

זה לא טריוויאלי להמיר את פלט המודול הגולמי למידע שהתוכנית שלך יכולה להשתמש בו בפועל. למרבה המזל, יש כבר כמה ספריות נהדרות לעשות זאת עבורך. ספריית ה- GPS הפופולרית של לימור פריד היא בחירה נוחה אם אתה משתמש בפריצה האולטימטיבית שלהם. הוא נכתב כדי לאפשר תכונות ייחודיות ל- Ultimate (כמו רישום נתונים פנימי) ומוסיף כמה פעמונים ושריקות משלו. אולם ספריית הניתוח האהובה עלי - והנה אני כמובן נטולת משוא פנים לחלוטין - היא זו שכתבתי בשם TinyGPS ++. עיצבתי אותו כך שיהיה מקיף, עוצמתי, תמציתי וקל לשימוש. בואו ניקח את זה לסיבוב.

שלב 6: קידוד עם TinyGPS ++

מנקודת מבטו של המתכנת, השימוש ב- TinyGPS ++ הוא פשוט מאוד:

1) צור GPS אובייקט.

2) נתב כל תו שמגיע מהמודול לאובייקט באמצעות gps.encode ().

3) כשאתה צריך לדעת את המיקום או הגובה שלך או השעה או התאריך, פשוט שאל את אובייקט ה- GPS.

#כלול #כלול

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// החיבור הטורי למכשיר ה- GPS SoftwareSerial ss (RXPin, TXPin);

// אובייקט TinyGPS ++

Gps TinyGPSPlus;

הגדרת בטל () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("דוגמא ל- GPS 2");

Serial.println ("גשש פשוט באמצעות TinyGPS ++.");

Serial.println ("מאת מיקל הארט");

Serial.println ();

}

לולאת חלל () {

// אם הגיעו תווים מה- GPS, /

/ שלח אותם לאובייקט TinyGPS ++

בעוד (ss.available ()> 0)

gps.encode (ss.read ());

// בואו להציג את המיקום והגובה החדשים

// בכל פעם שאחד מהם עודכן

אם (gps.location.isUpdated () || gps.altitude.isUpdated ())

{

Serial.print ("מיקום:");

Serial.print (gps.location.lat (), 6);

Serial.print (",");

Serial.print (gps.location.lng (), 6);

Serial.print ("גובה:");

Serial.println (gps.altitude.meters ());

}

}

היישום השני שלנו מציג ללא הרף את המיקום והגובה של המקלט, באמצעות TinyGPS ++ כדי לסייע בניתוח. במכשיר אמיתי, תוכל לרשום נתונים אלה לכרטיס SD או להציג אותם על מסך LCD. תפוס את הספרייה ושרטט את FindingYourself.ino (למעלה). התקן את הספרייה, כרגיל, בתיקיית ספריות Arduino. העלה את הסקיצה ל- Arduino שלך ופתח צג סידורי בגובה 115, 200 באוד. אתה אמור לראות את המיקום והגובה שלך מתעדכנים בזמן אמת. כדי לראות בדיוק היכן אתה עומד, הדבק כמה מקואורדינטות הרוחב/קו האורך שהתקבלו במפות Google. כעת חבר את המחשב הנייד שלך וצא לטיול או נסיעה. (אך זכור לשים עין על הכביש!)

שלב 7: "הממד הרביעי"

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

כדי להפוך את FindingYourself.ino לשעון סופר מדויק, פשוט שנה את השורות האחרונות כך:

if (gps.time.isUpdated ()) {

חרוסת בוף [80];

sprintf (buf, "השעה היא%02d:%02d:%02d", gps.time.hour (), gps.time.minute (), gps.time.second ()); Serial.println (buf);

}

שלב 8: למצוא את הדרך שלך

מוצא את הדרך שלך
מוצא את הדרך שלך

היישום השלישי והאחרון שלנו הוא תוצאה של אתגר אישי לכתוב סקיצה TinyGPS ++ קריאה, בפחות מ -100 שורות קוד, שתנחה משתמש ליעד באמצעות הוראות טקסט פשוטות כמו "שמור ישר" או "סטה שמאלה".

#כלול #כלול

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// החיבור הטורי למכשיר ה- GPS SoftwareSerial ss (RXPin, TXPin);

// אובייקט TinyGPS ++ GPS TinyGPSPlus;

unsigned long lastUpdateTime = 0;

#define EIFFEL_LAT 48.85823#הגדר EIFFEL_LNG 2.29438

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

הדרך הקלה ביותר להשיג את קואורדינטות הגודל/ארוך היא ללחוץ באמצעות לחצן העכבר הימני על היעד במפות Google (maps.google.com), ולבחור "מה יש כאן?". זה מכניס את הערכים המדויקים לתיבת החיפוש

*/

הגדרת בטל () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("דוגמא ל- GPS 3");

Serial.println ("מערכת הדרכה לא כל כך מקיפה");

Serial.println ("מאת מיקל הארט");

Serial.println ();

}

לולאת חלל () {

// אם הגיעו תווים כלשהם מה- GPS, // שלחו אותם לאובייקט TinyGPS ++ בעוד (ss.available ()> 0) gps.encode (ss.read ());

// כל 5 שניות, בצע עדכון

if (millis () - lastUpdateTime> = 5000)

{

lastUpdateTime = millis ();

Serial.println ();

// קבע את המצב הנוכחי שלנו

double distanceToDestination = TinyGPSPlus:: distanceBetween

gps.location.lat (), gps.location.lng (), EIFFEL_LAT, EIFFEL_LNG);

course doubleToDestination = TinyGPSPlus:: courseTo

gps.location.lat (), gps.location.lng (), EIFFEL_LAT, EIFFEL_LNG);

const char *directionToDestination = TinyGPSPlus:: cardinal (courseToDestination);

int courseChangeNeeded = (int) (360 + courseToDestination - gps.course.deg ()) % 360;

// debug Serial.print ("DEBUG: Course2Dest:");

Serial.print (courseToDestination);

Serial.print ("CurCourse:");

Serial.print (gps.course.deg ());

Serial.print ("Dir2Dest:");

Serial.print (directionToDestination);

Serial.print ("RelCourse:");

Serial.print (courseChangeNeeded);

Serial.print ("CurSpd:");

Serial.println (gps.speed.kmph ());

// בטווח של 20 מטרים מהיעד? היו כאן

אם (distanceToDestination <= 20.0)

{Serial.println ("ברכותינו: הגעת!");

יציאה (1);

}

Serial.print ("DISTANCE:"); Serial.print (distanceToDestination);

Serial.println ("מטר לסיום.");

Serial.print ("הוראה:");

// עומד בלי לזוז? רק ציינו לאיזה כיוון ללכת

אם (gps.speed.kmph () <2.0)

{

Serial.print ("ראש");

Serial.print (directionToDestination);

Serial.println (".");

לַחֲזוֹר;

}

if (courseChangeNeeded> = 345 || courseChangeNeeded <15) Serial.println ("המשך ישר קדימה!");

אחרת אם (courseChangeNeeded> = 315 && courseChangeNeeded <345)

Serial.println ("ויר מעט שמאלה.");

אחרת אם (courseChangeNeeded> = 15 && courseChangeNeeded <45)

Serial.println ("ויר מעט ימינה.");

אחרת אם (courseChangeNeeded> = 255 && courseChangeNeeded <315)

Serial.println ("פנה שמאלה.");

אחרת אם (courseChangeNeeded> = 45 && courseChangeNeeded <105)

Serial.println ("פנה ימינה.");

אַחֵר

Serial.println ("הסתובב לגמרי.");

}

}

כל 5 שניות הקוד לוכד את מיקום המשתמש ואת מסלולו (כיוון הנסיעה) ומחשב את הנושא (כיוון ליעד), בשיטת TinyGPS ++ courseTo (). השוואת שני הווקטורים מייצרת הצעה להמשיך ישר או לפנות, כפי שמוצג להלן.

העתק את המערכון FindingYourWay.ino (למעלה) והדבק אותו ב- IDE של Arduino. הגדר יעד אחד קילומטר או 2 ק מ משם, העלה את הסקיצה לארדואינו שלך, הפעל אותה במחשב הנייד שלך ובדוק אם הוא יוביל אותך לשם. אך חשוב מכך, למד את הקוד והבין כיצד הוא פועל.

שלב 9: התקדמות נוספת

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

מוּמלָץ: