Страница 1 из 2

Давайте соберем пользовательский блок для GPS NEO6 вместе.

Добавлено: 11.09.2016{, 13:29}
Ernesto
Приветствую всех, не давно наткнулся на сей занимательный проект, и выражаю благодарность его создателю за столь удачную программу.
Посидев вечер я разобрался в основных функциях, в создании пользовательского блока я потерпел фиаско несмотря на то что читал и смотрел гайд автора.
Цель заставить работать GPS NEO-6 в рамках FLProg.
Я решил пойти от простого к сложному. Для начал просто получит с GPS широту и отправить ее по UART.
Подработав напильником пример из библиоткеи у меня получилось так:

СпойлерПоказать
#include <TinyGPS++.h>
#include <SoftwareSerial.h>

static const int RXPin = 4, TXPin = 3; // подключение GPS  достаточно RXpin
static const uint32_t GPSBaud = 9600;

// The TinyGPS++ object
TinyGPSPlus gps;

// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);

TinyGPSCustom latitude(gps, "GPGGA", 2); // Широта
TinyGPSCustom latitudeNS(gps, "GPGGA", 3); // Широта буква (север или юг)
TinyGPSCustom longitude(gps, "GPGGA", 4); // Долгота
TinyGPSCustom longitudeWE(gps, "GPGGA", 5); // Долгота буква (запад или восток)

void setup()
{
  Serial.begin(9600);
  ss.begin(GPSBaud);
}

void loop()
{
  // Every time anything is updated, print everything.
 if (
    latitude.isUpdated()|| latitudeNS.isUpdated()|| longitude.isUpdated() )
{

    Serial.print(F(" Latitude=")); Serial.print(latitude.value()); Serial.println(latitudeNS.value());
    Serial.print(F(" Longitude=")); Serial.print(longitude.value()); Serial.println(longitudeWE.value());
   delay (5000); // тестовая задержка

 }
//
  while (ss.available() > 0)
    gps.encode(ss.read());
}
тут уже и широта и долгота выводится, можно конечно сразу обрезать и оставить широту но пока оставлю так для наглядности.
Пользуясь руководством автора я на собрал блок, в итоге при компиляции непосредственно в ардуиновской апликашке пишут кучу ошибок.
Танцы с бубном не возымели действия, прошу помощи аксакалов .

Мой черновик блока и базовый скетч прилагаю.

Давайте соберем пользовательский блок для GPS NEO6 вместе.

Добавлено: 11.09.2016{, 13:37}
slavas
Поставьте галку "использовать один раз".

Давайте соберем пользовательский блок для GPS NEO6 вместе.

Добавлено: 11.09.2016{, 13:48}
Слимпер
А еще лучше, выложите сам ваш блок сюда. Тогда проще понять, что у вас не так происходит.

Давайте соберем пользовательский блок для GPS NEO6 вместе.

Добавлено: 12.09.2016{, 09:42}
Ernesto
Очень странно что файлы вложения не сохранились, добавлю опять

Добавлено (12.09.2016, 08:49)
---------------------------------------------
по библиотеке почитать тут http://arduiniana.org/libraries/tinygpsplus/

Добавлено (12.09.2016, 09:42)
---------------------------------------------
Постарался по максимуму упростить код который должен работать в блоке.


СпойлерПоказать
#include <TinyGPS++.h>
#include <SoftwareSerial.h>

static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;

// The TinyGPS++ object
TinyGPSPlus gps;

// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);

// For stats that happen every 5 seconds
unsigned long last = 0UL;

void setup()
{
  Serial.begin(9600);
  ss.begin(GPSBaud);
}
void loop()
{
  // Dispatch incoming characters
  while (ss.available() > 0)
    gps.encode(ss.read());
  if (gps.location.isUpdated())
  {
    Serial.print(F(" Lat="));
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(" Long="));
    Serial.println(gps.location.lng(), 6);
  }
  else if (millis() - last > 1000) // задержка разрыва вывода данных
  {
    Serial.println();

    if (gps.charsProcessed() < 10)
      Serial.println(F("WARNING: No GPS data.  Check wiring."));

    last = millis();

  }
}

Давайте соберем пользовательский блок для GPS NEO6 вместе.

Добавлено: 12.09.2016{, 10:57}
Слимпер
Ernesto писал(а):Постарался по максимуму упростить код который должен работать в блоке.
Приложил Новый вариант, в старом было множество ошибок.
1. в нескольких местах объявлялось latitude(переменная, выход, объект одновременно ).
2. Секции Loop Лишний знак "}"
3. Вызов несуществующего объекта 

Это я чисто по описанию библиотеки  дела, может тоже, что не так понял

Давайте соберем пользовательский блок для GPS NEO6 вместе.

Добавлено: 12.09.2016{, 11:21}
Ernesto
Сейчас по кручу ваш вариант, спасибо. :up:

Добавлено (12.09.2016, 11:21)
---------------------------------------------
Проверил с компиляцией все хорошо вот только при отсыле любой переменной в UART на порту тишина.
В обоих примерах что есть на этом сайте автор настраивал поле FunctionSection, в Вашем примере там пусто, чисто интуитивно предполагаю что в этом проблем.
Как подключил блок  UART добавил вложением.

Давайте соберем пользовательский блок для GPS NEO6 вместе.

Добавлено: 12.09.2016{, 11:39}
Слимпер
Ernesto писал(а):В обоих примерах что есть на этом сайте автор настраивал поле FunctionSection, в Вашем примере там пусто, чисто интуитивно предполагаю что в этом проблем.
Ну проблема точно не в этом. Любая область может быть пустой.
А для начал вы лучше напрямую из Arduino  IDE загрузите примеры из библиотеки работы с модулем (например BasicExample) и попробуйте.
Может у вас проблема вообще в подключении или спутники не ловит.

Да и простого мониторинга в терминале, лучше использовать просто "Отправка в UART"

Давайте соберем пользовательский блок для GPS NEO6 вместе.

Добавлено: 12.09.2016{, 11:52}
Ernesto
Вот что я еще заметил в блоке
void setup()
отсутствует  ss.begin(GPSBaud); хотя эта строка есть в SetupSection

Добавлено (12.09.2016, 11:43)
---------------------------------------------
Вот этот код прямо сейчас крутится в ардуине выдает координаты в UART
#include <TinyGPS++.h>
#include <SoftwareSerial.h>

static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;

// The TinyGPS++ object
TinyGPSPlus gps;

// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);

// For stats that happen every 5 seconds
unsigned long last = 0UL;

void setup()
{
Serial.begin(9600);
ss.begin(GPSBaud);
}
void loop()
{
// Dispatch incoming characters
while (ss.available() > 0)
gps.encode(ss.read());
if (gps.location.isUpdated())
{
Serial.print(F(" Lat="));
Serial.print(gps.location.lat(), 6);
Serial.print(F(" Long="));
Serial.println(gps.location.lng(), 6);
}
else if (millis() - last > 1000) // задержка разрыва вывода данных
{
Serial.println();

if (gps.charsProcessed() < 10)
Serial.println(F("WARNING: No GPS data.  Check wiring."));

last = millis();

}
}

Так что дело не в железе.

Добавлено (12.09.2016, 11:48)
---------------------------------------------
Вот что скомпилировалось у меня с вашим блоком

СпойлерПоказать
#include <SoftwareSerial.h>
#include <TinyGPS++.h>

#include <SoftwareSerial.h>

SoftwareSerial Serial100(4, 3);

float LAT;
float LNT;
int hour_;
int minute_;
int second_;
TinyGPSPlus gps;
SoftwareSerial ss(4, 3);
void setup()
{
Serial100.begin(9600);
ss.begin(9600);
}
void loop()
{

 if (gps.location.isValid())
      {        
     LAT =gps.location.lat();
     LNT = gps.location.lng();    
    }
 if (gps.time.isValid())
    {
    hour_ =gps.time.hour();
    minute_ = gps.time.minute();
    second_ =gps.time.second();        
    }
while (ss.available() > 0)
     gps.encode(ss.read());

if (!(0)){Serial100.print(LAT);}

}
Добавлено (12.09.2016, 11:50)
---------------------------------------------
Кстате в коде фигурирует 2 SoftwareSerial, один от блока UART FLprog второй из исходного кода GPS может тут конфликт ?

Добавлено (12.09.2016, 11:52)
---------------------------------------------
про ss.begin(GPSBaud); проехали у видел что вы его вынесли в параметры пользователя

Давайте соберем пользовательский блок для GPS NEO6 вместе.

Добавлено: 12.09.2016{, 12:02}
Слимпер
Ernesto писал(а):Кстате в коде фигурирует 2 SoftwareSerial, один от блока UART FLprog второй из исходного кода GPS может тут конфликт ?
Однозначно, та делать нельзя , с  SoftwareSerial может быть только один, для передачи в монитор COM , надо использовать аппаратный порт.

Давайте соберем пользовательский блок для GPS NEO6 вместе.

Добавлено: 12.09.2016{, 12:04}
Ernesto
Получил первые данные (пока криво), ошибка была что в блоке UART нужно было выбирать ComPort 0.
Получаю переменную LAT в UART приходит только 2 цифры после запятой

Давайте соберем пользовательский блок для GPS NEO6 вместе.

Добавлено: 12.09.2016{, 12:05}
Слимпер
Судя по коду вы отправляли данные не на компьютер,  а модулю GPS

Давайте соберем пользовательский блок для GPS NEO6 вместе.

Добавлено: 12.09.2016{, 12:46}
Ernesto
все дело в команде в коде - (gps.location.lat(), 6); цифра отвечает за количество знаков, в коде что я привел выше все работает
в коде FLprog если прописать  LAT =gps.location.lat(), 6; не работает.
Куда копать?

Добавлено (12.09.2016, 12:18)
---------------------------------------------
Слимпер писал(а):Судя по коду вы отправляли данные не на компьютер, а модулю GPS
Вот сейчас я как раз данные считываю с GPS и вижу их через монитор порта.

Добавлено (12.09.2016, 12:19)
---------------------------------------------
Код FLprog целиком

СпойлерПоказать
#include <TinyGPS++.h>

#include <SoftwareSerial.h>

float LAT;
float LNT;
int hour_;
int minute_;
int second_;
TinyGPSPlus gps;
SoftwareSerial ss(4, 3);
float _SV1CP0 = 0.00;
bool _SV1CP0needSend = 0;
unsigned long _SV1CP0Time = 0UL;
void setup()
{
Serial.begin(9600);
_SV1CP0Time = millis();
ss.begin(9600);
}
void loop()
{

 if (gps.location.isValid())
      {        
     LAT =gps.location.lat(), 6;
     LNT = gps.location.lng();    
    }
 if (gps.time.isValid())
    {
    hour_ =gps.time.hour();
    minute_ = gps.time.minute();
    second_ =gps.time.second();        
    }
while (ss.available() > 0)
     gps.encode(ss.read());

if (_isTimer(_SV1CP0Time, 1000 )) {_SV1CP0 =  LAT; _SV1CP0needSend = 1; _SV1CP0Time = millis();}

if(_SV1CP0needSend) {
_SV1CP0needSend = 0;
Serial.write (1);
Serial.print (1);
Serial.write (2);
Serial.print (_SV1CP0);
Serial.write (3);}

}
bool _isTimer(unsigned long startTime, unsigned long period )
  {
  unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
  }
Добавлено (12.09.2016, 12:27)
---------------------------------------------
Прописал  LAT =gps.location.lat(), 6; и выполнил преобразование из Float в строку оставиви 6 знаков после запятой все залетело как надо.
Хотя все равно странно почему flprog обрезает после 2 знаков

Добавлено (12.09.2016, 12:46)
---------------------------------------------
Завтра пропишу остальные переменные GPS, спасибо за помощь!

Давайте соберем пользовательский блок для GPS NEO6 вместе.

Добавлено: 13.09.2016{, 05:09}
Слимпер
Ernesto писал(а):Прописал  LAT =gps.location.lat(), 6; и выполнил преобразование из Float в строку оставиви 6 знаков после запятой все залетело как надо.Хотя все равно странно почему flprog обрезает после 2 знаков
В блок конвертации в строку, при подключении типа Float, в настройках блока появляется параметр сколько знаков после запятой оставлять (по умолчанию 2).

Давайте соберем пользовательский блок для GPS NEO6 вместе.

Добавлено: 13.09.2016{, 05:54}
Ernesto
Слимпер писал(а):В блок конвертации в строку, при подключении типа Float, в настройках блока появляется параметр сколько знаков после запятой оставлять (по умолчанию 2).
ту понятно,
не понятно почему когда я отправляю в UART на прямую переменную типа float в мониторе порта показывает только 2 знака после запятой.

Давайте соберем пользовательский блок для GPS NEO6 вместе.

Добавлено: 13.09.2016{, 05:59}
Слимпер
Ernesto писал(а):не понятно почему когда я отправляю в UART на прямую переменную типа float в монеторе порта показывает только 2 знака после запятой.
print()
Так команда работает.

Давайте соберем пользовательский блок для GPS NEO6 вместе.

Добавлено: 13.09.2016{, 11:23}
Ernesto
собрал блок
 несколько раз перепроверил код но переменные altitude, satellites, course приходят нулями
хотя код примера показывает данные по этим параметрам

Давайте соберем пользовательский блок для GPS NEO6 вместе.

Добавлено: 13.09.2016{, 11:39}
Слимпер
А что такие  записи работают?
LAT =gps.location.lat(), 6;
minute_ = gps.time.minute(), 7;

Добавлено (13.09.2016, 11:39)
---------------------------------------------
Если работает такое преобразование
то попробуй сделать так :
altitude_ =gps.altitude.meters(), 6;
satellites_ =gps.satellites.value(), 6;
course_ =gps.course.deg(), 6;

А в каком коде satellites работает?

Давайте соберем пользовательский блок для GPS NEO6 вместе.

Добавлено: 13.09.2016{, 11:53}
Ernesto
честно говоря что satellites_ =gps.satellites.value(), 6; что так satellites_ =gps.satellites.value();
для отладки упростил по максимуму блок
см. вложение.   в порт выдает ноль,
а вот такой код нормально выдает количество спутников

СпойлерПоказать
#include <TinyGPS++.h>
#include <SoftwareSerial.h>

static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;

// The TinyGPS++ object
TinyGPSPlus gps;

// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);

// For stats that happen every 5 seconds
unsigned long last = 0UL;

void setup()
{
Serial.begin(9600);
ss.begin(GPSBaud);
}
void loop()
{
// Dispatch incoming characters
while (ss.available() > 0)
gps.encode(ss.read());
if (gps.satellites.isValid())
{
Serial.print(F("Value="));
Serial.println(gps.satellites.value());
}
else if (millis() - last > 1000)
{
Serial.println();

last = millis();

}
}
возможно загвоздка в типе переменных , в самой библе они хитро объявляются например satellites это uint32_t
я понимаю что так типы объявляют в нормальном С, но вот куда копать?

Давайте соберем пользовательский блок для GPS NEO6 вместе.

Добавлено: 13.09.2016{, 11:59}
Слимпер
Попробуй для переменной  satellites_ поменять тип с Integer на Uunsigned Long Integer

Давайте соберем пользовательский блок для GPS NEO6 вместе.

Добавлено: 13.09.2016{, 12:04}
Ernesto
Слимпер писал(а):Попробуй для переменной satellites_ поменять тип с Integer на Uunsigned Long Integer
не помогло