25 November 2010

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

Developing for Arduino
Sandbox
Однажды у меня возник интерес к 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.

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


Tags:arduinogps
Hubs: Developing for Arduino
+67
49.5k 125
Comments 55
Popular right now