- Необходимые компоненты
- Получение данных о местоположении от GPS
- Принципиальная электрическая схема
- Шаги по взаимодействию GPS с микроконтроллером AVR
- Код Пояснение
Модули GPS широко используются в электронике для отслеживания местоположения на основе координат долготы и широты. Система слежения за транспортными средствами, часы GPS, система оповещения об обнаружении аварий, дорожная навигация, система наблюдения и т. Д. - вот лишь некоторые из примеров, где функциональность GPS имеет важное значение. GPS предоставляет данные о высоте, широте, долготе, всемирном координированном времени и многие другие данные о конкретном местоположении, полученные с более чем одного спутника. Для чтения данных с GPS необходим микроконтроллер, поэтому здесь мы связываем модуль GPS с микроконтроллером AVR Atmega16 и печатаем долготу и широту на ЖК-дисплее 16x2.
Необходимые компоненты
- Atmega16 / 32
- Модуль GPS (uBlox Neo 6M GPS)
- Антенна с длинным проводом
- ЖК-дисплей 16x2
- Резистор 2,2 кОм
- Конденсатор 1000 мкФ
- Конденсатор 10 мкФ
- Соединительный провод
- LM7805
- Разъем постоянного тока
- Адаптер постоянного тока 12 В
- Burgstips
- Печатная плата или печатная плата общего назначения
Ublox Neo 6M - это последовательный модуль GPS, который предоставляет информацию о местоположении через последовательную связь. Имеет четыре контакта.
Штырь |
Описание |
Vcc |
2.7 - источник питания 5В |
Gnd |
Земля |
TXD |
Передача данных |
RXD |
Получать данные |
GPS-модуль Ublox neo 6M является TTL-совместимым, его характеристики приведены ниже.
Время захвата |
Крутой старт: 27 с, Горячий старт: 1 с |
Протокол связи |
NMEA |
Последовательная связь |
9600 бит / с, 8 бит данных, 1 стоповый бит, без контроля четности и без управления потоком |
Рабочий ток |
45 мА |
Получение данных о местоположении от GPS
Модуль GPS будет передавать данные в виде нескольких строк со скоростью 9600 бод. Если мы используем терминал UART со скоростью 9600 бод, мы можем видеть данные, полученные GPS.
Модуль GPS отправляет данные о местоположении в реальном времени в формате NMEA (см. Снимок экрана выше). Формат NMEA состоит из нескольких предложений, в которых ниже приведены четыре важных предложения. Более подробную информацию о предложении NMEA и его формате данных можно найти здесь.
- $ GPGGA: данные о фиксации глобальной системы позиционирования
- $ GPGSV: видны спутники GPS
- $ GPGSA: GPS DOP и активные спутники
- $ GPRMC: рекомендуемый минимум конкретных данных GPS / транзита
Узнайте больше о данных GPS и строках NMEA здесь.
Это данные, полученные GPS при подключении на скорости 9600 бод.
$ GPRMC, 141848.00, A, 2237.63306, N, 08820.86316, E, 0.553,, 100418,,, A * 73 $ GPVTG,, T,, M, 0.553, N, 1.024, K, A * 27 $ GPGGA, 141848.00, 2237.63306, N, 08820.86316, E, 1,03,2,56,1,9, M, -54,2, M,, * 74 $ GPGSA, A, 2,06,02,05,,,,,,,,,, 2,75, 2,56,1,00 * 02 $ GPGSV, 1,1,04,02,59,316,30,05,43,188,25,06,44,022,23,25,03,324, * 76 $ GPGLL, 2237.63306, N, 08820.86316, E, 141848.00, А, А * 65
Когда мы используем модуль GPS для отслеживания любого местоположения, нам нужны только координаты, и мы можем найти их в строке $ GPGGA. Только строка $ GPGGA (Global Positioning System Fix Data) в основном используется в программах, а другие строки игнорируются.
$ GPGGA, 141848.00, 2237.63306, N, 08820.86316, E, 1,03,2.56,1.9, M, -54.2, M,, * 74
Что означает эта строка?
Значение этой строки: -
1. Строка всегда начинается со знака «$».
2. GPGGA - это сокращение от Global Positioning System Fix Data.
3. «,» запятая обозначает разделение между двумя значениями.
4. 141848.00: GMT время как 14 (час): 18 (мин): 48 (сек): 00 (мс)
5. 2237.63306, N: 22 (градус) 37 (минуты) 63306 (сек) северной широты.
6. 08820.86316, E: 088 (градус) 20 (минуты) 86316 (сек) восточной долготы.
7. 1: количество исправлений 0 = недопустимые данные, 1 = действительные данные, 2 = исправление DGPS
8. 03: Количество просматриваемых в данный момент спутников.
9. 1.0: HDOP
10. 2,56, M: высота (высота над уровнем моря в метрах).
11. 1.9, M: высота геоидов.
12. * 74: контрольная сумма
Итак, нам нужны № 5 и № 6 для сбора информации о местонахождении модуля или о том, где он находится. В этом проекте мы использовали библиотеку GPS, которая предоставляет некоторые функции для извлечения широты и долготы, поэтому нам не нужно об этом беспокоиться.
Ранее у нас был интерфейс GPS с другими микроконтроллерами:
- Как использовать GPS с Arduino
- Учебное пособие по взаимодействию с модулем Raspberry Pi GPS
- Взаимодействие модуля GPS с микроконтроллером PIC
- Отслеживание автомобиля на картах Google с помощью Arduino, ESP8266 и GPS
Здесь можно посмотреть все проекты, связанные с GPS.
Принципиальная электрическая схема
Схема подключения GPS к микроконтроллеру AVR Atemga16 приведена ниже:
Вся система питается от адаптера постоянного тока 12 В, но схемы работают от 5 В, поэтому напряжение питания регулируется до 5 В с помощью регулятора напряжения LM7805. ЖК-дисплей 16x2 настроен в 4-битном режиме, и его контакты показаны на принципиальной схеме. GPS также питается от 5 В, и его вывод tx напрямую подключен к Rx микроконтроллера Atmega16. Кварцевый генератор 8 МГц используется для синхронизации микроконтроллера.
Шаги по взаимодействию GPS с микроконтроллером AVR
- Установите конфигурации микроконтроллера, которые включают конфигурацию осциллятора.
- Установите желаемый порт для ЖК-дисплея, включая регистр DDR.
- Подключите модуль GPS к микроконтроллеру с помощью USART.
- Инициализируйте UART системы в режиме ISR со скоростью 9600 бод и ЖК-дисплеем в 4-битном режиме.
- Возьмите два массива символов в зависимости от длины широты и долготы.
- Получите по одному биту символа за раз и проверьте, запускается ли он с $ или нет.
- Если получено $, то это строка, нам нужно проверить $ GPGGA, это 6 букв, включая $.
- Если это GPGGA, то получите полную строку и установите флаги.
- Затем извлеките широту и долготу с направлениями в двух массивах.
- Наконец, распечатайте массивы широты и долготы на ЖК-дисплее.
Код Пояснение
Полный код с демонстрационным видео приводится в конце, здесь объясняются некоторые важные части кода.
Прежде всего, включите в код требуемый заголовок, а затем напишите MACROS битовой маски для конфигурации LCD и UART.
#define F_CPU 8000000ul #include #include
Теперь объявите и инициализируйте некоторые переменные и массивы для хранения строки GPS, широты, долготы и флагов.
char buf; volatile char ind, flag, stringReceived; char gpgga = {'$', 'G', 'P', 'G', 'G', 'A'}; широта символа; char logitude;
После этого у нас есть некоторая функция драйвера ЖК-дисплея для управления ЖК-дисплеем.
void lcdwrite (char ch, char r) { LCDPORT = ch & 0xF0; RWLow; если (r == 1) RSHigh; else RSLow; ENHigh; _delay_ms (1); ENLow; _delay_ms (1); LCDPORT = ch << 4 & 0xF0; RWLow; если (r == 1) RSHigh; else RSLow; ENHigh; _delay_ms (1); ENLow; _delay_ms (1); } пусто lcdprint (char * str) { while (* str) { lcdwrite (* str ++, DATA); // __ delay_ms (20); } } void lcdbegin () { char lcdcmd = {0x02,0x28,0x0E, 0x06,0x01}; для (int я = 0; я <5; я ++) lcdwrite (lcdcmd, CMD); }
После этого мы инициализировали последовательную связь с GPS и сравнили полученную строку с «GPGGA»:
void serialbegin () { UCSRC = (1 << URSEL) - (1 << UCSZ0) - (1 << UCSZ1); UBRRH = (BAUD_PRESCALE >> 8); UBRRL = BAUD_PRESCALE; UCSRB = (1 <
Теперь, если полученная строка успешно сопоставлена с GPGGA, тогда в основной функции извлеките и отобразите координаты широты и долготы местоположения:
lcdwrite (0x80,0); lcdprint ("Широта:"); serialprint ("Широта:"); для (int я = 15; я <27; я ++) { широта = buf; lcdwrite (широта, 1); serialwrite (широта); если (я == 24) { lcdwrite ('', 1); i ++; } } serialprintln (""); lcdwrite (192,0); lcdprint ("Журнал:"); serialprint ("Логичность:"); для (int я = 29; я <41; я ++) { logitude = buf; lcdwrite (логичность, 1); serialwrite (логичность); если (я == 38) { lcdwrite ('', 1); i ++; } }
Вот как модуль GPS может быть подключен к ATmega16 для определения координат местоположения.
Найдите полный код и рабочее видео ниже.