جدول المحتويات:

Arduino GPS Logger: 3 خطوات
Arduino GPS Logger: 3 خطوات

فيديو: Arduino GPS Logger: 3 خطوات

فيديو: Arduino GPS Logger: 3 خطوات
فيديو: How To Make Arduino GPS Logger With Google Map Display On GPSVisualizer 2024, يوليو
Anonim
Arduino GPS Logger
Arduino GPS Logger
Arduino GPS Logger
Arduino GPS Logger

اهلا ياجماعة،

لقد خرجت بشكل كبير من المشاريع الصغيرة التي تسمح للناس بفهم الكثير من التكنولوجيا التي نمتلكها كل يوم.

يدور هذا المشروع حول اختراق GPS وتسجيل SD. لقد تعلمت الكثير بمجرد بناء هذه الأشياء.

هناك الكثير من المفاهيم التي ستكتسبها بعد هذا البرنامج التعليمي ، وأكثر من ذلك بكثير تتبع الرابط الذي أقدمه للتعمق في الموضوعات.

إذن ، ما هذا؟ بسيط: هو جهاز تعقب GPS يقوم بتسجيل المواقع (مع الارتفاع أيضًا) والسرعة والتاريخ / الوقت على بطاقة microSD.

ما سوف تحتاجه:

- Arduino Nano (لقد استخدمت بالفعل UNO لبناء الرسم ، لكنهم متماثلون تمامًا!) - اختراق Adafruit النهائي لنظام تحديد المواقع العالمي (GPS) - بطاقة MicroSD - أدوات اللحام (كل ما تحتاجه للحام) - لوحة شريطية عالمية (كنت أستخدمها) a 5x7cm) - الأسلاك

كل هذه المكونات رخيصة جدًا باستثناء وحدة GPS. هذا هو حوالي 30-40 دولارًا وهو أغلى جزء. حتى مجموعة مكواة اللحام الجديدة يمكن أن تكلف أقل.

يوجد أيضًا درع Adafruit مع وحدات GPS وبطاقة SD معًا. إذا كنت ترغب في استخدامه ، فضع في اعتبارك أنه مصمم خصيصًا لـ Arduino UNO ، لذلك ستحتاج إلى UNO وليس Nano. لا يوجد فرق في الرسم بالرغم من ذلك.

دعنا نذهب أبعد …

الخطوة 1: توصيل المكونات

توصيل المكونات
توصيل المكونات
توصيل المكونات
توصيل المكونات
توصيل المكونات
توصيل المكونات
توصيل المكونات
توصيل المكونات

حسنًا ، بعد حصولك على المكونات ، ستحتاج إلى توصيلها. هنا يمكنك أن تجد المخططات التافهة الواضحة جدًا. ومع ذلك ، هيريس pinout أيضا:

اندلاع MicroSD

5V -> 5VGND -> GnnCLK -> D13DO -> D12DI -> D11CS -> D4 (إذا كنت تستخدم الدرع فهذا مدمج في D10)

اختراق GPS

فين -> 5VGnn -> GnnRx -> D2Tx -> D3

ملاحظات قليلة حول هذه الوحدة: يتواصل هذان الصبيان من خلال مسارات مختلفة مع Arduino. يستخدم GPS المسلسل TTL ، وهو نفس النوع الذي نستخدمه عندما نتواصل مع Arduino عبر Serial Monitor ، ولهذا السبب يتعين علينا الإعلان من خلال مكتبة عن مسلسل جديد (Tx و Rx) لأن GPS يريد استخدام 9600 افتراضيًا ، ونحن تريد استخدامه أيضًا. تقوم وحدة GPS دائمًا بتدفق البيانات ، إذا تم توصيلها. هذا هو الجزء الصعب الذي يجب التعامل معه ، لأننا إذا قرأنا جملة وقمنا بطباعتها ، فقد نفقد الجملة التالية ، وهذا مطلوب أيضًا. علينا أن نضع ذلك في الاعتبار عند البرمجة!

تتواصل بطاقة MicroSD عبر SPI (الواجهة المحيطية التسلسلية) ، وهي طريقة أخرى للتواصل مع اللوحة. يستخدم هذا النوع من الوحدات دائمًا CLK على D13 و DO على D12 و DI على D11. في بعض الأحيان يكون لهذه الاتصالات اسم مختلف مثل CLK = SCK أو SCLK (الساعة التسلسلية) ، DO = DOUT ، SIMO ، SDO ، SO ، MTSR (كل هذه تشير إلى إخراج رئيسي) و DI = SOMI ، SDI ، MISO ، MRST (إدخال رئيسي). أخيرًا لدينا CS أو SS التي تشير إلى الدبوس الذي نرسل إليه ما نريد كتابته في MicroSD. إذا كنت تريد استخدام وحدتي SPI مختلفتين ، فما عليك سوى التمييز بين هذا الدبوس لاستخدامهما معًا. على سبيل المثال ، شاشة LCD و MicroSd مثل تلك التي نستخدمها. يجب أن تعمل أيضًا باستخدام شاشتي LCD مختلفتين متصلتين بأجهزة CS مختلفة.

قم بتوصيل هذه الأجزاء معًا في اللوحة وستكون جاهزًا لتحميل الرسم!

كما ترون في الرسم التخطيطي ، قمت بلحام بعض الموصلات الأنثوية المزدوجة بدلاً من المكون المباشر ، وذلك لأنني في المستقبل قد أرغب في إعادة استخدام المكون أو تغيير أحد المكونات.

لقد قمت أيضًا بلحام وحدة GPS بالموصلات في الاتجاه الخاطئ ، وكان هذا خطأي ولم أرغب في ذلك ، لكنه يعمل ولا أريد المخاطرة بتكسيره في محاولة لإلغاء هؤلاء الأوغاد الصغار! فقط جندى بالطريقة الصحيحة وسيكون كل شيء على ما يرام!

إليك بعض مقاطع الفيديو المفيدة حول اللحام: دليل اللحام للمبتدئين ، فيديو حول desolder

قناة Adafruit على اليوتيوب ، هناك الكثير من الأشياء المثيرة للاهتمام!

عندما تقوم باللحام ، حاول استخدام كمية المعدن التي تحتاجها فقط ، وإلا ستحدث فوضى. لا تخف من القيام بذلك ، فربما تبدأ بشيء ليس باهظ الثمن ، واستمر في اللحام بأشياء مختلفة. المادة الصحيحة تصنع الفرق أيضًا!

الخطوة 2: الرسم

أولاً ، بالطبع ، نقوم باستيراد المكتبة وبناء كائناتها للعمل معها: SPI.h للتواصل مع وحدات SPI ، SD هي مكتبة MicroSD و Adafruit_GPS هي مكتبة وحدة GPS. SoftwareSerial.h مخصص لإنشاء منفذ تسلسلي عبر البرنامج. الصيغة هي "mySerial (TxPin ، RxPin) ؛". يجب توجيه كائن GPS إلى مسلسل (بين قوسين) ، وإليك روابط المكتبات الخاصة باختراق Adafruit GPS ، وكسر MicroSD (للقيام بعمل نظيف ، يجب أيضًا تنسيق SD مع هذا البرنامج من جمعية SD) و مكتبة البرامج التسلسلية (يجب تضمينها في IDE).

ملاحظة: واجهت بعض المشاكل عند محاولة إلحاق الكثير من المعلومات في ملف واحد أو استخدام أكثر من ملفين في الرسم التخطيطي. لم أقم بتنسيق SD باستخدام هذا البرنامج ، فربما يمكن أن يؤدي ذلك إلى حل المشكلة. أيضًا ، حاولت إضافة مستشعر آخر في الجهاز ، BMP280 (وحدة I2C) ، دون أي نجاح. يبدو أن استخدام وحدة I2C يجعل الرسم مجنونًا! لقد تأثرت بالفعل بهذا الأمر في منتدى Adafruit ، لكن ما زلت لم أحصل على إجابة.

# تضمين "SPI.h" # تضمين "SD.h" # تضمين "Adafruit_GPS.h" # تضمين "SoftwareSerial.h" SoftwareSerial mySerial (3، 2) ؛ Adafruit_GPS GPS (& mySerial) ؛

نحتاج الآن إلى جميع المتغيرات الخاصة بنا: الخيطتان مخصصتان لقراءة الجملتين اللتين نحتاجهما لحساب مجموعة من المعلومات المفيدة من نظام تحديد المواقع العالمي (GPS). الحرف مخصص لتخزين الجمل قبل تحليلها ، والعوامات مخصصة لحساب الإحداثيات بالدرجات (يرسل نظام تحديد المواقع إحداثيات الاستخدام بالدرجات والدقائق ، ونحتاجها بالدرجات للسماح بالقراءة في برنامج جوجل إيرث). الشريحة Select هو الدبوس حيث نقوم بتوصيل CS لبطاقة MicroSD. في هذه الحالة هو D4 ، ولكن إذا كنت تستخدم درع SD ، فسيتعين عليك وضع D10 هنا. متغير الملف هو الذي سيخزن معلومات الملف الذي نستخدمه أثناء الرسم.

سلسلة NMEA1 ؛

سلسلة NMEA2 ؛ شار ج ؛ درجة تعويم درجة تعويم درجة تعويم رقاقة intSelect = 4 ؛ ملف mySensorData ؛

نحن الآن نعلن عن وظيفتين لجعل الرسم أكثر أناقة وأقل فوضوية:

إنهم يفعلون نفس الشيء في الأساس: قراءة جمل NMEA. يتجاهل clearGPS () ثلاث جمل ويقوم readGPS () بحفظ اثنتين منها في المتغيرات.

دعونا نرى كيف: تتحكم حلقة while loop في ما إذا كانت هناك جمل NMEA جديدة على الوحدة وقراءة دفق GPS حتى يوجد واحد. عندما تكون هناك جملة جديدة ، فإننا نخرج من حلقة while ، حيث تتم قراءة الجملة بالفعل وتحليلها وتخزينها في أول متغيرات NMEA. نحن نفعل الشيء نفسه على الفور للخطوة التالية ، لأن GPS يتدفق باستمرار ، ولا ينتظر منا أن نكون مستعدين ، وليس لدينا وقت لطباعته على الفور

هذا مهم جدا! لا تفعل أي شيء قبل تخزين كلتا الجملتين ، وإلا فإن الجملة الثانية ستكون تالفة أو خاطئة في النهاية.

بعد أن حصلنا على جملتين ، قمنا بطباعتهما في المسلسل للتحكم في أن الأمر يسير على ما يرام.

readGPS باطلة () {

clearGPS () ، while (! GPS.newNMEAreceived ()) {c = GPS.read () ؛ } GPS.parse (GPS.lastNMEA ()) ؛ NMEA1 = GPS.lastNMEA () ، while (! GPS.newNMEAreceived ()) {c = GPS.read () ؛ } GPS.parse (GPS.lastNMEA ()) ؛ NMEA2 = GPS.lastNMEA () ، Serial.println (NMEA1) ؛ Serial.println (NMEA2) ؛ } باطل clearGPS () {while (! GPS.newNMEAreceived ()) {c = GPS.read ()؛ } GPS.parse (GPS.lastNMEA ()) ؛ while (! GPS.newNMEAreceived ()) {c = GPS.read () ؛ } GPS.parse (GPS.lastNMEA ())؛ w while (! GPS.newNMEAreceived ()) {c = GPS.read () ؛ } GPS.parse (GPS.lastNMEA ()) ؛ }

حسنًا ، الآن بعد أن أصبحنا جميعًا جاهزين ، يمكننا تجاوز الإعداد ():

أولاً: نفتح الاتصال على Serial 115200 for Arduino PC وعلى 9600 لوحدة GPS Arduino. ثانيًا: نرسل ثلاثة أوامر إلى وحدة GPS: الأول هو إغلاق تحديث الهوائي ، والثاني هو طلب سلسلة RMC و GGA فقط (سنستخدم فقط تلك التي تحتوي على جميع المعلومات التي قد تحتاجها من أي وقت مضى. a GPS) ، الأمر الثالث والأخير هو ضبط معدل التحديث على 1HZ ، الذي اقترحه Adafruit.

بعد ذلك ، قمنا بتعيين الدبوس D10 على الإخراج ، إذا ، وفقط إذا ، كان دبوس 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 ، الإخراج) ؛

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 ، يعني t هات أننا متصلون بقمر صناعي e. إذا حصلنا عليها ، فسنكتب معلوماتنا في الملفات. في الملف الأول "NMEA.txt" ، نكتب فقط الجمل الأولية. في الملف الثاني ، "GPDData.txt" ، نلحق الإحداثيات (محولة بالوظائف التي رأيناها من قبل) والارتفاع. هذه المعلومات كافية لتجميع ملف kml. لإنشاء مسار على Google Earth. لاحظ أننا نغلق الملفات في كل مرة نفتحها لكتابة شيء ما!

حلقة فارغة() {

readGPS () ، // Condizione if che controla se l'antenna ha segnale. حد ذاته ، إجراءات معادية للبيانات. if (GPS.fix == 1) {// احفظ البيانات فقط إذا كان لدينا إصلاح mySensorData = SD.open ("NMEA.txt"، FILE_WRITE) ؛ // Apre il file لكل le frasi NMEA grezze mySensorData.println (NMEA1) ؛ // Scrive prima NMEA sul file mySensorData.println (NMEA2) ؛ // Scrive seconda NMEA sul file mySensorData.close () ؛ // ملف خيود !!

mySensorData = SD.open ("GPSData.txt" ، FILE_WRITE) ؛

// Converte e scrive la longitudine convLong ()؛ mySensorData.print (درجة ، 4) ؛ // Scrive le تنسيق في ملف gradi sul mySensorData.print ("،") ؛ // Scrive una virgola pereparare i dati Serial.print (deg) ؛ Serial.print ("،") ؛ // Converte e scrive la latitudine convLati ()؛ mySensorData.print (درجة ، 4) ؛ // Scrive le تنسيق في ملف gradi sul mySensorData.print ("،") ؛ // Scrive una virgola pereparare i dati Serial.print (deg) ؛ Serial.print ("،") ؛ // Scrive l'altitudine mySensorData.print (GPS.altitude) ؛ mySensorData.print ("") ؛ Serial.println (GPS.altitude) ؛ mySensorData.close () ، }}

الآن بعد أن انتهينا جميعًا ، يمكنك تحميل الرسم وبناء الجهاز والاستمتاع به!

لاحظ أنك تحتاج إلى استخدامه مع GPS borad المواجه للسماء من أجل الحصول على Fix = 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 بالتوقيت العالمي A = الحالة A = نشط أو V = باطل 4807.038 ، N = خط العرض 48 درجة 07.038 'شمالًا 01131.000 ، E = خط الطول 11 درجة 31.000' E 022.4 = السرعة فوق الأرض بالعقد 084.4 = زاوية المسار بالدرجات صحيح 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 Global Positioning System Fix Data 123519 تم أخذ الإصلاح في 12:35:19 بالتوقيت العالمي 4807.038، N خط العرض 48 درجة 07.038 'شمالًا 01131.000، خط الطول 11 درجة 31.000' E 1 جودة الإصلاح: 0 = غير صالح ؛ 1 = إصلاح GPS (SPS) ؛ 2 = إصلاح DGPS ؛ 3 = إصلاح PPS ؛ 4 = الحركة الحركية في الوقت الحقيقي ؛ 5 = تعويم 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 بمعرفة العلامات والحجج الخاصة به. لقد وجدت فقط الدليل من Google ، الذي ربطته من قبل والجزء الأساسي هو تحديد النمط بين العلامات واستدعائه بعلامة # عندما يحين وقت كتابة الإحداثيات.

الملف الذي أضفته في هذا القسم هو ملف kml. يمكنك فقط لصق إحداثياتك فيه. ضع في اعتبارك أن تلصق بهذه الصيغة: خطوط الطول والعرض والارتفاع

موصى به: