Пользователь
0,0
рейтинг
25 ноября 2010 в 14:53

Получение и вывод GPS координат на Arduino из песочницы

Однажды у меня возник интерес к GPS, а еще чуть раньше — к платформе Arduino. Поэтому со Sparkfun были заказаны, с разницей в пару дней, Arduino Duemilanove, GPS Shield и GPS приемник EM-406A.
Заказ пришел и частично лежал на полке, а недавно дошли руки до этого комплекта…

Собранный GPS Shield, подключенный к Arduino



Аппаратная часть


  • Arduino Duemilanove
  • GPS Shield
  • GPS приемник EM-406A
  • LCD WH-0802A

Для большей мобильности платформа запитана от отдельного аккумулятора и подключается к компьютеру только для заливки нового скетча.

Распиновка GPS модуля EM-406A



При наличии щилда распиновка, по большому счету, не так важна — нужно просто вставить два разъема. Если щилд отсутствует, то нужно подключить выводы GND к GND, Rx — к digital pin 2, Tx — к digital pin 3, VCC — к POWER 5V. Внимание, серый провод не 1, а 6й!

На GPS модуле имеется светодиодный индикатор состояния:
  • индикатор горит постоянно — идет поиск спутников и определение координат
  • индикатор моргает — координаты установлены, идет их передача
  • индикатор не горит, питание на шилд подано — плохой контакт в разъемах или модуль переключился в бинарный SiRF протокол


Переключатель UART/DLINE


С помощью переключателя можно подключить Rx и Tx GPS модуля к ногам Tx и Rx Arduino (позиция UART) или к pin digital 2 и digital 3 (позиция DLINE, если не снимать перемычки из припоя). Нужно убедиться, что переключатель находится в положении «DLINE», иначе возможны проблемы с заливкой скетчей в Arduino.

Подключение знакосинтезирующего ЖК индикатора

Я не покупал отдельный shield под экран и подключал уже имеющийся индикатор — WH-0802A в 4х битном режиме. В принципе, так можно подключить любой другой знакосинтезирующий индикатор. Для этого нужно найти в даташите распиновку разъема и подключить линии RS, E, D4, D5, D6, D7 к любым цифровым pin'ам (кроме 0…3) и не забыть сконфигурировать куда подключены эти линии в коде, Vss, R/W — к GND, Vdd — к 5V. Вывод Vo (настройка контрастности) нужно подключить к потенциометру, включенному между GND и 5V, но я просто подключил к GND — полученная контрастность меня устроила.

Назначение выводов индикатора WH-0802A



Мой вариант подключения индикатора к Arduino

  • RS — pin 13
  • E — pin 12
  • D4 — pin 11
  • D5 — pin 10
  • D6 — pin 9
  • D7 — pin 8
  • Vss, R/W, Vo — GND
  • Vdd — 5V

Программная часть


Для работы с GPS потребуются две библиотеки TinyGPS и NewSoftSerial. Библиотеки распаковываются в каталог libraries.
#include <NewSoftSerial.h>
#include <TinyGPS.h>
#include <LiquidCrystal.h>
TinyGPS gps;
//Tx, Rx
NewSoftSerial nss(2, 3);
//Конфигурация линий, куда подключен lcd: RS, E, D4, D5, D6, D7
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
bool feedgps();
void setup() {
  //4800 скорость обмена с GPS приемником
  nss.begin(4800);
  //8 символов, 2 строки
  lcd.begin(8, 2);
  lcd.print("waiting");
}
void loop() {
  bool newdata = false;
  unsigned long start = millis();
  long lat, lon;
  unsigned long age;
  //задержка в секунду между обновлениями координат
  while (millis() - start < 1000) {
    if (readgps())
       newdata = true;
  }
  if (newdata) {
    gps.get_position(&lat, &lon, &age);
    lcd.setCursor(0, 0);
    lcd.print(lat);
    lcd.setCursor(0, 1);
    lcd.print(lon);
  }
}
bool readgps() {
  while (nss.available()) {
    int b = nss.read();
    //в TinyGPS есть баг, когда не обрабатываются данные с \r и \n
    if('\r' != b) {
      if (gps.encode(b))
          return true;
    }
  }
  return false;
}


После включения GPS модуля и заливки скетча нужно подождать как минимум 42 секунды (время холодного старта) для того чтобы модуль определил свое местоположение и начал выдавать валидные координаты. Когда модуль перейдет в рабочий режим он начнет моргать светодиодом. У меня на рабочем столе модуль не всегда может найти спутники — приходится переносить его на окно.

Работающий модуль с подключенным дисплеем и полученными координатами


Справа к дисплею подключён источник питания для подсветки.
После определения спутников на дисплее появляются координаты и обновляются раз в секунду.
В итоге получен опыт работы и база для дальнейшего освоения GPS.

«Используемая литература»


@stifff
карма
48,2
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (55)

  • +5
    Всегда мечтал делать что то подобное — но как всегда руки не доходят :( Удачи вам.
    • +2
      Дык, а по большому счету, что останавливает?
      На Sparkfun много чего можно найти для «ленивого» занятия подобным =)
      Arduino, пару shield и за пару часов можно что-нибудь соорудить.
  • 0
    Вызывает интерес вот этот момент. Сколько раз он вызовет readgps()?
    ...
    while (millis() - start < 1000) {
        if (readgps())
           newdata = true;
      }
    ...
    
    • 0
      Оно его постоянно вызывает — в readgps() происходит считывание данных с программного UART'а — nss.read()
      • 0
        получается, за одну секунду он читается много раз.
        однако, все кроме последнего раза — вхолостую?
        • 0
          нет, оно постоянно читается, но один раз в секунду прерывается и, если координаты определены, выводит на экран.
      • 0
        Вопрос в эту ветку: какая в реальности максимальная скорость получения координат? Может быть чаще, чем раз в секунду?
        • +1
          Уточнение — у меня в коде задержку формирую я, а не гпс приемник — она может быть и пять секунд.

          Теперь по вопросу — скорость обновления у этого приемника 1 Гц, но бывают и 5 Гц и 10 Гц. Подробнее можно посмотреть тут www.sparkfun.com/tutorials/127
          Но, если не секрет, под какое применение может потребоваться 10 Гц?
          Плюс нужно учитывать «шум» — даже находясь на окне координаты ощутимо плавают.
          • 0
            Я хотел ради развлечения, обучения и время убиения собрать такого же плана GPS-приёмник в машину. Основной прицел на построение пройденного маршрута плюс замер скорости и ускорения. Если для маршрута достаточно раз в 1-10 секунд записывать координаты, то скорость и особенно ускорение хотелось бы замерять почаще, например раз в 0.05-0.1 секунды.

            Ну а с такими данными очень много чего можно интересного сделать: и во время вождения, и после.
            • 0
              Я могу ошибаться, но считать расстояние умеет и сам приемник — можно будет просто брать их оттуда.
              А может быть стоит под ускорение взять датчик ускорения? 2-3х осный. И намного точнее выйдет.
              • 0
                плюсую за датчик ускорения. по GPS можно вычислять маршрут и среднюю скорость, для ускорения точность слишком низкая
              • 0
                Тут таки вопрос скорее в том, что хотелось бы такой девайс собрать:
                Я еду в машине с девайсом, он логгирует координаты на флешку, а по приезду домой я этот лог читаю специальной (своей) программой, она рисует мне трек передвижения. на этом треке я хочу видеть свою скорость, чем чаще — тем лучше.
                Допустим, с таким девайсом проехали 5 машин, после этого можно было бы наложить друг на друга 5 графиков и посмотреть, в какой момент у какой машины какая была скорость. Особенно актуально на ралли/подъемах на холм, узнать кто на какой скорости вкатывает в поворот.

                Для такой задачи обновление раз в секунду — очень много, хотелось бы что-то около 0.1 секунды.
                Вот и вопрос: насколько такое сложно собрать на базе Адруино и насколько оно будет соответствовать задаче? Есть ли модули для подключения флешек с возможностью писать на них?
                • +1
                  Мое имхо, основанное на работе с сабжевым приёмником.
                  Он подходит для определения средней скорости, допустим за 10 секунд т.к. даже когда лежит на окне показывает ненулевую скорость, а в районе .1….8 км/ч. Возможно, в других приемниках ситуация лучше. Да, есть приемники, которые выдают нужную частоту — 10Hz это как раз .1 сек.

                  Все-таки для раллийной задачи я бы взял GPS + трехосный датчик ускорения. Для более точного просчета скорости в интересующих точках — будет известна средняя скорость и ускорение. В поворотах, теоретически, можно рассчитать скорость из центростремительного ускорения, емнис.

                  По поводу хранения — вроде бы есть реализация ЮСБ хоста на AVR, но точно сейчас не скажу. У меня сейчас лежит модуль OpenLog от того же sparkfun, который пишет данные на microSD. Если интересно — попробую набросать «обзор».
                  • 0
                    Я паяльных дел, увы, совершенно не мастер, но статье на подобную тему был бы крайне рад (и, думаю, очень многие здесь). Поэтому за «обзор» я только за:)
  • 0
    И во сколько обошлась такая штука? :)
    • 0
      Попробовал посчитать вместо автора, получилось чуть меньше 5000 рублей
      • 0
        ну… меньше — около 3500р
        • 0
          arduino тоже входит в эту цену?
          • 0
            да, хотя с новой ардуино может выйти баксов на 5…10 дороже — www.sparkfun.com/products/9950
    • 0
      Около 3500р — те железки, которые на фотографии.
  • 0
    Я вот никак не могу понять, зачем Shield? Какую он функцию выполняет?
    • 0
      <..> позволяет, используя популярные GPS-модули, осуществлять запись трека на обычную карту SD.<..> а дополнительная плата <..> обеспечивает подключение GPS-приемника и карты SD к этой платформе.

      gps-club.ru/gps_news/detail.php?ID=20302
    • 0
      Коммутацию адруино с модулем. Возможно, обвязку модуля. В случае с одним это не так критично, но когда щилдов/модулей становится больше — получается легко пересобираемый бутербродик.
  • –3
    Ладно Bluetooth, ethernet модули. Практические применение им огромно. А с GPS модулем что делать? Запускать в стратосферу, как это модно в последнее время?
    • +1
      Ошейник для собаки сделать. Правда сейчас в моде Глонасс.
    • 0
      прикольно было бы сделать самые догогие часы. GPS в них использовать как источник точного (очень точного) времени.
      • +1
        Мне кажется, что очень точное время эти часы показывать не будут.
        К слову, при GPS позиционировании, приходится делать поправки даже на то, что время в различных точках пространства (положения спутника и приемника) течет по-разному
        • +2
          Да, и учитывая эти поправки и рассчитываются координаты. А заодно точное время.
          Кстати, большинство GPS-приемников умеет выдавать время с точностью до 0.001 секунды если не ошибаюсь. В общем довольно точно.
        • +1
          Смотря что считать точным временем. Если ты собираешься делать замер времени полета элементарной частицы, то да, тебя может ожидать фейл. Но для бытовой точности даже без мудреных преобразований можно без труда получить точность плюс минус секунда. При этом эта ошибка будет обладать одним очень важным свойством — она не накапливается. И через год и через два эти часы будут иметь ошибку плюс/минус секунда, в то время как обычные часы за год около минуты погрешности накапливают.
      • 0
        понимаю, что тема старая, но все-же… промышленные часы (включая наручные) используют не синхронизацию по GPS, а (чаще) по радио. На eBay можно недорого (до $15) купить приемник для синголов DCF77 (позывные станции точного вресени в Германии), в UART-выходом. Схемы сиспользования такого приемника с Arduino гуглятся легко, а поскольку для приемника на 77,5кГц «прямая видимость» не нужна, синхронихация заметно увереннее будет работать внутри помещений, неже-ли в случае использования GPS
    • –2
      Все вышесказанные идеи сомнительно несут хоть какую-то как морально, так и...«физическую» пользу.

      Ошейник — слишком большой, да и она его разобьет.
      Часы… ну, это уже слишком. Тут попахивает «производством».
      • +1
        в машину засунуть. Что б если угонят, знать где красавица находится.
        • 0
          один маленький вопрос — а координаты она будет угонщику показывать, чтобы он знал, где сейчас находится эта угнанная красавица?
          • +2
            имхо, синтегрировать данную конструкцию с GSM передадчиком является возможным. А там уже дело фантазии.
            • –1
              думаю, что арудино все-таки более обучающая платформа, чем для практического применения.
              Т.е. сделать-то можно, но для повседневного использования (например, качестве трекера для автомобиля) мало пригодно.
              • +1
                Мне кажется, что ардуину нужно рассматривать как платформу для быстрого и несложного прототипирования. С этой точки зрения все довольно стройно получается.
            • 0
              а как же глушилки сигнала?
  • НЛО прилетело и опубликовало эту надпись здесь
    • 0
      хм, а у меня это коврик для резки и на нем мыша хуже скользит, чем на коврики, хотя да, мысль заюзать его как коврик посещала )
  • 0
    а какая общая стоимость всего комплекта получилась?
    • 0
      Около 3500р — те железки, которые на фотографии.
  • 0
    А посылка от SparkFun долго шла?
    • 0
      Эта шла около полутора месяцев. Пришла в сентябре. Иногда приходит быстрее — недели за три.
  • 0
    Так там обычный NMEA протокол через UART?
    • 0
      ну… да. при желании еще в бинарный SiRF можно переключиться.
  • 0
    А где такой дисплей можно купить в дефоулт-сити?
    • 0
      Я брал в платане:
      www.platan.ru/cgi-bin/qweryv.pl/0w21103.html
      но там нужно предзаказывать.
      Можно в чипдипе:
    • 0
      В чипдипе
      Можно в терре:
      www.terraelectronica.ru/catalog.php?ID=389

      Нужно только смотреть, чтобы индикатор был рассчитан на стандартный температурный диапазон (от нуля, а не от -20)
      • 0
        И аурдино с любым будет работать, да?
        • 0
          Да. С любым знакосинтезирующим, рассчитанным на стандартный температурный диапазон.
          Если еще точнее — построенном на контроллере KS0066 (или аналогичном)
          Возможно, придется поставить дополнительный потенциометр.
          • 0
            какое отношение имеет температурный диапазон?
            • 0
              индикатор с расширенным диапазоном требует дополнительного источника отрицательного напряжения для того, чтобы изображение было контрастным.
  • 0
    на заметку, вместо шилда можно купить GPS навигатор Holux m-1000 ($44 в DX) — lusorobotica.com/index.php?topic=1238.0 — только что попробовал — работает отлично =)
    • 0
      смотря как ставить цель. Если цель просто сделать работающее устройство, то да Holux подходит, но если цель сделать прототип, то он уже будет мешать.
      • 0
        цель сделать работающее устройство, докупая как можно меньше деталей =)

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.