Спаял себе 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 модуль требует чтобы отправлена была сразу команда, а здесь он видит непонятно что. Ради интереса надо поправить позже.
Я не стал настаивать, и сделал программку, которая автоматически отправляет команды из Ардуины в модуль. Код ниже, но было несколько моментов, из-за которых плевое дело растянулось на пару часов:
Поскольку GPS питается от 3.3В, а Ардуина - 5В, на выход Ардуины - поставил стабилитрон на 3В.
Похоже, GPS не хочет менять скорость на пониженную, без снижения количества / скорости выводимых параметров. Поэтому алгоритм такой - снижаем скорость обновления до 1Гц, и отключаем почти все выводимые параемтры (я оставил GGA). После этого отправляем команду на переключение на 4800
Похоже, надо соблюдать какие-то тайминги, или ждать освобождения порта в GPS. Я этого не делал, а просто перезапускал программу несколько раз, дожидаясь когда мне повезёт. Обычно на 2-3 раз команда проходит
Похоже, по ссылке, которую давал 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
Comments
arduino.cc там хор форум (не реклама) - правдо на инглише
сразу вопрос - не знаете ли есть ли русско язычный такой форум у нас ? и нет ли у вас м-агента ?
тоже заморочился ардуиной
Хороший вопрос, боюсь на русском языке хороших ресурсов я не встречал. Наиболее живой - arduino.ru/forum М-агента нет, скайп и почту я Вам в личку кинул
Я, на самом деле, в Ардуине и сам новичок, но платформа мне нравится, и я с ней с удовольствием разбираюсь. Жутко понравилость то, что вдали от дома, в глухой деревне, имея только комп и Ардуину, удалось проинициализировать модуль GPS 😃 Чувствуется ардуина теперь на всякий случай добавляется к обычному составу вещей, которые я беру с собой 😃
дело в том что количество данных выдаваемых приемником значительно превышает возможности порта на скорости 4800, что бы приемник не “ушел в себя” он проверяет количество включенных опций и выставляемую скорость и если есть сильное превышение нагрузки на порт просто игнорит команду (на eb270) либо отключает все опции, зависит от реализации производителем.
дело в том что количество данных выдаваемых приемником значительно превышает возможности порта на скорости 4800, что бы приемник не “ушел в себя” он проверяет количество включенных опций и выставляемую скорость и если есть сильное превышение нагрузки на порт просто игнорит команду (на eb270) либо отключает все опции, зависит от реализации производителем.
Да, EB-500 тоже игнорит команды, если ему что-то не нравится, безо всякого ответа.
Сейчас переделываю программку для Ардуины, чтобы работала с одного раза. EB-500, увы, почему-то у меня уже два раза терял настройки (батарейка присутствует) и возвращался к любимой скорости в 9600…
какой смысл возиться с дуиной если можно сунуть код инициализации прямо в e-osd
{"assets_hash":"a8b26fa7f6e768b07a72c8c9aadb9422","page_data":{"users":{"4741bd143df955007777fc51":{"_id":"4741bd143df955007777fc51","hid":29285,"name":"dROb","nick":"dROb","avatar_id":null,"css":""},"497b2f813df9550077772c4f":{"_id":"497b2f813df9550077772c4f","hid":43284,"name":"finker","nick":"finker","avatar_id":null,"css":""},"4dff22373df9550077751293":{"_id":"4dff22373df9550077751293","hid":91197,"name":"falke5","nick":"falke5","avatar_id":null,"css":""},"534d23ff3df955007772a25f":{"_id":"534d23ff3df955007772a25f","hid":199978,"name":"kayot","nick":"kayot","avatar_id":null,"css":""}},"settings":{"blogs_can_create":false,"blogs_mod_can_delete":false,"blogs_mod_can_hard_delete":false,"blogs_mod_can_add_infractions":false,"can_report_abuse":false,"can_vote":false,"can_see_ip":false,"blogs_edit_comments_max_time":30,"blogs_show_ignored":false,"blogs_reply_old_comment_threshold":30,"votes_add_max_time":168},"entry":{"_id":"4fc0b61499707300771078c9","hid":14493,"title":"Инициализация GPS модуля с помощью Arduino","html":"<p><a class=\"attach attach-img attach__m-sm\" href=\"https://rcopen.com/member29285/media/4fc0b5ad9970730077f1679e\" target=\"_blank\" data-nd-media-id=\"4fc0b5ad9970730077f1679e\" data-nd-image-orig=\"https://rcopen.com/member29285/media/4fc0b5ad9970730077f1679e\" data-nd-image-size=\"sm\"><img class=\"attach__image\" src=\"https://rcopen.com/files/4fc0b5ad9970730077f1679e_sm\" alt width=\"170\" height=\"150\"></a></p>\n<p>Спаял себе GPS модуль на базе EB-500, но он по умолчанию работает на скорости 9600 бод, а для CL-OSD нужно 4800. Думал, как проще модуль сконфигурировать - решил через Arduino, которая здорово мне уже помогла в reverse engineering USB-GPS’а (использовал ардуину в качестве пробника-приемника UART, при поиске ноги c нужными нам NMEA данными). Первая проба была в использовании Ардуины в виде транслятора команд из терминала в GPS модуль, но что-то у меня не заработало. То есть данные из модуля идут, а в модуль - не лезут.</p>\n<!--cut-->\n<pre class=\"hljs\"><code>void loop()\n{\n if (mySerial.available())\n Serial.print((char)mySerial.read());\n if (Serial.available())\n mySerial.print((char)Serial.read());\n}\n</code></pre>\n<p>В принципе при ближайшем рассмотрении становится понятно, почему не работает - пример выдран из примера по библиотеки NewSoftSerial, и обмен между портами происходит по одной букве. А GPS модуль требует чтобы отправлена была сразу команда, а здесь он видит непонятно что. Ради интереса надо поправить позже.</p>\n<p>Я не стал настаивать, и сделал программку, которая автоматически отправляет команды из Ардуины в модуль. Код ниже, но было несколько моментов, из-за которых плевое дело растянулось на пару часов:</p>\n<ol>\n<li>Поскольку GPS питается от 3.3В, а Ардуина - 5В, на выход Ардуины - поставил стабилитрон на 3В.</li>\n<li>Похоже, GPS не хочет менять скорость на пониженную, без снижения количества / скорости выводимых параметров. Поэтому алгоритм такой - снижаем скорость обновления до 1Гц, и отключаем почти все выводимые параемтры (я оставил GGA). После этого отправляем команду на переключение на 4800</li>\n<li>Похоже, надо соблюдать какие-то тайминги, или ждать освобождения порта в GPS. Я этого не делал, а просто перезапускал программу несколько раз, дожидаясь когда мне повезёт. Обычно на 2-3 раз команда проходит</li>\n<li>Похоже, по ссылке, которую давал <strong data-nd-pair-src=\"**\">falke5</strong> в <a href=\"https://rcopen.com/forum/f90/topic226809/130\" class=\"link link-int\" data-nd-link-orig=\"https://rcopen.com/forum/f90/topic226809/130\">теме по E-OSD</a>, в одной из команд ошибка. Вот эта команда не хотела выполняться: $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 можно всё обратно включить.</li>\n</ol>\n<pre class=\"hljs\"><code>#include <NewSoftSerial.h>\n\nNewSoftSerial mySerial(2, 3); //GPS модуль на пинах 2 и 3\n\nvoid setup()\n{\n Serial.begin(9600); // Соединяемся с ПК\n Serial.println("Hit me!");\n\n // начинаем связь на скорости 9600\n mySerial.begin(9600);\n delay(1000);\n\n // Первым делом надо занизить все параметры - ставим 1гц обновление и выдачу только данных GGA\n mySerial.println("$PMTK300,1000,0,0,0,0*1C"); // скорость обновления 1гц\n Serial.println("Command sent: $PMTK300,1000,0,0,0,0*1C");\n while (mySerial.available()) Serial.print((char)mySerial.read()); // Смотрим результат\n delay(1000);\n\n mySerial.println("$PMTK314,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29"); // выдача только GGA\n 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");\n while (mySerial.available()) Serial.print((char)mySerial.read()); // Смотрим результат\n delay(1000);\n\n /*\n // Это инициализация выдачи GGA, GSA, RMC, VTG, ZDA - её запустим уже в следующий раз, когда модуль уже будет проинициализирован на 1Гц, GGA, и 4800baud\n mySerial.println("$PMTK314,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,5,0*2D"); // выдача только GGA\n 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");\n while (mySerial.available()) Serial.print((char)mySerial.read()); // Смотрим результат\n delay(1000);*/\n\n mySerial.println("$PMTK251,4800*14"); // Переключаем модуль на 4800\n Serial.println("Command sent: $PMTK251,4800*14");\n while (mySerial.available()) Serial.print((char)mySerial.read()); // Смотрим результат\n delay(1000);*/\n\n // Настройка закончена, теперь начинаем связь теперь на скорости 4800\n mySerial.begin(4800);\n delay(1000);\n\n}\n\nvoid loop() // Готово, теперь просто смотрим на входящие данные\n{\n if (mySerial.available())\n Serial.print((char)mySerial.read());\n /*if (Serial.available())\n mySerial.print((char)Serial.read()); // Транслировать данные с порта компьютера на ардуину и на GPS (у меня вроде не работало) */\n}\n</code></pre>\n<p>P.S. Возможно, если у кого-то возникнут проблемы с командой PMTK314, есть возможность включать/отключать выдаваемые опции по отдельности (я не пробовал):</p>\n<p>GGA: Вкл => $PSRF103,00,00,01,01*25 , Выкл =>$PSRF103,00,00,00,01*24<br>\nGLL: Вкл => $PSRF103,01,00,01,01*24 , Выкл => $PSRF103,01,00,00,01*25<br>\nGSA: Вкл => $PSRF103,02,00,01,01*27 , Выкл => $PSRF103,02,00,00,01*26<br>\nGSV: Вкл => $PSRF103,03,00,01,01*26 , Выкл => $PSRF103,03,00,00,01*27<br>\nRMC: Вкл => $PSRF103,04,00,01,01*21 , Выкл => $PSRF103,04,00,00,01*20<br>\nVTG:Вкл => $PSRF103,05,00,01,01*20 , Выкл => $PSRF103,05,00,00,01*21</p>\n","user":"4741bd143df955007777fc51","ts":"2012-05-26T10:53:08.000Z","st":1,"cache":{"comment_count":6,"last_comment":"5350eb049970730077153116","last_comment_hid":6,"last_ts":"2014-04-18T09:06:12.000Z","last_user":"534d23ff3df955007772a25f"},"views":3575,"bookmarks":0,"votes":0},"subscription":null},"locale":"en-US","user_id":"000000000000000000000000","user_hid":0,"user_name":"","user_nick":"","user_avatar":null,"is_member":false,"settings":{"can_access_acp":false,"can_use_dialogs":false,"hide_heavy_content":false},"unread_dialogs":false,"footer":{"rules":{"to":"common.rules"},"contacts":{"to":"rco-nodeca.contacts"}},"navbar":{"tracker":{"to":"users.tracker","autoselect":false,"priority":10},"forum":{"to":"forum.index"},"blogs":{"to":"blogs.index"},"clubs":{"to":"clubs.index"},"market":{"to":"market.index.buy"}},"recaptcha":{"public_key":"6LcyTs0dAAAAADW_1wxPfl0IHuXxBG7vMSSX26Z4"},"layout":"common.layout"}