Работа с 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 работает некорректно.
#include <SoftwareSerial.h> #include <TinyGPS.h> /* This sample code demonstrates the normal use of a TinyGPS object. It requires the use of SoftwareSerial, and assumes that you have a 4800-baud serial GPS device hooked up on pins 3(rx) and 4(tx). */ TinyGPS gps; SoftwareSerial ss(2, 3); void setup() { Serial.begin(115200); ss.begin(57600); Serial.print("Simple TinyGPS library v. "); Serial.println(TinyGPS::library_version()); Serial.println("by Mikal Hart"); Serial.println(); } void loop() { bool newData = false; unsigned long chars; unsigned short sentences, failed; // For one second we parse GPS data and report some key values for (unsigned long start = millis(); millis() - start < 1000;) { while (ss.available()) { char c = ss.read(); Serial.write(c); // uncomment this line if you want to see the GPS data flowing if (gps.encode(c)) // Did a new valid sentence come in? Тут то и не выполняется условие. Не понимаю, для чего нужен этот метод encode. newData = true; } } if (newData) //сюда мы не попадаем и не получаем желаемых данных в удобном виде { float flat, flon; unsigned long age; gps.f_get_position(&flat, &flon, &age); Serial.print("LAT="); Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6); Serial.print(" LON="); Serial.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6); Serial.print(" SAT="); Serial.print(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites()); Serial.print(" PREC="); Serial.print(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop()); } gps.stats(&chars, &sentences, &failed); Serial.print(" CHARS="); Serial.print(chars); Serial.print(" SENTENCES="); Serial.print(sentences); Serial.print(" CSUM ERR="); Serial.println(failed); }Есть какие-нибудь мысли?
А на какой может? Только на этой скорости я получаю корректные символы. В даташите модуля указана эта скорость, я поэтому на такой и принимаю.
А на какой может?
9600 - точно сможет.
Да и, если верить авторам библиотеки, 57600 должна смочь. Они обещают до 115200.
Еще играет рояль какая у вас плата. Если Mega или Leonardo - там не на любой пин можно использовать.
Попробуйте, для начала добится того что вы вообще данные видите от модуля. Из арудины сделайте "тупой пересыльщик".
void loop(){ if(Serial.available())ss.write(Serial.read()); if(ss.available())Serial.write(ss.read()); }Откройте Serial монитор и посмотрите видите-ли вы идущие от модуля данные.
А сами можете ему "покомандывать". Команды - искать в даташите. Частенько бывают и команды "снизить скорость" (хотя, если вы уже видите данные смысла в этом особого нет).
Строка 38-мь. Если я правильно понял. Этот метод принимает в себя каждый пришедший из Serial символ. И "запоминает". То есть от модуля "пришла строка", вы в этот метод, кормите ее по одному символу. Где-то внутри себя он запоминает (собирает в строку). Когда в том что он насобирал, он увидит "осмысленные данные" - он вернет истину (и опять готов "собирать" следующую порцию для анализа).
А еще можете в строку 30-ть добавить к if-у условие !newData . Что-бы если какие-то данные задетектились - оно сразу выходило и не ждало конца секунды. Или после newData = true; добавить break;
Вообщем как только что-то получили - вышли из цикла, что-бы "следующие данные", которые продолжают поступть из Serial не испортили полученный результат до того как мы его выведем в Serial.
Если тебе нужно смотреть данные GPS в сериалмониторе то можно сделать вот так
В мониторе установи скорость порта 57600, пины используй D9 и D8
uint8_t RX_Pin=8; uint8_t TX_Pin=9; void setup() { pinMode(0, INPUT); //RX pinMode(1, OUTPUT);//TX pinMode(RX_Pin, OUTPUT); pinMode(TX_Pin, INPUT); } void loop() { uint8_t Result; asm volatile( "cli" "\n\t" "label%=:" "in %[Result], %[in_portd]" "\n\t" "out %[out_portb], %[Result]" "\n\t" "in %[Result], %[in_portb]" "\n\t" "out %[out_portd], %[Result]" "\n\t" "rjmp label%=" "\n\t" : [Result] "=r" (Result) : [out_portb] "I" (_SFR_IO_ADDR(PORTB)), [out_portd] "I" (_SFR_IO_ADDR(PORTD)), [in_portb] "I" (_SFR_IO_ADDR(PINB)), [in_portd] "I" (_SFR_IO_ADDR(PIND)) : );//asm end }Простите не увидел что "данные уже получаю".
Ну попробйте 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
Я уже с этим разобрался, как только встретился с этой задачей. Я сразу на ардуино все перевел.
Но все равно спасибо.)