آموزش اتصال ماژول GPS به STM32

GPS مخفف عبارت Global Positioning System به معنای سیستم موقعیت‌یابی جهانی است و از آن برای به دست آوردن طول و عرض جغرافیایی یک مکان بر روی کره‌ی زمین و زمان UTC یا Universal Time Coordinated آن استفاده می‌شود.

آموزش نحوه‌ی استفاده از ماژول GPS و میکروکنترلر STM32F103C8، برای دستیابی به مختصات موقعیت مکانی

این سیستم مختصات هر مکانی را در هر لحظه از ماهواره‌ها دریافت می‌کند و به زمان UTC آن (زمان و تاریخ) ضمیمه می‌کند. اهمیت سیستم GPS در این است که بسیار دقیق عمل می‌کند و علاوه بر موقعیت مکانی، اطلاعات دیگری را نیز در اختیار کاربر قرار می‌دهد.

همه‌ی ما هم احتمالا از میزان اهمیت، کاربردی بودن و فراگیری GPS مطلع هستیم چرا که واضح‌ترین کاربرد آن در زندگی روزمره ما در گوشی‌های تلفن همراه است که ردیاب‌های مکانی دارند و از تاکسی‌های اینترنتی گرفته تا ردیابی ارتفاع هواپیمای در حال پرواز و … مورد استفاده قرار می‌گیرند.

در این آموزش قصد داریم به سراغ این ماژول جذاب برویم و ببینیم که چطور می‌توان آن را با میکروکنترلر STM32 مرتبط کرد، مختصات مکان‌ها را به دست آورد و بر روی LCD نمایش داد.

تجهیزات مورد نیاز برای انجام پروژه

آشنایی با ماژول GPS

GPS ماژولی که ما در تصویر زیر می‌بینید، GY-NEO6MV2 XM37-1612 است که ۴ پایه دارد، پایه‌های ۵+ ولت و Gnd و پایه‌های TXD و RXD. با استفاده از این دو پورت سریال ارتباط برقرار می‌شود و به راحتی به پورت سریال میکروی STM32 نیز متصل شود.

مقاله مرتبط: ارتباط سریال – پروتکل UART

آموزش نحوه‌ی استفاده از ماژول GPS و میکروکنترلر STM32F103C8، برای دستیابی به مختصات موقعیت مکانی

این ماژول داده‌های خود را با فرمت 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 Nucleo64، با استفاده از نرم‌افزارهای STM32CubeMX و TrueSTUDIO – پروژه‌ی ساده‌ی کنترل LED

پایه‌های میکروکنترلر STM32

پورت‌های ارتباط سریال (USART) بورد BLUE PILL در نقشه‌ی پورت زیر با برچسب آبی روشن نشان داده شده‌اند.

PA9-TX1, PA10- RX1, PA2-TX2, PA3- RX2, PB10-TX3, PB11- RX3

بنابراین سه کانال ارتباط سریال در این میکرو وجود دارد.

آموزش نحوه‌ی استفاده از ماژول GPS و میکروکنترلر STM32F103C8، برای دستیابی به مختصات موقعیت مکانی

نقشه اتصالات مدار

آموزش نحوه‌ی استفاده از ماژول GPS و میکروکنترلر STM32F103C8، برای دستیابی به مختصات موقعیت مکانی

اتصالات بین ماژول GPS و میکروکنترلر

آموزش نحوه‌ی استفاده از ماژول GPS و میکروکنترلر STM32F103C8، برای دستیابی به مختصات موقعیت مکانی

اتصالات بین میکرو و LCD

آموزش نحوه‌ی استفاده از ماژول GPS و میکروکنترلر STM32F103C8، برای دستیابی به مختصات موقعیت مکانی

و در نهایت مدار کامل چنین شکلی خواهد داشت.

آموزش نحوه‌ی استفاده از ماژول GPS و میکروکنترلر STM32F103C8، برای دستیابی به مختصات موقعیت مکانی

پروگرم کردن میکروکنترلر برای ارتباط با ماژول 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  نمایش می‌دهیم.

مطلب پیشنهادی:  اتصال LCD 16x2 به میکروکنترلر STM32F103C8T6

بررسی اینکه آیا داده‌های مربوط به لوکیشن معتبر هستند یا خیر.

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 نمایش داده خواهند شد.

آموزش نحوه‌ی استفاده از ماژول GPS و میکروکنترلر STM32F103C8، برای دستیابی به مختصات موقعیت مکانی

برای اینکه اطمینان حاصل کنید که آیا مختصات دریافتی درست هستند یا خیر، از Google Map استفاده کنید. GPS گوشی موبایل خود را روشن کنید، Google Map را باز کنید و آن آیکون دایره‌ای آبی رنگ را لمس کنید. مختصات مکانی که در آن قرار دارید مانند تصویر زیر به شما نشان داده خواهد شد.

مطلب پیشنهادی:  آموزش راه اندازی ماژول بلوتوث HC-05 [بهمراه برنامه رایگان اندروید]

آموزش نحوه‌ی استفاده از ماژول GPS و میکروکنترلر STM32F103C8، برای دستیابی به مختصات موقعیت مکانی

کد کامل پروژه و ویدئوی نمونه از انجام پروژه را در ادامه می‌توانید ببینید.

کد

#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);
}

ویدئو

امیدواریم آموزش «اتصال ماژول GPS به STM32» برایتان مفید واقع شده باشد. در ادامه پیشنهاد می‌کنیم دیگر آموزش‌های STM32 را نیز مطالعه کنید. کامنت یادتون نره 🙂

اگر این نوشته‌ برایتان مفید بود لطفا کامنت بنویسید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

2 دیدگاه

  1. سلام وقت بخیر
    وقتی از کتابخانه برایgps استفاده می کنیم یک erorr برای include “WProgram.h” می آید لطفا راهنمایی کنید

  2. چرا کتابخانه جواب نمی دهد