Почему-то дико напоминает название кина: " Три билборда на границе Эббинга, Миссури" ахаха.
Кин кстати классный.
А можно скетч написать вообще не используя библиотеку SoftwareSerial.h и подключить к аппаратным пинам ?
конечно
Я бы:
- На одной плате ардуино перерезал дорожки tx rx от чипа usb-uart и прошивал её через другую, работающую в качестве программатора.
- Для общения с GPS в скетче использовал бы аппаратный UART.
- Через U-center поотключал бы вывод пакетов, которые мне не нужны и поднял скорость обмена до 115200 с сохранением настроек на самом модуле.
…
Оптимально отключить все пакеты NMEA (которых судя по логу 12 штук по умолчанию) и включить ОДИН пакет протокола UBX nav pvt - 100 байт, которые содержат всё что нужно…
всё конечно правильно, но как сказала одна личность - “чтобы взять эту ноту меня должны … второй раз”
п.1 Да.
п.2 Нет смысла ускорять неторопливый вывод GPS, 9600 за-глаза. (он принципиально не имеет более частой инфы)
(при копировании пункты сбились)
Спасибо за помощь все получилось заработало GPS приемник подключил к аппаратным RX TX . задержки конечно есть при движении но не значительные около секунды двух в будущем и пакеты отключить попробывать можно и скорость на приемнике поднять.
Да при прошивке GPS приемник нужно отключать с разьемов RX TX иначе прошивка не идет.
Интересно:
- почему при прошивке своим скетчем провод данных от GPS приемника подключаю к пину RX , а когда прошиваю пустым скетчем чтобы данные пошли в U-Centr нужно провод данных от GPS приемника подключать к пину TX?
- Подавляющее кол-во примеров в интернете с использованием SoftwareSerial.h и у всех как вроде работет . Я брал за основу эти примеры и нигде не упоминается что SoftwareSerial.h плохо работает. Либо я чтото неправильно делал или примеры в интернете не совсем рабочие?

Мой работающий скетч
#include <TinyGPSPlus.h> //Библиотека GPS модуля
TinyGPSPlus gps; //Создаём объект gps класса TinyGPSPlus.
int hour; // обЪявление переменной час
int GMT = 5; // обЪявление переменной часовой пояс
// Подключения дисплея
#include <Wire.h> // библиот для общения по I2C
#include <LiquidCrystal_I2C.h> // библиот работы с символьным жк-дисплеем по I2C
LiquidCrystal_I2C lcd(0x27, 20, 4); // Устанавливаем характеристики дисплея
void setup() {
Serial.begin(9600); //задаем скорость общения по USB
lcd.init(); // инициализация ЖК дисплея
lcd.backlight(); // Включаем подсветку дисплея
// Печатаем оформление на дисплее то что не меняется
lcd.clear(); //
lcd.print("Date");
lcd.setCursor(0, 1);
lcd.print("clock");
lcd.setCursor(0, 2);
lcd.print("spyt=");
lcd.setCursor(9, 2);
lcd.print("<=");
lcd.setCursor(0, 3);
lcd.print("H=");
lcd.setCursor(9, 3);
lcd.print("skor=");
delay(1000);
}
void loop() {
// This sketch displays information every time a new sentence is correctly encoded.
while (Serial.available() > 0) { // ПРОВЕРКА ЕСТЬ ЛИИ ДАННЫЕ в порте
if (gps.encode(Serial.read())) { // команда библиотеки TinyGPSPlus.h ОБРАБОТКА ДАННЫХ ИЗВЛЕЧЕНИЕ нужной информации
if (gps.date.isValid() && gps.time.isValid() && gps.satellites.isValid() && gps.altitude.isValid() && gps.course.isValid() && gps.speed.isValid() && gps.location.isValid()) {
// Дата печать
lcd.setCursor(6, 0); // Устанавливаем курсор на 5 строку и 1.
if (gps.date.day() < 10) lcd.print("0"); //печать 0 перед днем если меньше 10
lcd.print(gps.date.day()); // печать день
lcd.print(F("/"));
if (gps.date.month() < 10) lcd.print(F("0")); //печать 0 перед месяцом если меньше 10
lcd.print(gps.date.month()); // печать месяц
lcd.print(F("/"));
lcd.print(gps.date.year()); // печать год
lcd.setCursor(7, 1); // Устанавливаем курсор на 5 строку и 1.
hour = gps.time.hour() + GMT; // расчет переменной час с учетом часового пояса
if (hour > 23) hour = hour - 24; // Вычитаем 24 когда часы переходят за 23 часа
if (hour < 10) lcd.print("0"); //печать 0 перед часом если меньше 10
lcd.print(hour); // печать часа
lcd.print(F(":"));
if (gps.time.minute() < 10) lcd.print(F("0")); //печать 0 перед часом если меньше 10
lcd.print(gps.time.minute()); // печать минут
lcd.setCursor(6, 2);
lcd.print(gps.satellites.value()); //кол-чество спутн
lcd.setCursor(2, 3);
lcd.print(gps.altitude.meters()); //Высота
lcd.setCursor(12, 2);
lcd.print(gps.course.deg()); //Угол направления
lcd.setCursor(14, 3);
lcd.print(gps.speed.kmph());
} else {
lcd.setCursor(6, 0);
lcd.print(F("--"));
}
}
}
}
потому что при прошивке данные идут от порта компьютера в процессор, а при выдаче команд (а не “прошивки”) данные от компьютера идут в модуль GPS.
Он использует много ресурсов процессора, поэтому может сбиваться если процессор занят другими быстрыми делами. При прочих равных его использовать нежелательно.
Особенно когда на скорости 9600 летит 660 байтов по 10 бит на байт занимая ~70% пооцессорного времени …
Что то не понял. когда я использую свой скетч то данные с GPS приемника идут в ардуино она обрабатывает и передает на дисплей. А когда я использую пустой скетч то данные вроде также идут с GPS через ардуино в программу U-Centr которая отображает геолокацию(кстати если открыть порт при этом в программе Arduino IDE там также отображается поток данных с GPS приемника) . Вроде одно и тоже но провод данных с GPS призодится перекидывать на контактах ардуино RX TX
Вы даже можете просто отпаять 328P !!!
Работает только чип usb-uart.
Получается когда работает чип 328P Контакты RX иTX меняются местами? ![]()
Нет на TX коллизии от gps и 328p
Я не правильно сформулировал не при прошивке своим скетчем а при работе на моем скетче.
328p шлёт в Tx и GPS шлёт в Tx
Usb-uart не понимает что это и ничего не отображает
Без 328 данные от gps идут в usb-uart и в ББ
Для работы скетча надо данные от gps принииать в 328 на его Rx и выводить их на дисплей, не выводя в сериал !!!
Но при заливке прошивкеи gps будет мешать - надо его в этот момент отцеплять !!!
Вроде начинает усваиваться принцип работы.
но как так Подавляющее кол-во примеров в интернете с использованием SoftwareSerial.h и у всех как вроде работет . Я брал за основу эти примеры и нигде не упоминается что SoftwareSerial.h плохо работает. Либо я чтото неправильно делал или примеры в интернете не совсем рабочие? ![]()
Можно изменить код:
…
while (Serial.available() > 0) {
Serial.write(Serial.peek());
if (gps.encode(Serial.read()))
…
Тогда будет и дисплей показывать и u-center сможет принимать данные от gps !!!
Другой вывод информации в Serial надо Исключить !