Skip to content

nRF24L01+ — беспроводной радиомост

Радиомост на паре модулей nRF24L01+ между двумя ESP32: одна плата в роли передатчика шлёт пакеты телеметрии, вторая принимает их через собственный прикладной класс NrfLink поверх библиотеки RF24.

nRF24L01+ — беспроводной радиомост между двумя ESP32

Компонент реализует радиомост на паре модулей nRF24L01+: одна ESP32 в роли передатчика (Transmitter) шлёт пакеты телеметрии, вторая в роли приёмника (Receiver) их принимает. Обмен идёт через готовую библиотеку RF24, поверх которой компонент даёт собственный прикладной класс NrfLink — подробнее о том, зачем нужен ещё один слой поверх уже готового драйвера чипа, см. THEORY.md.

Файлы

  • include/NrfLink.h / src/NrfLink.cpp — драйвер.
  • src/main.cpp — тестовый стенд с тремя ролями (передатчик/приёмник/тест железа).
  • tools/link_quality_view.py — живой график качества связи (см. раздел “Визуализация” ниже).
  • THEORY.md — физика радиоэфира 2.4 ГГц, Auto-ACK, лимиты payload.
  • WIRING.md — схема подключения (SPI).
  • Lesson.md — методический план урока для учителя.

Подключение (кратко)

nRF24L01+ESP32 (по умолчанию в main.cpp)
VCC3.3V
GNDGND
CEGPIO4
CSNGPIO27
SCKGPIO18
MISOGPIO19
MOSIGPIO23

Полная схема, включая важное примечание про конденсатор питания, — в WIRING.md.

Быстрый старт

Нужны две платы ESP32 с двумя модулями nRF24L01+.

  1. Собрать схему по WIRING.md на обеих платах.
  2. Прошить первую плату ролью передатчика: pio run -e transmitter -t upload.
  3. Прошить вторую плату ролью приёмника: pio run -e receiver -t upload.
  4. Открыть Serial Monitor на каждой (115200 бод) — передатчик покажет долю успешных подтверждений (AckRate), приёмник — принятые пакеты и оценочную задержку.

Если нужно просто проверить, что чип отвечает по SPI (без второй платы) — окружение по умолчанию: pio run -e test_hw -t upload.

Роли и окружения PlatformIO

ОкружениеРольПлата
test_hwПроверка присутствия чипа по SPI, без радиообменаesp32dev
transmitter / transmitter_s3 / transmitter_c6Передатчикesp32dev / esp32-s3 / esp32-c6
receiver / receiver_s3 / receiver_c6Приёмникesp32dev / esp32-s3 / esp32-c6

Если прошиваете обе платы с одного компьютера, PlatformIO может перепутать порты при автоопределении — как найти и закрепить свой порт, см. комментарий в platformio.ini.

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

Serial Monitor с текстовыми числами — не самый наглядный формат для группы учеников. tools/link_quality_view.py рисует живой график:

cd tools
pip install -r requirements.txt
python3 link_quality_view.py /dev/ttyUSB0 --role tx   # для передатчика
python3 link_quality_view.py /dev/ttyUSB0 --role rx   # для приёмника

На стороне передатчика хорошо видно, как разносится плата с приёмником (закройте антенну ладонью, отойдите подальше) — AckRate падает в реальном времени. Serial Monitor прошивки на момент запуска скрипта должен быть закрыт.

API драйвера

МетодНазначение
begin(role, address, channel, dataRate, paLevel)Инициализация SPI и настройка радиоэфира под выбранную роль.
sendTelemetry(TelemetryPacket)Отправка пакета (только Transmitter). false — Auto-ACK не получен.
receiveTelemetry(TelemetryPacket&)Приём пакета, если он есть (только Receiver).
getAckSuccessRate()Доля успешных подтверждений с момента begin().
isChipConnected()Прямая проверка присутствия чипа по SPI.
isAlive(timeoutMs)Была ли недавняя протокольная активность (отправка/приём).

Известные ограничения

  • У nRF24L01+ нет измерения настоящей силы сигнала (RSSI) — метрика качества связи здесь построена на проценте успешных Auto-ACK, см. THEORY.md.
  • Оценка задержки (DelayMs) на приёмнике не учитывает рассинхронизацию часов millis() двух независимых плат — годится для сравнения “быстрее/медленнее”, не для точного измерения времени в миллисекундах.
  • Максимальный размер пакета — 32 байта (аппаратный лимит чипа), проверяется на этапе компиляции через static_assert в NrfLink.cpp:15-16.