# 📡 Радар присутствия HMMD (24 ГГц mmWave)

HMMD — миллиметровый радар: в отличие от PIR-датчиков (см. [PIR_sensor_AM312](../AM312)),
которые видят только резкое изменение теплового излучения, радар обнаруживает цель по отражению
собственного излучаемого сигнала (эффект Доплера) и различает не только движение, но и почти
неподвижного человека (дыхание) — физика в [THEORY.md](THEORY.md).

⚠️ **Протокол датчика не полностью подтверждён документацией** (официальная wiki Waveshare
недоступна из окружения разработки, независимые источники расходятся в формате) — драйвер
поэтому не отправляет радару никаких команд настройки и распознаёт оба вероятных формата вывода
(текстовый и бинарный). Подробности и как проверить свой экземпляр — [THEORY.md, раздел 3](THEORY.md#3-протокол--что-подтверждено-а-что-нет).

## 📋 Навигация

| Файл | Что внутри |
| :--- | :--- |
| [WIRING.md](WIRING.md) | Подключение по UART, таблица пинов |
| [THEORY.md](THEORY.md) | Физика радара, эффект Доплера, честный разбор протокола |
| [Lesson.md](Lesson.md) | Методический план урока для учителя |
| [PREZ.md](PREZ.md) | Презентация модуля — тезисы для урока |

## 🛠 Состав компонента

- [`include/HmmdRadar.h`](include/HmmdRadar.h) — интерфейс класса драйвера.
- [`src/HmmdRadar.cpp`](src/HmmdRadar.cpp) — приём UART, распознавание ASCII/бинарного формата.
- [`src/main.cpp`](src/main.cpp) — тестовый стенд: серийная диагностика, режим сырого HEX-дампа, встроенный LED-индикатор.
- [`tools/radar_view.py`](tools/radar_view.py) — визуализация радар-экрана в реальном времени (см. ниже).

## 🚀 Сборка и прошивка (PlatformIO)

```bash
cd Components/HMMD-mmWave
pio run -t upload && pio device monitor
```

По умолчанию UART2 на GPIO16 (RX)/GPIO17 (TX) — см. [WIRING.md](WIRING.md).

### Первый запуск на новом экземпляре датчика

1. Прошейте и откройте Serial Monitor (115200 бод).
2. Отправьте `r` — включится сырой HEX-дамп всех байт, приходящих от радара. Это подтверждает
   физическое подключение и позволяет увидеть реальный формат вывода вашего конкретного модуля.
3. Отправьте `r` ещё раз, чтобы вернуться в обычный режим — статус печатается каждые 0.5с:

```
[EMPTY]  зона свободна  формат=?     isAlive=1
[TARGET] дистанция=1.35 м формат=ASCII isAlive=1
```

`формат=ASCII` или `формат=BINARY(FD FC FB FA)` показывает, какой протокол реально распознан у
вашего датчика. `isAlive=0` означает, что от радара давно не было ни одного валидного кадра —
обрыв UART или неподтверждённый формат вывода (см.
[`HmmdRadar::isAlive()`](include/HmmdRadar.h#L54)).

## ⚙️ Настройки в коде

Зона контроля и удержание статуса задаются в конструкторе
([`main.cpp`](src/main.cpp#L13): `HmmdRadar radar(Serial2, kMaxDistanceM, kHoldTimeMs)`):
- `kMaxDistanceM` (по умолчанию 2.10 м) — показания дальше игнорируются.
- `kHoldTimeMs` (по умолчанию 2000 мс) — сколько ждать без валидных данных, прежде чем считать
  цель ушедшей из зоны (защита от дребезга на границе обнаружения, см. THEORY.md, раздел 4).

Настройка самой чувствительности/дальности радара HEX-командами в этой версии **не
выполняется** — см. [THEORY.md, раздел 3](THEORY.md#3-протокол--что-подтверждено-а-что-нет)
о том, почему.

## 🖥️ Наглядная визуализация (для демонстрации детям)

[`tools/radar_view.py`](tools/radar_view.py) рисует живой "радар-экран" в реальном времени:
сектор обзора ±60°, кольца дальности до 2.1 м, красная дуга — где сейчас цель. Датчик отдаёт
только дистанцию, без угла, поэтому дуга рисуется через весь сектор, а не точкой в
конкретном направлении — это честное отображение того, что реально измеряется (см.
[THEORY.md, раздел 3](THEORY.md#3-протокол--что-подтверждено-а-что-нет)).

```bash
cd Components/HMMD-mmWave/tools
pip install -r requirements.txt
python3 radar_view.py /dev/ttyUSB0   # порт как в pio device monitor
```

Прошивка должна быть в обычном режиме (не `r`/сырой дамп) и не занята другим Serial Monitor —
порт может слушать только одна программа одновременно.

## 🔧 Устранение неисправностей

- **Постоянно `isAlive=0`, дамп (`r`) пустой** — проверьте, что TX радара идёт на RX2 ESP32 и
  наоборот (частая ошибка — перепутать местами), питание 3.3В (не 5В).
- **Дамп (`r`) не пустой, но обычный режим не распознаёт `[TARGET]`/`[EMPTY]` осмысленно** —
  скорее всего, ваш датчик выдаёт бинарный формат (`формат=BINARY`), для которого декодирование
  точной дистанции ещё не реализовано (только факт обнаружения кадра) — см. THEORY.md.
- **`isAlive=1`, `формат=ASCII`, но всегда `[EMPTY]`** — цель может быть дальше `kMaxDistanceM`;
  попробуйте подойти ближе, в пределах 1 метра.
