# 🛰️ GPS NEO Модуль для STEM Лаборатории

Проект для работы с GPS модулем NEO-6M/7M/8M на ESP32. Программа читает "сырые" NMEA-данные со спутников, проверяет их по контрольной сумме и выводит понятный статус связи/спутников/координат в консоль.

## 📋 Документация проекта

| Файл | Что внутри | Кому |
|---|---|---|
| [GUIDE.md](GUIDE.md) | Учебное пособие: протокол NMEA, разбор кода построчно, диагностика, самопроверка | Изучаешь проект впервые |
| [WIRING.md](WIRING.md) | Схема подключения модуля к ESP32 | Собираешь железо |
| [ROADMAP.md](ROADMAP.md) | Куда развивать проект: автономный ровер по GPS-координатам | Хочешь пойти дальше |

## Описание

Проект демонстрирует базовую работу с GPS на уровне, который понятен и пятикласснику, и старшекласснику:

- Чтение и побайтовый разбор строк NMEA 0183.
- Проверка каждой строки по контрольной сумме (отсев "битых" пакетов).
- Подсчёт спутников, видимых каждой системой (GPS/BeiDou/GLONASS/Galileo) — с суммированием по всем созвездиям.
- Определение статуса Fix (есть ли валидные координаты) и числа спутников, реально использованных в расчёте.
- Разбор координат, скорости, курса (из `$..RMC`) и высоты/точности HDOP (из `$..GGA`) в десятичные градусы и метрические единицы.
- Watchdog связи: чёткое сообщение в консоли, если модуль физически не отвечает (обрыв проводов/питания), а не просто "тишина".

## Программная архитектура

Один класс-драйвер, без обёрток и фасадов — стандартный паттерн для всех компонентов этого репозитория (см. `Components/2.MPU6050`):

| Файлы | Что внутри |
|---|---|
| `include/GpsNeo.h`, `src/GpsNeo.cpp` | Класс `GpsNeo`: парсинг RMC/GGA/GSV, проверка checksum, watchdog связи. Публичный API компактный (`begin()`, `process()`, `hasFix()`, `getPosition()`...), поэтому отдельного упрощённого слоя не требуется. |
| `src/main.cpp` | Тестовый стенд: создаёт единственный экземпляр `GpsNeo gps(Serial2)` и выводит диагностику — связь → данные → спутники → координаты. |
| `tools/gps_track_view.py` | Живой визуализатор трека движения (см. раздел "Визуализация" ниже). |

Разбор того, как это устроено внутри — в [GUIDE.md](GUIDE.md#как-код-разбирает-строку).

## Работа через CLI

```bash
cd "Components/1.GPS_NEO_6-8"
pio run -t upload && pio device monitor
```

> Если прошивка падает с ошибкой `chip stopped responding` — снизь `upload_speed = 115200` в `platformio.ini`, закрой Serial Monitor перед прошивкой.

> Окружение `esp32c6` в текущей версии не собирается (конфликт макроса `Serial`/`USBSerial` в ядре Arduino для этой платы) — используй `esp32dev` или `esp32s3`.

## 📊 Визуализация

Голые числа `Lat:.../Lon:...` в консоли — не самый наглядный формат для группы
учеников. `tools/gps_track_view.py` рисует накопленный трек движения в реальном
времени в метрах от точки старта:

```bash
cd tools
pip install -r requirements.txt
python3 gps_track_view.py /dev/ttyUSB0
```

Работает полностью офлайн (относительная проекция, см.
[GUIDE.md](GUIDE.md#21-как-ddmmmmmm-превращается-в-десятичные-градусы) про формат
координат и [ROADMAP.md](ROADMAP.md#21-расстояние--формула-гаверсинусов) про
приближение коротких расстояний). Если нужна подложка настоящей карты
(OpenStreetMap) и есть интернет — добавьте флаг `--map` (потребует
`pip install contextily`); без сети скрипт продолжит работу без подложки.

Serial Monitor прошивки на момент запуска скрипта должен быть закрыт — иначе
порт занят и Python не сможет его открыть.

---
*Примечание: для работы внутри помещения используйте внешнюю активную антенну или расположите модуль у окна с прямым видом на небо.*


## Связанные материалы

- [Пространство и положение](/docs/robotics/concepts/geometry/) — координаты,
  точка отсчёта, пересчёт в метры.
- [BeaconRadio](/docs/projects/beaconradio/) — проект на этом датчике: SOS-маячок
  с передачей координат, разбор NMEA и обнаружение GNSS-спуфинга.
- [GY-271](/docs/sensors/navigation/gy-271/) — GPS обновляется раз в секунду и
  «дрожит» на месте; компас даёт направление здесь и сейчас.
