Збираємо gps-радар на базі stm32f3discovery і u-blox neo-6m

Отже, що ж має робити наше пристрій?

  1. Отримати інформацію про поточний стан від GPS-приймача.
  2. Розібрати її.
  3. Показати на екрані поточний стан приймача, а також видимі супутники.

Для цього доведеться дізнатися, що таїться за термінами 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).

Збираємо gps-радар на базі stm32f3discovery і u-blox neo-6m
Мал. 1. Загальний вигляд u-center

Видно, що Neo-6M має величезний потенціал, але детально описати всі його можливості не вистачить місця, тому обмежимося пропонованими з коробки: тільки UART на швидкості 9600, тільки NMEA, частота імпульсів - 1 Гц.

У плані підключення все гранично просто: лінії VCC, GND, RX і TX на приймачі підключаємо до + 3.3V, GND, PA9 і PA10 на Discovery відповідно.

Вона повинна відображати поточний стан приймача, швидкість, напрямок руху, чинники зниження точності, час, дату, а ще показувати в полярній системі координат використовуються супутники. Ось приблизно так, як це робить u-center на рис. 2.

Збираємо gps-радар на базі stm32f3discovery і u-blox neo-6m
Мал. 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).

Збираємо gps-радар на базі stm32f3discovery і u-blox neo-6m
Мал. 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 хвилин тому

Google розкрила деталі вразливостей в Chrome ОС, що принесли яка знайшла їх експерту $ 100 000

Новітні патчі Microsoft призводять до збоїв в роботі принтерів Epson

Спеціаліст знайшов в репозиторії DJI приватні ключі, облікові дані AWS, і тепер йому загрожують судом

Компанія Oracle випустила екстрений патч для критичних вразливостей в продуктах PeopleSoft