راه اندازی ماژول GPS ublox NEO-6M در آردوینو
در این مقاله، در مورد ماژول جی پی اس NEO-6M GPS نکاتی را می آموزیم و روش راه اندازی آن را با آردوینو یاد می گیریم تا پارامترهای زیر را از آن به دست بیاوریم:
- عرض جغرافیایی(latitude)
- طول جغرافیایی(longitude)
- ارتفاع(altitude)
- تاریخ(date)
- زمان(time)
- سرعت(speed)
- ماهواره ها(satellites)
- و غیره
ما در این مقاله می آموزیم که GPS چگونه کار می کند و به بررسی اجمالی ماژول NEO-6M GPS می پردازیم و به مقدمه ای در مورد آن و نقشه پین ها و مشخصات فنی آن می پردازیم. پس از آن، یاد می گیریم که یک ماژول NEO-6M GPS را به وسیله آردوینو راه اندازی کنیم. و در اسکچ های آردوینو برای کدنویسی ماژول مذکور استفاده می کنیم.
نکته: این آموزش به طور عملی توسط مترجم تست نشده است و صرفاً بعنوان تئوری می تواند مورد استفاده قرار گیرد.
در اسکچ اول(در کدهای اول) به سادگی داده های GPS که از ماژول NEO-6M GPS به دست می آید را قرائت می کنیم. این داده ها، به شکل جملات NMEA هستند و درک آنها آسان نیست. برای خوانا کردن داده های این GPS، ما از کتابخانه TinyGPS++ در اسکچ دوم استفاده می کنیم.
در اسکچ دوم، ما مختصات موقعیت GPS را در داخل سریال مانیتور IDE آردوینو نمایش می دهیم. این موقعیت، به شکل طول جغرافیایی(longitude) و عرض جغرافیایی(latitude) نمایش داده می شود. علاوه بر این، ارتفاع موقعیت(altitude) و تاریخ و زمان نمایش داده می شوند.
معرفی GPS
کلمه GPS مخفف کلمات Global Positioning System به معنی سیستم موقعیت یاب جهانی می باشد. GPS یک سیستم هدایت مبتنی بر ماهواره است که شامل 24 ماهواره در حال گردش می باشد؛ و هرکدام از آنها در هر 24 ساعت دو مدار به دور زمین می سازد. این ماهواره ها سه بیت اطلاعات را انتقال می دهند:
- شماره ماهواره
- موقعیت ماهواره در فضا
- زمانی که این داده ها ارسال شده اند
این سیگنال ها توسط گیرنده GPS دریافت می شوند؛ و از این اطلاعات برای محاسبه فاصله بین این گیرنده و ماهواره های GPS استفاده می کند. با استفاده از سیگنال های سه ماهواره یا بیشتر، یک گیرنده GPS می تواند موقعیت خود را با استفاده از موقعیت معلوم شده ی ماهواره ها، بر روی زمین مثلث بندی کند(بعنوان مثال طول و عرض جغرافیایی).
با استفاده از چهار ماهواره یا بیشتر، یک گیرنده GPS می تواند یک موقعیت سه بعدی را مشخص کند(مثل عرض جغرافیایی، طول جغرافیایی و ارتفاع). علاوه بر این ها، یک گیرنده GPS می تواند داده هایی را برای سرعت و جهت حرکت را ارائه دهد. هر کسی که یک گیرنده GPS داشته باشد، می تواند از این سیستم استفاده کند، زیرا GPS، موارد زیر را به ما ارائه می دهد:
- ارائه همزمان اطلاعات(real-time)
- موقعیت دهی سه بعدی
- ناوبری
- زمان بندی 24 ساعته
- هفت روز هفته در دسترس بودن
در سراسر جهان، از GPS در برنامه های مختلفی استفاده می شود، که سه نمونه ی آن عبارتند از:
- جمع آوری داده های GIS
- مساحت سنجی
- نقشه برداری
نکته: یک گیرنده GPS ،مکان سه ماهواره یا بیشتر را تعیین می کند. و فاصله را تا هرکدام از آنها محاسبه می کند و از این اطلاعات برای تولید موقعیت خود استفاده می کند. این عملیات بر اساس یک اصل ریاضی به نام سه گانه سازی(Trilateration) انجام می شود.
معرفی ماژول NEO-6M GPS
ماژول NEO-6M GPS یک گیرنده GPS است که می تواند تمام موقعیت های روی زمین را مشخص کند؛ زیرا این ماژول می تواند تقریباً 22 ماهواره را ردیابی کند.
این ماژول از یک موتور موقعیت یابی u-blox 6 با کارایی بالا تشکیل شده است؛ معماری فشرده و مصرف برق پایین، آن را به یک انتخاب مناسب برای پروژه های اینترنت اشیاء(IoT) تبدیل کرده است. به طور کلی این ماژول، یک گیرنده GPS مقرون به صرفه است.
بررسی کلی سخت افزار این ماژول
اجازه دهید کمی در مورد سخت افزار ماژول جی پی اس NEO-6M GPS صحبت کنیم. برای به دست آوردن قرائت GPS، ما باید از ماژول NEO-6M GPS به همراه یک آنتن استفاده کنیم. این آنتن، از طریق کانکتور U.FL محکم به ماژول متصل می شود. این کانکتور در بسته ی ماژول GPS یافت می شود.

تراشه NEO-6M GPS
در وسط این ماژول جی پی اس، می توانید تراشه NEO-6M را مشاهده کنید. این تراشه، مسئول ردیابی حداکثر 22 ماهواره و هر موقعیتی بر روی زمین، در چند کانال می باشد. این تراشه به دلیل ماهیت ردیابی بسیار حساس آن، باعث می شود ماژول NEO-6M یک ماژول ردیاب GPS محسوب شود. برخی از ویژگی های کلیدی تراشه NEO-6M عبارتند از:
- حساسیت بالا برای ردیابی
- جریان تغذیه کم(45mA~)
- توانایی ردیابی 5 موقعیت در ثانیه با دقت 2.5 متر(افقی)
- مجهز به PSM که مخفف Power Saving Mode(حالت ذخیره انرژی) است. این حالت با روشن و خاموش کردن ماژول، بر اساس نیاز، باعث مصرف برق بسیار کمتر می شود.
- استفاده عالی به عنوان ردیاب GPS در ساعت های هوشمند به دلیل مصرف انرژی بسیار کم(11mA~)
LED شاخص تثبیت موقعیت
در حرکت های روبه جلو، این ماژول از یک LED شاخص تثبیت موقعیت برخوردار است. این LED از طریق چشمک زن خود، نشان می دهد که آیا ماژول در جستجوی ماهواره است یا قبلاً آنها را پیدا کرده است. اگر این LED هر یک ثانیه یک بار چشمک بزند، نشان می دهد که محل ثابت(position fix) پیدا شده است. اما اگر LED چشمک نزند، ماژول هنوز در حال جستجو برای ماهواره می باشد.
رگولاتور 3.3 ولت کم افت خروجی
این ماژول، مجهز به یک رگولاتور 3.3 ولت LDO می باشد(MIC5205). این یک تنظیم ولتاژ خطی کارآمد با خروجی بسیار کم نویز و افت ولتاژ بسیار کم را فراهم می آورد. همچنین این ماژول می تواند 5 ولت را به راحتی تحمل کند؛ بنابراین برنامه نویسی آن با آردوینو بسیار راحت است.
مشخصات فنی
در جدول زیر، برخی از مشخصات فنی ماژول NEO-6M نشان داده شده است:
| نوع | GPS |
| تغذیه | 2.7 V-3.6 V |
| جریان عملیاتی | 45mA |
| دمای عملیاتی | -40°C ~ 85°C |
| دقت موقعیت افقی | 2.5m |
| پروتکل ارتباطی | NMEA, UBX Binary, RTCM |
| ویژگی ها | RTC Crystal and External Interrupt/Wake up |
| رابط کاربری | UART, SPI, USB and DDC |
برای اطلاعات بیشتر در مورد ماژول NEO-6M، به راهنمای آن در این آدرس مراجعه کنید.
نقشه پین های ماژول NEO 6M
تصویر زیر، نقشه پین های ماژول NEO 6M را نشان می دهد. این ماژول، 4 پین به نام های زیر دارد:
- GND
- TX
- RX
- VCC

| GND |
این پین مخصوص اتصال به زمین است که به پین اتصال به زمین آردوینو UNO متصل می شود. |
| TX |
این پین انتقال داده(transmission) آردوینو است که از آن برای ارتباطات سریال استفاده می شود. |
| RX |
این پین دریافت داده(receiver) است که از آن برای ارتباطات سریال استفاده می شود. |
| VCC | این پین VCC است که از آن برای برق رساندن به ماژول GPS استفاده می شود. آن را به پین 5 ولت بورد آردوینو UNO متصل کنید. |
اتصال آردوینو UNO و ماژول NEO-6M
ماژول NEO-6M GPS چهار پایانه دارد که ما می خواهیم آنها را به بورد آردوینو متصل کنیم. چون که ماژول GPS تا 5 ولت تحمل دارد، می خواهیم آن را به پایانه VCC پنج ولت آردوینو UNO متصل کنیم. ما می خواهیم پایانه TX(انتقال داده) و RX(دریافت داده) از ماژول GPS را به پین های دیجیتال آردوینو UNO متصل کنیم. برای برقراری ارتباط بین این دو دستگاه از ارتباطات سریال(Software serial) استفاده می شود. از این رو، ما پین مشاره 6 را برای TX و پین شماره 7 را در اسکچ های برنامه برای RX تنظیم می کنیم. بنابراین، پین TX از NEO-6M به پین 7 آردوینو و پین RX از NEO-6M به پین 6 آردوینو متصل می کنیم. اما شما می توانید از هر پین دیجیتال دیگری نیز استفاده کنید. همچنین هردو دستگاه، پین اتصال به زمین مشترکی دارند.
| آردوینو UNO | NEO-6M ماژول |
| 5V | VCC |
| 6 | TX |
| 7 | RX |
| GND | GND |
نمودار شماتیک
همان طور که در زیر نشان داده شده است، هر دوی بورد های آردوینو UNO و ماژول NEO-6M GPS را به صورت زیر به یکدیگر متصل کنید. همان طور که در جدول بالا نشان داده شده است، ما در نمودار زیر، دستگاه ها را به یکدیگر متصل کرده ایم.

کدنویسی آردوینو: به دست آوردن داده های GPS از ماژول NEO-6M
ویرایشگر یا همان IDE آردوینو را باز کنید و به آدرس File > New بروید. خواهید دید که یک فایل جدید باز می شود. کد زیر را کپی کنید(دکمه کپی در گوشه سمت راست و بالا) و آن را در فایل الصاق(پیست) کنید سپس فایل را ذخیره کنید.
#include <SoftwareSerial.h>
int Rx_pin = 7;
int Tx_pin = 6;
SoftwareSerial SerialGPS(Rx_pin, Tx_pin);
void setup()
{
Serial.begin(9600);
SerialGPS.begin(9600);
}
void loop()
{
while (SerialGPS.available() > 0)
Serial.write(SerialGPS.read());
}
در کدهای بالا، ما ابتدا کتابخانه SoftwareSerial.h را اضافه(include) کرده ایم. زیرا می خواهیم از سریال نرم افزاری برای ارتباط بین دو دستگاه استفاده کنیم. سپس پین های RX و TX را تنظیم می کنیم. سپس متغیرهای این دو را بعنوان پارامتر به نمونه آبجکت SoftwareSerial که نامش را SerialGPS می نامیم، پاس می دهیم:
int Rx_pin = 7;
int Tx_pin = 6;
SoftwareSerial SerialGPS(Rx_pin, Tx_pin);
در درون تابع setup()، ما ارتباط سریال را برای هردوی پورت آردوینو و پورت GPS با نرخ انتقال(baud rate) 9600 باز می کنیم. ماژول NEO-6M، یک نرخ انتقال پیش فرض 9600 دارد؛ بنابراین ما از مقدار 9600 استفاده می کنیم:
void setup()
{
Serial.begin(9600);
SerialGPS.begin(9600);
}
در درون تابع loop()، ما پورت GPS را قرائت می کنیم و داده ها را در سریال مانیتور پرینت می کنیم:
void loop()
{
while (SerialGPS.available() > 0)
Serial.write(SerialGPS.read());
}
مستندات
برای اینکه نتیجه کدهای بالا را مشاهده کنید، آنها را در آردوینو UNO آپلود کنید. مطمئن شوید که آنتن به خوبی به کانکتور U.FL از ماژول NEO-6M متصل شده باشد:

قبل از آپلود کردن کدها، مطمئن شوید که در آدرس Tools > Board از IDE آردوینو، بورد آردوینو را انتخاب کرده باشید؛ همچنین پورت COM را که بورد آردویو به آن متصل شده است را در آدرس Tools > Port انتخاب کنید.

وقتی که کدها در آردوینو آپلود شدند، سریال مانیتور(serial monitor) را باز کنید و نرخ انتقال(baud rate) را به 9600 تنظیم کنید. حالا دکمه RST را در آردوینو UNO فشار دهید.

بلافاصله، سریال مانیتور شروع به نمایش دادن داده های GPS به صورت جملات NMEA می کند. این داده چیزی شبیه به تصویر زیر هستند:

درک مبانی جملات NMEA
همان طور که مشاهده کردید، GPS داده هایی را نمایش می دهد که انواع مختلفی دارند و شامل GPRMC$ و GPGGA$ و غیره می شوند. هر قسمت داده ی NMEA با یک کاما جدا شده است و با یک علامت $ شروع می شود. در جدول زیر، قواعد نوشتاری به صورت GPXXX$ را مشاهده می کنید که انواع مختلف پیغام های NMEA را نشان می دهد:
| $GPGGA |
داده های سیستم موقعیت یابی جهانی(Fix Data). این نوع داده، موقعیت سه بعدی و دقت داده ها(accuracy data) را ارائه می دهد. |
| $GPGSA |
این نوع داده،تعدیل دقت(GPS DOP) و ماهواره های فعال را ارائه می دهد. |
| $GPGSV |
این نوع داده، اطلاعات دقیق را در مورد ماهواره جی پی اس ارائه می دهد. |
| $GPGLL |
این نوع داده، عرض و طول جغرافیایی را ارائه می دهد. |
| $GPRMC |
این نوع داده، موقعیت و سرعت و زمان را ارائه می دهد. |
| $GPVTG |
این نوع داده، سرعت زمین را نشان می دهند. |
اجازه دهید ببینیم که چگونه می توانیم یک جمله NMEA را قرائت کنیم؛ مثلاً جمله GPGGA$ . در زیر، یک مثال از جمله GPGGA$ قرار دارد:
$GPGGA, 103005, 3807.038, N, 07128.99030, E, 1, 07, 1.43, 134.5, M, 42.9, M, , *78
| شماره | مقدار | توضیح |
|---|---|---|
| 1 | علامت $ | این علامت، شروع یک جمله NMEA را مشخص می کند. |
| 2 | GPGGA | داده های سیستم موقعیت یابی جهانی(Fix Data). |
| 3 | 103005 | این مورد، زمان UTC را وقتی که داده ها در دسترس ما قرار گرفته اند، به فرمت HH:MM:SS نشان می دهد. در این مورد، زمان برابر است با 10:30:05 UTC. |
| 4 | 3807.038, N | عرض جغرافیایی، 38 درجه، 07.038 دقیقه شمالی. |
| 5 | 07128.99030, E | طول جغرافیایی، 71 درجه، 28.99030 دقیقه شرقی. |
| 6 | 1 | موقعیت ثابت جی پی اس(GPS fix) |
| 7 | 07 | تعداد ماهواره های ردیابی شده. |
| 8 | 1.43 | تعدیل دقت افقی. |
| 9 | 134.5, M | ارتفاع از سطح دریا(m) را نشان می دهد. |
| 10 | 42.9, M | ارتفاع زمین واره یا ژئوئید. |
| 11 | فیلد خالی | زمان بر حسب ثانیه، از آخرین آپدیت جی پی اس تفاضلی(DGPS). |
| 12 | فیلد خالی | شماره شناسه ایستگاه جی پی اس تفاضلی یا DGPS. |
| 13 | *78 | داده های جمع بندی(checksum data) |
نکته: ممکن است برخی از داده های جدول بالا، مخصوصاً داده های ردیف 4 و 5 به درستی بیان نشده باشند.
اطلاعات دقیق تر از فایل راهنمای NMEA Reference Manual
فرض کنید داده های زیر برای GPGGA$ داده شده باشد:
$GPGGA,002153.000,3342.6618,N,11751.3858,W,1,10,1.2,27.0,M,-34.2,M,,0000*5E
| شماره | نام | مثال | واحد | توضیح |
|---|---|---|---|---|
| 1 | شناسه پیغام | $GPGGA | عنوان پروتکل GGA | |
| 2 | زمان UTC | 002153.000 | hhmmss.sss | |
| 3 | عرض جغرافیایی | 3342.6618 | ddmm.mmmm | |
| 4 | شاخص N یا S | N | N یعنی شمال و S یعنی جنوب | |
| 5 | طول جغرافیایی | 11751.3858 | فرمت dddmm.mmmm | |
| 6 | شاخص E یا W | W | مقدار E یعنی شرق و مقدار W یعنی غرب | |
| 7 | شاخص Position Fix | 1 | جدول 1.4 را مشاهده کنید. | |
| 8 | ماهواره های مورد استفاده | 10 | محدوده 0 تا 12 | |
| 9 | HDOP | 1.2 | تعدیل دقت افقی(Horizontal Dilution of Precision) | |
| 10 | ارتفاع MSL | 27.0 | متر | |
| 11 | واحد(Unit) ارتفاع MSL | M | متر | |
| 12 |
جدایش زمین واره (Geoid Separation)
|
34.2- | متر | جدایش زمین واره و بیضی مرجع(به نکته شماره 1 و2 در زیر توجه کنید) |
| 13 | واحد(Unit) جدایش زمین واره | M | متر | |
| 14 |
عمر اصلاحات دیفرانسیل (age of differential corrections) |
ثانیه | وقتی که از DGPS استفاده نشده باشد، مقدار این فید خالی(null) خواهد بود. | |
| 15 |
ایستگاه مرجع دیفرانسیل GPS (Differential GPS reference station) |
0000 | ||
| 16 |
داده های جمع بندی(checksum) |
5E* | ||
| 17 |
<CR> <LF> |
انتهای پیام |
نکته شماره 1: جدایش زمین واره(Geoid Separation) چیست؟ برای تقریب زدن سطح زمین، دو مرجع به نام های زمین واره(Geoid) و بیضی مرجع وجود دارد. به انحراف بین زمین واره و یک بیضی مرجع، جدایش زمین واره گفته می شود.
نکته شماره 2: ارتفاع بیضی = ارتفاع MSL + جدایش زمین واره.
جدول 1.4:
| مقدار | توضیح |
|---|---|
| 0 | فیکس(Fix) در دسترس نیست یا نامعتبر است. |
| 1 | معتبر هستند GPSو SPSو Modeو fix |
| 2 | Differential GPSو SPS Modeو fix معتبر هستند. |
| 3 تا 5 | پشتیبانی نمی شود. |
| 6 | Dead Reckoning Mode, fix valid |
مسئله این است که برای بیان عرض جغرافیایی(latitude) و طول جغرافیایی(longitude) یک فرمت وجود دارد که به نظر می رسد یک عدد ممیز شناور اعشاری باشد، اما این طور نیست. به داده ی GPS زیر نگاهی بیندازید، عرض و طول جغرافیایی به رنگ قرمز نشان داده شده اند:
$GPGGA,170243.00,3401.20701,N,11824.6820,W,1,06,2.14,70.9,M,-32.9,M,,*51
توجه کنید که عرض جغرافیایی 3401.20701 است و طول جغرافیایی 11824.6820 است. این ها اعداد ممیز شناور اعشاری به فرمت ##.###### نیستند! بلکه GPGGA علاوه بر دیگر ساختارهای جملات GPS، از فرمت dddmm.mmmm برای عرض جغرافیایی و از فرمت dddmm.mmmm برای طول جغرافیایی استفاده می کند. در نگاه اول، ممکن است فکر کنید که فرمت های ddmm.mmmm و dddmm.mmmm مقادیر عددی هستند، اما این طور نیست. بلکه این فرمت ها ترکیبی از اعداد هستند و موقعیت هر عدد معنی خاصی دارد.
داده ی GPS زیر را در نظر بگیرید:
$GPGGA,170241.00,3401.21189,N,11824.67797,W,1,06,2.14,71.6,M,-32.9,M,,*57
در فرمت ddmm.mmmm و dddmm.mmmm رقم های dd و ddd درجه را مشخص می کنند. رقم های فرمت mm.mmmm ، دقیقه و کسری از دقیقه را مشخص می کنند. بنابراین عرض جغرافیایی 3401.21189 با فرمت ddmm.mmmm به مقدار 34.020196 در فرمت ##.##### ترجمه می شود.
برای کسانی که به جزئیات بیشتری نیاز دارند، در جدول زیر، منطق تبدیل عرض جغرافیایی 3401.21189 و طول جغرافیایی 11824.67797 از فرمت های ddmm.mmmm و dddmm.mmmm به مقادیر استاندارد اعشاری نشان داده شده است:
| فرمت | مقدار | منطق تبدیل | نتیجه(عدد اعشاری) |
|---|---|---|---|
| ddmm.mmmm |
3401.21189 |
\(34 + (01.21189 / 60)\) |
34.020196 |
|
dddmm.mmmm |
11824.67797 |
\(118 + (24.67797 / 60)\) |
118.41129833 |
استفاده از کتابخانه ++TinyGPS برای تجزیه داده های NMEA،
ما می خواهیم از IDE آردوینو برای برنامه نویسی بورد آردوینو UNO خود استفاده کنیم. برای برنامه نویسی آردوینو UNO خود برای تجزیه پیغام های NMEA، به صورت ساده، نیاز داریم تا کتابخانه TinyGPS++.h را نصب کنیم. به غیر از تابع ها، ما در اسکچ(کدهای) دوم، از کتابخانه ++TinyGPS نیز استفاده می کنیم که به ما کمک می کند تا به طول جغرافیایی، عرض جغرافیایی و ارتفاع و تاریخ و زمان فعلی خود دسترسی داشته باشیم. ما همچنین در این کتابخانه، به چند تابع اضافی دسترسی داریم:
1. تابع gps.speed.value() : این تابع سرعت فعلی زمین را در صدم گره(knot)، به ما ارائه می دهد.
2. تابع gps.course.value() : این تابع مسیر حرکت زمینی فعلی را به صدم درجه به ما ارائه می دهد.
3. تابع gps.hdop.value(): این تابع کاهش دقت افقی را به ما ارائه می دهد(GPS).
4. تابع gps.satellites.value(): این تابع تعداد ماهواره های ردیابی شده را به ما ارائه می دهد.
5. تابع age() : این تابع تعداد میلی ثانیه های سپری شده از آخرین آپدیت را برمی گرداند.
نصب کتابخانه ++TinyGPS
برای ساده تر کردن پروژه خود، می خواهیم کتابخانه ++TinyGPS را نصب کنیم تا بتوانیم به سادگی داده های دریافتی از ماژول GPS را به کار ببریم. برای دانلود این کتابخانه، اینجا کلیک کنید و در روی دکمه Code و سپس Download Zip کلیک کنید. برای دانلود این فایل از آموزشگاه مجازی سینا، اینجا کلیک کنید.

شما باید در IDE آردوینو، به آدرس Sketch > Include Library > Add .zip Library بروید و این کتابخانه را نصب کنید.
اسکچ (کدهای) آردوینو برای کتابخانه ++TinyGPS
IDE آردوینو را باز کنید و به آدرس File > New بروید. خواهید دید که یک فایل جدید باز می شود. کدهای زیر را کپی کنید و در فایل مورد نظر قرار دهید و آن را ذخیره(Save) کنید. این اسکچ عرض جغرافیایی، طول جغرافیایی و ارتفاع موقعیت را به ما نشان می دهد. علاوه بر این، تاریخ و زمان فعلی نیز در سریال مانیتور نشان داده می شود. این موارد گفته شده را با استفاده از تابع های درون کتابخانه ++TinyGPS با تجزیه پیغام NMEA به سادگی به دست می آوریم و آن را با یک فرمت راحت تر نشان می دهیم.
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
int RXPin = 7;
int TXPin = 6;
TinyGPSPlus gps;
SoftwareSerial SerialGPS(RXPin, TXPin);
void setup()
{
Serial.begin(9600);
SerialGPS.begin(9600);
}
void loop()
{
while (SerialGPS.available() > 0)
if (gps.encode(SerialGPS.read()))
showData();
if (millis() > 5000 && gps.charsProcessed() < 10)
{
Serial.println("GPS NOT DETECTED!");
while(true);
}
}
void showData()
{
if (gps.location.isValid())
{
Serial.print("Latitude: ");
Serial.println(gps.location.lat(), 6);
Serial.print("Longitude: ");
Serial.println(gps.location.lng(), 6);
Serial.print("Altitude: ");
Serial.println(gps.altitude.meters());
}
else
{
Serial.println("Location is not available");
}
Serial.print("Date: ");
if (gps.date.isValid())
{
Serial.print(gps.date.month());
Serial.print("/");
Serial.print(gps.date.day());
Serial.print("/");
Serial.println(gps.date.year());
}
else
{
Serial.println("Not Available");
}
Serial.print("Time: ");
if (gps.time.isValid())
{
if (gps.time.hour() < 10) Serial.print(F("0"));
Serial.print(gps.time.hour());
Serial.print(":");
if (gps.time.minute() < 10) Serial.print(F("0"));
Serial.print(gps.time.minute());
Serial.print(":");
if (gps.time.second() < 10) Serial.print(F("0"));
Serial.print(gps.time.second());
Serial.print(".");
if (gps.time.centisecond() < 10) Serial.print(F("0"));
Serial.println(gps.time.centisecond());
}
else
{
Serial.println("Not Available");
}
Serial.println();
Serial.println();
delay(5000);
}
این کدها چگونه کار می کنند؟
در کدهای بالا ما ابتدا کتابخانه های مورد نیاز را برای پروژه اضافه می کنیم. از کتابخانه ++TinyGPS، برای استخراج داده های مفید GPS استفاده می کنیم. اما از کتابخانه SoftwareSerial برای ارتباطات سریال بین دو دستگاه استفاده می کنیم.
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
سپس پین های RX و TX را تنظیم می کنیم. برای انجام این کار، این دو متغیر را بعنوان پارامتر، در درون نمونه آبجکت گرفته شده از کتابخانه SoftwareSerial که آن را SerialGPS نامیده ایم پاس می دهیم.
int RXPin = 7;
int TXPin = 6;
SoftwareSerial SerialGPS(RXPin, TXPin);
همچنین ما یک آبجکت از کلاس TinyGPSPlus که در داخل کتابخانه ++TinyGPS وجود دارد، به نام gps ایجاد می کنیم؛ که می خواهیم بعداً از آن در اسکچ برای به دست آوردن داده ها استفاده کنیم.
TinyGPSPlus gps;
در درون تابع setup() ما می خواهیم یک ارتباط سریال را برای پورت آردوینو و پورت GPS با نرخ انتقال(baud rate) به مقدار 9600 باز کنیم. ماژول NEO-6M یک نیز یک نرخ انتقال به مقدار 9600 دارد، بنابراین ما از عدد 9600 استفاده می کنیم.
void setup()
{
Serial.begin(9600);
SerialGPS.begin(9600);
}
در درون تابع loop()، ما داده های GPS را قرائت کرده و سپس تابع showData() را فراخوانی می کنیم تا آن را به طور مناسب در سریال مانیتور(serial monitor) نمایش دهیم. همچنین اگر پس از 5000 میلی ثانیه، داده ای به دست نیاید، سریال مانیتور پیغام GPS NOT DETECTE را نمایش می دهد.
while (SerialGPS.available() > 0)
if (gps.encode(SerialGPS.read()))
showData();
if (millis() > 5000 && gps.charsProcessed() < 10)
{
Serial.println("GPS NOT DETECTED!");
while(true);
}
تابع showData() مقدار عرض جغرافیایی و طول جغرافیایی و ارتفاع را برای یک موقعیت مکانی معتبر در سریال مانیتور نمایش می دهد. علاوه بر این، تاریخ و زمان فعلی نیز نمایش داده می شوند.
void showData()
{
if (gps.location.isValid())
{
Serial.print("Latitude: ");
Serial.println(gps.location.lat(), 6);
Serial.print("Longitude: ");
Serial.println(gps.location.lng(), 6);
Serial.print("Altitude: ");
Serial.println(gps.altitude.meters());
}
else
{
Serial.println("Location is not available");
}
Serial.print("Date: ");
if (gps.date.isValid())
{
Serial.print(gps.date.month());
Serial.print("/");
Serial.print(gps.date.day());
Serial.print("/");
Serial.println(gps.date.year());
}
else
{
Serial.println("Not Available");
}
Serial.print("Time: ");
if (gps.time.isValid())
{
if (gps.time.hour() < 10) Serial.print(F("0"));
Serial.print(gps.time.hour());
Serial.print(":");
if (gps.time.minute() < 10) Serial.print(F("0"));
Serial.print(gps.time.minute());
Serial.print(":");
if (gps.time.second() < 10) Serial.print(F("0"));
Serial.print(gps.time.second());
Serial.print(".");
if (gps.time.centisecond() < 10) Serial.print(F("0"));
Serial.println(gps.time.centisecond());
}
else
{
Serial.println("Not Available");
}
Serial.println();
Serial.println();
delay(5000);
}
نمایش کدهای بالا
برای مشاهده نتیجه کدهای بالا، این کدها را در آردوینو آپلود کنید. اما قبل از آپلود کردن کدها، در IDE آردوینو به آدرس Tools > Board بروید و نوع برد آردوینو را انتخاب کنید(UNO). همچنینبا رفتن به آدرس Tools > Port پورت COM مناسب را انتخاب کنید.

هنگامی که این کدها در آردوینو آپلود شدند، سریال مانیتور را باز کنید و نرخ انتقال(baud rate) را به 9600 تنظیم کنید. بلافاصله خواهید دید که سریال مانیتور پارامترهای موقعیت را نمایش می دهند و تاریخ و زمان فعلی را نیز نمایش می دهد.

سخن پایانی
خب دوستان ما توانستیم چند داده را در آردوینو، با استفاده از ماژول جی پی اس NEO-6M GPS از ماهواره قرائت کنیم. امیدوارم این مقاله مفید واقع شود.
منابع:
- بازدید: 1879
1. سعی کنید نظرات شما مرتبط با مقاله ی مورد نظر باشد، در غیر این صورت پاسخ داده نخواهد شد.
2. سوالات خود را به صورت کوتاه بیان کنید و از پرسیدن چند سوال به طور همزمان خودداری کنید.
3. سوال خود را به طور واضح بیان کنید و از کلمات مبهم استفاده نکنید.