Дачный логгер с GPS на Uno я собрал на SoftwareSerial: пины 2 и 3, модуль на заводских 9600. Пока скетч только слушал, координаты шли ровно; стоило добавить отладочную печать и зуммер — в NMEA начали выпадать байты, контрольные суммы перестали сходиться, и часть предложений приёмник молча выбрасывал. Механику цены байта для соседей мы считали в уроке про SoftwareSerial: программный порт принимает на прерываниях, и любая печать ему мешает. Тогда я перевёл логгер на Mega — и проблема ушла не потому, что Mega быстрее, а потому что у неё четыре настоящих UART.
Аппаратных портов у Mega четыре: Serial на пинах 0 и 1, он же USB через чип 16U2; Serial1 — приём RX1 на 19-м, передача TX1 на 18-м; Serial2 — 17 и 16; Serial3 — 15 и 14. У каждого своя скорость и собственная пара 64-байтных буферов, и друг о друге они не знают ничего: GPS капает на 9600 в один порт, отладка летит на 115200 в другой, и ни один байт не мешает соседнему. Разбор самих NMEA-предложений — тема урока про GPS и NMEA; здесь — раскладка по портам, проводам и именам.
Симулятор сайта второй порт не умеет: в движке один Serial, GPS-модулей там тоже нет, и это честное ограничение. Поэтому интерактив урока — модель деления потоков: два источника с разными темпами и команды-переключатели, чтобы руками почувствовать, что порт — это просто маршрут данных со своей скоростью. Скетчи ниже — настоящие, для настоящей Mega: компилируются и работают как написаны.
Четыре порта и их пины
Первый порт в скетче называется Serial — слова Serial0 в стандартном ядре нет, и путаница начинается прямо на именах. Классика из моих переписок в комментариях: модуль воткнут в пины 0 и 1 (логика подсказывает «это же первый порт»), а скетч читает Serial1 — то есть 19 и 18. Компилятор доволен, плата мигает, GPS молчит: его байты уходят в никуда, потому что на его пинах никто не слушает. Обратная расстановка ещё смешнее: отладочный лог на 115200 уезжает прямо в GPS-модуль, который такого темпа не ожидает и на команды не отвечает.
Распиновку стоит выучить или распечатать: RX1 — 19, TX1 — 18, дальше по убыванию Serial2 (17 приём, 16 передача) и Serial3 (15 и 14). Рядом с 19-м и 18-м лежат 20 и 21 — это не пятый UART, а SDA и SCL шины I2C: модуль часов туда сядет, GPS нет. Направление проводов — вечный источник молчания: подписи на модулях даны с их стороны, поэтому TX модуля идёт в RX платы и наоборот. Если плата только читает NMEA, ножку RX модуля можно вообще не вести — передача к GPS нужна лишь при его настройке командами.
Питание — по паспорту модуля: у NEO-6M на платке стоит стабилизатор, и ей всё равно, 5 вольт или 3,3; голый чип u-blox ест строго 3,3 В, и пять вольт на питание — это поход за новым модулем. Земля общая с платой всегда. Скорость — заводская 9600 у большинства модулей; у старых прошивок u-blox встречается 4800, и это первая проверка, когда модуль пищит светодиодом, а текста в мониторе нет.
| Плата | Порт | Пины | Роль в моих сборках |
|---|---|---|---|
| Mega | Serial | 0/1 + USB | прошивка и отладочный лог на 115200 |
| Mega | Serial1 | RX 19, TX 18 | GPS на 9600 |
| Mega | Serial2 / Serial3 | 17/16, 15/14 | Bluetooth, радио, запас под соседа |
| Leonardo | Serial / Serial1 | USB / 0 и 1 | Serial — виртуальный CDC, Serial1 — железо |
// Mega: TX модуля -> пин 19 (RX1), RX модуля -> 18 (TX1), GND общий.// Отладка и команды - в Serial (USB) на 115200.String stroka = ""; void setup() { Serial.begin(115200); // отладка: быстрая, чтобы не тормозить loop Serial1.begin(9600); // GPS: заводская скорость большинства модулей Serial.println("start: zhdu NMEA na Serial1");} void loop() { while (Serial1.available() > 0) { char c = Serial1.read(); if (c == '\n') { // конец предложения NMEA if (stroka.startsWith("$GPRMC")) { // отбор: статус и координаты Serial.print("RMC: "); Serial.println(stroka); } stroka = ""; } else if (c != '\r') { stroka += c; // копим байты предложения } } // Serial остаётся свободен для отладочных команд if (Serial.available() > 0) { String k = Serial.readStringUntil(10); k = k.trim(); if (k == "status") { Serial.println("chitayu Serial1, filtr GPRMC, log 115200"); } }}Заливка скетча с подключённым GPS — отдельная ловушка: пины 0 и 1 делятся между USB-чипом и загрузчиком, и NMEA-поток модуля на 9600 ломает прошивку с отчётом not in sync. Модуль в 0/1 я либо вынимаю на момент заливки, либо перевешиваю на Serial1 — ради этого порт и берут. Печать в Serial при этом ничего не ломает: USB-канал и Serial1 физически разные, в этом весь смысл раскладки.
Как искать молчащий модуль, если имена и пины сверены: сначала поменяйте местами TX и RX — на дешёвых модулях подписи даны со стороны модуля, и перепутанные ножки дают ровно те же симптомы, что битый модуль. Потом подождите: холодный GPS ищет спутники до одной-двух минут, под крышей фикс может не прийти вовсе — выносите сборку к окну. И только после этого грешите на модуль: по моей статистике, из десяти «мёртвых» GPS девять оживали на перепутанных проводах и повторе со скоростью 4800.
Про уровни и соседей — два коротких правила. Уровни: логика GPS-модуля трёхвольтовая, поэтому TX модуля читается платой напрямую (3,3 В — честная единица для пяти вольтовой логики), а вот TX платы в RX модуля идёт через делитель из двух резисторов — или не идёт вовсе, если плата только читает. Соседи: один порт — один собеседник; два модуля на один RX живут, пока говорят по очереди, а «пока» кончается быстро — разнося их по Serial1 и Serial2, вы платите нулём и никогда об этом не вспомните.
Когда Mega не нужна: один приёмник на 9600, передач редкая или нулевая, loop без единой delay — SoftwareSerial на Uno отрабатывает честно, я прожил с GPS-логгером на нём месяцами. Мой водораздел проходит по двум пунктам: соседей стало двое или приём выше 19200 — и я прекращаю воевать с прерываниями. Подробный разбор альтернатив, включая AltSoftSerial и NeoSWSerial, сделан в уроке про SoftwareSerial против железа; HC-05 с телефоном на 9600 мы подключали в уроке про Bluetooth.
На Mega программные порты мне не нужны вовсе: все четыре UART железные, и делить их не с кем. Правило, которое вывелось из этих экспериментов: порт — это канал с договором, скорость и роль фиксируются один раз. GPS — 9600 и только приём; отладка — 115200 и только в сторону человека; беспроводной сосед — на его заводской скорости, тот же принцип деления каналов мы применяли в мосту из двух плат, где одна говорила, вторая слушала. Спорное место правила — цена: б/у Mega стоит как пара HC-05, и иногда радио дешевле платы; считайте оба варианта до пайки.
Деление каналов: правило портов
В скетче выше стоит фильтр: в монитор уходит только $GPRMC, остальные предложения GPS молча съедаются. Полный NMEA-поток на 9600 — это сотни байт в секунду из шести-восьми предложений; сливать всё в отладочный канал можно, но искать координаты в простыне будет трудно. Правило деления то же, что и у портов: один канал — одна роль. При этом сами каналы не зависят друг от друга: можете погасить отладку командой dbg в модели и убедиться, что GPS-пакеты продолжают приходить ровно по расписанию.
Мой типовой набор на Mega к этому уроку сложился окончательный: Serial — прошивка и отладочный лог, Serial1 — GPS, Serial2 — Bluetooth или радио, Serial3 — запас под того соседа, который придёт в проект позже. Uno остаётся для сборок с одним соседом, а как проект дорастает до второго — берётся Mega или вторая плата. Спорить можно о цене и о том, нужна ли Mega вообще, когда есть ESP32 с тремя UART и радио на борту, — но это уже разговор следующего урока, а раскладку каналов он не меняет.
Последняя цифра — про темп чтения: NMEA-поток на 9600 это около 400 байт в секунду, и 64-байтный приёмный буфер Serial1 заполняется за 160 мс. Если loop жуёт дольше, байты начнут падать — читайте GPS каждым проходом цикла, как в скетче выше, и не ставьте delay никуда рядом. Тем же правилом проверяйте любые планы «спать по десять секунд между чтениями»: приёмный буфер не переживает сон, и координаты за время сна не накопятся — только свежий пакет после пробуждения.
- 1. На каких пинах сидит Serial1 у Arduino Mega?
- 2. GPS воткнут в пины 0 и 1, скетч читает Serial1. Что в мониторе?
- 3. Почему отладочная печать на 115200 не сбивает приём GPS на Serial1?
- 4. Когда SoftwareSerial на Uno оправдан вместо покупки Mega?
- 5. Что будет с заливкой скетча, если GPS продолжает говорить в пины 0/1?
- Mega: Serial на 0/1 и USB, Serial1 — 19/18, Serial2 — 17/16, Serial3 — 15/14
- 20 и 21 — это I2C (SDA/SCL), пятого UART между ними нет
- Первый порт зовут Serial: путаница с Serial1 = молчащий модуль на пинах
- TX модуля идёт в RX платы: подписи на модулях — с их стороны
- Порты Mega независимы: GPS на 9600 не мешает отладке на 115200
Частые вопросы по теме урока
- На каких пинах сидит Serial1 у Arduino Mega?
- RX1 — пин 19, TX1 — пин 18. Соседние 20 и 21 — это SDA и SCL шины I2C, к UART они отношения не имеют. Приём 19, передача 18
- GPS воткнут в пины 0 и 1, скетч читает Serial1. Что в мониторе?
- Скетч ждёт байты на пинах 19/18, а модуль говорит в 0/1. Компилятор при этом доволен — ловушка чисто в проводах и именах. Тишина: на пинах модуля никто не слушает
- Почему отладочная печать на 115200 не сбивает приём GPS на Serial1?
- У каждого UART своя пара буферов и своя скорость. Печать в Serial уходит через USB-чип и до пинов 19/18 физически не доходит — порты независимы. У портов раздельные буферы и независимая тактировка
- Когда SoftwareSerial на Uno оправдан вместо покупки Mega?
- Один тихий сосед на 9600 SoftwareSerial тянет честно. Два соседа или приём выше 19200 — повод взять Mega или вторую плату. Один приёмник на 9600, передач редкие, loop без delay
- Что будет с заливкой скетча, если GPS продолжает говорить в пины 0/1?
- Пины 0/1 делятся между USB-чипом и загрузчиком: NMEA-поток в RX0 валит прошивку с not in sync. Модуль вынимают или вешают на Serial1. Заливка сломается с отчётом not in sync