GPS مخفف عبارت Global Positioning System به معنای سیستم موقعیتیابی جهانی است و از آن برای به دست آوردن طول و عرض جغرافیایی یک مکان بر روی کرهی زمین و زمان UTC یا Universal Time Coordinated آن استفاده میشود.
این سیستم مختصات هر مکانی را در هر لحظه از ماهوارهها دریافت میکند و به زمان UTC آن (زمان و تاریخ) ضمیمه میکند. اهمیت سیستم GPS در این است که بسیار دقیق عمل میکند و علاوه بر موقعیت مکانی، اطلاعات دیگری را نیز در اختیار کاربر قرار میدهد.
همهی ما هم احتمالا از میزان اهمیت، کاربردی بودن و فراگیری GPS مطلع هستیم چرا که واضحترین کاربرد آن در زندگی روزمره ما در گوشیهای تلفن همراه است که ردیابهای مکانی دارند و از تاکسیهای اینترنتی گرفته تا ردیابی ارتفاع هواپیمای در حال پرواز و … مورد استفاده قرار میگیرند.
در این آموزش قصد داریم به سراغ این ماژول جذاب برویم و ببینیم که چطور میتوان آن را با میکروکنترلر STM32 مرتبط کرد، مختصات مکانها را به دست آورد و بر روی LCD نمایش داد.
تجهیزات مورد نیاز برای انجام پروژه
آشنایی با ماژول GPS
GPS ماژولی که ما در تصویر زیر میبینید، GY-NEO6MV2 XM37-1612 است که ۴ پایه دارد، پایههای ۵+ ولت و Gnd و پایههای TXD و RXD. با استفاده از این دو پورت سریال ارتباط برقرار میشود و به راحتی به پورت سریال میکروی STM32 نیز متصل شود.
مقاله مرتبط: ارتباط سریال – پروتکل UART
این ماژول دادههای خود را با فرمت NMEA ارسال میکند. این فرمت داده از جملات متعددی تشکیل شده است که از میان آنها ما تنها یکی را لازم داریم؛ جملهای که با عبارت $GPGGA شروع میشود و حاوی مختصات مکانی، زمان و اطلاعات مفید دیگری است. به مجموعهی اطلاعاتی که در جملهی GPGGA وجود دارند، Global Positioning System Fix Data نیز گفته میشود.
دربارهی اینکه این اطلاعات چه چیزهایی هستند در منابع میتوانید بخوانید.
در ادامه یک نمونه از جملهی $GPGGA را آوردهایم و در خط دوم مشخص کردهایم که هر بخش از این جمله نشاندهندهی چه اطلاعاتی است.
$GPGGA,104534.000,7791.0381,N,06727.4434,E,1,08,0.9,510.4,M,43.9,M,,*47
$GPGGA,HHMMSS.SSS,latitude,N,longitude,E,FQ,NOS,HDP,altitude,M,height,M,,checksum data
در این آموزش ما از کتابخانهی TinyGPSPlus GPS library استفاده میکنیم که خود تمام اطلاعات لازم را از این جملهی NMEA بیرون میکشد و فقط کافی است که ما یکی دو خط کد ساده بنویسیم تا طول و عرض جغرافیایی را به دست آوریم. این کد را در ادامهی آموزش با هم بررسی میکنیم.
پایههای میکروکنترلر STM32
پورتهای ارتباط سریال (USART) بورد BLUE PILL در نقشهی پورت زیر با برچسب آبی روشن نشان داده شدهاند.
PA9-TX1, PA10- RX1, PA2-TX2, PA3- RX2, PB10-TX3, PB11- RX3
بنابراین سه کانال ارتباط سریال در این میکرو وجود دارد.
نقشه اتصالات مدار
اتصالات بین ماژول GPS و میکروکنترلر
اتصالات بین میکرو و LCD
و در نهایت مدار کامل چنین شکلی خواهد داشت.
پروگرم کردن میکروکنترلر برای ارتباط با ماژول GPS
به روال همیشگی کد کامل این پروژه را در انتهای همین مطلب برایتان قرار دادهایم و در ادامه بخشهایی از آن را با هم بررسی میکنیم. میکروکنترلر STM را میتوان با استفاده از Arduino IDE و اتصال آن از طریق پورت USB به یک کامپیوتر پروگرم کرد. فقط دقت داشته باشید که پینهای RX و TX را در حین پروگرم کردن کد جدا کرده و بعدا دوباره متصل کنید.
بسیار خب، برای ایجاد ارتباط میان میکروکنترلر و ماژول GPS، ابتدا باید کتابخانهی TinyGPSPlus را از گیتهاب دانلود کنیم.
پس از دانلود میتوانیم آن را از مسیر Sketch -> Include Library -> Add .zip Library به IDE اضافه کنیم. (این کتابخانه برای ارتباط با بوردهای آردوینو نیز مناسب است)
ابتدا کتابخانههای لازم را در کد قرار میدهیم و پینهای LCD را هم تعریف میکنیم.
#include <LiquidCrystal.h> #include <TinyGPS++.h> const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
سپس یک object به نام gps تعریف میکنیم که از کلاس TinyGPSPlus باشد.
TinyGPSPlus gps;
سپس در بخش void setup ارتباط سریال با ماژول را با استفاده از (Serial1.begin(9600)) برنامهریزی میکنیم Serial1 را به عنوان پورت Serial 1 (پینهای PA9, PA10) استفاده میکنیم.
Serial1.begin(9600);
نمایش پیام welcome بر روی LCD:
lcd.begin(16,2); lcd.print("Circuit Digest"); lcd.setCursor(0,1); lcd.print("STM32 with GPS"); delay(4000); lcd.clear();
سپس در بخش ()void loop، طول و عرض جغرافیایی را از GPS دریافت میکنیم و بررسی میکنیم که آیا دادهها معتبر هستند یا خیر. در صورت درست بودن آنها را بر روی serial Monitor وLCD نمایش میدهیم.
بررسی اینکه آیا دادههای مربوط به لوکیشن معتبر هستند یا خیر.
loc_valid = gps.location.isValid();
دریافت عرض جغرافیایی:
lat_val = gps.location.lat();
دریافت طول جغرافیایی:
lng_val = gps.location.lng();
اگر دادهی دریافت شده معتبر نباشد؛ بر روی serial Monitor پیغام «*****» و بر روی LCD پیغام «waiting» را نمایش میدهیم.
if (!loc_valid) { lcd.print("Waiting"); Serial.print("Latitude : "); Serial.println("*****"); Serial.print("Longitude : "); Serial.println("*****"); delay(4000); lcd.clear(); }
و اگر درست باشند آنها را در هر دو درگاه (LCD و serial Monitor) نمایش میدهیم.
lcd.clear(); Serial.println("GPS READING: "); Serial.print("Latitude : "); Serial.println(lat_val, 6); lcd.setCursor(0,0); lcd.print("LAT:"); lcd.print(lat_val,6); Serial.print("Longitude : "); Serial.println(lng_val, 6); lcd.setCursor(0,1); lcd.print("LONG:"); lcd.print(lng_val,6); delay(4000);
تابع بعدی هم یک وقفه را در بین هر بار خواندن اطلاعات ایجاد میکند؛ فرصتی برای اینکه بتوانیم دادهها را نمایش دهیم.
static void GPSDelay(unsigned long ms) { unsigned long start = millis(); do { while (Serial1.available()) gps.encode(Serial1.read()); } while (millis() - start < ms); }
تست عملی پروژهی ارتباط میکروکنترلر STM32 با ماژول GPS
پس از اینکه مدار را به طور کامل بستید و کد را هم بر روی میکرو آپلود کردید؛ نوبت به تست کردن پروژه میرسد. اطمینان حاصل کنید که ماژول GPS را در فضایی قرار داده باشید که بتواند سیگنالهای ماهوارهای را با سرعت بهتری دریافت کند. اگر شرایط مناسب نباشد گاهی ممکن است تا چند دقیقه هم طول بکشد تا ماژول بتواند مختصات مکان را از ماهوارهها دریافت کند. به محض این که ماژول شروع به دریافت سیگنال کند چراغ LED آن به حالت چشمک زن درخواهد آمد و پس از لحظات کوتاهی نیز مختصات بر روی LCD نمایش داده خواهند شد.
برای اینکه اطمینان حاصل کنید که آیا مختصات دریافتی درست هستند یا خیر، از Google Map استفاده کنید. GPS گوشی موبایل خود را روشن کنید، Google Map را باز کنید و آن آیکون دایرهای آبی رنگ را لمس کنید. مختصات مکانی که در آن قرار دارید مانند تصویر زیر به شما نشان داده خواهد شد.
کد کامل پروژه و ویدئوی نمونه از انجام پروژه را در ادامه میتوانید ببینید.
کد
#include <LiquidCrystal.h> //Library for using LCD display functions #include <TinyGPS++.h> //Library for using GPS functions const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; //LCD pins connected with STM32 LiquidCrystal lcd(rs, en, d4, d5, d6, d7); TinyGPSPlus gps; //Object gps for class TinyGPSPlus void setup() { Serial1.begin(9600); //Begins Serial comunication at Serial Port 1 at 9600 baudrate lcd.begin(16,2); //Sets display in 16x2 Mode lcd.print("Circuit Digest"); lcd.setCursor(0,1); lcd.print("STM32 with GPS"); delay(4000); lcd.clear(); } void loop() { GPSDelay(1000); unsigned long start; double lat_val, lng_val; bool loc_valid; lat_val = gps.location.lat(); //Gets the latitude loc_valid = gps.location.isValid(); lng_val = gps.location.lng(); //Gets the longitude if (!loc_valid) //Excecutes when invalid data is received from GPS { lcd.print("Waiting"); Serial.print("Latitude : "); Serial.println("*****"); Serial.print("Longitude : "); Serial.println("*****"); delay(4000); lcd.clear(); } else //Excutes when valid data is received from GPS { lcd.clear(); Serial.println("GPS READING: "); Serial.print("Latitude : "); Serial.println(lat_val, 6); //Prints latitude at Serial Monitor lcd.setCursor(0,0); lcd.print("LAT:"); lcd.print(lat_val,6); //Prints latitude at LCD display Serial.print("Longitude : "); Serial.println(lng_val, 6); //Prints longitude at Serial monitor lcd.setCursor(0,1); lcd.print("LONG:"); lcd.print(lng_val,6); //Prints longitude at LCD display delay(4000); } } static void GPSDelay(unsigned long ms) //Delay for receiving data from GPS { unsigned long start = millis(); do { while (Serial1.available()) gps.encode(Serial1.read()); } while (millis() - start < ms); }
ویدئو
- منبع: ترجمه از سایت circuitdigest.com
امیدواریم آموزش «اتصال ماژول GPS به STM32» برایتان مفید واقع شده باشد. در ادامه پیشنهاد میکنیم دیگر آموزشهای STM32 را نیز مطالعه کنید. کامنت یادتون نره 🙂
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.
سلام وقت بخیر
وقتی از کتابخانه برایgps استفاده می کنیم یک erorr برای include “WProgram.h” می آید لطفا راهنمایی کنید
چرا کتابخانه جواب نمی دهد