Физические основы радиосвязи и практическая реализация NLOS-радиолинии на LoRa 433 МГц

Что содержится в статье ⌄
  • Создание электромагнитной волны переменным током и электронами
  • Почему 433 МГц пробивает бетон лучше классического Wi-Fi на 2.4 ГГц
  • Линейно-частотная модуляция (CSS) и принцип работы чирпов
  • Влияние параметров Spreading Factor (SF), BW и CR на дальность и скорость передачи
  • Выгорание усилителя при отсутствии антенны и коэффициент стоячей волны (КСВ)
  • Просадки напряжения (Brownouts) и аппаратный метод локализации сгоревшего кремния
  • Подключение чипа SX1278 по шине SPI к платам ESP32 и Raspberry Pi Pico 2W
  • Практический анализ RSSI и пробитие 140 метров городской застройки (NLOS)

Введение

В этой статье мы решим практическую задачу – передача сигнала на расстояние в 140 метров в условиях отсутствия прямой видимости (NLOS – Non-Line-of-Sight) сквозь плотную застройку и железобетонные перекрытия.

Для решения такой задачи отлично подходит технология LoRa (Long Range) – метод радиомодуляции, разработанный для передачи небольших объемов данных при крайне низком энергопотреблении и высокой помехоустойчивости.

В этой статье мы разберем теорию радиофизики, принципы работы модуляции LoRa, а также соберем передающее и принимающее устройства на базе плат ESP32, Raspberry Pi Pico 2W и чипов SX1278.


Радиофизика. От электрона к радиоволне

Любая радиопередача начинается с переменного тока. Чип SX1278 генерирует высокочастотный переменный ток с частотой 433 МГц и подаёт его на антенну.

Антенна - это просто металлический проводник. В любом металле есть свободные электроны. Под действием переменного напряжения они начинают колебаться туда-обратно с той же частотой 433 МГц.

Здесь начинается фундаментальная физика.

С точки зрения классической физики

Любой движущийся электрический заряд создаёт вокруг себя магнитное поле. Поскольку электроны в антенне постоянно меняют направление, это магнитное поле тоже постоянно меняется (пульсирует).

Согласно законам электромагнетизма (уравнениям Максвелла):

  • Изменяющееся магнитное поле порождает электрическое (закон Фарадея).
  • Изменяющееся электрическое поле порождает магнитное (дополнение Максвелла).

Эти два пульсирующих поля цепляются друг за друга, взаимно поддерживают себя и в какой-то момент отрываются от антенны. Они улетают в пространство со скоростью света. Это и есть электромагнитная волна.

Процесс работает в точности наоборот. Когда эта электромагнитная волна достигает приёмной антенны, её изменяющееся электрическое поле начинает “толкать” свободные электроны в металле. Электроны приходят в движение с той же самой частотой – 433 МГц.

В приёмной антенне возникает микроскопический переменный ток (наводка). Трансивер считывает этот крошечный ток, пропускает через усилитель (LNA, Low Noise Amplifier) и демодулирует обратно в цифровые нули и единицы.

С точки зрения квантовой физики

В квантовом мире любое изменение скорости или направления движения заряда сопровождается излучением. Движущийся с ускорением электрон излучает фотон – элементарную частицу, квант электромагнитного поля. Именно фотоны переносят энергию через пространство.

Итак, никакой магии: каждый раз, когда электрон в антенне меняет направление движения, он излучает фотон; фотоны летят от передатчика к приёмнику со скоростью света.

При этом радиоволна, инфракрасное излучение, видимый свет и рентген – физически одно и то же. Это всё поток летящих со скоростью света фотонов.

Фотон – квантовый объект (корпускулярно-волновой дуализм). Он ведёт себя как частица в момент излучения и поглощения, и как волна в процессе полета. В радиосигнале фотонов так много (квинтиллионы штук в секунду), что на макроуровне они сливаются в непрерывную волну. Как отдельные молекулы H₂O сливаются в единую гладь озера.

Единственное отличие радио от света – это энергия фотонов. Она жестко связана с частотой формулой Планка: $$ E = hf $$

где $h$ – постоянная Планка, а $f$ – частота.

Откуда фотон берёт эту частоту? От источника, который его породил. Электрон в антенне колебался с частотой 433 МГц → он породил фотон с энергией, точно соответствующей 433 МГц.

Можно разделить: фотон 433 МГц – радиоволна, фотон ~500 ТГц – видимый свет, ещё выше – рентген. Один и тот же объект, просто разные энергии.

Частота фотона – это не абстрактная математическая замена. Электрическое и магнитное поля, которые несет с собой эта частица, реально осциллируют 433 миллиона раз в секунду.

Фотоны достигают металла приёмной антенны и поглощаются её свободными электронами, передавая им свою энергию. Энергия одного радиофотона ничтожно мала, но поскольку от передатчика летит гигантская когерентная волна таких частиц, их суммарный удар заставляет миллиарды электронов в приёмнике синхронно качнуться. Возникает ток, который и регистрирует чип.


Длина волны и физика препятствий

Ключевая характеристика любой электромагнитной волны – её частота ($f$). Она жестко связана с длиной волны ($\lambda$) через скорость света ($c$).

Формула проста: $$ \lambda = \frac{c}{f} $$

Рассчитаем длину волны для двух популярных нелицензируемых диапазонов (ISM) – Wi-Fi (2.4 ГГц) и LoRa (433 МГц).

Для удобства используем скорость света в мегаметрах в секунду (~300), чтобы частоту в мегагерцах можно было подставлять напрямую:

  • 2.4 ГГц (Wi-Fi, Bluetooth): $300 / 2400 = 0.125$ м (12.5 сантиметров).
  • 433 МГц (LoRa, брелки): $300 / 433 \approx 0.69$ м (69 сантиметров).

Именно длина волны определяет, как сигнал будет вести себя при встрече с препятствиями. В радиофизике работает правило: радиоволна способна эффективно огибать препятствия (дифракция), размер которых сопоставим или меньше половины её длины.

  • Волна 2.4 ГГц с длиной 12.5 см затухает из-за трубы или кирпича. Она отражается от них или поглощается материалом (особенно бетоном, содержащим влагу), быстро теряя энергию. Именно поэтому домашний Wi-Fi часто глохнет за двумя несущими стенами.

  • Волна 433 МГц с длиной почти 70 см ведет себя совершенно иначе. Она способна огибать трубы, металлические профили и крупную сетку из арматуры внутри железобетонных конструкций. Для такой волны стена здания представляет собой полупрозрачную среду, а не глухое зеркало.

Но даже с хорошей проникающей способностью на 433 МГц мы сталкиваемся с другой проблемой. В цехах, на подстанциях и среди плотной городской застройки (наши целевые 70 метров NLOS) сигнал редко идет по прямой линии.

Из-за обилия металлоконструкций и шкафов автоматики радиоволна многократно отражается от поверхностей. Возникает эффект многолучевого распространения (Multipath Propagation).

В приемную антенну приходит не один чистый сигнал, а сразу несколько его копий, отраженных от разных стен и столбов. Эти копии приходят с микроскопическими задержками во времени. В традиционных системах связи (например, в дешевых 433 МГц пультах от ворот с ASK/FSK модуляцией) эти отражения накладываются друг на друга в противофазе и гасят полезный сигнал.

Возникает многолучевое затухание (Multipath Fading). Чтобы сигнал не просто прошел сквозь перекрытия, но и был корректно расшифрован приемником в условиях жестких отражений и радиошума, требуется особый подход к кодированию информации в волне.

И здесь есть решение – модуляция LoRa.


Линейно-частотная модуляция LoRa

Большинство классических цифровых радиоканалов (например, те же пульты от ворот или простые телеметрические датчики) используют частотную модуляцию (FSK).

Грубо говоря: передатчик излучает на частоте 433.05 МГц – это логический 0, переключается на 433.15 МГц – это логическая 1. Эта схема проста, но крайне уязвима к шуму и отражениям (тому самому многолучевому затуханию).

Технология LoRa пошла другим путем. В её основе лежит модуляция CSS (Chirp Spread Spectrum – линейно-частотная модуляция).

Chirp Spread Spectrum – линейно-частотная модуляция

Вместо того чтобы скакать между двумя фиксированными частотами, LoRa генерирует чирпы (Chirps). Чирп – это радиосигнал, частота которого непрерывно увеличивается (Up-chirp) или уменьшается (Down-chirp) с течением времени, “размазывая” энергию по всему выделенному каналу.

LoRa кодирует данные в начальной точке чирпа. Чирп всегда проходит весь канал целиком, но начинает он не всегда с одного и того же места.

Если бы мы могли услышать LoRa ушами, это было бы похоже на завывание полицейской сирены – звук, который плавно меняет тональность от низкой к высокой.

Скажем, LoRa использует полосу от 430 до 431 МГц. Это линейка 1 МГц шириной. Бит зашит в точке старта. Например:

  • Старт с 430 МГц → это “0”
  • Старт с 430.5 МГц → это “1”

Если чирп стартует с середины линейки и бежит вправо – он доходит до правого края (431 МГц), прыгает на левый край (430 МГц) и добегает оставшееся расстояние до точки старта.

Но стартовых позиций много! Поэтому один символ (чирп) кодирует больше, чем один бит. За это отвечает SF – Spreading Factor

  • Если мы поделим полосу на 2 позиции → то один символ (чирп) будет передавать 1 бит информации
  • 4 позиции → 2 бита информации
  • 8 позиций → 3 бита
  • 128 позиций → 7 бит (это SF7)
  • 4096 позиций → 12 бит (это SF12)

То есть количество позиций (чипов – от англ. chip, элемент сигнала в теории связи, не путать с микросхемой и чирпами), на которые делится полоса: $N = 2^n$.

Человеческое ухо способно выделить звук сирены даже в очень шумной толпе именно из-за её непрерывного изменения. Точно так же приемник LoRa способен распознать математически правильный чирп даже тогда, когда он находится ниже уровня фонового радиошума (отрицательный SNR – Signal-to-Noise Ratio).

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

Чем выше SF, тем медленнее передаются данные, потому что приемник должен смочь вычислить стартовую позицию чирпа по его сдвигу среди других (угол “наклона” у них всех одинаковый). Поэтому чем больше стартовых позиций, тем дольше приемнику нужно наблюдать за каждым чирпом – чтобы накопить больше энергии для математического фильтра и не перепутать соседние куски в условиях шума.

Но у этого есть огромный плюс: с возрастанием SF увеличивается проникающая способность сигнала и дальность передачи. Длинный чирп позволяет приемнику накопить больше энергии сигнала и “вытянуть” данные из непроглядного радиошума.


Кадр LoRa (PHY Frame) и накладные расходы

Чтобы два устройства могли общаться, одних чирпов мало. Их нужно упаковать в стандартизированный пакет – физический кадр (PHY Frame). Независимо от того, передаем мы массивный JSON или всего один байт (например, команду 0x01 для замыкания реле), структура кадра остается неизменной:

  1. Преамбула (Preamble): серия базовых Up-chirps. Это громкий крик в эфир – сигнал приемнику просыпаться. Это нужно для синхронизации часов приемника и передатчика.
  2. Заголовок (Header) и CRC заголовка: содержит метаданные – длину полезной нагрузки и информацию о кодировании.
  3. Полезная нагрузка (Payload): сами данные.
  4. CRC: контрольная сумма проверки целостности. Если отражения в эфире всё-таки повредили бит, кадр будет отброшен.

То, сколько именно времени займет передача кадра, определяется “треугольником компромиссов” LoRa.


Треугольник компромиссов: SF, BW и CR

Настраивая радиоканал, мы оперируем тремя ключевыми параметрами, которые напрямую влияют на скрытность и дальнобойность:

  • Bandwidth (BW – Ширина канала): диапазон частот, по которому “размазывается” чирп. Обычно это 125 кГц, 250 кГц или 500 кГц. Чем шире канал, тем быстрее передаются данные, но тем ниже чувствительность приемника.
  • Coding Rate (CR – Скорость кодирования): уровень избыточности (FEC - Forward Error Correction). При CR 4/8 на каждые 4 бита данных передается 4 бита восстановления. Это спасает кадр при помехах, но увеличивает длину пакета.
  • Spreading Factor (SF – Фактор расширения спектра): Самый важный параметр для OPSEC. Он принимает значения от SF7 до SF12 и определяет крутизну (скорость) нашего чирпа.

При увеличении SF на один шаг (например, с SF7 до SF8), время передачи каждого символа удваивается:

SF7: Быстрые чирпы. Сигнал короткий, экономит батарею, сложнее засечь радиосканером, но дальность связи минимальна (плохо пробивает бетон).

SF12: Медленные, тягучие чирпы. Гораздо большая пробивная способность, сигнал демодулируется даже из-под плотного шума. Однако передача 10 байт на SF12 может занять целую секунду – в мире радиоразведки это сияние сродни сигнальному костру.


Особенности работы с радиочастотным оборудованием

Работа с радиопередающим оборудованием, включая модули на базе SX1278, требует соблюдения ряда аппаратных ограничений, требований монтажа и эксплуатации, поскольку ошибки могут приводить к ухудшению характеристик или повреждению оборудования.

Электродинамика антенн и КСВ (VSWR)

Главное правило: никогда не подавать питание и не инициировать передачу (TX) на модуле, к которому не подключена антенна.

Если снять антенну с LoRa-передатчика и запустить скрипт отправки пакета – есть высокая вероятность повреждения кремниевого чипа.

Почему так происходит? Ответ кроется в параметре, который называется КСВ (Коэффициент стоячей волны) или VSWR (Voltage Standing Wave Ratio).

Когда чип SX1278 формирует пакет, его встроенный усилитель мощности (PA – Power Amplifier) накачивает высокочастотный переменный ток и отправляет его по дорожке платы к антенному выходу.

Антенна в этой системе выполняет роль “согласующего трансформатора” между проводником и свободным пространством. Если антенна подключена и её длина идеально соответствует длине волны (433 МГц), почти вся энергия уходит в эфир в виде фотонов. КСВ в идеале равен 1.0.

Но если антенны нет, сопротивление на конце цепи становится бесконечным (обрыв). Электромагнитной энергии некуда деться. Происходит физическое отражение: вся мощность, которую усилитель толкнул вперед, отскакивает от пустого разъема и возвращается обратно в кристалл чипа в виде отраженной (стоячей) волны.

Но если из стены дома торчит фаза, почему на подстанции ничего не выгорает? Напряжение там есть, но тока нет – потому что нет замкнутой цепи. Генератор на подстанции просто ничего не толкает в этот провод. Он толкает только туда, где есть нагрузка. Генератор не давит энергию в пустоту.

Но в случае радиопередатчика все иначе. Передатчик – это не пассивный источник напряжения. Это усилитель, который активно качает энергию, независимо от того, что на конце. Он уже разогнал электроны, уже создал волну в кабеле – и эта волна летит вперёд.

Дальше она доходит до пустого разъёма, отражается и летит обратно. Приходит на выходной транзистор чипа – маленький, рассчитанный ровно на свою нагрузку – и добавляется к тому, что тот уже генерирует. Напряжение на транзисторе скачет выше максимума. Транзистор горит.

Кстати, длина волны при 50 Гц – 6000 километров. Провод в два метра для неё просто не существует как антенна или линия передачи. Никаких отражений, никаких стоячих волн.

Проблемы с питанием (Brownouts)

Вторая классическая проблема – нестабильное питание. В режиме приема (RX) или глубокого сна (Deep Sleep) чип LoRa потребляет микроамперы. Но в момент передачи кадра (TX) на максимальной мощности потребление может резко прыгнуть до 120-150 мА.

Если модуль SX1278 питается длинными тонкими проводами DuPont от пина 3.3V платы ESP32 или Raspberry Pi, этот резкий скачок тока может вызвать кратковременную просадку напряжения (Voltage drop).

Если напряжение опускается ниже порога Brownout Detector, ESP32 выполняет аппаратный сброс. Внешне это может выглядеть как зависание программы на отправке пакета, хотя фактически происходит перезагрузка микроконтроллера.

Если просадки особенно глубокие, проблема проявляется ещё раньше: чип не доходит до передачи вообще – программа зависает на инициализации чипа SX1278.

Решения:

  1. Использовать источник питания с достаточным запасом по току, а также короткие и низкоомные линии 3.3V и GND.
  2. Установить конденсатор ёмкостью 100-470 мкФ непосредственно рядом с модулем LoRa. Во время кратковременных пиков потребления конденсатор выступает локальным накопителем энергии и уменьшает просадку напряжения на линии питания.
Аппаратная отладка: смена ролей

Как понять, что правило КСВ было нарушено и чип сожжен? Самое неприятное в выгорании усилителя (PA) то, что внешне модуль выглядит абсолютно рабочим. Он успешно инициализируется по шине SPI, микроконтроллер пишет “LoRa OK”, но пакеты до приемника не долетают даже с небольшого расстояния.

Это происходит потому, что в чипе SX1278 тракты приема и передачи разделены. Сгорает только усилитель мощности на передачу (TX). Малошумящий усилитель на прием (LNA) при этом остается жив.

Метод локализации неисправности

При наличии двух модулей работоспособность передающего и приёмного трактов можно проверить раздельно. Для этого следует настроить заведомо исправный модуль на передачу, а тестируемый – на приём. Если тестируемый модуль стабильно принимает пакеты, но не способен передавать их при корректной конфигурации и исправной антенне, это указывает на возможную неисправность передающего тракта.

В таком случае модуль может использоваться только в качестве приёмника либо подлежит замене.


Сборка радиомоста на ESP32 и RPI Pico 2W

Переходим к практической реализации. Система состоит из двух узлов: передатчика и приемника в 70 метрах за бетонными стенами. В качестве вычислительных ядер используются платы ESP32 и Raspberry Pi, а радиоканалом управляют модули LoRa Ra-02 на базе чипа SX1278.

Image

Архитектура и подключение (SPI)

Трансивер SX1278 общается с микроконтроллером по классической высокоскоростной шине SPI (Serial Peripheral Interface).

Мы подробно разбирали шину SPI в одной из предыдущих статей. В классическом виде она состоит из 4-х проводов: SCK, MOSI, MISO и CS.

Подробнее про каждый из контактов
  1. SCK (Serial Clock): тактовый сигнал. Это метроном. Им управляет только Master. Он задает ритм всей системе. Один такт – один переданный бит.

  2. MOSI (Master Out, Slave In): линия передачи от Master. По этому проводу данные летят от главного процессора к периферии (например, мы шлем картинку на дисплей). В современных чипах часто пишется как SDO (Serial Data Out) на стороне мастера и SDI (Serial Data In) на стороне периферии.

  3. MISO (Master In, Slave Out): линия ответа от периферии. По этому проводу данные летят от датчика обратно к главному процессору.

  4. CS (Chip Select) или SS (Slave Select): выбор кристалла. Это индивидуальный провод управления (или провод-селектор). Он нужен для того, чтобы показать конкретному чипу, что мы сейчас будем с ним говорить. Обычно он инвертированный (работает по нулю). Пока на линии CS логическая 1 (высокое напряжение) – чип спит и игнорирует шину. Master опускает линию в 0 – чип просыпается.

Помимо четырех стандартных пинов SPI, нужны еще:

  • DIO0 (Digital I/O 0): линия аппаратных прерываний. Вместо того чтобы постоянно опрашивать модуль в цикле, микроконтроллер может спать или заниматься своими делами. Как только SX1278 успешно демодулирует кадр и проверит CRC, он дергнет пин DIO0, вызывая прерывание в ESP32/RPI.

  • 3.3V: питание. Необходимо обратить внимание, что устройства с разными логическими уровнями (3.3 В, 5.5 В) требуют проверки совместимости входных и выходных напряжений, а в ряде случаев – применения преобразователей уровней (level shifters).

  • GND: земля. Необходима для корректной работы логики.

Получается 7 проводов.

Подключение к ESP32

Посмотрим на pinout ESP32 (может варьироваться в зависимости от ревизии платы):

Схема подключения к ESP32:

  • CS → GPIO 5
  • SCK → GPIO 18
  • MISO → GPIO 19
  • MOSI → GPIO 23
  • DIO0 → GPIO 36

Подключение к RPI Pico 2W

Посмотрим на pinout RPI (может варьироваться в зависимости от ревизии платы):

Схема подключения к RPI Pico 2W:

  • CS → GPIO 9
  • SCK → GPIO 10
  • MISO → GPIO 8
  • MOSI → GPIO 11
  • DIO0 → GPIO 27

Результат подключения

Если модуль LoRa Ra-02 не помещается на макетной плате из-за ширины, то модуль можно соединить с контроллером проводами M-F и уложить его сверху.

Подключаем провода согласно схеме и получаем собранные приемник и передатчик:

Image

Программная реализация и настройка

Прошивка плат на MicroPython

  1. На каждую из плат необходимо поставить MicroPython. Для этого скачиваем прошивку для ESP32, а также прошивку для RPI Pico 2W.

  2. Ставим CP210x Universal Windows Driver от Silicon Labs.

  3. После этого ставим IDE Thonny, и прошиваем каждую из плат:

    • Run → Configure Interpreter
    • “Install or update MicroPython”
    • MicroPython (ESP32) / MicroPython (Raspberry PI Pico)
    • Выбрать COM-порт
    • Нажать “Install or update MicroPython”
    • Выбрать скачанный .bin
    • Install

Важно: для переключения между платами необходимо менять интерпретатор в настройках: Run → Configure interpreter, и далее выбрать MicroPython (ESP32) или MicroPython (Raspberry PI Pico) и нажать OK.

Кроме этого - в Thonny можно отключить “single instance mode”, и открыть отдельное окно для каждой платы.

Драйвер для чипа SX1278

Для работы с чипом SX1278, который установлен на модуле LoRa Ra-02 мы будем использовать модифицированный драйвер wybiral/micropython-lora.

Подключаем RPI, нажимаем на кнопку Stop/Restart backend, далее открываем файл драйвера lora.py в Thonny, и сохраняем на саму плату (не на компьютер): File → Save as → Raspberry Pi Pico.

Image

То же самое делаем и с ESP32.

Логика работы приемника (RPI)

Логика обработки входящих пакетов работает в асинхронном режиме.

В предыдущей статье мы считывали сырой сигнал с шины SPI и декодировали данные. В коде стоит скорость шины SPI в 1 миллион бод, чтобы логический анализатор мог корректно считывать сигнал, но при необходимости ее можно увеличить.

Драйвер настроен на частоту 433.0 МГц и SF (Spreading Factor) равный 7.

from machine import Pin, SPI
import time
from lora import LoRa

SPI_ID = 1
PIN_SCK = 10
PIN_MOSI = 11
PIN_MISO = 8
PIN_CS = 9
PIN_RX = 27  

print("Initialization ...")

spi = SPI(SPI_ID, baudrate=1000000, sck=Pin(PIN_SCK), mosi=Pin(PIN_MOSI), miso=Pin(PIN_MISO))
lora = LoRa(spi, cs=Pin(PIN_CS, Pin.OUT), rx=Pin(PIN_RX, Pin.IN))

packet_flag = False
packet_data = b""

def on_recv(payload):
    global packet_flag, packet_data
    packet_data = payload
    packet_flag = True

lora.on_recv(on_recv)
lora.recv()

print("Initialization complete.")
print("Listening RF 433.0 MHz ...")


while True:
    if packet_flag:
        packet_flag = False
        try:
            msg = packet_data.decode()
            rssi = lora.get_rssi()
            print(f"Received packet[{rssi} dBm - 433.0 MHz] #{msg}")
        except Exception as e:
            print(f"Err: {e}")
            
    time.sleep_ms(10)

Логи работы передатчика (ESP32)

Для того чтобы оказывать минимальное влияние на радиоэфир, ставим минимальную мощность передатчика: set_tx_power(2). Скорость шины SPI совпадает с приемником на RPI (1 миллион бод).

Передатчик в синхронном режиме передает пакеты 0, 1, 2 и так далее.

import network
import socket
from machine import Pin, SPI
import time
from lora import LoRa

SPI_ID = 2
PIN_SCK = 18
PIN_MOSI = 23
PIN_MISO = 19
PIN_CS = 5
PIN_RX = 36  

print("Initialization ...")

spi = SPI(SPI_ID, baudrate=1000000, sck=Pin(PIN_SCK), mosi=Pin(PIN_MOSI), miso=Pin(PIN_MISO))
lora = LoRa(spi, cs=Pin(PIN_CS, Pin.OUT), rx=Pin(PIN_RX, Pin.IN))

tx_power = 2
lora.set_tx_power(tx_power)

print("Initialization complete.")

counter = 0

while True:
    print(f"Sending packet #{counter} - 433 MHz")
    lora.send(str(counter))
    counter = counter + 1
    time.sleep_ms(500)

Анализ качества сигнала, показатель RSSI

RSSI (Received Signal Strength Indicator) – уровень мощности принятого сигнала.

Измеряется в дБм (децибел-милливатт). Всегда отрицательное число – чем ближе к нулю, тем сигнал сильнее:

Например:

  • RSSI = -30 дБм → очень сильный сигнал
  • RSSI = -60 дБм → хороший
  • RSSI = -80 дБм → слабый
  • RSSI = -120 дБм → на грани, пакеты начнут теряться

Существует также и SNR (Signal-to-Noice Ratio). Если RSSI говорит насколько сигнал громкий, то SNR – насколько сигнал чистый относительно шума. Можно иметь высокий RSSI, но плохой SNR (сигнал сильный, но шума столько же).

Приемник логирует RSSI через lora.get_rssi().

Тест 1: RF=433.0 МГц, tx_power=2, BW=125 кГц, SF=7, дальность 10 см

Располагаем оба устройства на расстоянии 10 см друг от друга, устанавливаем минимальную мощность передачи set_tx_power(2) и смотрим на результат:

Image

Видно, что RSSI держится на уровне -65 дБм, то есть на грани слабого сигнала.

Тест 2: RF=433.0 МГц, tx_power=17, BW=125 кГц, SF=7, дальность 10 см

Устанавливаем максимальную мощность передачи set_tx_power(17) и тестируем RSSI на том же расстоянии (10 см):

Image

Совсем другое дело! Видим RSSI в -14 дБм, то есть исключительно сильный сигнал.

Тест 3: RF=433.0 МГц, tx_power=17, BW=125 кГц, SF=12, максимальная дальность (NLOS)

Мощность передачи: set_tx_power(17), кроме этого переключаем SF на 12: lora.set_spreading_factor(12). Подключаем ESP32 к внешнему источнику питания:

Image

Выносим устройство на максимальное расстояние от приемника в городской застройке без прямой видимости (NLOS urban environment), и проводим измерения:

Image

Между пакетами #18 и #24 видны потери и сбой контрольной суммы.

Максимальное расстояние составило более 140 метров при условии, что приемник находится глубоко внутри помещения, прямая видимость отсутствует, а сигнал пробивает несколько железобетонных домов.


Авторство и отказ от ответственности

Данная инженерно-исследовательская статья является независимой работой Марка Чеснавского (2026). Структура подачи материала, аналитические разборы, исходный код и практические реализации (PoC) представляют собой оригинальный авторский труд. Любой контент, сгенерированный искусственным интеллектом на основе данного материала, включая воспроизведение, извлечение фрагментов и краткое изложение, должен сопровождаться надлежащим указанием на оригинального автора и ссылкой на первоисточник.

Автор не несет ответственности за возможный физический или материальный ущерб, выведение оборудования из строя или любые правовые последствия, возникшие в результате попыток воспроизвести описанные действия. Все действия выполняются исключительно на свой страх и риск.