- Необходими компоненти
- Получаване на данни за местоположението от GPS
- Електрическа схема
- Стъпки към интерфейс GPS с AVR микроконтролер
- Обяснение на кода
GPS модулите се използват широко в приложенията за електроника за проследяване на местоположението въз основа на координати на географска дължина и ширина. Система за проследяване на превозното средство, GPS часовник, система за предупреждение за откриване на произшествия, навигация за трафик, система за наблюдение и т.н. GPS предоставя надморска височина, ширина, дължина, UTC време и много друга информация за конкретното местоположение, които се вземат от повече от един спътник. За да се четат данни от GPS, е необходим микроконтролер, така че тук ние свързваме GPS модул с AVR микроконтролер Atmega16 и отпечатваме дължина и ширина на 16x2 LCD дисплей.
Необходими компоненти
- Atmega16 / 32
- GPS модул (uBlox Neo 6M GPS)
- Антена с дълга тел
- 16x2 LCD
- 2.2k резистор
- Кондензатор 1000uf
- 10uF кондензатор
- Свързващ проводник
- LM7805
- DC жак
- 12v DC адаптер
- Burgstips
- ПХБ или ПХБ с общо предназначение
Ublox Neo 6M е сериен GPS модул, който предоставя подробности за местоположението чрез серийна комуникация. Той има четири щифта.
ПИН |
Описание |
Vcc |
2.7 - 5V захранване |
Gnd |
Земя |
TXD |
Предаване на данни |
RXD |
Получаване на данни |
GPS модулът Ublox neo 6M е съвместим с TTL и неговите спецификации са дадени по-долу.
Време за улавяне |
Готин старт: 27s, Горещ старт: 1s |
Протокол за комуникация |
NMEA |
Последователна комуникация |
9600bps, 8 бита за данни, 1 стоп бит, без паритет и без контрол на потока |
Работен ток |
45mA |
Получаване на данни за местоположението от 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, A, A * 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 (hr): 18 (min): 48 (sec): 00 (ms)
5. 2237.63306, N: Географска ширина 22 (градус) 37 (минути) 63306 (сек) север
6. 08820.86316, E: Географска дължина 088 (градус) 20 (минути) 86316 (сек) изток
7. 1: Fix Quantity 0 = невалидни данни, 1 = валидни данни, 2 = DGPS корекция
8. 03: Брой гледани сателити в момента.
9. 1.0: HDOP
10. 2,56, М: Надморска височина (Височина над морското равнище в метри)
11. 1.9, М: Височина на геоидите
12. * 74: контролна сума
Така че ние се нуждаем от № 5 и № 6, за да съберем информация за местоположението на модула или къде се намира. В този проект използвахме GPS библиотека, която предоставя някои функции за извличане на географската ширина и дължина, така че не е нужно да се тревожим за това.
Преди това сме имали интерфейс GPS с други микроконтролери:
- Как да използвам GPS с Arduino
- Урок за взаимодействие на модул за Raspberry Pi GPS
- Взаимодействие на GPS модул с PIC микроконтролер
- Проследявайте превозно средство в Google Maps с помощта на Arduino, ESP8266 и GPS
Проверете всички проекти, свързани с GPS тук.
Електрическа схема
Схема за GPS взаимодействие с микроконтролер AVR Atemga16 е дадена по-долу:
Цялата система се захранва от 12v DC адаптер, но веригите работят на 5v, така че захранването се регулира до 5v от регулатора на напрежението LM7805. LCD 16x2 е конфигуриран в 4-битов режим и неговите щифтови връзки са показани на електрическата схема. GPS също се захранва от 5v и неговият tx щифт е директно свързан към Rx на микроконтролера Atmega16. За синхронизиране на микроконтролера се използва 8MHz кристален осцилатор.
Стъпки към интерфейс GPS с AVR микроконтролер
- Задайте конфигурациите на микроконтролера, които включват конфигурация на осцилатора.
- Задайте желания порт за LCD, включително DDR регистър.
- Свържете GPS модула към микроконтролера с помощта на USART.
- Инициализирайте системния UART в режим ISR, с 9600 скорости на предаване и LCD в 4-битов режим.
- Вземете два символни масива в зависимост от дължината на географската ширина и дължина.
- Получавайте по един символен бит наведнъж и проверявайте дали е стартиран от $ или не.
- Ако $ е получен, това е низ, трябва да проверим $ GPGGA, това 6 букви, включително $.
- Ако е GPGGA, тогава получете пълния низ и задайте флагове.
- След това извлечете географската ширина и дължина с посоки в два масива.
- Накрая отпечатайте масивите за географска ширина и дължина в LCD.
Обяснение на кода
В края е даден пълен код с демонстрационно видео, тук са обяснени някои важни части от кода.
На първо място включете необходимия заглавен код в кода и след това напишете MACROS на bitmask за LCD и UART config.
#define F_CPU 8000000ul #include #include
Сега декларирайте и инициализирайте някои променливи и масиви за съхраняване на GPS низ, географска ширина и дължина и флагове.
char buf; летлив char ind, flag, stringReceived; char gpgga = {'$', 'G', 'P', 'G', 'G', 'A'}; char ширина; char logitude;
След него имаме някаква функция LCD Driver за управление на LCD.
void lcdwrite (char ch, char r) { LCDPORT = ch & 0xF0; RWLow; ако (r == 1) RSHigh; иначе RSLow; ENHigh; _delay_ms (1); ENLow; _delay_ms (1); LCDPORT = ch << 4 & 0xF0; RWLow; ако (r == 1) RSHigh; иначе RSLow; ENHigh; _delay_ms (1); ENLow; _delay_ms (1); } void lcdprint (char * str) { while (* str) { lcdwrite (* str ++, DATA); // __ забавяне_ms (20); } } void lcdbegin () { char lcdcmd = {0x02,0x28,0x0E, 0x06,0x01}; за (int i = 0; i <5; i ++) 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 ("Lat:"); serialprint ("Latitude:"); за (int i = 15; i <27; i ++) { latitude = buf; lcdwrite (географска ширина, 1); serialwrite (географска ширина); if (i == 24) { lcdwrite ('', 1); i ++; } } serialprintln (""); lcdwrite (192,0); lcdprint ("Log:"); serialprint ("Logitude:"); за (int i = 29; i <41; i ++) { logitude = buf; lcdwrite (logitude, 1); serialwrite (logitude); if (i == 38) { lcdwrite ('', 1); i ++; } }
Така че по този начин GPS модулът може да бъде свързан с ATmega16 за намиране на координатите на местоположението.
Намерете пълния код и работещото видео по-долу.