GPS означает «Глобальная система позиционирования» и используется для определения широты и долготы любого местоположения на Земле с точным временем UTC (всемирное координированное время). Устройство GPS получает координаты от спутника каждую секунду с указанием времени и даты. GPS обеспечивает большую точность, а также предоставляет другие данные помимо координат положения.

Все мы знаем, что GPS является очень полезным средством и очень часто используется в мобильных телефонах и других портативных устройствах для отслеживания местоположения. Он имеет очень широкий спектр применений в любой области: от вызова такси до отслеживания высоты полета самолетов. В этом примере мы свяжем микроконтроллер STM32 с GPS-модулем для получения координат, что можно использовать в различных проектах геопозиционирования.
В качестве модуля GPS будем использовать GY-NEO6MV2 XM37-1612. Этот модуль GPS имеет четыре контакта +5В, GND, TXD и RXD. Он связывается с вычислительной системой помощью последовательных контактов UART и может быть легко подключен к соответствующему порту STM32F103C8.

Модуль GPS отправляет данные в формате NMEA. Формат NMEA состоит из нескольких предложений, в которых нам нужно только одно предложение. Это предложение начинается с $GPGGA и содержит координаты, время и другую полезную информацию. GPGGA относится к данным коррекции системы глобального позиционирования. Ниже приведен пример строки $GPGGA вместе с ее описанием.
$GPGGA,104534.000,7791.0381,N,06727.4434,E,1,08,0.9,510.4,M,43.9,M,,*47
$GPGGA,ЧЧММСС.ССС, широта, N, долгота, E, FQ, NOS, HDP, высота над уровнем моря, M, высота, M,, данные контрольной суммы
В этом примере, мы используем библиотеку TinyGPSPlus GPS, которая извлекает всю необходимую информацию из предложения NMEA, и нам просто нужно написать простую строку кода для получения широты и долготы, которую мы увидим позже в этом примере.
В данном проекте мы используем микроконтроллер STM32F103C8 на плате BLUE PILL. Порты последовательной связи USART показаны на рисунке ниже. Они имеют синий цвет (PA9-TX1, PA10-RX1, PA2-TX2, PA3-RX2, PB10-TX3, PB11-RX3). У данного микроконтроллера три таких канала связи.

Используя информацию о распиновке отобразим схему подключения микроконтроллера STM32F103C8, GPS-модуля и LCD-дисплея, который будет использоваться для отображения данных.


STM32F103C8 можно запрограммировать с помощью Arduino IDE, просто подключив его к ПК через USB-порт. Убедитесь, что вы отключили контакты TX и RX при загрузке кода и подключите их после загрузки.
Чтобы связать GPS с STM32, сначала мы должны загрузить библиотеку из ссылки TinyGPSPlus (https://github.com/mikalhart/TinyGPSPlus). После загрузки библиотеки ее можно включить в IDE Arduino, выбрав Sketch - Include Library - Add .zip Library. Та же библиотека может быть использована для взаимодействия GPS с Arduino. Полный комментированный код взаимодействия микроконтроллера STM32 с модулем GPS представлен далее.
#include <LiquidCrystal.h> // Библиотека для использования функций ЖК-дисплея
#include <TinyGPS++.h> // Библиотека для использования функций GPS
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; // Выводы LCD, связанные с STM32
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
TinyGPSPlus gps; // Объект GPS для класса TinyGPSPlus
void setup()
{
Serial1.begin(9600); // Инициализируем последовательную связь через последовательный порт 1 со скоростью 9600 бод
lcd.begin(16,2); // Настраиваем дисплей в режим 16x2
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(); // Получаем широту
loc_valid = gps.location.isValid();
lng_val = gps.location.lng(); // Получаем долготу
if (!loc_valid) // При получении неверных данных от GPS
{
lcd.print("Waiting");
Serial.print("Latitude : ");
Serial.println("*****");
Serial.print("Longitude : ");
Serial.println("*****");
delay(4000);
lcd.clear();
}
else // Когда действительные данные получены от GPS
{
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) // Задержка для получения данных от GPS
{
unsigned long start = millis();
do
{
while (Serial1.available())
gps.encode(Serial1.read());
} while (millis() - start < ms);
}
После выполнения настроек и загрузки кода убедитесь, что модуль GPS размещен на открытой площадке для быстрого приема сигнала. Иногда получение сигнала занимает несколько минут, поэтому подождите некоторое время. Светодиод начнет мигать в модуле GPS, когда он начнет принимать сигнал, а координаты местоположения будут отображены на ЖК-дисплее.

Вы можете проверить широту и долготу местоположения с помощью карт Google. Просто перейдите на Google maps с включенным GPS и нажмите на синюю точку. Он покажет адрес с широтой и долготой, как показано на рисунке ниже.

© digitrode.ru