GPS модуль EB-500 и ATMega
Статьи по теме: GPS EB-500 + ATMEGA. Схема. Пример для WinAVR (GCC) GPS. Расчет дистанции между двумя точками по GPS координатам. Расчет курса на точку
Понадобилось мне в очередном проекте задействовать GPS навигацию. Требования к GPS модулю были следующие:
- - UART интерфейс
- - нормальная чувствительность
- - быстрый старт
- - небольшая стоимость
- - можно было без проблем купить в Украине
- - Размер: 13 х 15 х 2.2 мм.
- - Высокая чувствительность -165dBm
- - 66 канальный
- - Поддержка A-GPS (это нам вряд ли понадобится, однако приятно)
- - Быстрое определение местоположения
Железо
Первая испытанная мной антенна была пассивного типа. Сделал тестовую одностороннюю плату. Схема включения - как в документации. Пассивную антенну впаял на плату ближе к приемнику (как оказалось позже - это стремление сыграло со мной злую шутку). В будущем GPS модуль будет подключаться к микроконтроллеру, но первые тесты удобнее выполнять с компьютером. Для подключения к компьютеру я использовал модуль для подключения к USB порту. От него же и питал EB-500. Питание EB-500: 3.0 ... 4.2В. Будьте внимательны: 5 вольт недопустимо много для EB-500! Батарейку для тёплого старта решил сразу не ставить, а зря. Потом пришлось припаять проводками. Получилось вот так:Обратите внимание, что на вывод 12 (в документации обозначен как V_RTC_3V3) подается напряжение от батарейки. Потребление мизерное, зато это позволяет модулю хранить нужную информацию после отключения основного питания. И быстрее стартовать при следующем включении. Кроме того, без подачи напряжения на эту ногу модуль не запускается. Можно подать на эту ногу "+" питания, но лучше использовать батарейку напряжением 3В.
У модуля есть две пары выводов сигналов Rx,Tx. Документация гласит, что это равнозначные выводы. Можно задействовать любую пару. Модуль имеет выход для индикации состояния. На этот вывод подключают светодиод. Светодиод горит, пока модуль ищет спутники и вычисляет координаты, как только пошли актуальнее данные, светодиод мигает раз в секунду. После подключения модуля к компьютеру и запуска окна терминала в него сразу полетели данные (протокол NMEA-0183). Пока что неактуальные. Разбор этих сообщений опишу ниже. Пока же займемся "железом". Скорость подключения нужно подобрать. Первый купленный модуль по умолчанию работал на скорости 9600. Второй модуль на скорости 115200.
В помещении пассивная антенна была бессильна. Только на улице нашлись спутники. На их поиск потребовалось около 25 минут. Пассивная антенна работала крайне нестабильно. Иногда модуль вообще не мог определить координаты даже за 40 минут. Такая нестабильность, в конце концов, вынудила купить активную бескорпусную антенну. Ситуация несколько улучшилась, но не настолько, чтобы назвать ее удовлетворительной. Поиск спутников - от 3 до 15 минут. Опять же какая-то нестабильность. Было обнаружено, что лучше всего GPS приемник работает, когда антенна максимально удалена от приемника. Перерыв гору разной информации, прихожу к выводу, что GPS приемник просто обязан работать с пассивными антеннами, а применение активных антенн не обязательно.
Попробовал вынести пассивную антенну подальше от приемника с помощью кабеля с волновым сопротивлением 50Ом длиной 20см. Саму антенну установил на кусок текстолита, создав под ней заземленный полигон. Это должно улучшать прием. И тут наступило счастье! Наконец добился стабильной работы с пассивной антенной. При этом поиск спутников занимает не более 3-х минут. При отключении и включении модуля спутники находились секунд за 30 иногда вообще за 2 секунды. Наконец-то стал находить спутники с подоконника квартиры и офиса. Но это был не предел. Настоящие сюрпризы (хорошие конечно) - были позже.
Добившись нормальной работы, решил перенести приемник на нормальную плату, установить SMA разъем для цивилизованного подключения разных антенн. На этот раз я сделал плату с максимальной площадью заземленных полигонов. Текстолит взял двусторонний, и обратную сторону сделал сплошным заземленным полигоном. Светодиод ставить не стал. В моем случае его никто не увидит. Изменил отвод дорожки для антенны. Это оказалось очень важным моментом! Раньше она проходила под корпусом модуля, теперь я отвел ее в сторону. Я предполагаю, что именно прохождение проводника под корпусом приемника мешало достижению нормального результата. Плата получилась вот такой:
Поскольку у меня была еще одна автомобильная активная антенна, дальнейшие эксперименты были уже с ней. Результат превзошел всяческие ожидания! Холодный старт на подоконнике ЖБ дома 40-50 секунд! Это при бешеном затенении небосвода. Выключаем приемник, включаем снова - 2 секунды и есть координаты. YESSS! Это то, чего я хотел.
Но и это еще не все! Эксперименты показали, что с пассивной антенной на открытой местности приемник работает не хуже. При этом связь не терялась, даже если антенна была ориентирована в землю. Отличия начинаются при затенении и в помещениях. Там проявляются все достоинства активной антенны. Активная антенна принимала даже в глубине квартиры (3-4м от окна) железобетонного дома.
Далее был шок. Мой прибор должен был звуковым сигналом оповещать момент обнаружения координат и момент потери спутников. Эксперимент проводился на открытой местности, в автомобиле, с активной антенной. И вот, после обнаружения спутников, я пытаюсь помешать антенне принимать сигнал. Перевернул ее - работа продолжается. Накрыл ее, чем попало - работает. И так и сяк, решил просто отключить антенну от модуля. Открутил антенну - модуль продолжает нормально выдавать координаты! Это как?! Да быть того не может! А может он и спутники найдет без антенны!? Выключаю, включаю снова и с ухмылкой гляжу на прибор: "анну, давай!". Глаза из орбит полезли секунде на пятой. Вот так! Работает и без антенны! Справедливости ради надо сказать, что без антенны приемник дольше ищет спутники, но сам факт радует. Сразу надо было правильную плату делать! Ради интереса сделал штыревую антенну из обыкновенного одножильного медного провода. Работает, так же как и с керамической пассивной антенной. В будущем попробую вытравить антенну прямо на плате.
В испытаниях принимали участие следующие антенны:
Пассивная керамическая GPS антена ANT GPS A20-4T | |
Soft
Теперь рассмотрим подключение EB-500 к микроконтроллеру. Собственно, что там его подключать! RX GPS модуля на TX микроконтроллера, TX GPS модуля на RX микроконтроллера.Предполагается, что читатель знаком с UART, знает как управлять портом и считывать данные. Поэтому не будем сильно углубляться в работу с UART и сосредоточимся непосредственно на разборе данных, полученных от GPS модуля.
Качаем архив EB-500.zip в нем есть библиотека для нашего GPS.
Сразу заглянем в файл gps.h В нем описана структура:
#ifndef GPS_H
#define GPS_H
#include <avr/io.h>
typedef struct
{
unsigned long latitude; // Широта
char latitude_c; // Широта литера
unsigned long longitude; // Долгота
char longitude_c; // Долгота литера
uint8_t satels; // Количество спутников
double altitude; // Высота над уровнем моря
double geodeff; // Геоидальное различие
double Time; // Время
uint8_t Day; // День
uint8_t Month; // Месяц
unsigned int Year; // Год
double course; // Направление курса в градусах
double speed; // Скорость
uint8_t actual; // GPS модуль нашел спутники и выдает актуальные данные
} tpGPG;
tpGPG GPS;
void gps_getc(void);
void gps_init(void);
void gps_parse(void);
#endif
В эту структуру и будут складываться распарсенные данные.
В библиотеке есть функция gps_getc. Она считывает полученные с порта символы, помещает в буфер и, при обнаружении конца строки, вызывает функцию gps_parse, которая обрабатывает полученную от GPS модуля строку и раскладывает данные в структуру, описанную в файле gps.h.
Функцию gps_getc следует поместить в обработку прерывания, которое срабатывает при получении символа, в моем случае SIGNAL(UART0_RECEIVE_INTERRUPT). В Вашем случае может UART, UART1 и т.п., в зависимости от того на какой порт Вы подключите GPS модуль.
Теперь можно читать данные со структуры примерно так: GPS.latitude GPS.speed
Моя функция void gps_parse(void) разбирает сообщения $GPGGA, $GPZDA, $GPVTG. И извлекает из них не все данные, а только те, которые меня интересовали. Если Вам нужно больше, функцию можно доработать под свой проект. Думаю, это не сложно.
В библиотеке есть пустые функции:
- gps_init - можно использовать для первоначальной настройки модуля. У меня пока не было такой необходимости, поэтому о командах настройки модуля EB-500 можете прочитать здесь: http://we.easyelectronics.ru/part/gps-modul-eb-500.html
- gps_connected - вызывается при обнаружении координат (спутников)
- gps_disconnected - вызывается при потере спутников
Данные
Напоследок приведу описание информации, которую выдает GPS модуль. Данные взяты из ранее приведенной статьи http://we.easyelectronics.ru/part/gps-modul-eb-500.html1. RMC - самое полезное сообщение, содержит всю самую необходимую информацию. Содержит данные о времени, местоположении, курсе и скорости. Контрольная сумма обязательна для этого сообщения, интервалы передачи не должны превышать 2 секунды. $GPRMC,181057.000,A,5542.2389,N,03741.6063,E,0.47,74.50,190311,,,A*51
- 181057.000 — время 18.10.57.
- A — данные достоверны, V — недостоверны..
- 5542.2389,N — широта («N» для северной или «S» для южной широты).
- 03741.60637,E — долгота («E» для восточной или «W» для западной долготы).
- 0.47 — скорость (узлов в час).
- 74.50 — путевой угол (направление скорости) в градусах. Число с плавающей точкой. Целая и дробная части переменной длины. Значение равное 0 соответствует движению на север, 90 — восток, 180 — юг, 270 — запад.
- 190311 — дата 19.03.2011.
- — магнитное склонение в градусах, рассчитанное по некоторой модели, отсутствует.
- — направление магнитного склонения, отсутствует.
- A — режим: «A» — автономный, «D» — дифференциальный, «E» — аппроксимация, «N» — недостоверные данные.
- *51 — контрольная сумма (далее - КС).
- 74.50,T — Направление курса в градусах.
- M — Магнитное склонение в градусах, отсутствует.
- 0.47,N — скорость (узлов в час).
- 0.87,K — скорость (км в час).
- A — так и не нашел что это за параметр, возможно достоверность данных.
- *07 — КС.
- 181057.000 — время
- 19 — число
- 03 — месяц
- 2011 — год
- — Часовой пояс, смещение от GMT, от 00 до ± 13 часов, отсутствует.
- *55 — КС.
- 181058.000 — время
- 5542.2389,N — широта
- 03741.60637,E — долгота
- 1 — GPS fix ( 0 = Данные не верны, 1 = Позиция зафиксирована, 2 = DGPS (повышенная точность))
- 8 — количество спутников
- 1.34 — HDOP, горизонтальная точность
- 115.0,M — высота над уровнем моря
- 14.6,M — Геоидальное различие — различие между земным эллипсоидом WGS-84 и уровнем моря(геоидом)
- — время с момента последнего обновления DGPS, отсутствует.
- *54 — КС.
- 5542.2389,N — широта
- 03741.60637,E — долгота
- 181058.000 — время по гринвичу на момент определения местоположения (в формате ЧЧММСС.[доли секунд]).
- А — данные верны
- *59 — КС.
- A — режим (М — Manual, forced to operate in 2D or 3D, А — авто 3D/2D)
- 3 — режим (1 — нет фиксации, 2=2D, 3=3D)
- 3...14 — Идентификаторы SVs используется для фиксации позиции
- 2.35 — PDOP (снижение точности по местоположению)
- 1.34 — HDOP (снижение точности в горизонтальной плоскости)
- 1.93 — VDOP (снижение точности в вертикальной плоскости)
- 4 — Полное число сообщений, от 1 до 9.
- 1 — Номер сообщения, от 1 до 9.
- 13 — Полное число видимых спутников.
- 28 — PRN номер спутника.
- 65 — Высота, градусы, (90° — максимум).
- 075 — Азимут истинный, градусы, от 000° до 359°
- 17 — Отношение сигнал/шум от 00 до 99 дБ, ноль — когда нет сигнала.
- 26,53,202,37, то же самое для 2 спутника
- 15,50,278,17, то же самое для 3 спутника
- 27,39,290,24, то же самое для 4 спутника
- *7D — КС.
- 1 (Идеальная) — Рекомендуется к использованию в системах, требующих максимально возможную точность во всё время их работы
- 2-3 (Отличная) — Достаточная точность для использования результатов измерений в достаточно чувствительной аппаратуре и программах
- 4-6 (Хорошая) — Рекомендуемый минимум для принятия решений по полученным результатам. Результаты могут быть использованы для достаточно точных навигационных указаний.
- 7-8 (Средняя) Результаты можно использовать в вычислениях, однако рекомендуется озаботиться повышением точности, например, выйти на более открытое место.
- 9-20 (Ниже среднего) — Результаты могут использоваться только для грубого приближения местоположения
- 21-50 (Плохая) — Выходная точность ниже половины футбольного поля. Обычно такие результаты должны быть отброшены.
В одной из следующих статей я расскажу как рассчитать направление на заданную точку и расстояние до нее, зная GPS координаты.
Желаю успехов!
Спасибо за статью, мне вот-вот должны доставить этот модуль. Исходник печатки не выложите?
Исходник печатной платы в zip файле. На плате выводы для шлейфа делал под свои цели (чтобы шлейф не перекручивался). Это место на плате можно упростить.
А можно целый проект посмотреть, где используются библиотеки.
Проект, в котором используется EB-500 коммерческий, я не могу его публиковать. Но, будет маленький, простенький проект в качестве примера. В нем будет оптимизированная библиотека, поскольку последние версии EB-500 работают на скорости 115200, а не 9600.
По фотографии штыревой антенны видно, что ее длина около 80 мм. Предполагается что это полуволновой вибратор? Собираюсь заказывать себе такой же модуль, а поэтому интересует вопрос: Рискованно ли это заказать только модуль без пассивной керамической антенны? В целях экономии так сказать. Хочу по вашему примеру использовать штыревую, но сомневаюсь: заработает ли у меня так, как у Вас? Спасибо.
И еще один вопрос. Какая розетка SMA использовалась, по фотографии не видно как она припаяна. Насколько знаю в розетках такого типа центральный вывод не лежит в одной плоскости с крайними. Как в этом случае припаивали Вы?
Я экспериментировал с разной длинной штырей (фактически это одножильная проволока с кабеля витой пары). Создалось впечатление, что длинна антенны свыше 70 см. не оказывает влияния на качество приема. Ее можно даже завивать в пружину, все равно работает. Единственное что для этого модуля критично - это нужно чтобы антенна была на расстоянии от модуля. Т.е. если вы уложите антенну на модуль или на близком расстоянии к нему (до 40 мм), прием будет не уверенны или вовсе не быть. Попытка вытравить на плате дорожку вокруг модуля в качестве антенны так же не дали результата. Антенна должна уходить подальше от модуля. Сейчас только проволокой обхожусь. Пассивные керамические антенны не использую, поскольку их надо относить подальше от модуля, т.е. использовать кабель. Смысла нет, если в меньшие габариты помещается обычная проволочка да еще ее не надо ориентировать вверх как керамику.
Я использую SMA-16 и SMA-20. Эти разъемы специально разработаны для монтажа на плату. Плата заходит между боковыми усиками, а центральный контакт ложится на медь платы. Паяется чудесно.
Спасибо. полезная информация! Сам был приятно удивлен когда разбирался с GSM модулем SIM900D, что он способен ловить сеть даже без антенны. Куска дорожки и разъема под антенну хватало чтобы ловить отличный сигнал.
Было бы неплохо какой-нибудь простой проектик приложить, например вывести координаты на lcd. Чтобы было понятно как использовать библиотеку.
я спаял плату, при подаче питания загорается светодиод сигнализирующий о том, что модуль начал искать спутники, но он их так и не находи... в чем может быть проблема? это может быть из-за неправильной спайки? или какой-то косяк с антенной?
- Если модуль ничего не выдает на выходе TX, проверьте подачу +3В на вывод 12 (в документации обозначен как V_RTC_3V3). - Если модуль выводит данные на выходе TX, тогда проверяем антенну. Если модуль с индексом "L" надо обязательно использовать активную антенну. Если без буковки "L" пойдет любая пассивная, вплоть до куска проволоки. Антенна должна быть удалена от модуля на расстояние не менее 10-15 см. В противном случае сам модуль ее заглушает.
на tx модуль выдает сигнал... но определяет координаты 0, а время 07:00 и дату 27.01.2030... пишет что спутников не находи...модуль без буквы L. использую пассивную антенну, удаленную на 1 метр, пробовал на открытой местности, но светодиод так и не начал мигать.
когда будет следующая статья "как рассчитать направление на заданную точку и расстояние до нее, зная GPS координаты" ?
кто-нибудь знает почему gps выдает в EB Viel вот такие строки: $PMTK401*37 $PMTK101*32 $PMTK414*33 $PMTK605*31 $PMTK400*36
Спасибо, что напомнили. Сажусь писать.
Недавні записи
- Text to speech. Українська мова
- LCD Display ST7567S (IIC)
- Розпізнавання мови (Speech recognition)
- Selenium
- Комп'ютерний зір (Computer Vision)
- Деякі думки про точність вимірювань в електроприводі
- Датчики Холла 120/60 градусів
- Модуль драйверів напівмосту IGBT транзисторів
- Драйвер IGBT транзисторів на A316J
- AS5600. Варіант встановлення на BLDC мотор
Tags
docker sensors rtc led timer wifi remap sms css websocket mongodb bme280 rfid bluetooth esp8266 nodemcu bkp piezo bmp280 i2c mpu-6050 encoder examples avr brushless ngnix nvic displays bldc java-script pmsm barometer pwm lcd ethernet stm32 raspberry-pi capture usart gpio exti atmega meteo solar smd dma adc eeprom eb-500 flask python ssd1306 uart options flash mpx4115a html gps st-link 3d-printer servo dc-dc foc git books battery hih-4000 watchdog dht11 web tim programmator ssd1331 mpu-9250 usb rs-232 motor max1674 soldering
Архіви