Проблема с GPS модулем GY-NEO6MV2

derungebundener

✩✩✩✩✩✩✩
18 Июл 2020
117
3
Прошу помощи по GPS модулю GY-NEO6MV2. Приобретался вот здесь:

Как я понял, это не оригинал от u-blox, а клон с некоторыми дополнениями. Одно из дополнений - возможность подачи питания 5 в. а также сигнала 5 в. тогда как оригинал требует исключительно 3.3 в.

Проблема заключается в том, что я не могу заставить его работать. Выражается это в следующем:

Сперва подключил его в соответствие инструкциям из интернета - vcc либо на 3.3, либо на 5 вольт; RX/TX на пины 3/4 - в примерах использовалась Software Serial - результата никакого не принесло.

Поначалу думал, что модуль приехал мёртвый - ибо даже при подключенном питании светодиод на нём и ни мигает, ни даже просто не горит.

После целого вечера в гугле, продвинулся чуть дальше - смог читать поступающие с модуля данные. То есть, это говорит о том, что хоть какая-то часть модуля, но, жива.
Для этого я arduino nano "переделал" в простой usb-uart переходник - закоротив GND и RESET, дабы ардуинка не "стучала" по этой шине. А RX/TX модуля подцепил на TX/RX ардуинки.

При подаче питания 3.3 в. видно вот такое: Screenshot from 2020-07-18 13-40-32.png
При переключении питания на 5 в. данные меняются: Screenshot from 2020-07-18 14-22-29.png

По случайно найденной документации:
понял, что проблема заключается в том, что модуль не видит спутники. В документации написано, что должен начать мигать светодиод, но он даже просто не светится.

По советам пробовал выносить его на балкон к окну и оставлять минут на 40 - не помогло.

Также грешил на то, что села встроенная батарейка. Но, модуль весь вечер подключен к питанию - давно бы зарядилась. Также мерил тестером - в районе 2.5 - 2.8 вольт на батарейке.

Пробовал подключать его к программе u-centr по той же методике - arduino nano с закороченными GND/RST, дабы использовать её как usb-uart переходник. Программа к порту как бы присоединяется, но, ничего не происходит.

В общем, даже не знаю, что делать. Покупать новый модуль? А где гарантия, что он будет рабочим? Да и во-вторых - вещь нужна сейчас, а новый будет ехать неизвестно сколько.

Грешу либо на полу-мёртвый модуль, либо же на мёртвую антенну.

Очень надеюсь на помощь, спасибо.
 
Изменено:
  • Лойс +1
Реакции: c0nstruct0r

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
А где у тебя лежит модуль с антенной ? где тесты делал. Что бы хоть как то определить положение мне пришлось модуль на окно класть как можно ближе к стеклу, что бы хоть пол неба было видно
 

derungebundener

✩✩✩✩✩✩✩
18 Июл 2020
117
3
А где у тебя лежит модуль с антенной ? где тесты делал. Что бы хоть как то определить положение мне пришлось модуль на окно класть как можно ближе к стеклу, что бы хоть пол неба было видно
Сейчас на ночь планирую вынести ноутбук и ардуинку с модулем на балкон.
До этого тестил внутри дома (пятиэтажка), а также выносил на полчаса на балкон, но, пришлось занести - слишком жарко было днём.

На счёт "пол неба" сомневаюсь - через дорогу стоит другой ряд пятиэтажек.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
Вот втором случае, при 5в , у тебя нормальные данные. Для "холодного" старта нужно какое то время. Пол неба конечно условно. нужно нормально ловить от 4-х спутников.
 

derungebundener

✩✩✩✩✩✩✩
18 Июл 2020
117
3
Как и ожидалось, ночь на балконе не помогла - всё без изменений.

Меня смущают две вещи:

Светодиод вообще не горит, хотя, судя по видео на Youtube, должен. Притом он рабочий, я проверял. Даже замерял сопротивление его резистора - всего 472 ома вроде как, то бишь не много.

Второе - у меня есть подозрения, что антенна тоже либо неисправна, либо модуль её не видит...

И ещё - я пробовал подключать модуль через программу u-center - соединение вроде как установлено по порту, но, программа модуль совершенно не видит, хотя текстовая консоль нормально получает те же текстовые данные. Есть идеи?
 

derungebundener

✩✩✩✩✩✩✩
18 Июл 2020
117
3
Оно заработало!!! (простите за эмоциональность)

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

Сейчас решил занести их обратно, ибо дело бесполезное, смотрю - а там нормальные данные пошли. И светодиод на модуле начал моргать красным.

Как думаете, что могло быть? У меня такие варианты:

А) Модуль действительно глючный и ему нужно очень много времени чтобы найти спутники.
Б) Более вероятный - батарейка действительно разрядилась за время дороги + хранения ранее. Где-то читал, что она на 3.3 вольта, а вчера замерял - было 2.5. Возможно, что из-за этого. И за ночь могла зарядиться. Позже надо будет замерить - те же 2.5 или уже в районе 3.3

P.S. Часть данных всё равно ещё с пропусками - видать спутников мало видит

P.P.S Стоило выключить и включить модуль, как данные снова пропали. Подожду минут 20, может чего появится.
 
Изменено:

derungebundener

✩✩✩✩✩✩✩
18 Июл 2020
117
3

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
если пустые, то не может определить - не может вычислить, значит не хватает данных.при видимости сколько спутников на небе ?
 

derungebundener

✩✩✩✩✩✩✩
18 Июл 2020
117
3
если пустые, то не может определить - не может вычислить, значит не хватает данных.при видимости сколько спутников на небе ?
А теперь уже ни сколько. С утра, вот, обрадовался, но, стоило только отключить модуль, как всё пропало. Сейчас переставил с балкона к окну, посмотрю, может чего снова найдёт.

А существуют ли какие-либо методики, чтобы проверить работоспособность антенны?
Открыть-то можно, но, что-то я побаиваюсь снимать защитный чехольчик.
 
Изменено:

derungebundener

✩✩✩✩✩✩✩
18 Июл 2020
117
3
Небольшое обновление:

Буквально через 20 минут стояния на подоконнике (вместо балкона ранее) сигнал появился, данные идут. Пока не смотрел, насколько полные.
Видимо, материал балкона тоже как-то блокирует сигнал.

Сейчас попробую "на лету", не отключая питания от модуля, прицепить его к скетчу (ардуинка сейчас работает как uart/usb с замкнутыми gnd/rst) и посмотреть, что покажет скетч

P.S. Согласно данным из скетча от библиотеки TinyGPS, видит 5 и иногда 6 спутников.
В сыром виде всё ещё присутствуют запятые, но, в скетче всё заполнено как надо.

Ну, на свой страх и риск попробую ради теста перезагрузить ардуинку и, следовательно, сам модуль - хочу узнать, найдет ли и как быстро спутники в этот раз.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
Выключение питания равносильно холодному старту, 20 минут вполне нормально. Для определения координат используются последовательные приближения и начальная точка задается одним китайцам ведом где. поэтому и 20 минут. По идее последние координаты должны быть в памяти модуля и новое определение должно быть относительно их.
Я плюнул на библиотеки и читал как сериал. Смотрел что надо.
Структура там интересная,в оной строке данные по, кажется, 4-м спутникам. строк может быть до 3 , т.е. всего до 12 спутников. если спутника не видно, то соотв будут запятые. Но строка может присутствовать. постояв по дольше у меня показывало 2-3 строки с данными о спутниках

В конечном виде, для себя, я остановился на отсеве строк с $GPGLL - координаты и время.
 

derungebundener

✩✩✩✩✩✩✩
18 Июл 2020
117
3
Я в этом деле новичок совсем - с ардуиной познакомился всего как 3 месяца назад.
Чем отличается холодный старт от горячего? Где можно про это подробнее почитать?

И ещё такой вопрос - я эту штуку хочу использовать на квадрокоптере. То есть, чтобы она работала, надо будет также подавать питание и выжидать те самые 20 минут и только потом лететь?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
Холодный - когда нет актуальных данных для GPS. Горячий по ресету ардуины, но данные храняться. там что то около минуты должно быть. Чем дальше сохраненные координаты от текущих тем дольше старт.

Где прочитать не знаю. Я когда то в институте это проходил мимо, в качестве ознакомления. Мы там выжимали миллиметровую точность , но для этого нужно было пару датчиков и час времени на точках + последующая обработка данных и учет дрейфа координат. привязка к ГАИШ МГУ )

Вопрос что хочешь сделать с этим. Координаты в течении дня меняются на одной точке метров до 30. но в течении 20 минут полета, ну пусть часа, вернуться можно будет достаточно точно. если же надо лететь по координатам, то конечную точку надо получать на момент старта, а не из сохраненных данных. Но опять же вопрос в точности.
В приведенном ниже скетче я считаю среднее значение географических секунд. С каким то интервалом. вроде 10 минут, для чего нужно 900 сек я уже не помню. Можно запустить и посмотреть

C++:
#include <SoftwareSerial.h>
char a[80];
uint32_t start_t;
uint32_t start_sum_t;
float l1 = 0;
float l2 = 0;
uint32_t n1 = 0;
uint32_t n2 = 0;
SoftwareSerial gpsSerial(8, 9); //номера пинов, к которым подключен модуль (RX, TX)
void setup() {
  // put your setup code here, to run once:
  gpsSerial.begin(9600); // установка скорости обмена с приемником
  Serial.begin(115200);
  start_t = millis();
}

void loop() {
  // put your main code here, to run repeatedly:
  if (gpsSerial.available())
  {


    byte n = gpsSerial.readBytesUntil(char(10), a, 80);
    //Serial.print(a);Serial.print("-");Serial.print(char(a));
    if (a[4] == 'L')
    {
     
        a[n] = char(10);
        for (int i = 0; i < n + 1; i++) Serial.print(a[i]);

                  byte chks = 0;
                  for (int i = 1; i < n - 4; i++) chks=chks xor byte(a[i]);
                  Serial.println(chks,HEX);
     
      char ss[10];
      String(a).substring(11, 17).toCharArray(ss, 6);
      float secunda = atof(ss) * 60.0;
      if (millis() - start_t > 600000)
      {
        l1 = l1 + secunda;
        n1++;
      }
      //Serial.print(String(a).substring(7, 9)); Serial.print(" "); Serial.print(String(a).substring(9, 11));
      if (millis() - start_t > 900000)
      {
        Serial.print("Среднее:"); Serial.println((float)l1 / n1);
      }
      else
      {
        Serial.print("L1:"); Serial.print(secunda);
      };
      String(a).substring(25, 31).toCharArray(ss, 6);
      secunda = atof(ss) * 60.0;
      if (millis() - start_t > 600000)
      {
        l2 = l2 + secunda;
        n2++;
      }
      //Serial.print(String(a).substring(20, 23)); Serial.print(" "); Serial.print(String(a).substring(23, 25));
      if (millis() - start_t > 900000)
      {
        Serial.print("Среднее:"); Serial.println((float)l2 / n2);
      }
      else
      {

        Serial.print(" L2:"); Serial.println(secunda);
      }
    }
  }
}

Кстати! в я уже написал выше про $GPGLL . Посмотри что при включении дает эта строка и посмотри на карте гугла где это
А так же сравнить координаты в работе , через какое то время, и сразу после включения.

У меня такой же модуль, только купленный в тридорога тут, его работа меня устраивает.
 
Изменено:

derungebundener

✩✩✩✩✩✩✩
18 Июл 2020
117
3
Брал координаты не сырые из строки, а уже обработанные скетчем - нормально, показывает буквально прямо на стену здания - то бишь на окно. Сейчас подожду некоторое время и сравню - сдвинется или нет.

Да, час - это весьма долгое время полёта, а за минут 15 точности вполне хватит.

Сейчас проверял - после отключения питания, если находиться возле окна, то спутники находит секунд через 15 после включения. При простом ресете ардуинки - практически сразу.


Меня теперь мучает другой вопрос - как заставить GPS нормально определяться в программе u-center. Если коннект есть, а также есть показания в текстовой консоли, то это говорит, что подключение нормальное. Однако, ни обновить прошивку, ни поменять настройки не могу - модуля как будто нет.
 

PavelAravin

✩✩✩✩✩✩✩
22 Июл 2020
3
0
Привет. Очень странный модуль, всё было ок, валялся без дела, время от времени проверялся на работоспособность, как дошло дело до сборки проекта в корпус так начались беды. Питаю от 4.75в.
Начал глючить, отваливались спутники каждые то есть штук 5-7 то 0, то опять 5-7 и через 2-3 секунды 0.
Позже вообще перестал принимать сигнал, только на горизонте появляется 1-2 спутника, так сразу пропадают что с антенной, что без неё. Коаксиал целый. Что такое с ним, хз.
 
Изменено:

derungebundener

✩✩✩✩✩✩✩
18 Июл 2020
117
3
А через Ucenter не пробовали менять настройки? Модуль кое-как заставил работать, но, настроек он не видит вообще.
 
  • Лойс +1
Реакции: PavelAravin

PavelAravin

✩✩✩✩✩✩✩
22 Июл 2020
3
0
Потихоньку понимаю, с простым скейчем работает ок, сигнал стабильный. Стоит только включить функционал, шим, sd карта, дисплей - пару секунд после старта и всё пропадает сигнал. Настройки мощности в u-centr не помогают. Видать наводка от чего то такая сильная что сигнал глушит. Кто феррит одевал - помогает?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
вот интересно..вся обработка идет на стороне модуля, в ардуину только передаются данные. если увеличить расстояние между модулем и ардуино ? я получал данные по проводу длиной в 4 метра.
 
  • Лойс +1
Реакции: PavelAravin

PavelAravin

✩✩✩✩✩✩✩
22 Июл 2020
3
0
вот интересно..вся обработка идет на стороне модуля, в ардуину только передаются данные. если увеличить расстояние между модулем и ардуино ? я получал данные по проводу длиной в 4 метра.
Я бы с радостью, но у меня компактное устройство
 

Вложения

derungebundener

✩✩✩✩✩✩✩
18 Июл 2020
117
3
вот интересно..вся обработка идет на стороне модуля, в ардуину только передаются данные. если увеличить расстояние между модулем и ардуино ? я получал данные по проводу длиной в 4 метра.
А как это поможет? Я немного потерял нить повествования...
Это омжет помочь заставить модуль слушаться настроек из UCentr?
 

derungebundener

✩✩✩✩✩✩✩
18 Июл 2020
117
3
12 Дек 2020
2
-2
Оформи код соответствующим тэгом
Здравствуйте. Приобрел аналогичный модуль https://roboparts.ru/catalog/datchiki/datchiki_navigatsii/smart-gnss-gps-glonass-modul-neo-m8n/. Подключил к arduino nano, как на схеме с сайта (только пины поменял на 3 и 4):9ae396d4ae768df97452a486c490e8f8.png
Напряжение на батарейке модуля 1,19 вольт. Если я правильно понял, у модуля получилось найти спутники (мигает красный светодиод), однако, координаты ардуино не получает.
После использования данной программы (пример simple_test из библиотеки 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 4(rx) and 3(tx).
*/

TinyGPS gps;
SoftwareSerial ss(3, 4);

void setup()
{
Serial.begin(115200);
ss.begin(4800);

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?
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);
if (chars == 0)
Serial.println("** No characters received from GPS: check wiring **");
}

в мониторе порта оказалось следующее:
1607790406680.png
Взяв пример test_with_gps_device из той же библиотеки

#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 4(rx) and 3(tx).
*/

TinyGPS gps;
SoftwareSerial ss(3, 4);

static void smartdelay(unsigned long ms);
static void print_float(float val, float invalid, int len, int prec);
static void print_int(unsigned long val, unsigned long invalid, int len);
static void print_date(TinyGPS &gps);
static void print_str(const char *str, int len);

void setup()
{
Serial.begin(115200);

Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
Serial.println("by Mikal Hart");
Serial.println();
Serial.println("Sats HDOP Latitude Longitude Fix Date Time Date Alt Course Speed Card Distance Course Card Chars Sentences Checksum");
Serial.println(" (deg) (deg) Age Age (m) --- from GPS ---- ---- to London ---- RX RX Fail");
Serial.println("-------------------------------------------------------------------------------------------------------------------------------------");

ss.begin(9600);
}

void loop()
{
float flat, flon;
unsigned long age, date, time, chars = 0;
unsigned short sentences = 0, failed = 0;
static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;

print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5);
print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5);
gps.f_get_position(&flat, &flon, &age);
print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6);
print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6);
print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
print_date(gps);
print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 7, 2);
print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2);
print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6);
print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0xFFFFFFFF : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON) / 1000, 0xFFFFFFFF, 9);
print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? TinyGPS::GPS_INVALID_F_ANGLE : TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
print_str(flat == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON)), 6);

gps.stats(&chars, &sentences, &failed);
print_int(chars, 0xFFFFFFFF, 6);
print_int(sentences, 0xFFFFFFFF, 10);
print_int(failed, 0xFFFFFFFF, 9);
Serial.println();

smartdelay(1000);
}

static void smartdelay(unsigned long ms)
{
unsigned long start = millis();
do
{
while (ss.available())
gps.encode(ss.read());
} while (millis() - start < ms);
}

static void print_float(float val, float invalid, int len, int prec)
{
if (val == invalid)
{
while (len-- > 1)
Serial.print('*');
Serial.print(' ');
}
else
{
Serial.print(val, prec);
int vi = abs((int)val);
int flen = prec + (val < 0.0 ? 2 : 1); // . and -
flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
for (int i = flen; i < len; ++i)
Serial.print(' ');
}
smartdelay(0);
}

static void print_int(unsigned long val, unsigned long invalid, int len)
{
char sz[32];
if (val == invalid)
strcpy(sz, "*******");
else
sprintf(sz, "%ld", val);
sz[len] = 0;
for (int i = strlen(sz); i < len; ++i)
sz = ' ';
if (len > 0)
sz[len - 1] = ' ';
Serial.print(sz);
smartdelay(0);
}

static void print_date(TinyGPS &gps)
{
int year;
byte month, day, hour, minute, second, hundredths;
unsigned long age;
gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
if (age == TinyGPS::GPS_INVALID_AGE)
Serial.print("********** ******** ");
else
{
char sz[32];
sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d ",
month, day, year, hour, minute, second);
Serial.print(sz);
}
print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
smartdelay(0);
}

static void print_str(const char *str, int len)
{
int slen = strlen(str);
for (int i = 0; i < len; ++i)
Serial.print(i < slen ? str : ' ');
smartdelay(0);
}

получил:
1607790715969.png
Если поменять пины RX и TX местами, какие-либо значения и вовсе пропадут:
1607791091948.png
Буду благодарен за любую помощь в решении проблемы.
 
  • Аррр! -2
Реакции: shtrlz

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
1) Код надо оформлять с использованием тега под код . в верхней части заголовка.
2) В 1-ом случае софт-сериал открывается на 4800, а надо 9600, эта скорость прописана даже есть по ссылке на модуль.
3) Внутри помещения спутники не будут ловиться. Надо что бы модуль был как минимум на окне.