Работа с GPS модулем locosys 1513
- Войдите на сайт для отправки комментариев
Пт, 07/09/2012 - 15:57
Здравствуйте.
Возникла проблема при считывании данных с gps модуля. Этот модуль подключен к ардуино (уно) соответствующим образом.
Имеется вот такой код:
#include "TinyGPS.h" #include <SoftwareSerial.h> #define rxPin 2 #define txPin 3 boolean t=true; SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin); TinyGPS gps; float flat, flon; unsigned long fix_age; void setup() { mySerial.begin(57600); Serial.begin(9600); delay(500); } void loop() { gps.f_get_position(&flat, &flon, &fix_age); Serial.print("Data from GPS: "); Serial.println(mySerial.read()); Serial.print("Latitude: "); Serial.println(flat); Serial.println(); delay(1000); }
Данные с gps приходят просто в виде числа, хотя я должне увидеть что-то такое:
$GPGGA,105317.709,8960.0000,N,00000.0000,E,0,0,,137.0,M,13.0,M,,*4C
$GPGLL,8960.0000,N,00000.0000,E,105317.709,V,N*49
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,1,1,00*79
$GPRMC,105317.709,V,8960.0000,N,00000.0000,E,0.00,0.00,010610,,,N*78
$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
А широта не определяется. Возможно gps не может найти спутники?(когда выношу модуль за окно начинается мигание диода, а в квартире не мигает) Или я неправильно принимаю и обрабатываю данные?
попробуйте в 27 строке сделать так:
SoftwareSerial не сможет принять данные на скорости 57600
Спасибо. Это мне помогло в значительной степени.
Данные получаю, но TinyGPS работает некорректно.
Есть какие-нибудь мысли?
А на какой может? Только на этой скорости я получаю корректные символы. В даташите модуля указана эта скорость, я поэтому на такой и принимаю.
А на какой может?
9600 - точно сможет.
Да и, если верить авторам библиотеки, 57600 должна смочь. Они обещают до 115200.
Еще играет рояль какая у вас плата. Если Mega или Leonardo - там не на любой пин можно использовать.
Попробуйте, для начала добится того что вы вообще данные видите от модуля. Из арудины сделайте "тупой пересыльщик".
Откройте Serial монитор и посмотрите видите-ли вы идущие от модуля данные.
А сами можете ему "покомандывать". Команды - искать в даташите. Частенько бывают и команды "снизить скорость" (хотя, если вы уже видите данные смысла в этом особого нет).
Строка 38-мь. Если я правильно понял. Этот метод принимает в себя каждый пришедший из Serial символ. И "запоминает". То есть от модуля "пришла строка", вы в этот метод, кормите ее по одному символу. Где-то внутри себя он запоминает (собирает в строку). Когда в том что он насобирал, он увидит "осмысленные данные" - он вернет истину (и опять готов "собирать" следующую порцию для анализа).
А еще можете в строку 30-ть добавить к if-у условие !newData . Что-бы если какие-то данные задетектились - оно сразу выходило и не ждало конца секунды. Или после newData = true; добавить break;
Вообщем как только что-то получили - вышли из цикла, что-бы "следующие данные", которые продолжают поступть из Serial не испортили полученный результат до того как мы его выведем в Serial.
Если тебе нужно смотреть данные GPS в сериалмониторе то можно сделать вот так
В мониторе установи скорость порта 57600, пины используй D9 и D8
Простите не увидел что "данные уже получаю".
Ну попробйте break; добавить.
И покажите что вы в выходите видите.
Если тебе нужно смотреть данные GPS в сериалмониторе то можно сделать вот так
В мониторе установи скорость порта 57600, пины используй D9 и D8
Интерестный финт ушами. Правда от него коде-хайлайтеру мозг сносит. Что-бы увидить весь ваш код целиком нужно "цитировать", нажать. и уже в цитате - видно вашм АСМ :)
Но тут же важно проверить именно работу SoftwareSerial. А, иначе, можно было-бы вообще тупо подключить модуль на D0,D1 залить пустой скетч и смотреть что там происходит.
Интерестный финт ушами. Правда от него коде-хайлайтеру мозг сносит. Что-бы увидить весь ваш код целиком нужно "цитировать", нажать. и уже в цитате - видно вашм АСМ :)
У меня в опере все показывает нормально.
Но тут же важно проверить именно работу SoftwareSerial. А, иначе, можно было-бы вообще тупо подключить модуль на D0,D1 залить пустой скетч и смотреть что там происходит.
При прямом подключении на хардверные пины, не сможешь данные от GPS обрабатывать
А коректрной работы SoftwareSerial на скорости 57600 не получится
При прямом подключении на хардверные пины, не сможешь данные от GPS обрабатывать
А с вашим скетчем можно? Тупо открыть Serial.begin() и можно паралельно с компом читать? Если да - то круто. такое может пригодится.
А коректрной работы SoftwareSerial на скорости 57600 не получится
http://arduino.cc/en/Reference/SoftwareSerial
It is possible to have multiple software serial ports with speeds up to 115200 bps
Врут? Или я что-то недопонимаю?
Похоже я отстал от жизни :)
Раньше либа могла читать макимум 19200
Получилось получит вот такие данные: $GPGGA,124715.130,5535.4915,N,03738.6425,E,1,5,2.12,259.6,M,14.5
Правда не всегда приходят. В основном вот такая информация: $GPGLL,,,,,124716.451,V,1 $GPGGA,124716.651,,,,,0,4,,,M,,M,,*49 Видать в квартире плохая связь со спутниками. Проверял полученные координаты и они показали далеко не точное местоположение. Может быть не правильно вводил координаты. Вводил в гугл вот таким образом: 55.354915, 37.386425
Поставил break по вашему совету. Но ничего не поменялось. В 38 строке условие не выполняется. Может gps.encode() возвращает 1 только если поступающие данные корректны? Хотя данные приходят в нормальном виде. Выше я показал в каком - по стандарту.
Получилось получит вот такие данные: $GPGGA,124715.130,5535.4915,N,03738.6425,E,1,5,2.12,259.6,M,14.5
Правда не всегда приходят. В основном вот такая информация: $GPGLL,,,,,124716.451,V,1 $GPGGA,124716.651,,,,,0,4,,,M,,M,,*49 Видать в квартире плохая связь со спутниками.
Ну значит SoftwareSerial справился с вашими скоростями. В эту сторону - можно не думать.
ну вообще работа GPS в квартире - это большая редкость и удача. Даже "на балкон" - не всегда помогает. Иногда "ну вот хотим чистое небо", без деревьев и тучь :)
Насколько я помню, данные с определившимися координатами начинаются с $GPRMC, а все остальное может быть "вермя, поправки, точность, состояния аккума, сколько спутников видно и т.п.".
Вот тут можно посмотреть что команды означают http://www.gpsinformation.org/dale/nmea.htm#nmea
Да и на самой странице библиотеки написанно
"The NMEA sentences must report valid data. If the $GPRMC sentence reports a validity of “V” (void) instead of “A” (active), or if the $GPGGA sentence reports fix type “0″ (no fix) then those sentences are discarded"
Так что похоже, вашему gps.encode() пока действительно не попалось ничего путного. Вот он и не срабатывает.
Проверял полученные координаты и они показали далеко не точное местоположение. Может быть не правильно вводил координаты. Вводил в гугл вот таким образом: 55.354915, 37.386425
Ой.. пол года назад ковырялся, там с этими системами координат не все так просто. Счас уже не помню. Правда есть online сервисы которые помогают в перевод (можно нагуглить). Кстати есть сервисы и для декодинга NMEA данных.
Поставил break по вашему совету. Но ничего не поменялось. В 38 строке условие не выполняется. Может gps.encode() возвращает 1 только если поступающие данные корректны? Хотя данные приходят в нормальном виде. Выше я показал в каком - по стандарту.
ну конечно только если корректы. причем не просто "корректны", а еще и содержат информацию о местоположении. если шилд не смог понять где он, то и gps.encode() не вернет 1. Корректные данные могут содержать инфу "мы видим всего два спутника".
Более того, не забывайте что в зависимости от качества чипа/погоды/антены первые данные, после включения питания (холодный старт) могут начать поступать аж через 5-7-мь минут. (до минуты - неплохой показатель).
Так что берем все лабуду и на природу :) На волю, в помпасы :)
Можно еще поискать софт, который умеем записывать/проигрывать данные с ком-порта. Тогда берете скетч который "просто транслирует" подклчюаете шилд через дуину к порту, выходите на природу - записываете все что он передает (кстати можно и GPS софт какой-то взять, посмотреть как он будет отображать ваше положение на карте).
Потом приходите домой, и "проигрываете" этот лог в Serial порт :)
Я кажишсь вот этим софтом пользовался http://gpsgate.com/products/gpsgate_client . Для записи и проигрыша. Вроде и сам "эмулировать" умеет (даешь точки, а он по ним "летит"). В комбинации с всякими виртуальными ком-портами и нуль модемными кабелями, плюс софт для всяких моделистов (арду-пилот и т.п.) можно намонстрячится "летать" по картам, отображать где вы сейчас на гугл-мапс и т.п. не вставая из-за стола :) Но "морокливо" со всей этой тряхомудрией разбиртся/настраивать.
Спасибо за полезную информацию. Придется идти на природу. Погода, конечно, ни как в Пампасах, но а что ещё делать.
Мне главное получить широту и долготу. Дальше придется записывать эти данные в бд, чтобы потом по необходимости работать с ними в той же гугл мэпс. Не думал, что столько провожусь с этими железками.
Ещё раз спасибо за помощь, добрый человек. Удачи. Возможно, я ещё вернусь...
Спасибо за полезную информацию. Придется идти на природу. Погода, конечно, ни как в Пампасах, но а что ещё делать.
Я же дал ссылочку на прогу. Она умеет эмулировать GPS. Задаете точки, задаете скорость и она типа "едет по ним". Ну и скетч можно отлаживать по "этим поездкам".
Правда нужно будет еще один USB-Serial конвертер делать. Что-бы по одному "послыть в ардуину NMEA данные", а через другой - получать распарсенные результаты. Правда они "слишком гладкие". Никаких тебе "бросков в сторону и т.п."
И еще, подумайте а нужна ли вам тут вообще Arduino, библиотеки и т.п? Если вы собираетесь "писать в базу", то не проще будет отправлять сырые данные компу? А уж там разбирать этот NMEA. И саму на компе парсить проще (языки мощней) да и либ готовых найти гораздо проще.
Возможно, я ещё вернусь...
Ээээ... вы так не пугайте. Вы что собрались с самолета в тайгу прыгать и выходить к людям по ардуине? Типа либо пан, либо пропал? ;)))
Эмулятор эмулятором, но мне хотелось бы увидеть модуль в реальной работе на свежем воздухе. Это тем более повод выйти на свежий воздух.)
Если не получится на ардуино получить данные в красивом виде, то буду обрабатывать на другом языке. Просто хочется на компьютере маленькую программку, которая бы только писала данные в бд.
А вы не пугайтесь. Спасибо за содержательные ответы. Буду рад с вами обсудить ещё какую-нибудь проблемку, если она появится.
Эмулятор эмулятором, но мне хотелось бы увидеть модуль в реальной работе на свежем воздухе. Это тем более повод выйти на свежий воздух.)
Не стоит недооценивать ценность эмуляторов. У вас сейчас три "неизвестные" (способные не корректно работать) - библиотека, скетч и железо.
Эмулятором вы приводите в известность две из них - скетч и библиотеку. Убеждаетесь что они работают (и разбираетесь как они работают). А "на природе", проверяете уже только железо. Будучи, отностильено, уверены в програмной части.
Если "не завелось",то, опять-таки, записываем что у нас шлет железо. Потом дома, в комфортных условиях, эмулятором, "проигрываем" эти данные. И добиваемся что-бы софт понимал эти, теперь уже реальные данные. После чего следующая поездка на природу уже просто не может не закончится бросанием в воздух чепчиков и криками "Ура!".
Я решил главную свою задачу. Написал свою процедуру для обработки полученных данных. Получаю широту и долготу в необходимом мне формате. Проверил эти данные в гугл - все сработало точно.
TinyGPS так и не хочет работать как мне нужно было, даже на улице.
А вам ещё раз спасибо за душевную беседу.
Я решил главную свою задачу. Написал свою процедуру для обработки полученных данных. Получаю широту и долготу в необходимом мне формате. Проверил эти данные в гугл - все сработало точно.
Замечательно. Если хотите - можете тут поделится своими результатами. Авось кому-нибудь еще пригодятся (я вот недавно нашел на форуме решения одной своей проблемы, смотрю на автора - я сам многомесячной давности).
TinyGPS так и не хочет работать как мне нужно было, даже на улице.
Если есть "желание и азарт", можете попытатся разобратся что же не так с TinyGPS. Раз уж "сами написали", то и "чужое" понять уже будет легче.
Проверял полученные координаты и они показали далеко не точное местоположение. Может быть не правильно вводил координаты. Вводил в гугл вот таким образом: 55.354915, 37.386425
Ой.. пол года назад ковырялся, там с этими системами координат не все так просто. Счас уже не помню.
Вот наткнулся на описание как переводить: Как указать GPS-координаты для Google
Я уже с этим разобрался, как только встретился с этой задачей. Я сразу на ардуино все перевел.
Но все равно спасибо.)