Отже, що ж має робити наше пристрій?
- Отримати інформацію про поточний стан від GPS-приймача.
- Розібрати її.
- Показати на екрані поточний стан приймача, а також видимі супутники.
Для цього доведеться дізнатися, що таїться за термінами GPS, NMEA-0183 і алгоритм Брезенхема.
Звичайно, детально розбиратися в нюансах роботи GPS не потрібно, оскільки всю роботу по обчисленню координат, швидкості, курсу і інших параметрів за нас візьме на себе GPS-приймач. Але базу знати треба.
Для знаходження відстані між приймачем і передавачем необхідно спочатку синхронізувати їх годинник, а потім порахувати шукане відстань, знаючи швидкість поширення радіохвилі, а також затримку між часом передачі і часом прийому.
Як я вже писав вище, приймачу необхідно знати точні положення передавачів. Подібна інформація надається передавачем і називається «альманах». Природно, ця інформація застаріває, тому в залежності від «свіжості» альманаху можна виділити три типи затримки між включенням приймача і визначення його перших точних координат: «холодний старт», «теплий старт» і «гарячий старт».
Існують способи, які дозволяють зменшити час старту: AGPS (отримання альманаху альтернативними способами - через інтернет або Поштою Росії), DGPS (виняток спотворення сигналу атмосферою) та інші. Але я їх розглядати не буду, оскільки для виконання поставленого завдання цього не потрібно.
Тепер розберемося з тим, в якому ж вигляді розраховані координати з'являються на виході пристрою. Для цього існує спеціальний стандарт.
NMEA - National Marine Electronics Association, а NMEA-0183 (згідно Вікіпедії) - текстовий протокол зв'язку морського (як правило, навігаційного) обладнання (або обладнання, що використовується в поїздах) між собою. Ось рядки, які приходять від мого приймача.
Спочатку визначимо схожі частини кожного рядка. Легко бачити, що всі вони починаються однаково і більш-менш однаково закінчуються. $ GP - інформація йде від приймача GPS (ти ж розумієш, що на кораблі купа інших датчиків: якби у нас був аварійний маяк, то рядок починалася б з $ EP. А якщо ехолот, то з $ SD. Ну і так далі) . Кожен рядок обов'язково закінчується контрольної XOR-сумою всіх байтів в рядку починаючи від $ і закінчуючи * - це якраз ті два символу в кінці рядка. І не забуваємо про символи
- $ GPVTG - GPS Track Made Good and Ground Speed - рядок з інформацією про курс і швидкість.
- a.a - курс в градусах.
- T - True, прапор достовірності інформації.
- b.b - напрямок магнітного відхилення (у нас його немає).
- M - Magnetic, так, дійсно магнітне.
- c.c - горизонтальна швидкість у вузлах (помножити на 1,852 для отримання швидкості в кілометрах в годину).
- N - kNots, вузли.
- d.d - горизонтальна швидкість у кілометрах в годину (і множити нічого не треба).
- K - кілометри на годину.
- ee - контрольна сума.
- $ GPGGA - Global Positioning System Fix Data - рядок з інформацією про поточне місцезнаходження.
- hhmmss.ss - час за всесвітнім координованим часом UTC, коли була проведена фіксація положення.
- a.a - величина широти.
- N - північна широта. Якщо S. то південна.
- b.b - величина довготи.
- E - східна довгота. Якщо W. то західна.
- c - прапор якості сигналу GPS.
- d - кількість використовуваних супутників.
- e.e - фактор зниження точності (DOP, Dilution of precision).
- f.f - висота розташування приймача над рівнем моря.
- M - висота дається в метрах.
- g.g - відмінність між геоидом (істинної формою нашої планети) і еліпсоїдом по WGS84 (тривимірна система координат для позиціонування).
- M - відмінність дається в метрах.
- h.h - номер станції, що передає поправки DGPS.
- i - контрольна сума.
- $ GPGSA - GPS DOP and Active satellites - рядок з інформацією про супутники, використаних для визначення місця розташування та про фактори зниження точності.
- A - автоматичний режим вибору роботи в 2D або 3D, M - ручний режим, коли жорстко обраний, наприклад, 2D.
- x - режим роботи приймача: 0 - координати не визначені, 1 - режим 2D, 2 - режим 3D.
- y1..y12 - номери супутників, які використовуються для визначення місця розташування приймача.
- z1..z2 - PDOP, HDOP, VDOP (фактори зниження точності по положенню, в горизонтальній площині і у вертикальній площині відповідно).
- i - контрольна сума.
- GPGSV - GPS Satellites in View - рядок містить в собі інформацію про номер, азимут, висоті над горизонтом і співвідношенням сигнал / шум супутника. У рядку максимально може бути чотири супутники.
- a - загальна кількість рядків GPGSV.
- b - номер поточного рядка.
- c1..c4 - номер супутника.
- d1..d4 - висота над горизонтом в градусах (0..90).
- e1..e4 - азимут супутника в градусах (0..359).
- f1..f4 - співвідношення сигнал / шум в дБ (0..99).
$ GPGLL, 5541.23512, N, 03749.12634, E, 174214.00, A, A * 6D - на цьому рядку немає сенсу зупинятися детально, оскільки вона містить в собі координати і час, а це ми вже маємо в рядках GPRMC і GPGGA.
Зрозуміло, виробникам GPS-приймачів не забороняє додавати власні рядки. У мого приймача можна при запуску побачити такі:
алгоритм Брезенхема
Цей алгоритм є одним з найстаріших алгоритмів комп'ютерної графіки - він був розроблений Джеком Брезенхема (IBM) аж в 1962 році. З його допомогою відбувається растеризация графічного примітиву, іншими словами, цей алгоритм визначає координати пікселів, які необхідно запалити на екрані, щоб отриманий малюнок примітиву збігався з оригіналом.
Алгоритм Брезенхема використовує тільки операції додавання і віднімання цілих чисел: зазвичай використання арифметики дрібних чисел уповільнює роботу контролера. Зазвичай, але не в нашому випадку, оскільки всередині контролера STM32F303VC знаходиться ядро ARM Cortex-M4 з FPU. FPU (Floating Point Unit) - пристрій, що прискорює роботу з дробовими числами (математичний співпроцесор), тому нас ніщо не обмежує і ми можемо використовувати алгоритм DDA-лінії. Цікаву демонстрацію прискорення роботи МК при малюванні фракталів можна подивитися на YouTube.
Що ж ми використовуємо в проекті?
- Отладочную плату STM32F3-Discovery;
- модуль UART GPS NEO-6M від WaveShare на базі приймача u-blox NEO-6M;
- ЖК-матрицю МТ-12864А.
- 1 - Ucc - харчування - до 5V на Discovery.
- 2 - GND - земля - до GND на Discovery.
- 3 - Uo - вхід харчування ЖК-панелі для управління контрастністю - до підлаштування резистори.
- 4..11 - DB0..DB7 - шина даних - до PD0..PD7 на Discovery.
- 12, 13 - E1, E2 - вибір контролера - до PD8, PD9 на Discovery.
- 14 - RES - скидання - до PD10 на Discovery.
- 15 - R / W - вибір: читання / запис - до PD11 на Discovery.
- 16 - A0 - вибір: команда / дані - до PD12 на Discovery.
- 17 - E - стробирование даних - до PD13 на Discovery.
- 18 - Uee - вихід DC-DC перетворювача - до підлаштування резистори.
Приймач Neo-6M має такі властивості:
- час холодного або теплого старту - 27 с;
- час гарячого старту - 21 с;
- максимальна частота видачі інформації - 1 Гц;
- діапазон частот імпульсів на пін PPS - 0,25 Гц - 1 кГц;
- максимальна точність визначення положення - 2,5 м;
- максимальна точність визначення швидкості - 0,1 м / с;
- максимальна точність визначення курсу - 0,5 градуса.
Neo-6M вміє використовувати SBAS (Satellite Based Augmentation System) - супутникові системи диференціальної корекції, що збільшує точність визначення положення до 2 м, а також AGPS (Assisted GPS) для зниження часу холодного старту. Отримання даних AGPS відбувається з сайту u-blox за допомогою сервісів AssistNow Online і AssistNow Offline (довгостроковий альманах). Модуль має підтримку протоколів NMEA, UBX і RTCM. UBX - пропріетарний протокол від u-blox, а RTCM - протокол для передачі модулю даних про диференціальної корекції DGPS. Також для зв'язку доступні інтерфейси UART, I2C, SPI і USB.
Для роботи з приймачами існує оригінальна утиліта u-center, що має на момент написання статті версію 8.11 (рис. 1).
Мал. 1. Загальний вигляд u-centerВидно, що Neo-6M має величезний потенціал, але детально описати всі його можливості не вистачить місця, тому обмежимося пропонованими з коробки: тільки UART на швидкості 9600, тільки NMEA, частота імпульсів - 1 Гц.
У плані підключення все гранично просто: лінії VCC, GND, RX і TX на приймачі підключаємо до + 3.3V, GND, PA9 і PA10 на Discovery відповідно.
Вона повинна відображати поточний стан приймача, швидкість, напрямок руху, чинники зниження точності, час, дату, а ще показувати в полярній системі координат використовуються супутники. Ось приблизно так, як це робить u-center на рис. 2.
Мал. 2. Очікування того, що буде показано на екранчику 128 х 64Як тільки рядок line від Neo-6M приймається контролером, відбувається її розбиття на токени (масив charTokens) - на підрядка, які в заданій стрічці розділені комами.
Здавалося б, цілком логічно використовувати функцію strtok. але я цього не роблю. Причину покажу на прикладі. Нехай є рядок a, b. c. Результат розбиття її на токени за допомогою strtok буде таким: 'a', 'b', 'c'. Для розбору NMEA це неприпустимо, оскільки в цьому протоколі значення токенов залежать від положення в рядку. Результат роботи описаного вище методу включає в себе порожні маркери - 'a', 'b', '0', '0' 'c'.
Для зручного зберігання інформації про стан приймача, про точність визначення положення, а також про параметри супутників були написані три структури даних.
Положення і швидкість приймача, а також дата і час:
Структура точності визначення координат:
Структура про номер супутника, його положенні і якості сигналу:
Якщо інформація про супутнику не полная, наприклад є інформація про висоту і азимут, але немає про співвідношення сигнал / шум, то в поле isFull записується нульове значення. Такі супутники при виведенні на «радар» будуть ігноруватися.
Заповнення структури на основі масиву токенов відбувається дуже просто: після розбору рядка GPGSA в масиві charTokens значення факторів зниження точності * DOP знаходяться в елементах за номерами 15, 16 і 17.
Тепер можна розібрану інформацію сміливо виводити на екран (рис. 3).
Мал. 3. А ось і реальність!Тепер ти знаєш, що в GPS теж немає нічого складного (якщо не лізти в нетрі), а якщо тобі хочеться зрозуміти суть супутникової навігації, то ласкаво просимо на курс від Стенфорда GPS: An Introduction to Satellite Navigation, with an interactive Worldwide Laboratory using Smartphones або від Університету Міннесоти From GPS and Google Maps to Spatial Computing на Coursera.
А в якості домашнього завдання я поставлю перед тобою три завдання: 1. Додати можливість запису треку. 2. Замінити монохромний екран на кольоровий. 3. Разом з WizFi220 (з номера 188) забезпечити пристрій можливістю отримання A-GPS. Якщо виникли якісь питання, пиши мені на email, який можна знайти на початку статті. Успіхів!
Не забувай заземлюватися! Пам'ятай, що розряд статичної електрики може вбити і модуль GPS, і антену, і екран, і контролер!
- 31 хвилин тому