Работа с GPS модулем locosys 1513

Voronar
Offline
Зарегистрирован: 30.04.2012

 Здравствуйте.

Возникла проблема при считывании данных с 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 не может найти спутники?(когда выношу модуль за окно начинается мигание диода,  а в квартире не мигает) Или я неправильно принимаю и обрабатываю данные?

maksim
Offline
Зарегистрирован: 12.02.2012

 попробуйте в 27 строке сделать так:

Serial.println((char)mySerial.read());

 

carduino.ru
Offline
Зарегистрирован: 06.12.2011

 SoftwareSerial не сможет принять данные на скорости 57600 

Voronar
Offline
Зарегистрирован: 30.04.2012

 Спасибо. Это мне помогло в значительной степени.

Данные получаю, но 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);
}

 Есть какие-нибудь мысли?

Voronar
Offline
Зарегистрирован: 30.04.2012

 А на какой может? Только на этой скорости я получаю корректные символы. В даташите модуля указана эта скорость, я поэтому на такой и принимаю.

leshak
Offline
Зарегистрирован: 29.09.2011

 

Voronar пишет:

А на какой может?

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.

carduino.ru
Offline
Зарегистрирован: 06.12.2011

Если тебе нужно смотреть данные 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 
     
}

 

 

leshak
Offline
Зарегистрирован: 29.09.2011

Простите не увидел что "данные уже получаю". 

Ну попробйте break; добавить.

 newData = true;break;

 

И покажите что вы в выходите видите.

 

leshak
Offline
Зарегистрирован: 29.09.2011

carduino.ru пишет:

Если тебе нужно смотреть данные GPS в сериалмониторе то можно сделать вот так 

В мониторе установи скорость порта 57600, пины используй D9 и D8

Интерестный финт ушами. Правда от него коде-хайлайтеру мозг сносит. Что-бы увидить весь ваш код целиком нужно "цитировать", нажать. и уже в цитате - видно вашм АСМ :)

Но тут же важно проверить именно работу SoftwareSerial. А, иначе, можно было-бы вообще тупо подключить модуль на D0,D1 залить пустой скетч и смотреть что там происходит.

 

carduino.ru
Offline
Зарегистрирован: 06.12.2011

leshak пишет:

 

Интерестный финт ушами. Правда от него коде-хайлайтеру мозг сносит. Что-бы увидить весь ваш код целиком нужно "цитировать", нажать. и уже в цитате - видно вашм АСМ :)

 

У меня в опере все показывает нормально.

leshak пишет:

Но тут же важно проверить именно работу SoftwareSerial. А, иначе, можно было-бы вообще тупо подключить модуль на D0,D1 залить пустой скетч и смотреть что там происходит.

При прямом подключении на хардверные пины, не сможешь данные от GPS обрабатывать

А коректрной работы SoftwareSerial на скорости 57600 не получится

leshak
Offline
Зарегистрирован: 29.09.2011

carduino.ru пишет:

При прямом подключении на хардверные пины, не сможешь данные от GPS обрабатывать

А с вашим скетчем можно? Тупо открыть Serial.begin() и можно паралельно с компом читать? Если да - то круто. такое может пригодится.

carduino.ru пишет:

А коректрной работы SoftwareSerial на скорости 57600 не получится

http://arduino.cc/en/Reference/SoftwareSerial

Цитата:

It is possible to have multiple software serial ports with speeds up to 115200 bps

Врут? Или я что-то недопонимаю?

carduino.ru
Offline
Зарегистрирован: 06.12.2011

Похоже я отстал от жизни :)

Раньше либа могла читать макимум 19200 

Voronar
Offline
Зарегистрирован: 30.04.2012

 Получилось получит вот такие данные: $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 только если поступающие данные корректны? Хотя данные приходят в нормальном виде. Выше я показал в каком - по стандарту.

leshak
Offline
Зарегистрирован: 29.09.2011

Voronar пишет:

 Получилось получит вот такие данные: $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() пока действительно не попалось ничего путного. Вот он и не срабатывает.

Voronar пишет:

Проверял полученные координаты и они показали далеко не точное местоположение. Может быть не правильно вводил координаты. Вводил в гугл вот таким образом: 55.354915, 37.386425

Ой.. пол года назад ковырялся, там с этими системами координат не все так просто. Счас уже не помню. Правда есть online сервисы которые помогают в перевод (можно нагуглить). Кстати есть сервисы и для декодинга NMEA данных.

Voronar пишет:

Поставил break по вашему совету. Но ничего не поменялось. В 38 строке условие не выполняется. Может gps.encode() возвращает 1 только если поступающие данные корректны? Хотя данные приходят в нормальном виде. Выше я показал в каком - по стандарту.

ну конечно только если корректы. причем не просто "корректны", а еще и содержат информацию о местоположении. если шилд не смог понять где он, то и  gps.encode() не вернет 1. Корректные данные могут содержать инфу "мы видим всего два спутника".

Более того, не забывайте что в зависимости от качества чипа/погоды/антены первые данные, после включения питания (холодный старт) могут начать поступать аж через 5-7-мь минут. (до минуты - неплохой показатель).

Так что берем все лабуду и на природу :) На волю, в помпасы :)

Можно еще поискать софт, который умеем записывать/проигрывать данные с ком-порта. Тогда берете скетч который "просто транслирует" подклчюаете шилд через дуину к порту, выходите на природу - записываете все что он передает (кстати можно и GPS софт какой-то взять, посмотреть как он будет отображать ваше положение на карте).

Потом приходите домой, и "проигрываете" этот лог в Serial порт :)

Я кажишсь вот этим софтом пользовался http://gpsgate.com/products/gpsgate_client . Для записи и проигрыша. Вроде и сам "эмулировать" умеет (даешь точки, а он по ним "летит"). В комбинации с всякими виртуальными ком-портами и нуль модемными кабелями, плюс софт для всяких моделистов (арду-пилот и т.п.) можно намонстрячится "летать" по картам, отображать где вы сейчас на гугл-мапс и т.п. не вставая из-за стола :)  Но "морокливо" со всей этой тряхомудрией разбиртся/настраивать.

Voronar
Offline
Зарегистрирован: 30.04.2012

 Спасибо за полезную информацию. Придется идти на природу. Погода, конечно, ни как в Пампасах, но а что ещё делать.

Мне главное получить широту и долготу. Дальше придется записывать эти данные в бд, чтобы потом по необходимости работать с ними в той же гугл мэпс. Не думал, что столько провожусь с этими железками.

Ещё раз спасибо за помощь, добрый человек. Удачи. Возможно, я ещё вернусь...

leshak
Offline
Зарегистрирован: 29.09.2011

 

Voronar пишет:

Спасибо за полезную информацию. Придется идти на природу. Погода, конечно, ни как в Пампасах, но а что ещё делать.

Я же дал ссылочку на прогу. Она умеет эмулировать GPS. Задаете точки, задаете скорость и она типа "едет по ним". Ну и скетч можно отлаживать по "этим поездкам".
Правда нужно будет еще один USB-Serial конвертер делать. Что-бы по одному "послыть в ардуину NMEA данные", а через другой - получать распарсенные результаты. Правда они "слишком гладкие". Никаких тебе "бросков в сторону и т.п."
И еще, подумайте а нужна ли вам тут вообще Arduino, библиотеки и т.п? Если вы собираетесь "писать в базу", то не проще будет отправлять сырые данные компу? А уж там разбирать этот NMEA. И саму на компе парсить проще (языки мощней) да и либ готовых найти гораздо проще.

Voronar пишет:

Возможно, я ещё вернусь...

Ээээ... вы так не пугайте. Вы что собрались с самолета в тайгу прыгать и выходить к людям по ардуине? Типа либо пан, либо пропал? ;)))

Voronar
Offline
Зарегистрирован: 30.04.2012

Эмулятор эмулятором, но мне хотелось бы увидеть модуль в реальной работе на свежем воздухе. Это тем более повод выйти на свежий воздух.)

Если не получится на ардуино получить данные в красивом виде, то буду обрабатывать на другом языке. Просто хочется на компьютере маленькую программку, которая бы только писала данные в бд. 

А вы не пугайтесь. Спасибо за содержательные ответы. Буду рад с вами обсудить ещё какую-нибудь проблемку, если она появится.

leshak
Offline
Зарегистрирован: 29.09.2011

Voronar пишет:

Эмулятор эмулятором, но мне хотелось бы увидеть модуль в реальной работе на свежем воздухе. Это тем более повод выйти на свежий воздух.)

Не стоит недооценивать ценность эмуляторов. У вас сейчас три "неизвестные" (способные не корректно работать) - библиотека, скетч и железо.

Эмулятором вы приводите в известность две из них - скетч и библиотеку. Убеждаетесь что они работают (и разбираетесь как они работают). А "на природе", проверяете уже только железо. Будучи, отностильено, уверены в програмной части.

Если "не завелось",то, опять-таки, записываем что у нас шлет железо. Потом дома, в комфортных условиях, эмулятором, "проигрываем" эти данные. И добиваемся что-бы софт понимал эти, теперь уже реальные данные. После чего следующая поездка на природу уже просто не может не закончится бросанием в воздух чепчиков и криками "Ура!".

Voronar
Offline
Зарегистрирован: 30.04.2012

Я решил главную свою задачу. Написал свою процедуру для обработки полученных данных. Получаю широту и долготу в необходимом мне формате. Проверил эти данные в гугл - все сработало точно.

TinyGPS так и не хочет работать как мне нужно было, даже на улице.

А вам ещё раз спасибо за душевную беседу.

leshak
Offline
Зарегистрирован: 29.09.2011

Voronar пишет:

Я решил главную свою задачу. Написал свою процедуру для обработки полученных данных. Получаю широту и долготу в необходимом мне формате. Проверил эти данные в гугл - все сработало точно.

Замечательно. Если хотите - можете тут поделится своими результатами. Авось кому-нибудь еще пригодятся (я вот недавно нашел на форуме решения одной своей проблемы, смотрю на автора - я сам многомесячной давности).

Voronar пишет:

TinyGPS так и не хочет работать как мне нужно было, даже на улице.

Если есть "желание и азарт", можете попытатся разобратся что же не так с TinyGPS. Раз уж "сами написали", то и "чужое" понять уже будет легче.

leshak
Offline
Зарегистрирован: 29.09.2011

leshak пишет:

Voronar пишет:

Проверял полученные координаты и они показали далеко не точное местоположение. Может быть не правильно вводил координаты. Вводил в гугл вот таким образом: 55.354915, 37.386425

Ой.. пол года назад ковырялся, там с этими системами координат не все так просто. Счас уже не помню. 

Вот наткнулся на описание как переводить: Как указать GPS-координаты для Google

Voronar
Offline
Зарегистрирован: 30.04.2012

 Я уже с этим разобрался, как только встретился с этой задачей. Я сразу на ардуино все перевел.

Но все равно спасибо.)