GPS модуль EB-500 и ATMega


18.04.2012

Статьи по теме: GPS EB-500 + ATMEGA. Схема. Пример для WinAVR (GCC) GPS. Расчет дистанции между двумя точками по GPS координатам. Расчет курса на точку

Понадобилось мне в очередном проекте задействовать GPS навигацию. Требования к GPS модулю были следующие:

  • - UART интерфейс
  • - нормальная чувствительность
  • - быстрый старт
  • - небольшая стоимость
  • - можно было без проблем купить в Украине
На удивление выбор был невелик. Наиболее подходящий по характеристикам и цене оказался GPS модуль EB-500. Сбор информации по этому модулю привел меня к замечательной статье http://we.easyelectronics.ru/part/gps-modul-eb-500.html Однако без проблем не обошлось.  Но, обо всех ошибках, особенностях и экспериментах по порядку. EB-500 доступен в двух исполнениях EB-500 и EB-500L. EB-500L работает только с активными антеннами. Я приобрел EB-500, так как планировал использовать пассивные антенны. Основные характеристики таковы:
  • - Размер: 13 х 15 х 2.2 мм.
  • - Высокая чувствительность -165dBm
  • - 66 канальный
  • - Поддержка A-GPS (это нам вряд ли понадобится, однако приятно)
  • - Быстрое определение местоположения
Более подробно читайте в документации EB-500.pdf

Железо

Первая испытанная мной антенна была пассивного типа. Сделал тестовую одностороннюю плату. Схема включения - как в документации. Пассивную антенну впаял на плату ближе к приемнику (как оказалось позже - это стремление сыграло со мной злую шутку). В будущем 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

Активная бескорпусная GPS антена ANT GPS HM-NZ04 UFL-F 10CM

Активная GPS антена ANT GPS BY-GPS-07 SMA-M 2M

Пассивная штыревая GPS антена домашнего приготовления

Со всеми антенами GPS модуль EB-500 работает отлично.

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.html

1. 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 — контрольная сумма (далее - КС).
2. VTG - содержит текущее истинное направление курса (COG) и скорость относительно земли (SOG). $GPVTG,74.50,T,,M,0.47,N,0.87,K,A*07
  • 74.50,T — Направление курса в градусах.
  • M — Магнитное склонение в градусах, отсутствует.
  • 0.47,N — скорость (узлов в час).
  • 0.87,K — скорость (км в час).
  • A — так и не нашел что это за параметр, возможно достоверность данных.
  • *07 — КС.
3. ZDA - содержит информацию о времени по UTC, календарный день, месяц, год и локальный часовой пояс. $GPZDA,181057.000,19,03,2011,,*55
  • 181057.000 — время
  • 19 — число
  • 03 — месяц
  • 2011 — год
  • — Часовой пояс, смещение от GMT, от 00 до ± 13 часов, отсутствует.
  • *55 — КС.
4. GGA - содержит GPS данные о местоположении, времени местоопределения, качестве данных, количестве использованных спутников. $GPGGA,181058.000,5542.2389,N,03741.60637,E,1,8,1.34,115.0,M,14.6,M,,*54
  • 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 — КС.
5. GLL - содержит GPS–данные о географической широте, долготе и времени определения координат. $GPGLL,5542.2389,N,03741.60637,E,181058.000,A,A*59
  • 5542.2389,N — широта
  • 03741.60637,E — долгота
  • 181058.000 — время по гринвичу на момент определения местоположения (в формате ЧЧММСС.[доли секунд]).
  • А — данные верны
  • *59 — КС.
6. GSA - содержит режим работы GPS приёмника, параметры спутников, используемых при решении навигационной задачи, результаты которой отображены в сообщении $GPGGA и значения факторов точности определения координат. $GPGSA,A,3,27,17,26,18,09,28,15,08,,,,,2.35,1.34,1.93*0A
  • 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 (снижение точности в вертикальной плоскости)
7. GSV - указывает количество видимых спутников, их номера, возвышение, азимут, и значение отношения сигнал/шум для каждого из них. По этим данным можно сделать красивую картинку с информацией о положении спутников в небе и уровне сигнала от них. $GPGSV,4,1,13,28,65,075,17,26,53,202,37,15,50,278,17,27,39,290,24*7D
  • 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 — КС.
Так же приведу значения параметра снижения точности DOP (HDOP, VDOP, PDOP), исключительно для ознакомления:
  • 1 (Идеальная) — Рекомендуется к использованию в системах, требующих максимально возможную точность во всё время их работы
  • 2-3 (Отличная) — Достаточная точность для использования результатов измерений в достаточно чувствительной аппаратуре и программах
  • 4-6 (Хорошая) — Рекомендуемый минимум для принятия решений по полученным результатам. Результаты могут быть использованы для достаточно точных навигационных указаний.
  • 7-8 (Средняя) Результаты можно использовать в вычислениях, однако рекомендуется озаботиться повышением точности, например, выйти на более открытое место.
  • 9-20 (Ниже среднего) — Результаты могут использоваться только для грубого приближения местоположения
  • 21-50 (Плохая) — Выходная точность ниже половины футбольного поля. Обычно такие результаты должны быть отброшены.
Скачать архив EB-500.zip  (документация на GPS модуль EB-500, печатная плата, библиотека GCC).

В одной из следующих статей я расскажу как рассчитать направление на заданную точку и расстояние до нее, зная GPS координаты.

Желаю успехов!

Схеми і прошивки
Коментарі:
Евгений говорить:
19.04.2012 09:03
Спасибо за статью, мне вот-вот должны доставить этот модуль. Исходник печатки не выложите?

admin говорить:
19.04.2012 09:26
Исходник печатной платы в zip файле. На плате выводы для шлейфа делал под свои цели (чтобы шлейф не перекручивался). Это место на плате можно упростить.

Nick говорить:
30.06.2012 22:38
А можно целый проект посмотреть, где используются библиотеки.

admin говорить:
02.07.2012 08:22
Проект, в котором используется EB-500 коммерческий, я не могу его публиковать. Но, будет маленький, простенький проект в качестве примера. В нем будет оптимизированная библиотека, поскольку последние версии EB-500 работают на скорости 115200, а не 9600.

Feruz говорить:
19.11.2012 12:55
По фотографии штыревой антенны видно, что ее длина около 80 мм. Предполагается что это полуволновой вибратор? 
Собираюсь заказывать себе такой же модуль, а поэтому интересует вопрос: Рискованно ли это заказать только модуль без пассивной керамической антенны? В целях экономии так сказать. Хочу по вашему примеру использовать штыревую, но сомневаюсь: заработает ли у меня так, как у Вас? Спасибо.

Feruz говорить:
19.11.2012 13:26
И еще один вопрос. Какая розетка SMA использовалась, по фотографии не видно как она припаяна. Насколько знаю в розетках такого типа центральный вывод не лежит в одной плоскости с крайними. Как в этом случае припаивали Вы?

admin говорить:
19.11.2012 13:38
Я экспериментировал с разной длинной штырей (фактически это одножильная проволока с кабеля витой пары). Создалось впечатление, что длинна антенны свыше 70 см. не оказывает влияния на качество приема. Ее можно даже завивать в пружину, все равно работает. Единственное что для этого модуля критично - это нужно чтобы антенна была на расстоянии от модуля. Т.е. если вы уложите антенну на модуль или на близком расстоянии к нему (до 40 мм), прием будет не уверенны или вовсе не быть. Попытка вытравить на плате дорожку вокруг модуля в качестве антенны так же не дали результата. Антенна должна уходить подальше от модуля. Сейчас только проволокой обхожусь. Пассивные керамические антенны не использую, поскольку их надо относить подальше от модуля, т.е. использовать кабель. Смысла нет, если в меньшие габариты помещается обычная проволочка да еще ее не надо ориентировать вверх как керамику.

admin говорить:
19.11.2012 13:43
Я использую SMA-16 и SMA-20. Эти разъемы специально разработаны для монтажа на плату. Плата заходит между боковыми усиками, а центральный контакт ложится на медь платы.  Паяется чудесно.

exersizze говорить:
02.12.2012 19:16
Спасибо. полезная информация! Сам был приятно удивлен когда разбирался с GSM модулем SIM900D, что он способен ловить сеть даже без антенны. Куска дорожки и разъема под антенну хватало чтобы ловить отличный сигнал.

Nick говорить:
30.01.2013 22:35
Было бы  неплохо какой-нибудь простой проектик приложить, например вывести координаты на lcd.
Чтобы было понятно как использовать библиотеку.

Денис говорить:
28.03.2013 12:17
я спаял плату, при подаче питания загорается светодиод сигнализирующий о том, что модуль начал искать спутники, но он их так и не находи... в чем может быть проблема? это может быть из-за неправильной спайки? или какой-то косяк с антенной?

admin говорить:
28.03.2013 13:34
- Если модуль ничего не выдает на выходе TX, проверьте подачу +3В на вывод 12 (в документации обозначен как V_RTC_3V3).
- Если модуль выводит данные на выходе TX, тогда проверяем антенну. Если модуль с индексом "L" надо обязательно использовать активную антенну. Если без буковки "L" пойдет любая пассивная, вплоть до куска проволоки. Антенна должна быть удалена от модуля на расстояние не менее 10-15 см. В противном случае сам модуль ее заглушает.

Денис говорить:
28.03.2013 14:20
на tx модуль выдает сигнал... но определяет координаты 0, а время 07:00 и дату 27.01.2030... пишет что спутников не находи...модуль без буквы L. использую пассивную антенну, удаленную на 1 метр, пробовал на открытой местности, но светодиод так и не начал мигать.

Влад говорить:
03.04.2013 18:01
когда будет следующая статья "как рассчитать направление на заданную точку и расстояние до нее, зная GPS координаты" ?

Денис говорить:
03.04.2013 20:17
кто-нибудь знает почему gps выдает в EB Viel вот такие строки:
$PMTK401*37
$PMTK101*32
$PMTK414*33
$PMTK605*31
$PMTK400*36

admin говорить:
04.04.2013 07:25
Спасибо, что напомнили. Сажусь писать.

Додати коментар
Code
* - обов'язкові поля

Архіви