این مطلب قسمت چهارم از آموزش جامع اینترنت اشیا با آردوینو است. در این قسمت به معرفی ماژول GPS و بررسی نحوه راهاندازی آن با آردوینو خواهیم پرداخت. از آنجایی که GPS یک ابزار پرکاربرد در تلفنهای هوشمند امروزی است، تقریبا هر کسی با کاربرد آن آشنایی دارد. GPS مهمترین ابزار موقعیتیابی جهانی کنونی است و به دلیل ارتباط با ماهوارههای مخابراتی، در هر جایی حتی دورافتادهترین نقاط سطح زمین نیز قابل استفاده است. در پایان این آموزش، با نحوه کار ماژول GPS آشنا خواهید شد و آن را به کمک آردوینو راهاندازی خواهید کرد.
قطعات مورد نیاز
معرفی ماژول GPS
u-blox یکی از معروفترین شرکتهای سازنده قطعات مخابراتی مانند GPS، بلوتوث، LTE و … است که محصولات آن در پروژههای DIY بسیار مورد استفاده قرار گرفته است. در این آموزش از ماژول GY-GPS6MV2 استفاده میکنیم که بر روی آن تراشه u-blox NEO-6M قرار دارد.
قیمت نسبتا پایین، راحتی کار با سنسور و مصرف پایین انرژی باعث شده است تا NEO-6M انتخاب مناسبی برای شروع کار با ماژولهای GPS باشد. این ماژول میتواند به صورت همزمان به ۲۲ ماهواره متصل شده و موقعیت را با دقت بالایی گزارش کند. تعیین موقعیت گیرنده GPS با استفاده از یک روش هندسی به نام trilateration صورت میگیرد. تعداد زیادی ماهواره موقعیتیابی در جو زمین قرار دارند. هر کدام از این ماهوارهها دادهای شامل موقعیت لحظهای خود و زمان را با امواج رادیویی به سطح زمین میفرستد. گیرنده GPS این اطلاعات را دریافت کرده و موقعیت هر ماهواره را تشخیص میدهد. ماژول مدت زمان انتقال هر موج را محاسبه کرده و از این طریق فاصله خود با هر ماهواره را به دست میآورد. سپس با استفاده از روابط هندسی موقعیت خود را محاسبه میکند. برای استفاده از این روش ماژول باید حداقل به ٣ ماهواره متصل شود. هر چه تعداد ماهوارهها بیشتر باشد، دقت موقعیتیابی بیشتر میشود. امواج GPS در محیط باز بهتر دریافت میشوند و در محیطهای بسته، سرپوشیده یا درون جعبه یا اصلا دریافت نمیشوند یا اینکه کیفیت مناسبی ندارند.
ماژول Neo 6-M دارای حساسیت 161dBm- و 2.5m دقت اندازهگیری افقی دارد. سرعت انتقال اطلاعات و نرخ به روزرسانی دادهها در این ماژول به صورت پیشفرض به ترتیب ۹۶۰۰ و 1Hz است. بر روی ماژول یک LED قرار دارد که در صورت تشخیص موقعیت، شروع به چشمک زدن میکند.
ماژول GPS با ولتاژ 3.3V کار میکند. به همین دلیل یک رگولاتور بر روی آن قرار داده شده است تا ولتاژ را تغییر دهد. به این ترتیب میتوانید ماژول را با ولتاژ 5V آردوینوتان هم تغذیه کنید. پایههای سریال ماژول هم با وجود اینکه ولتاژ 3.3V دارند اما با ولتاژ 5V هم میتوانند کار کنند. به هر ترتیب بهتر است ولتاژ پایه Rx ماژول را به 3.3V کاهش دهید. با این کار عمر ماژول را افزایش میدهید.
ولتاژ کاری و همچنین ولتاژ قابل تحمل پایههای دیتا در ماژولهای مختلف متفاوت است. قبل از استفاده از ماژول از شرایط کاری آن مطمئن شوید. در غیر این صورت ممکن است به ماژول آسیب برسد.
یکی از مزایای این ماژول وجود یک باتری خازنی با عمر بالاست. این باتری یک حافظه EEPROM را تغذیه میکند که داده آخرین موقعیت ثبت شده را در خود نگه میدارد. باتری ماژول GPS میتواند تا دو هفته شارژ نگه دارد و پس از هر بار وصل شدن به منبع تغذیه، دوباره شارژ میشود.
به همراه ماژول GPS یک آنتن ارائه میشود که بخش مهم ماژول است. این آنتن از طریق درگاه U.FL متصل میشود. هنگام کار با ماژول GPS باید دقت زیادی داشته باشید تا به آن آسیبی نرسد. اول اینکه درگاه U.FL و سیم آن بسیار ظریف بوده و ممکن است به راحتی خراب شود. و دوم اینکه ماژول GPS خیلی به الکتریسیته ساکن حساس است و در اثر تماس با دستتان و یک تخلیه الکتریکی، میتواند خراب شود. بنابراین پیشنهاد میکنم هنگام کار با آن، از دستبند آنتی استاتیک استفاده کنید.
اتصالات ماژول GPS ساده است. همانطور که مشخص است، ماژول از پروتکل UART استفاده میکند. پایه VCC و GND ماژول را به 5V و GND آردوینو و Tx و Rx ماژول را به ترتیب به ٨ و ۹ آردوینو وصل کنید. پایههای ٠ و ١ آردوینو مخصوص ارتباط UART است با این وجود در صورت نیاز میتوان رابطه سریال با دستگاههای دیگر از طریق هر پایه دیجیتال دیگری نیز ایجاد کرد ولی ارتباط سریال آردوینو با کامپیوتر غیر قابل تغییر است. در اینجا از پایههای ٨ و ۹ به همراه کتابخانه SoftwareSerial استفاده میکنیم تا بتوانیم از سریال آردوینو برای ارتباط با کامپیوتر استفاده کنیم. اتصال آنتن به ماژول را نیز فراموش نکنید.
خواندن داده خام GPS
ماژول GPS به محض اتصال به برد شروع به ارسال اطلاعات میکند. اطلاعات سنسور GPS از یک استاندارد خاص به نام NMEA پیروی میکند. اگر با این استاندارد آشنایی نداشته باشید، چیز زیادی از خروجی GPS متوجه نخواهید شد با این وجود این دادهها شامل اطلاعات بسیار کامل و مفیدی هستند. برای خواندن دادههای خام GPS میتوانید برنامه زیر را بر روی آردوینو آپلود کنید.
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
#include <SoftwareSerial.h>
int RX = 8;
int TX = 9;
SoftwareSerial gpsPort(RX, TX);
void setup()
{
Serial.begin(9600);
gpsPort.begin(9600);
}
void loop()
{
while (gpsPort.available() > 0)
Serial.write(gpsPort.read());
}
در این برنامه ابتدا پورت سریال بین کامپیوتر و آردوینو و بین آردوینو و ماژول را برقرار میکنیم:
gpsPort.begin(9600);
سپس تمام اطلاعات دریافتی از ماژول را بدون هیچ تغییری در سریال مانیتور نمایش میدهیم:
while (gpsPort.available() > 0)
Serial.write(gpsPort.read());
معرفی استاندارد NMEA
همانطور که گفته شد ماژول GPS با هر بار به روزرسانی، دادههایی را با فرمت خاصی به نام NMEA میفرستد. به این اطلاعات جملات NMEA میگویند. NMEA مخفف National Marine Electronics Association یا انجمن الکترونیک دریایی آمریکاست که این استاندارد را تدوین کرده است. هر جمله با علامت $ شروع شده و یک عنوان خاص مثل GPGGA$ دارد. این عنوان نشان میدهد که ماژول چه اطلاعاتی را میخواهد بفرستد. برای مثال جمله GPRMC$ به ترتیب شامل ساعت، تاریخ، عرض جغرافیایی، طول جغرافیایی، ارتفاع از سطح دریا و سرعت است. یک نمونه از خروجی ماژول GPS به صورت زیر است:
$GPGGA,092750.000,5321.6802,N,00630.3372,W,1,8,1.03,61.7,M,55.2,M,,*76
$GPGSA,A,3,10,07,05,02,29,04,08,13,,,,,1.72,1.03,1.38*0A
$GPGSV,3,1,11,10,63,137,17,07,61,098,15,05,59,290,20,08,54,157,30*70
$GPGSV,3,2,11,02,39,223,19,13,28,070,17,26,23,252,,04,14,186,14*79
$GPGSV,3,3,11,29,09,301,24,16,09,020,,36,,,*76
$GPRMC,092750.000,A,5321.6802,N,00630.3372,W,0.02,31.66,280511,,,A*43
$GPGGA,092751.000,5321.6802,N,00630.3371,W,1,8,1.03,61.7,M,55.3,M,,*75
$GPGSA,A,3,10,07,05,02,29,04,08,13,,,,,1.72,1.03,1.38*0A
$GPGSV,3,1,11,10,63,137,17,07,61,098,15,05,59,290,20,08,54,157,30*70
$GPGSV,3,2,11,02,39,223,16,13,28,070,17,26,23,252,,04,14,186,15*77
$GPGSV,3,3,11,29,09,301,24,16,09,020,,36,,,*76
$GPRMC,092751.000,A,5321.6802,N,00630.3371,W,0.06,31.66,280511,,,A*45
استخراج دادههای GPS
جملات NMEA شامل تمام اطلاعاتی که GPS در اختیار دارد هستند. با این وجود خواندن آنها کمی دردسر دارد چرا که باید بدانید هر بخش مربوط به چه پارامتری است. برای استخراج و تحلیل دادههای GPS کتابخانه خوبی به نام +TinyGPS وجود دارد. این کتابخانه تمام تعاریف مورد نیاز در NMEA را دارد. کتابخانه GPS را نصب کنید و برنامه زیر را بر روی آردوینو آپلود کنید.
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
int RX = 8;
int TX = 9;
TinyGPSPlus gps;
SoftwareSerial gpsPort(RX, TX);
void checkGPS()
{
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());
digitalWrite(LED_BUILTIN, HIGH);
}
else
{
Serial.println("Couldn't identify Location");
}
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("Couldn't identify Date");
}
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("Couldn't identify Time");
}
Serial.println();
delay(1000);
}
void setup()
{
Serial.begin(9600);
gpsPort.begin(9600);
}
void loop()
{
while (gpsPort.available() > 0)
if (gps.encode(gpsPort.read()))
checkGPS();
if (millis() > 5000 && gps.charsProcessed() < 10)
{
Serial.println("No GPS Device; Try Again Later.");
while (true)
;
}
}
در این برنامه یک تابع جدید به نام()checkGPSتعریف شده است که موقعیت جغرافیایی، تاریخ و زمان را از دادههای GPS استخراج میکند. در کتابخانه +TinyGPS عرض، طول و ارتفاع جغرافیایی به ترتیب با توابع ()gps.location.lat و ()gps.location.lng و ()gps.altitude.meters در دسترس هستند. به همین ترتیب برای استخراج تاریخ و زمان از توابع زیر در کتابخانه استفاده میشود:
gps.date.month();
gps.date.day();
gps.date.year();
gps.time.hour();
gps.time.minute();
gps.time.second();
gps.time.centisecond();
اعلام هشدار با استفاده از GPS
در این قسمت میخواهیم با استفاده از مطالب قبل سیستمی بسازیم تا در صورت ورود به یک محدوده خاص به شما اطلاع بدهد. فرض کنید که قصد دارید با هواپیما سفر کنید و میخواهید هر وقت در محدوده تهران رسیدید با یک صدا به شما اطلاع داده شود. برای این کار طول و عرض جغرافیایی محدوده تهران را نیاز داریم. کمترین و بیشترین طول جغرافیایی تهران 35.572190 و 35.804159 و کمترین و بیشترین عرض جغرافیایی تهران 51.073654 و 51.640727 است. برنامه زیر را بر روی آردوینو آپلود کنید. اتصالات ماژول GPS مانند حالت قبل است. یک بازر را نیز به پایه ٣ آردوینو وصل کنید. در مورد نحوه کار با ماژول بازر، در آموزش ایجاد صوت با بازر و آردوینو توضیحات کافی داده شده است.
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
int buzzer = 5;
int RXPin = 2;
int TXPin = 3;
int GPSBaud = 9600;
SoftwareSerial gpsSerial(RXPin, TXPin);
TinyGPSPlus gps;
void setup()
{
Serial.begin(9600);
gpsSerial.begin(GPSBaud);
}
void loop()
{
while (gpsSerial.available() > 0)
{
double latitude = gps.location.lat();
double longitude = gps.location.lng();
if ((longitude < 35.804159 && longitude > 35.572190) || (latitude < 51.640727 && latitude > 51.073654))
{
tone(buzzer, 500);
};
}
}
نتیجه گیری
در این آموزش با ماژول GPS آشنا شدید. این ماژول در پروژههای اینترنت اشیا و پرندههای هوشمند مورد استفاده قرار میگیرد. ماژول GPS از آنجا که دادهها را مستقیما از ماهواره دریافت میکند، خطای کمی داشته و در شرایط مختلف قابل اعتماد است.
در آموزش بعدی به راهاندازی ماژول بلوتوث به کمک آردوینو خواهیم پرداخت.
نظرات شما باعث بهبود محتوای آموزشی ما میشود. اگر این آموزش را دوست داشتید، همینطور اگر سوالی در مورد آن دارید، از شنیدن نظراتتان خوشحال خواهیم شد.