Инициализация GPS модуля с помощью Arduino

Спаял себе GPS модуль на базе EB-500, но он по умолчанию работает на скорости 9600 бод, а для CL-OSD нужно 4800. Думал, как проще модуль сконфигурировать - решил через Arduino, которая здорово мне уже помогла в reverse engineering USB-GPS’а (использовал ардуину в качестве пробника-приемника UART, при поиске ноги c нужными нам NMEA данными). Первая проба была в использовании Ардуины в виде транслятора команд из терминала в GPS модуль, но что-то у меня не заработало. То есть данные из модуля идут, а в модуль - не лезут.

void loop()
{
  if (mySerial.available())
    Serial.print((char)mySerial.read());
  if (Serial.available())
    mySerial.print((char)Serial.read());
}

В принципе при ближайшем рассмотрении становится понятно, почему не работает - пример выдран из примера по библиотеки NewSoftSerial, и обмен между портами происходит по одной букве. А GPS модуль требует чтобы отправлена была сразу команда, а здесь он видит непонятно что. Ради интереса надо поправить позже.

Я не стал настаивать, и сделал программку, которая автоматически отправляет команды из Ардуины в модуль. Код ниже, но было несколько моментов, из-за которых плевое дело растянулось на пару часов:

  1. Поскольку GPS питается от 3.3В, а Ардуина - 5В, на выход Ардуины - поставил стабилитрон на 3В.
  2. Похоже, GPS не хочет менять скорость на пониженную, без снижения количества / скорости выводимых параметров. Поэтому алгоритм такой - снижаем скорость обновления до 1Гц, и отключаем почти все выводимые параемтры (я оставил GGA). После этого отправляем команду на переключение на 4800
  3. Похоже, надо соблюдать какие-то тайминги, или ждать освобождения порта в GPS. Я этого не делал, а просто перезапускал программу несколько раз, дожидаясь когда мне повезёт. Обычно на 2-3 раз команда проходит
  4. Похоже, по ссылке, которую давал falke5 в теме по E-OSD, в одной из команд ошибка. Вот эта команда не хотела выполняться: $PMTK314,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0*29 - вероятно ошибка в контрольной сумме. Я применил вместо этого $PMTK314,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29 - отключает вообще всё, кроме GGA, но работает. После переключения на 4800 можно всё обратно включить.
#include <NewSoftSerial.h>

NewSoftSerial mySerial(2, 3); //GPS модуль на пинах 2 и 3

void setup()
{
  Serial.begin(9600); // Соединяемся с ПК
  Serial.println("Hit me!");

  // начинаем связь на скорости 9600
  mySerial.begin(9600);
  delay(1000);

  // Первым делом надо занизить все параметры - ставим 1гц обновление и выдачу только данных GGA
  mySerial.println("$PMTK300,1000,0,0,0,0*1C");   // скорость обновления 1гц
  Serial.println("Command sent: $PMTK300,1000,0,0,0,0*1C");
  while (mySerial.available()) Serial.print((char)mySerial.read()); // Смотрим результат
  delay(1000);

  mySerial.println("$PMTK314,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29"); // выдача только GGA
  Serial.println("Command sent: $PMTK314,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29");
  while (mySerial.available()) Serial.print((char)mySerial.read()); // Смотрим результат
  delay(1000);

  /*
  // Это инициализация выдачи GGA, GSA, RMC, VTG, ZDA - её запустим уже в следующий раз, когда модуль уже будет проинициализирован на 1Гц, GGA, и 4800baud
  mySerial.println("$PMTK314,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,5,0*2D"); // выдача только GGA
  Serial.println("Command sent: $PMTK314,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,5,0*2D");
  while (mySerial.available()) Serial.print((char)mySerial.read()); // Смотрим результат
  delay(1000);*/

  mySerial.println("$PMTK251,4800*14");  // Переключаем модуль на 4800
  Serial.println("Command sent: $PMTK251,4800*14");
  while (mySerial.available()) Serial.print((char)mySerial.read()); // Смотрим результат
  delay(1000);*/

  // Настройка закончена, теперь начинаем связь теперь на скорости 4800
  mySerial.begin(4800);
  delay(1000);

}

void loop() // Готово, теперь просто смотрим на входящие данные
{
  if (mySerial.available())
    Serial.print((char)mySerial.read());
  /*if (Serial.available())
    mySerial.print((char)Serial.read()); // Транслировать данные с порта компьютера на ардуину и на GPS (у меня вроде не работало) */
}

P.S. Возможно, если у кого-то возникнут проблемы с командой PMTK314, есть возможность включать/отключать выдаваемые опции по отдельности (я не пробовал):

GGA: Вкл => $PSRF103,00,00,01,01*25 , Выкл =>$PSRF103,00,00,00,01*24
GLL: Вкл => $PSRF103,01,00,01,01*24 , Выкл => $PSRF103,01,00,00,01*25
GSA: Вкл => $PSRF103,02,00,01,01*27 , Выкл => $PSRF103,02,00,00,01*26
GSV: Вкл => $PSRF103,03,00,01,01*26 , Выкл => $PSRF103,03,00,00,01*27
RMC: Вкл => $PSRF103,04,00,01,01*21 , Выкл => $PSRF103,04,00,00,01*20
VTG:Вкл => $PSRF103,05,00,01,01*20 , Выкл => $PSRF103,05,00,00,01*21

  • 3572
Comments
finker

arduino.cc там хор форум (не реклама) - правдо на инглише
сразу вопрос - не знаете ли есть ли русско язычный такой форум у нас ? и нет ли у вас м-агента ?
тоже заморочился ардуиной

dROb

Хороший вопрос, боюсь на русском языке хороших ресурсов я не встречал. Наиболее живой - arduino.ru/forum М-агента нет, скайп и почту я Вам в личку кинул
Я, на самом деле, в Ардуине и сам новичок, но платформа мне нравится, и я с ней с удовольствием разбираюсь. Жутко понравилость то, что вдали от дома, в глухой деревне, имея только комп и Ардуину, удалось проинициализировать модуль GPS 😃 Чувствуется ардуина теперь на всякий случай добавляется к обычному составу вещей, которые я беру с собой 😃

falke5

дело в том что количество данных выдаваемых приемником значительно превышает возможности порта на скорости 4800, что бы приемник не “ушел в себя” он проверяет количество включенных опций и выставляемую скорость и если есть сильное превышение нагрузки на порт просто игнорит команду (на eb270) либо отключает все опции, зависит от реализации производителем.

dROb
falke5;bt76657

дело в том что количество данных выдаваемых приемником значительно превышает возможности порта на скорости 4800, что бы приемник не “ушел в себя” он проверяет количество включенных опций и выставляемую скорость и если есть сильное превышение нагрузки на порт просто игнорит команду (на eb270) либо отключает все опции, зависит от реализации производителем.

Да, EB-500 тоже игнорит команды, если ему что-то не нравится, безо всякого ответа.
Сейчас переделываю программку для Ардуины, чтобы работала с одного раза. EB-500, увы, почему-то у меня уже два раза терял настройки (батарейка присутствует) и возвращался к любимой скорости в 9600…

falke5

какой смысл возиться с дуиной если можно сунуть код инициализации прямо в e-osd

kayot

www.transystem.com.tw/product.php?b=G&m=pe&cid=4&s…
утиль для конфигурации модулей GPS от TSI
типа EB2XX EB5XX ну и тд