Skip to content

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

Миллиметровый радар: в отличие от PIR-датчиков обнаруживает цель по отражению собственного излучаемого сигнала (эффект Доплера) и различает почти неподвижного человека — например, по дыханию.

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

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

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

📋 Навигация

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

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

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

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

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

По умолчанию UART2 на GPIO16 (RX)/GPIO17 (TX) — см. 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()).

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

Зона контроля и удержание статуса задаются в конструкторе (main.cpp: HmmdRadar radar(Serial2, kMaxDistanceM, kHoldTimeMs)):

  • kMaxDistanceM (по умолчанию 2.10 м) — показания дальше игнорируются.
  • kHoldTimeMs (по умолчанию 2000 мс) — сколько ждать без валидных данных, прежде чем считать цель ушедшей из зоны (защита от дребезга на границе обнаружения, см. THEORY.md, раздел 4).

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

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

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

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 метра.