RSSI в sx127x

RSSI (received signal strength indicator) - это показатель уровня принимаемого сигнала. Для простоты - это те самые деления Вашего телефона, которые показывают уровень сигнала сети. Чем меньше, тем хуже и медленнее передаются данные. Этот показатель рассчитывается почти в каждом приёмнике и чипы sx127x не исключение. Но, так же как и во всех других приёмниках, этот показатель рассчитывается очень приближённо, и есть ненулевая вероятность получить совершенно случайные значения.

RSSI измеряется как логарифм отношения мощности принимаемого сигнала к 1мВт. При этом 0dBm - это идеальный уровень сигнала, а, примерно, -100dBm - это самый плохой уровень сигнала. На практике, RSSI может зависить от всего:

  • от калибровки на заводе
  • от периодической внутренней калибровки чипа
  • от производителя
  • от температуры
  • от антенны
  • от окружающей среды
  • от драйвера

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

Чипы серии sx127x могут принимать сигналы от -127dBm до 0dBm. Но эти цифры, скорее всего, получены в лаборатории и принять сигнал с RSSI -126dBm на практике вряд ли удастся.

Тем не менее, неплохо было бы хоть как-то сравнивать разные сигналы, и поэтому мой драйвер для работы с sx127x позволяет получить RSSI.

В документации к чипу и в стандарте IEEE 802.11 его рекомендуется измерять во время получении преамбулы. На скриншоте внизу примерное время отмечено вертикальной жёлтой линией:

Чип sx127x позволяет отловить это время. Для этого он генерирует прерывание PreambleDetect, которое можно обработать на пине DIO4. Однако, в TTGO lora32 v2.1 и Heltec lora32 v2 пин DIO4 не подключён, вместо этого мой код пытается отловить прерывание SyncAddress, которое приходит на пин DIO2. На скриншоте вверху - это вертикальная синяя линия.

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

В этом графике прекрасно буквально всё.

Во-первых, если измерять RSSI сразу же после получения пакета (прерывание PayloadReady), то значения будут сильно скакать от -90dBm до -50dBm. Нижняя граница - это уровень шума приёмника, сообщение уже было получено и, конечно же, уровень сигнала минимальный. Но если сразу же идёт следующее сообщение, то уровень будет -50dBm. Именно поэтому измерять RSSI после приёма пакета - неправильно.

Во-вторых, разница между PreambleDetect и SyncAddress объясняется тем, что PreambleDetect был получен совсем другой антенной, другим LoRa чипом и вообще с помощью Raspberry PI! Видимо, его антенна лучше резонирует на частоте 437Мгц и показывает более высокий уровень.

В-третьих, Raspberry PI, и Linux в частности, не успевают обрабатывать прерывания! Из-за этого уровень PreambleDetect может сэмплироваться в момент приёма самого сообщения, а не в момент получения преамбулы.

Однако в целом я доволен своей реализацией:

  • Уровень сигнала стабильный на протяжении многих тестов
  • Не зависит от длины сообщения
  • И не зависит от данных внутри сообщения