Частота дискретизации MKR GPS Shield

sensors gps mkr1010

У меня есть MKR 1010, и я работаю над трассой, которая требует GPS-позиционирования в реальном времени. Я купил MKR GPS Shield и использую его на шине I2C (подключенной кабелем к плате 1010), а также использую библиотеку Arduino_MKRGPS в своем скетче.

В данный момент я пытаюсь ОЧЕНЬ просто взаимодействовать с платой и просто хочу распечатать GPS-координаты на серийный номер.

Я использую образец GPSLocation из библиотеки Arduino_MKRGPS (см. здесь):

 /*
GPS местоположение

Этот скетч использует GPS для определения местоположения платы.
и распечатывает его на серийный монитор.

Схема:
- плата МКР
- MKR GPS подключен через кабель I2C

Этот пример кода находится в общественном достоянии.
*/

#include <Arduino_MKRGPS.h>

недействительная установка () {
// инициализируем последовательную связь и ждем открытия порта:
Серийный.начать(9600);
пока (!Серийный) {
; // ждем подключения последовательного порта. Требуется только для родного порта USB
}

// Если вы используете MKR GPS в качестве щита, измените следующую строку на pass
// параметр GPS_MODE_SHIELD для функции GPS.begin(...)
если (!GPS.begin()) {
Serial.println("Не удалось инициализировать GPS!");
пока (1);
}
}

недействительный цикл () {
// проверяем, доступны ли новые данные GPS
если (GPS.доступно()) {
// читаем значения GPS
плавающая широта = GPS.широта();
плавающая долгота = GPS.longitude();
плавающая высота = GPS.altitude();
плавающая скорость = GPS.скорость();
целые спутники = GPS.satellites();

// вывести значения GPS
Serial.print("Расположение: ");
Serial.print(широта, 7);
Серийный.принт(", ");
Serial.println(долгота, 7);

Serial.print("Высота: ");
Serial.print(высота);
Serial.println ("м");

Serial.print("Скорость относительно земли: ");
Serial.print (скорость);
Serial.println(" км/ч");

Serial.print("Количество спутников: ");
Serial.println(спутники);

Серийный.println();
}

задержка(100);
}

Я вижу, что инициализация GPS занимает порядка 30–90 секунд, а затем предоставляет новые обновленные координаты только каждые 20–30 секунд. И все это при ясном виде неба.

Это действительно то, чего можно ожидать от этого модуля? У меня сложилось впечатление, что он может предоставлять несколько выборок в секунду. Документации для библиотеки Arduino_MKRGPS очень не хватает. У кого-нибудь еще есть идеи или опыт работы с этим модулем?

Спасибо!

, 👍1


1 ответ


Лучший ответ:

1

Похоже, проблема с GPS была вызвана тем, что я использовал метод задержки(...) Arduino в своем цикле.

Я предполагаю, что из-за задержки соединение с модулем GPS разрывалось, и, по сути, каждая петля приводила к повторному подключению и новой загрузке сведений о спутниках.

Итак, при необходимости взаимодействия с GPS с высокой частотой дискретизации использование задержки в скетче не сработает.

ИЗМЕНИТЬ:

С тех пор, как я впервые опубликовал этот вопрос/ответ, я много копал и хотел поделиться своими выводами для тех, кто изо всех сил пытается заставить GPS-модуль MKR работать с частотой дискретизации выше 1 Гц.

Мне пришлось внести следующие два изменения в библиотеку Arduino_MKRGPS:

  1. увеличить скорость передачи данных GPS-соединения. В самой последней строке GPS.cpp...
GPSClass GPS(Serial1, 460800, serialDDC, 400000, 7);
  1. В GPS.h сделайте метод sendUbx общедоступным членом класса GPS. Это позволяет мне отправлять низкоуровневые команды на SAM-M8Q из моего скетча.

После этого я могу создавать низкоуровневые сообщения в своем скетче и настраивать GPS по своему вкусу. Вот что я сделал, чтобы увеличить частоту дискретизации до 3 Гц в методе настройки моего скетча:

  Serial.println("Configuring GPS refresh rate...");

  // UBX-CFG-RATE (0x06 0x08) Настройки скорости навигации/измерения
  // См. UBX-13003221, раздел 32.10.23.1
  byte payload[6];

  memset(payload, 0x00, sizeof(payload));

  uint16_t measRate = 333;    // мс между публикацией данных GPS (мин. 100)
  uint16_t navRate  =   1;    // соотношение между измерениями и вычислениями навигационного решения
  uint16_t timeRef  =   1;    // Система времени, к которой привязаны измерения (0: UTC, 1:GPS, ...)

  // записываем беззнаковые шорты в форме с прямым порядком байтов
  payload[0] = measRate & 0xff;   
  payload[1] = (measRate >> 8) & 0xff;   
  payload[2] = navRate & 0xff;
  payload[3] = (navRate >> 8) & 0xff;
  payload[4] = timeRef & 0xff;
  payload[5] = (timeRef >>8) && 0xff;

  GPS.sendUbx(0x06, 0x08, payload, sizeof(payload));

  Serial.println("  > done");

Надеюсь, это поможет кому-то, кто борется с более высокими скоростями передачи данных. Я думаю, что еще есть возможности для улучшения, в частности, путем уменьшения количества предложений, возвращаемых GPS. Мне не удалось получить частоту дискретизации выше 5 Гц, хотя технически GPS должен работать на частоте 10 Гц. Я не знаю, где узкое место.

,

Можете ли вы опубликовать весь код. Задержка может вызвать некоторые проблемы, главным образом потому, что данные передаются в буфер, и предполагается, что они будут либо прочитаны, либо обработаны почти немедленно, в зависимости от размера буфера. Я проверил библиотеку, и пример I2C построен на библиотеке UART, и он может работать. С UART это обычно довольно просто, и вы должны иметь возможность видеть потоковые данные, поступающие от GPS несколько раз в секунду., @karan

Я отредактировал свой исходный пост, чтобы включить весь скетч. Это образец под названием «GPSLocation», включенный в библиотеку Arduino_MKRGPS, с простым добавлением оператора задержки в конце цикла., @HackySchmacky