Частота дискретизации MKR GPS Shield
У меня есть 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 очень не хватает. У кого-нибудь еще есть идеи или опыт работы с этим модулем?
Спасибо!
@HackySchmacky, 👍1
1 ответ
Лучший ответ:
Похоже, проблема с GPS была вызвана тем, что я использовал метод задержки(...) Arduino в своем цикле.
Я предполагаю, что из-за задержки соединение с модулем GPS разрывалось, и, по сути, каждая петля приводила к повторному подключению и новой загрузке сведений о спутниках.
Итак, при необходимости взаимодействия с GPS с высокой частотой дискретизации использование задержки в скетче не сработает.
ИЗМЕНИТЬ:
С тех пор, как я впервые опубликовал этот вопрос/ответ, я много копал и хотел поделиться своими выводами для тех, кто изо всех сил пытается заставить GPS-модуль MKR работать с частотой дискретизации выше 1 Гц.
Мне пришлось внести следующие два изменения в библиотеку Arduino_MKRGPS:
- увеличить скорость передачи данных GPS-соединения. В самой последней строке GPS.cpp...
GPSClass GPS(Serial1, 460800, serialDDC, 400000, 7);
- В 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 Гц. Я не знаю, где узкое место.
- Как подключить датчик MPU6050 к Arduino MKR WIFI 1010?
- Подключение экрана MKR GPS кабелем или в качестве экрана
- Подключение нескольких модулей I2C к микроконтроллеру последовательно или параллельно?
- GPS-модуль uBlox Neo 6M не отвечает
- Какова работа pulseIn?
- Сколько датчиков может поддерживать один модуль Arduino?
- Получение BPM из данного кода
- DS18B20 дает высокие показания. Как заставить его вернуть правильную температуру?
Можете ли вы опубликовать весь код. Задержка может вызвать некоторые проблемы, главным образом потому, что данные передаются в буфер, и предполагается, что они будут либо прочитаны, либо обработаны почти немедленно, в зависимости от размера буфера. Я проверил библиотеку, и пример I2C построен на библиотеке UART, и он может работать. С UART это обычно довольно просто, и вы должны иметь возможность видеть потоковые данные, поступающие от GPS несколько раз в секунду., @karan
Я отредактировал свой исходный пост, чтобы включить весь скетч. Это образец под названием «GPSLocation», включенный в библиотеку Arduino_MKRGPS, с простым добавлением оператора задержки в конце цикла., @HackySchmacky