استخراج عرض و طول جغرافیایی از سیگنال GPS در آردوینو
در این آموزش، خواهیم آموخت چگونه دادههای عرض و طول جغرافیایی را از سیگنال GPS با استفاده از آردوینو و ماجیول GPS Ublox NEO-6M استخراج کنیم. این پروژه بهویژه برای کاربردهایی که نیاز به ردیابی موقعیت دارند مفید است، مانند رباتیک یا ناوبری در فضای باز. در پایان این آموزش، شما یک برنامه عملی خواهید داشت که دادههای GPS را میخواند و مختصات را در نمایشگر مسلسل چاپ میکند.

قبل از اینکه وارد جزئیات شویم، ممکن است بخواهید برای توضیح بیشتر در مورد سیمکشی و پیادهسازی شِفر (کود) به ویدیوی مرتبط مراجعه کنید (در ویدیو در 00:00).
سختافزار به زبان ساده
جزء اصلی این پروژه ماجیول GPS Ublox NEO-6M است. این ماجیول برای ارائه دادههای دقیق موقعیتیابی با استفاده از سیگنالهای ماهوارههای GPS طراحی شده است. این ماجیول میتواند بهطور همزمان سیگنالها را از چندین ماهواره دریافت کند که امکان ردیابی دقیق موقعیت را فراهم میسازد. ماجیول از طریق ارتباط سریال با آردوینو ارتباط برقرار میکند که ادغام آن را در پروژههای مختلف آسان میسازد.
علاوه بر ماجیول GPS، به یک برد آردوینو برای پردازش دادههای GPS نیاز خواهید داشت. آردوینو دادههای ارسالشده توسط ماجیول GPS را میخواند و مقادیر عرض و طول جغرافیایی را برای استفادههای بعدی استخراج میکند. ماجیول GPS معمولاً با ولتاژ 5V کار میکند و خروجی سریالی فراهم میکند که آردوینو میتواند از طریق پایه RX آن را بخواند.
جزئیات مشخصات فنی
| تولیدکننده | یو-بلوکس |
|---|---|
| شماره قطعه | NEO-6M |
| ولتاژ منطقی/ورودی-خروجی | 3.3 ولت |
| ولتاژ تغذیه | 3.0 تا 5.5 ولت |
| جریان خروجی | ≤ 50 mA |
| حساسیت جیپیاس | -165 dBm |
| دمای عملیاتی | -40 تا 85 °C |
| نرخ بهروزرسانی | 1 هرتز (پیشفرض) |
| بسته | 25 × 35 × 4 میلیمتر |
| یادداشتها / انواع | پیکربندیهای مختلف در دسترس هستند |
- اطمینان حاصل کنید که ماجیول GPS به یک منبع تغذیه پایدار (3.0 تا 5.5V) متصل باشد.
- برای انجام تجزیه دادههای GPS از یک کتابخانه مناسب استفاده کنید.
- برای دریافت بهتر ماهواره، آنتن را از هرگونه مانع دور نگه دارید.
- نرخ باود ماجیول GPS را بررسی کنید؛ معمولاً روی 9600 baud کار میکند.
- اگر ماجیول GPS ناپایدار است، استفاده از یک خازن برای صافسازی تغذیه را در نظر بگیرید.
دستورالعملهای سیمکشی

برای سیمکشی ماجیول GPS NEO-6M به آردوینو، با اتصال پایه VCC ماجیول GPS به پایه 5V روی آردوینو شروع کنید. سپس پایه GND ماجیول GPS را به پایه زمین (GND) روی آردوینو متصل کنید. ماجیول GPS با استفاده از پایههای TX و RX با آردوینو ارتباط برقرار میکند. پایه TX ماجیول GPS را به پایه RX (معمولاً پایه 0) روی آردوینو متصل کنید.
اگر از آردوینویی با پایههای اختصاصی I2C استفاده میکنید، مطمئن شوید که پایههای SDA و SCL را بهدرستی متصل کردهاید (معمولاً A4 برای SDA و A5 برای SCL روی بردهای استاندارد آردوینو). پس از سیمکشی، همه اتصالات را دوباره بررسی کنید تا مطمئن شوید که محکم و بهدرستی متصل شدهاند.
نمونههای شِفر (کود) و راهنمای گامبهگام
در اینجا یک بخش کوتاه از شِفر (کود) برای راهاندازی ارتباط سریال و تنظیم رشتهٔ ورودی برای دادههای GPS آمده است:

void setup() {
Serial.begin(9600);
inputString.reserve(200);
}این شِفر (کود) ارتباط سریال را با نرخ باود 9600 مقداردهی اولیه میکند و فضایی برای رشتهٔ دادههای ورودی GPS رزرو میکند.
حالا بیایید به بخشی از شِفر (کود) که دادههای ورودی GPS را پردازش میکند و عرض و طول جغرافیایی را استخراج میکند، نگاهی بیندازیم:
if (BB == signal) {
String LAT = inputString.substring(7, 17);
String LON = inputString.substring(20, 31);
Serial.println(LAT);
Serial.println(LON);
}در این قطعه شِفر (کود)، برنامه بررسی میکند که آیا دادههای ورودی با سیگنال GPS مورد انتظار مطابقت دارند یا خیر. اگر چنین باشد، مقادیر عرض جغرافیایی و طول جغرافیایی را از رشته ورودی استخراج کرده و آنها را در نمایشگر مسلسل چاپ میکند.
در نهایت، شِفر (کود) شامل بخشی برای رسیدگی به دادههای جدیدی است که از طریق اتصال سریال میرسند:
void serialEvent() {
while (Serial.available()) {
char inChar = (char) Serial.read();
inputString += inChar;
if (inChar == '\\n') {
stringComplete = true;
}
}
}این تابع کاراکترهای ورودی از پورت سریال را میخواند و آنها را بهinputString. وقتی یک خصیصه پایان خط تشخیص داده شود، آن را تنظیم میکندstringCompleteپرچم را روی true قرار میدهد که نشان میدهد یک رشتهٔ کامل از دادهها دریافت شده است.
نمایش / چه انتظاری داشته باشید
پس از بارگذاری شِفر (کود) و اجرای آردوینو، باید مقادیر عرض و طول جغرافیایی را در نمایشگر مسلسل مشاهده کنید. مهم است که ماجیول GPS دیدی واضح به آسمان داشته باشد تا سیگنالهای ماهوارهای را بهطور مؤثر دریافت کند. اگر ماجیول سیگنالی دریافت نکند، ممکن است مختصات معتبری نمایش ندهد (در ویدیو در 02:30).
اشتباهات رایج شامل خطاهای سیمکشی، تأمین برق ناکافی و دریافت ضعیف سیگنال ماهوارهای است. اگر با هر مشکلی مواجه شدید، حتماً این موارد را عیبیابی کنید.
برچسبهای زمانی ویدیو
- 00:00- مقدمه
- 02:30- دستورالعمل سیمکشی
- 05:00- توضیح شِفر (کود)
- 08:15- نمایش عملکرد GPS
/*
* این شِفر (کود) آردوینو برای ماجیول GPS یوبلوکس NEO-6M است.
* این شِفر (کود) عرض و طول جغرافیایی GPS را استخراج میکند تا بتوان از آن برای اهداف دیگر استفاده کرد.
*
* نوشته شده توسط احمد نجربی برای ویدیوی Robojax
* تاریخ: ۲۴ ژانویه ۲۰۱۷، در اِجَکس، انتاریو، کانادا
* اجازه به اشتراک گذاری این شِفر (کود) داده میشود، به شرطی که این یادداشت همراه شِفر (کود) حفظ شود.
* سلب مسئولیت: این شِفر (کود) "همانطور که هست" است و فقط برای اهداف آموزشی میباشد.
*
* // نوشته شده برای RoboJax.com
*/
String inputString = ""; // a string to hold incoming data
boolean stringComplete = false; // whether the string is complete
String signal = "\$GPGLL";
void setup() {
// initialize serial:
Serial.begin(9600);
// reserve 200 bytes for the inputString:
inputString.reserve(200);
}
void loop() {
// print the string when a newline arrives:
if (stringComplete) {
String BB = inputString.substring(0, 6);
if (BB == signal) {
String LAT = inputString.substring(7, 17);
int LATperiod = LAT.indexOf('.');
int LATzero = LAT.indexOf('0');
if (LATzero == 0) {
LAT = LAT.substring(1);
}
String LON = inputString.substring(20, 31);
int LONperiod = LON.indexOf('.');
int LONTzero = LON.indexOf('0');
if (LONTzero == 0) {
LON = LON.substring(1);
}
Serial.println(LAT);
Serial.println(LON);
}
// Serial.println(inputString);
// clear the string:
inputString = "";
stringComplete = false;
}
}
/*
* SerialEvent occurs whenever new data arrives via the
* hardware serial RX. This routine runs between each
* time loop() runs, so using delay inside loop can delay
* response. Multiple bytes of data may be available.
*/
void serialEvent() {
while (Serial.available()) {
// get the new byte:
char inChar = (char) Serial.read();
// add it to the inputString:
inputString += inChar;
// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
if (inChar == '\\n') {
stringComplete = true;
}
}
}
منابع و مراجع
هنوز هیچ منبعی موجود نیست.
فایلها📁
هیچ فایلی موجود نیست.