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

כונן GPS Arduino: 3 שלבים
כונן GPS Arduino: 3 שלבים

וִידֵאוֹ: כונן GPS Arduino: 3 שלבים

וִידֵאוֹ: כונן GPS Arduino: 3 שלבים
וִידֵאוֹ: 30 лучших советов и рекомендаций по Windows 10 на 2020 год 2024, יולי
Anonim
לוגר GPS Arduino
לוגר GPS Arduino
לוגר GPS Arduino
לוגר GPS Arduino

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

פרויקט זה עוסק בפריצת GPS ורישום SD. למדתי הרבה רק בבניית הדברים האלה.

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

אז, מה זה? פשוט: הוא גשש GPS המתעד עמדות (גם עם גובה), מהירות ותאריך/שעה על microSD.

מה שאתה תצטרך:

- Arduino Nano (למעשה השתמשתי ב- UNO לבניית הסקיצה, אבל הם בדיוק אותו הדבר!)- פריצת GPS אולטימטיבית ל- Adafruit- פריצת כרטיסי MicroSD- כלי הלחמה (כל מה שתזדקק להלחמה)- אוניברסלי לוח (השתמשתי א 5x7 ס מ)- חוטים

כל הרכיבים האלה די זולים למעט מודול ה- GPS. זה בערך 30-40 דולר וזה החלק היקר ביותר. אפילו סט ברזל הלחמה חדש עשוי לעלות פחות.

קיים גם מגן Adafruit עם מודולי GPS ו- SD יחד. אם אתה רוצה להשתמש בו, זכור כי הוא מיועד ל- Arduino UNO, לכן תזדקק ל- UNO ולא ל- Nano. אבל אין הבדל בסקיצה.

בואו נלך רחוק יותר…

שלב 1: חיבור רכיבים

רכיבי חיבור
רכיבי חיבור
רכיבי חיבור
רכיבי חיבור
רכיבי חיבור
רכיבי חיבור
רכיבי חיבור
רכיבי חיבור

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

התפרצות MicroSD

5V -> 5VGND -> GnnCLK -> D13DO -> D12DI -> D11CS -> D4 (אם אתה משתמש במגן זה בנוי ב- D10)

פריצת GPS

וין -> 5VGnn -> GnnRx -> D2Tx -> D3

הערות קטנות על המודול הזה: שני הנערים הקטנים האלה מתקשרים בדרכים שונות עם הארדואינו. ה- GPS משתמש בסידור TTL, מאותו סוג בו אנו משתמשים כאשר אנו מתקשרים עם Arduino באמצעות צג סידורי, מדוע עלינו להכריז באמצעות ספרייה על סדרה חדשה (Tx ו- Rx) מכיוון ש- GPS רוצה להשתמש ב 9600 כברירת מחדל, ואנו רוצה גם להשתמש בו. מודול ה- GPS תמיד זורם נתונים כל הזמן, אם הוא מחובר. זה החלק המסובך להתמודד איתו, כי אם נקרא משפט ולא נדפיס אותו, נוכל לאבד את המשפט הבא, גם הוא נחוץ. עלינו לזכור זאת בעת קידוד!

ה- MicroSD מתקשר באמצעות SPI (Serial Peripheral Interface), עוד דרך לתקשר עם הלוח. מודולים מסוג זה משתמשים תמיד ב- CLK ב- D13, ב- DO ב- D12 וב- DI ב- D11. לפעמים לחיבורים אלה יש שם שונה כמו CLK = SCK או SCLK (שעון סידורי), DO = DOUT, SIMO, SDO, SO, MTSR (כל אלה מציינים פלט מאסטר) ו- DI = SOMI, SDI, MISO, MRST (Master Input). לבסוף יש לנו את ה- CS או ה- SS המציין את הסיכה שאליה אנו שולחים את מה שאנו רוצים לכתוב ב- MicroSD. אם אתה רוצה להשתמש בשני מודולי SPI שונים, עליך רק להבדיל את הסיכה הזו על מנת להשתמש בשניהם. לדוגמה, מסך LCD ו- MicroSd כמו זה בו אנו משתמשים. זה אמור לעבוד גם באמצעות שני מסכי LCD שונים המחוברים למחשבי CS שונים.

הלחם את החלקים האלה יחד בלוח ואתה מוכן להעלות את המערכון!

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

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

לפניכם כמה סרטוני הלחמה שימושיים: מדריך הלחמה למתחילים סרטון אודות שמות

ערוץ היוטיוב של Adafruit, יש שם הרבה דברים מעניינים!

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

שלב 2: הסקיצה

ראשית, כמובן, אנו מייבאים את הספרייה ובונים את האובייקטים שלהם לעבודה: SPI.h מיועד לתקשורת עם מודולי SPI, SD היא ספריית MicroSD ו- Adafruit_GPS היא הספרייה של מודול ה- GPS. SoftwareSerial.h מיועד ליצירת יציאה טורית באמצעות תוכנה. התחביר הוא "mySerial (TxPin, RxPin);". יש להפנות את אובייקט ה- GPS לסדרה (בסוגריים). להלן הקישורים של הספריות לפריצת GPS של Adafruit, התפרצות ה- MicroSD (כדי לבצע עבודה נקייה, עליך גם לעצב את ה- SD עם תוכנה זו מאגודת SD) ואת ספריית סדרות תוכנה (יש לכלול אותו ב- IDE).

הערה: נתקלתי בבעיה כלשהי כשניסיתי לצרף מידע רב בקובץ אחד או באמצעות יותר משני קבצים בסקיצה. לא פרמטתי את ה- SD עם התוכנה הזו, אולי זה יכול לפתור את הבעיה. כמו כן, ניסיתי להוסיף חיישן נוסף במכשיר, BMP280 (מודול I2C), ללא כל הצלחה. נראה ששימוש במודול I2C גורם למערכון להשתגע! כבר התלהבתי מכך בפורום Adafruit, אך עדיין לא קיבלתי תשובה.

#include "SPI.h" #include "SD.h" #include "Adafruit_GPS.h" #include "SoftwareSerial.h" SoftwareSerial mySerial (3, 2); Adafruit_GPS GPS (& mySerial);

כעת אנו זקוקים לכל המשתנים שלנו: שני המיתרים נועדו לקריאת שני המשפטים הדרושים לנו לצורך חישוב צרור מידע שימושי מתוך ה- GPS. הצ'אר מיועד למלא את המשפטים לפני מנתח אותם, המצופים מיועדים לחישוב הקואורדינטות במעלות (GPS לשלוח קואורדינטות שימוש במעלות ודקות, אנו זקוקים להן במעלות כדי לתת לקריאה ב- Google earth). ה- chipSelect הוא הסיכה שבה אנו מחברים את ה- CS של כרטיס ה- MicroSD. במקרה זה הוא D4, אבל אם אתה משתמש במגן SD, תצטרך לשים כאן D10. משתנה הקובץ הוא זה שיאגר את המידע של הקובץ בו אנו משתמשים במהלך הסקיצה.

מחרוזת NMEA1;

מחרוזת NMEA2; צ'אר ג; צף אותך; צף degWhole; לצוף degDec; int chipSelect = 4; קובץ mySensorData;

כעת אנו מכריזים על כמה פונקציות כדי להפוך את המערכון לאלגנטי יותר ולפחות מבולגן:

הם עושים את אותו הדבר בעצם: קריאת משפטים של NMEA. clearGPS () מתעלם משלושה משפטים ו- readGPS () שומר שניים מהם במשתנים.

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

זה חשוב מאוד! אל תעשה דבר לפני שאתה מחזיק את שני המשפטים, אחרת בסופו של דבר השני יתקלקל או יטעה.

לאחר שקיבלנו שני משפטים, אנו מדפיסים אותם בסדרה כדי לשלוט בכך שהולך טוב.

void readGPS () {

clearGPS (); בעוד (! GPS.newNMEAreceived ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); NMEA1 = GPS.lastNMEA (); בעוד (! GPS.newNMEAreceived ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); NMEA2 = GPS.lastNMEA (); Serial.println (NMEA1); Serial.println (NMEA2); } void clearGPS () {while (! GPS.newNMEAreceived ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); בעוד (! GPS.newNMEAreceived ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); w while (! GPS.newNMEAreceived ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); }

ובכן, עכשיו כשכולנו מסודרים, נוכל לעבור את ההתקנה ():

ראשית: אנו פותחים תקשורת ב- Serial 115200 עבור מחשב Arduino וב- 9600 עבור מודול GPS Arduino. שנית: אנו שולחים שלוש פקודות למודול ה- GPS: הראשונה היא לסגור את עדכון האנטנה, השנייה היא לשאול רק מחרוזת RMC ו- GGA (אנו הולכים להשתמש רק באלה, שיש בהם את כל המידע שתצטרך אי פעם. GPS), הפקודה השלישית והאחרונה היא להגדיר את קצב העדכון ל- 1HZ, שהציע Adafruit.

לאחר מכן הגדרנו את סיכה D10 ל- OUTPUT, אם, ורק אם, סיכת ה- CS של מודל ה- SD שלך שונה מ- D10. מיד לאחר מכן, עמדו על הגדרת ה- CS על מודול ה- SD על שבב בחר סיכה.

אנו מריצים את הפונקציות readGPS () הכוללות את cleanGPS ().

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

הערה: ספריית ה- SD די רצינית לגבי פתיחה וסגירה של הקובץ בכל פעם! זכור זאת וסגור אותו בכל פעם! למידע על הספרייה היכנס לקישור זה.

אוקיי, באמת שכולנו מוכנים לקבל את ליבת החלק הזרם והיומן של המערכון.

הגדרת בטל () {

Serial.begin (115200); GPS.begin (9600); // שלח פקודות למודול ה- GPS GPS.sendCommand ("$ PGCMD, 33, 0*6D"); GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); עיכוב (1000); // רק אם סיכת ה- CS של מודול ה- SD שלך אינה נמצאת בסיכה D10

pinMode (10, OUTPUT);

SD.begin (chipSelect); readGPS (); if (SD.exists ("NMEA.txt")) {mySensorData = SD.open ("NMEA.txt", FILE_WRITE); mySensorData.println (""); mySensorData.print ("***"); mySensorData.print (GPS.day); mySensorData.print ("."); mySensorData.print (GPS.month); mySensorData.print ("."); mySensorData.print (GPS.year); mySensorData.print (" -"); mySensorData.print (GPS.hour); mySensorData.print (":"); mySensorData.print (GPS.minute); mySensorData.print (":"); mySensorData.print (GPS.seconds); mySensorData.println ("***"); mySensorData.close (); } אם (SD.exists ("GPSData.txt")) {mySensorData = SD.open ("GPSData.txt", FILE_WRITE); mySensorData.println (""); mySensorData.println (""); mySensorData.print ("***"); mySensorData.print (GPS.day); mySensorData.print ("."); mySensorData.print (GPS.month); mySensorData.print ("."); mySensorData.print (GPS.year); mySensorData.print (" -"); mySensorData.print (GPS.hour); mySensorData.print (":"); mySensorData.print (GPS.minute); mySensorData.print (":"); mySensorData.print (GPS.seconds); mySensorData.println ("***"); mySensorData.close (); }}

כעת אנו מקבלים את ליבת המערכון.

זה סופר פשוט, אכן.

אנו הולכים לקרוא את זרם ה- GPS עם הפונקציה readGPS (), מאשר אנו שולטים אם יש לנו תיקון שווה ל -1, כלומר, אנחנו מחוברים ללווין e. אם קיבלנו את זה, אנחנו נכתוב את המידע שלנו בקבצים. בקובץ הראשון "NMEA.txt", אנו כותבים רק את המשפטים הגולמיים. בקובץ השני, "GPDData.txt", אנו מצרפים את הקואורדינטות (המרות עם הפונקציות שראינו קודם) ואת הגובה. המידע הזה מספיק כדי לאסוף קובץ.kml ליצירת נתיב ב- Google Earth. שים לב שאנחנו סוגרים את הקבצים בכל פעם שפתחנו אותם כדי לכתוב משהו!

לולאת חלל () {

readGPS (); // Condizione if che controlla se l'antenna ha segnale. Se si, procede con la scrittura dei dati. if (GPS.fix == 1) {// שמור נתונים רק אם יש לנו תיקון mySensorData = SD.open ("NMEA.txt", FILE_WRITE); // קובץ מקוון לכל NMEA grezze mySensorData.println (NMEA1); // Scrive prima NMEA sul file mySensorData.println (NMEA2); // Scrive seconda NMEA sul קובץ mySensorData.close (); // קובץ Chiude !!

mySensorData = SD.open ("GPSData.txt", FILE_WRITE);

// Converte e scrive la longitudine convLong (); mySensorData.print (deg, 4); // Scrive le coordinate בקובץ gradi sul mySensorData.print (","); // Scrive una virgola per separare i data Serial.print (deg); Serial.print (","); // Converte e scrive la latitudine convLati (); mySensorData.print (deg, 4); // Scrive le coordinate בקובץ gradi sul mySensorData.print (","); // Scrive una virgola per separare i data Serial.print (deg); Serial.print (","); // Scrive l'altitudine mySensorData.print (GPS.altitude); mySensorData.print (""); Serial.println (GPS.altitude); mySensorData.close (); }}

עכשיו, כשכולנו סיימנו, אתה יכול להעלות את הסקיצה, לבנות את המכשיר וליהנות ממנו!

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

כמו כן, זכור שאם יש תיקון, הנורה האדומה מהבהבת כל 15 שניות, אם לא, הרבה יותר מהר (אחת ל 2-3 שניות).

אם אתה רוצה ללמוד עוד על משפטים NMEA, פשוט בצע את השלב הבא של מדריך זה.

שלב 3: משפטים NMEA וקובץ.kml

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

הנורה האדומה הקטנה מהבהבת כל 15 שניות כאשר קיבלת תיקון

אם אתה רוצה להבין טוב יותר את המשפטים NMEA, תוכל לקרוא עוד.

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

בואו נראה מה יש במחרוזת הזו:

$ GPRMC, 123519, A, 4807.038, N, 01131.000, E, 022.4, 084.4, 230394, 003.1, W*6A

RMC = משפט מינימלי מומלץ C 123519 = תיקון ב -12: 35:19 UTC A = סטטוס A = פעיל או V = חלל 4807.038, N = קו רוחב 48 מעלות 07.038 'N 01131.000, E = קו אורך 11 מעלות 31.000' E 022.4 = מהירות מעל הקרקע בקשרים 084.4 = זווית מסלול במעלות True 230394 = תאריך - 23 במרץ 1994 003.1, W = וריאציה מגנטית *6A = נתוני סכום הביקורת, מתחילים תמיד ב- *

$ GPGGA, 123519, 4807.038, N, 01131.000, E, 1, 08, 0.9, 545.4, M, 46.9, M,, *47

נתוני תיקון מערכת מיקום גלובלית של GGA 123519 תיקון שצולם בשעה 12:35:19 UTC 4807.038, N רוחב 48 מעלות 07.038 'N 01131.000, E אורך 11 מעלות 31.000' E 1 תיקון איכות: 0 = לא חוקי; 1 = תיקון GPS (SPS); 2 = תיקון DGPS; 3 = תיקון PPS; 4 = קינמטי בזמן אמת; 5 = Float RTK; 6 = אומדן (חשבון מת) (2.3 תכונה); 7 = מצב קלט ידני; 8 = מצב סימולציה; 08 מספר הלוויינים הנמצאים במעקב 0.9 דילול אופקי של מיקום 545.4, M גובה, מטרים, מעל פני הים 46.9, M גובה הגיאואיד (ממוצע פני הים) מעל WGS84 אליפסואיד (שדה ריק) זמן בשניות מאז עדכון ה- DGPS האחרון (שדה ריק) מספר מזהה תחנת DGPS *47 נתוני סכום הביקורת, מתחיל תמיד ב- *

כפי שאתה יכול לראות, יש הרבה יותר מידע ממה שאתה צריך שם. באמצעות הספרייה של Adafruit, אתה יכול להתקשר לחלק מהם, כמו GPS.latitude או GPS.lat (קו רוחב וחצי רוחב), או GPS.day/month/year/hour/minute/seconds/milliseconds… תסתכל אל Adafruit אתר אינטרנט כדי לדעת עוד משהו. לא כל כך ברור, אבל בעקבות כמה רמזים במדריך של מודולי ה- GPS, תוכל למצוא את מה שאתה צריך.

מה אנחנו יכולים לעשות עם קבצים שיש לנו? קל: הידור קובץ kml להצגת נתיב ב- Google Earth. כדי לעשות זאת, פשוט העתק/העבר את הקוד שתמצא בעקבות הקישור הזה (מתחת לפסקה נתיב), שים את הקואורדינטות שלך מהקובץ GPDData.txt בין התגים, שמור את הקובץ עם סיומת.kml וטען אותו גוגל כדור הארץ.

הערה: שפת הסימון.kml היא פשוטה, אם אתה כבר יודע מהי שפת סימון, שמור על הזמן לקרוא את הקישור והתיעוד הקודם בפנים, זה דווקא מעניין!

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

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

מוּמלָץ: