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

Создаем свой блок. Вопросы, помощь знатоков.
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
Лейтенант
Сообщения: 595
Зарегистрирован: 14.09.2015{, 22:29}
Репутация: 1
Откуда: Санкт-Петербург

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

#2

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

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

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

Давайте соберем пользовательский блок для 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();

  }
}
Вложения
CustomFields0_1.ino
(2.62 КБ) 123 скачивания
GPSNEO7_LAT-COD.ubi
(648.89 КБ) 101 скачивание
Последний раз редактировалось Ernesto 12.09.2016{, 08:45}, всего редактировалось 1 раз.

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

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

#5

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

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

Это я чисто по описанию библиотеки  дела, может тоже, что не так понял
Вложения
GPSNEO7_LAT_N.ubi
(669.06 КБ) 120 скачиваний

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 добавил вложением.
Вложения
GPS_test_0.1a.flp
(706.75 КБ) 127 скачиваний
Последний раз редактировалось Ernesto 12.09.2016{, 11:24}, всего редактировалось 1 раз.

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

Давайте соберем пользовательский блок для 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}
Репутация: 27
Откуда: Новосибирск

Давайте соберем пользовательский блок для 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}
Репутация: 27
Откуда: Новосибирск

Давайте соберем пользовательский блок для 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}
Репутация: 27
Откуда: Новосибирск

Давайте соберем пользовательский блок для 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}
Репутация: 27
Откуда: Новосибирск

Давайте соберем пользовательский блок для 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 приходят нулями
хотя код примера показывает данные по этим параметрам
Вложения
GPSNEO7_LAT-tes.ubi
(737.87 КБ) 111 скачиваний

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

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

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

Давайте соберем пользовательский блок для 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
не помогло

Ответить

Вернуться в «Разработка пользовательских блоков»