- Потрібні компоненти
- Отримання даних про місцезнаходження з GPS
- Кругова діаграма
- Кроки до взаємодії GPS з мікроконтролером AVR
- Пояснення коду
Модулі GPS широко використовуються в електронних додатках для відстеження місцезнаходження на основі координат довготи та широти. Система відстеження транспортних засобів, годинник GPS, система оповіщення про виявлення аварій, навігація дорожнім рухом, система спостереження тощо - це лише деякі з прикладів, коли функціональність GPS необхідна. GPS надає висоту, широту, довготу, час UTC та багато іншої інформації про конкретне місцезнаходження, яка береться з більш ніж одного супутника. Для зчитування даних з GPS потрібен мікроконтролер, тому тут ми взаємодіємо модуль GPS з мікроконтролером AVR Atmega16 і друкуємо довготу та широту на РК-дисплеї 16x2.
Потрібні компоненти
- Atmega16 / 32
- GPS-модуль (uBlox Neo 6M GPS)
- Довга дротова антена
- РК-дисплей 16x2
- 2.2k Резистор
- Конденсатор 1000 мкФ
- Конденсатор 10 мкФ
- З'єднувальний провід
- LM7805
- Джек постійного струму
- Адаптер постійного струму 12 В
- Burgstips
- PCB або PCB загального призначення
Ublox Neo 6M - це послідовний модуль GPS, який надає деталі місцезнаходження через послідовний зв’язок. Він має чотири шпильки.
PIN-код |
Опис |
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, 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 розшифровується як дані про виправлення глобальної системи позиціонування
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, М: Висота над рівнем моря (Висота над рівнем моря в метрах)
11. 1.9, М: Висота геоїдів
12. * 74: контрольна сума
Отже, нам потрібні №5 та №6 для збору інформації про розташування модуля або про те, де він знаходиться. У цьому проекті ми використовували бібліотеку GPS, яка надає деякі функції для вилучення широти та довготи, тому нам не доведеться про це турбуватися.
Раніше ми взаємоділи GPS з іншими мікроконтролерами:
- Як користуватися GPS з Arduino
- Підручник із взаємодії модуля GPS Raspberry Pi
- Модуль взаємодії GPS з мікроконтролером PIC
- Відстежуйте автомобіль на Картах Google за допомогою Arduino, ESP8266 та GPS
Перевірте всі проекти, пов’язані з GPS, тут.
Кругова діаграма
Схема для взаємодії GPS з мікроконтролером AVR Atemga16 наведена нижче:
Вся система живиться від адаптера постійного струму 12 В, але схеми працюють на 5 В, тому джерело живлення регулюється на 5 В регулятором напруги LM7805. РК-дисплей 16x2 налаштований у 4-бітному режимі, а його контактні з'єднання показані на схемі. GPS також живиться від 5v, а його штекер 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; мінливий знак ind, прапор, рядокReceived; char gpgga = {'$', 'G', 'P', 'G', 'G', 'A'}; широта знака; чар-логітет;
Після цього у нас є якась функція драйвера LCD для керування LCD.
порожній lcdwrite (char ch, char r) { LCDPORT = ch & 0xF0; RWLow; якщо (r == 1) RSHigh; ще RSLow; ВИСОКИЙ; _delay_ms (1); ENLOW; _delay_ms (1); LCDPORT = ch << 4 & 0xF0; RWLow; якщо (r == 1) RSHigh; ще RSLow; ВИСОКИЙ; _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 ("Широта:"); for (int i = 15; i <27; i ++) { latitude = buf; lcdwrite (широта, 1); serialwrite (широта); if (i == 24) { lcdwrite ('', 1); i ++; } } serialprintln (""); lcdwrite (192,0); lcdprint ("Журнал:"); serialprint ("Logitude:"); for (int i = 29; i <41; i ++) { logitude = buf; lcdwrite (logitude, 1); serialwrite (logitude); if (i == 38) { lcdwrite ('', 1); i ++; } }
Отже, таким чином модуль GPS може бути пов’язаний з ATmega16 для пошуку координат місцезнаходження.
Повний код та робоче відео знайдіть нижче.