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

Использование GSM GPS WiFi Bluetooth NRF. ESP, LAN и др. модулей и обсуждение пользовательских блоков к ним
Ernesto
Рядовой
Сообщения: 17
Зарегистрирован: 11.09.2016{, 13:11}
Репутация: 0

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

#1

Сообщение Ernesto » 11.09.2016{, 13:29}

Приветствую всех, не давно наткнулся на сей занимательный проект, и выражаю благодарность его создателю за столь удачную программу.
Посидев вечер я разобрался в основных функциях, в создании пользовательского блока я потерпел фиаско несмотря на то что читал и смотрел гайд автора.
Цель заставить работать 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());
}
тут уже и широта и долгота выводится, можно конечно сразу обрезать и оставить широту но пока оставлю так для наглядности.
Пользуясь руководством автора я на собрал блок, в итоге при компиляции непосредственно в ардуиновской апликашке пишут кучу ошибок.
Танцы с бубном не возымели действия, прошу помощи аксакалов .

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

Аватара пользователя
slavas
Лейтенант
Сообщения: 568
Зарегистрирован: 14.09.2015{, 22:29}
Репутация: 0
Откуда: Санкт-Петербург

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

#2

Сообщение slavas » 11.09.2016{, 13:37}

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

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 25
Откуда: Новосибирск

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

#3

Сообщение Слимпер » 11.09.2016{, 13:48}

А еще лучше, выложите сам ваш блок сюда. Тогда проще понять, что у вас не так происходит.

Ernesto
Рядовой
Сообщения: 17
Зарегистрирован: 11.09.2016{, 13:11}
Репутация: 0

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

#4

Сообщение Ernesto » 12.09.2016{, 09:42}

Очень странно что файлы вложения не сохранились, добавлю опять

Добавлено (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();

  }
}
Для скачивания вложений Вы должны быть зарегистрированы.
Последний раз редактировалось Ernesto 12.09.2016{, 08:45}, всего редактировалось 1 раз.

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 25
Откуда: Новосибирск

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

#5

Сообщение Слимпер » 12.09.2016{, 10:57}

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

Это я чисто по описанию библиотеки  дела, может тоже, что не так понял
Для скачивания вложений Вы должны быть зарегистрированы.

Ernesto
Рядовой
Сообщения: 17
Зарегистрирован: 11.09.2016{, 13:11}
Репутация: 0

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

#6

Сообщение Ernesto » 12.09.2016{, 11:21}

Сейчас по кручу ваш вариант, спасибо. :up:

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

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 25
Откуда: Новосибирск

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

#7

Сообщение Слимпер » 12.09.2016{, 11:39}

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

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

Ernesto
Рядовой
Сообщения: 17
Зарегистрирован: 11.09.2016{, 13:11}
Репутация: 0

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

#8

Сообщение Ernesto » 12.09.2016{, 11:52}

Вот что я еще заметил в блоке
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); проехали у видел что вы его вынесли в параметры пользователя
Последний раз редактировалось Ernesto 12.09.2016{, 11:44}, всего редактировалось 1 раз.

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 25
Откуда: Новосибирск

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

#9

Сообщение Слимпер » 12.09.2016{, 12:02}

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

Ernesto
Рядовой
Сообщения: 17
Зарегистрирован: 11.09.2016{, 13:11}
Репутация: 0

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

#10

Сообщение Ernesto » 12.09.2016{, 12:04}

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

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 25
Откуда: Новосибирск

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

#11

Сообщение Слимпер » 12.09.2016{, 12:05}

Судя по коду вы отправляли данные не на компьютер,  а модулю GPS

Ernesto
Рядовой
Сообщения: 17
Зарегистрирован: 11.09.2016{, 13:11}
Репутация: 0

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

#12

Сообщение Ernesto » 12.09.2016{, 12:46}

все дело в команде в коде - (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, спасибо за помощь!
Последний раз редактировалось Ernesto 12.09.2016{, 12:19}, всего редактировалось 1 раз.

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 25
Откуда: Новосибирск

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

#13

Сообщение Слимпер » 13.09.2016{, 05:09}

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

Ernesto
Рядовой
Сообщения: 17
Зарегистрирован: 11.09.2016{, 13:11}
Репутация: 0

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

#14

Сообщение Ernesto » 13.09.2016{, 05:54}

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

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 25
Откуда: Новосибирск

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

#15

Сообщение Слимпер » 13.09.2016{, 05:59}

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

Ernesto
Рядовой
Сообщения: 17
Зарегистрирован: 11.09.2016{, 13:11}
Репутация: 0

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

#16

Сообщение Ernesto » 13.09.2016{, 11:23}

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

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 25
Откуда: Новосибирск

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

#17

Сообщение Слимпер » 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 работает?
Последний раз редактировалось Слимпер 13.09.2016{, 11:49}, всего редактировалось 1 раз.

Ernesto
Рядовой
Сообщения: 17
Зарегистрирован: 11.09.2016{, 13:11}
Репутация: 0

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

#18

Сообщение Ernesto » 13.09.2016{, 11:53}

честно говоря что 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
я понимаю что так типы объявляют в нормальном С, но вот куда копать?
Для скачивания вложений Вы должны быть зарегистрированы.
Последний раз редактировалось Ernesto 13.09.2016{, 11:54}, всего редактировалось 1 раз.

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 25
Откуда: Новосибирск

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

#19

Сообщение Слимпер » 13.09.2016{, 11:59}

Попробуй для переменной  satellites_ поменять тип с Integer на Uunsigned Long Integer

Ernesto
Рядовой
Сообщения: 17
Зарегистрирован: 11.09.2016{, 13:11}
Репутация: 0

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

#20

Сообщение Ernesto » 13.09.2016{, 12:04}

Слимпер писал(а):Попробуй для переменной satellites_ поменять тип с Integer на Uunsigned Long Integer
не помогло

Ответить

Вернуться в «Беспроводная, проводная связь»