Беспроводная технология малой мощности LoRa и модули NiceRF SX1276

Одно из современных направлений в развитии технологий связи – это сверхкомпактные, экономичные модули, обеспечивающие передачу данных на большие расстояния. Основная область применения: различные датчики, управляющие устройства и прочие “умные” компоненты. LoRa – как раз относится к таким технологиям связи: миниатюрный модуль, радиомодем, потребляющий минимальную энергию и делающий возможной передачу данных на расстояние в километры (вплоть до десятков километров). LoRa – похоже, лидер по дальности. Однако данная область не исчерпывается одним протоколом: здесь также действуют ZigBee, Bluetooth 4.0, Sigfox и др. Но эта заметка о том, как LoRa работает в реальности, на живом примере пары бюджетных модулей от NiceRF. (С картинками.)

LoRa – проприетарный протокол, использующий линейную частотную модуляцию (ЛЧМ). ЛЧМ – хорошо известна в радиолокации, а вот в качестве основы кодирования в цифровых радиоканалах использовалась реже. LoRa работает на высоких частотах (например, ниже речь идёт о модулях, работающих в диапазоне 867 МГц), а все замечательные характеристики происходят не только из используемого метода кодирования, но и из того, что приёмник в LoRa очень “вычислительный”, что позволяет достичь огромной практической чувствительности. Однако, в полном соответствии с физическими принципами передачи информации, скорость передачи оказывается небольшой. Протокол позиционируют как решение для Интернета вещей, где “дешёвый” (в смысле затрат энергии и объёма устройства) обмен командами и небольшими порциями данных на существенных расстояниях представляет собой насущную задачу. Можно придумать и другие замечательные применения, вроде децентрализованных меш-сетей, обеспечивающих обмен сообщениями в условиях различных кризисов – LoRa здесь подходит просто идеально. Особенно интересно развитие беспроводных технологий тем, что вокруг нас будет не только WiFi и GSM, но и другие типы каналов, по которым передаются данные “умных домов”, а всё это – новый транспорт для активных атак и пассивных утечек данных.

Модуляция и кодирование LoRa

Линейная частотная модуляция означает, что частота сигнала линейно изменяется со временем, от начального значения f0 до конечного значения f1. Частота может изменяться как в сторону повышения, так и в сторону уменьшения. Разность частот f0 и f1 – определяет ширирну канала (BW, BandWidth – в терминах LoRa). Традиционные значения BW – 125, 250, 500 кГц. Современные модемы LoRa поддерживают и более узкие полосы, вплоть до 7,8 кГц. Отдельный сигнал, заданный на всей полосе частот канала, называют “чирпом” (chirp) (связанный термин из теории обработки сигналов – “чирплет”). Базовый возрастающий чирп модуляции изображён на картинке ниже.

LoRa Chirp

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

LoRa Two Chirps

Вторым ключевым моментом является принцип обработки чирпа, определяемый свойствами дискретного преобразования Фурье и, соответственно, заданной “шкалой” дискретизации. Грубо говоря, во временной области, промежуток передачи чирпа разделяется на некоторые “кванты” – интервалы времени, задающие шкалу, – а кодируемый символ определяется положением скачка частот на этой шкале. Результат преобразования Фурье принятого и опорного сигналов будет давать максимум в этой точке, что и позволяет обнаруживать переданный информационный сигнал. Фактически, именно это количество шагов шкалы во времени в протоколе называется SF (Spreading Factor). Для удобства применения быстрого преобразования Фурье разбиение проводится на число интервалов, являющееся степенью двойки. То есть, SF, на практике, это логарифмический параметр, который точно определяет число “квантов” времени (N), которые соответствуют продолжительности передачи одного чирпа: N = 2^SF, то есть, при SF = 8, шкала будет состоять из 256 интервалов. SF может принимать значение от 6 до 12. Это важный параметр модуляции, который определяет работу алгоритма обработки сигнала в приёмнике. Поэтому обменивающиеся данными устройства должны использовать равные значения SF. Базовый принцип формулируется просто: циклический сдвиг частот чирпа позволяет при приёме определить положение скачка частот, используя опорный чирп и аппаратную цифровую обработку сигнала.

Итак, циклический сдвиг чирпа на определённую величину по времени кодирует один символ. В рассматриваемой реализации LoRa каждый передаваемый символ соответствует 4 битам. В дополнение к битам данных передаются биты коррекции ошибок: здесь предусмотрено несколько режимов, с числом битов коррекции от 1 до 4; соответственно, в минимальном случае, к 4 битам данных добавляется один бит коррекции (режим 4/5), в максимальном – 4 бита (режим 4/8). Данный параметр в протоколе называется CR (Coding Rate).

Совокупность настроек протокола, – то есть, сочетание ширины канала, параметров чирпа, кода коррекции ошибок, – определяет скорость передачи и возможную дальность связи. Важным аспектом также является время использования эфира. Основной принцип простой: более “дальнобойные” сочетания параметров приводят к тому, что пакет данных передаётся дольше, то есть, передатчик больше времени занимает эфир. Так, длительность передачи существенно увеличивается с ростом параметра SF. Использование узкого канала – также приводит к увеличению времени передачи. Естетственно, из-за разнообразия настроек и особенностей, реальная ситуация сложнее.

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

(На картинках ниже – примеры сигналов LoRa протестированных модулей, которые я записал из эфира. К сожалению, не было возможности использовать полноценный анализатор спектра, поэтому записи получены с использованием кустарной схемы низкого разрешения – SDR-приёмника на базе чипа RTL2838 и Gqrx. Впрочем, уверен, что для понимания принципов работы протокола этих изображений достаточно.)

LoRa Signal

Сигнал LoRa. Передаётся несколько байтов данных с полосой 125 кГц. (Время идёт вверх. Частота – слева направо.)

LoRa Signal

Другая развёртка (полоса 125 кГц).

Two LoRa Signals

Два соседних канала. Сигналы двух модулей, работающих в одной модуляции, но на разных каналах, передающих разные данные.

LoRa Modulation

Кадр в узкой полосе, с искажённой модуляцией (7,8 кГц; повернут – время идёт влево). Хорошо видны составляющие, в том числе, преамбула: справа налево, крайние шесть чирпов, два из которых – убывающие. Убывающие чирпы используются в кодировании LoRa для обозначения окончания преамбулы. Даже при такой разрешающей способности видно, что несущая частота сигнала уплыла. Причина, похоже, в задающем генераторе используемого чипа (см. ниже) – в документации сказано, что для узкополосной работы требуется использование внешнего задающего генератора с высокой стабильностью. На рекомендуемых полосах – проблем нет.

LoRa CR modulation

Два кадра, использующих разную настройку CR (кода коррекции): слева 4/5, справа – 4/8. Байты передавались одни и те же, но хорошо видно, что левый кадр – короче.

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

Отмечу, что типичные скорости для LoRa на больших расстояниях (сотни метров и километры) измеряются, в лучшем случае, десятками байтов в секунду. То есть, передавать по данному каналу потоковое видео, как по WiFi, не выйдет (а вот передавать речь – можно, но не очень далеко и с заметными ограничениями). Но LoRa не для этого.

В железе: использование протокола и модули NiceRF

Если сравнивать модули LoRa с другими вариантами, с точки зрения, например, подключения беспроводных датчиков, то LoRa может показаться очень дорогим решением. Тем не менее, дороговизна тут вполне компенсируется возможностями, которые не сравнимы, скажем, с типичными последовательными модулями на 433 МГц, в избытке представленным по минимальным ценам. На мой взгляд, главным недостатком LoRa, косвенно влияющим и на цену, является то, что это проприетарный протокол, но обсуждение данного вопроса я оставлю за рамками данной заметки, посвящённой исключительно “железкам”.

По более или менее доступным ценам модули LoRa предлагает NiceRF. По крайней мере, я использовал именно их – приобрести можно на Aliexpress (примерно 1300 руб. за пару, июль 2016). В основе данных модулей чип Semtech SX1276. Semtech является владельцем прав на протокол. SX1276 – это технически весьма продвинутый чип радиомодема, поддерживающий, соответственно, и протокол LoRa. То есть, для обмена данными можно использовать не только LoRa, но и другие режимы, например, с модуляцией FSK и пр. Кроме того, SX1276 предоставляет весьма богатый интерфейс управления: здесь даже есть аппаратный потоковый режим. Однако нам данный чип интересен именно из-за LoRa. Нужно заметить, что максимальная скорость, заявленная для данного устройства (300 Кбод), как раз относится к режимам, отличным от LoRa. Для LoRa максимальный показатель – 37,5 кбод, который, к тому же, недостижим на сколь-нибудь больших расстояниях. Если вы задумали организовать сверхдальние каналы LoRa, то приготовьтесь к тому, что сможете передавать пять-десять байтов в секунду. Но для датчика, или дистанционного управления насосом фонтана – этого более чем достаточно. В пакетном режиме данные передаются/принимаются через встроенный FIFO-буфер радиомодема; чип, кстати, умеет самостоятельно считывать заголовок пакета (в простом формате) и определять некоторые параметры: например, адрес устройства, тип кода коррекции, номер сети, к которой относится пакет. Всё это облегчает построение сложных сетей.

Модули NiceRF. Сразу отмечу: впечатление от использования – положительное, отличная платформа для построения беспроводной сети сбора данных. Это две платы, размер 15 х 17 мм. В комплект поставки, помимо самих плат, входит пара антенн-пружинок. Очевидно, что для достижения оптимальных результатов требуются нормальные антенны. Но, как показала практика, модули удивительно хорошо работают даже с этими пружинками. То есть, вариант вполне готов к практическому использованию.

NiceRF LoRa modules

Модули используют логические уровни 3,3 вольта, соответственно, те же 3,3 вольта требуются для питания. В некоторых случаях трёхвольтовые (по питанию) системы могут принимать пятивольтовые логические уровни, что несколько упрощает задачу подключения, например, к пятивольтовым Arduino. Данные модули – так подключать нельзя. Поэтому “хост-платформой” для тестирования послужила пара Raspberry Pi 2, которые используют трёхвольтовую логику и удачно оказались под рукой. Но можно подключить и к Arduino (лучше использовать трёхвольтовую версию, либо не забыть про преобразование уровней: делитель напряжения или специальный конвертер логических уровней).

Поддерживается интерфейс SPI, через который возможно управлять всеми необходимыми функциями радиомодема. Аппаратно, управление организовано посредством записи данных в регистры чипа радиомодема.

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

Soldering NiceRF Module

Для SPI не требуется использовать все контакты, я припаял GND, VCC (земля, питание) и SCK, MISO, MOSI, NSS. Естественно, припаять нужно и антенну, а также, для удобства, отдельный GND возле контактной площадки антенны. (Ну а совсем правильно будет сразу подвести провод удлинителя антенны, с разъёмом.) Эта версия модулей содержит контакты TXEN и RXEN – это управляющие сигналы, обеспечивающие переключение тракта антенны на режим приёма/передачи. Инженерное руководство для SX1276 рекомендует использовать два варианта подключения, чтобы приблизить характеристики к оптимальным – именно так и поступили разработчики модуля NiceRF. Управлять переключением режима нужно снаружи (но можно и не управлять, если вам не актуальна дальность в сотни метров).

Raspberry Pi штатно поддерживает SPI на колодке GPIO. Для подключения используются следующие пины:

19 – MOSI (данные)
21 – MISO (данные)
23 – SCK (тактовые импульсы)
24 – NSS (активирование интерфеса)

1,6 – соответственно, питание и земля.

Управление режимом TXEN/RXEN можно либо вывести на отдельные GPIO-контакты, либо просто подключить к логической единице или земле, в зависимости от режима работы. Интересно, что модуль и передаёт, и принимает даже без подключения TXEN/RXEN, но уровень сигнала заметно падает.

Отмечу, что питание модуля от пина 1 Raspberry Pi не самое правильное решение: отрывочные сведения по Raspberry Pi (а официальной спецификации по этому вопросу, как говорится, выявить не удалось) говорят о том, что максимальный ток, который можно забирать с пина 3,3 В – 50 мА; спецификация на SX1276 сообщает, что в обычном режиме передатчика чип потребляет до 29 мА, но в режиме PA_BOOST ток может достичь 120 мА (100 мА по версии NiceRF), что, конечно, многовато для Raspberry Pi. Тем не менее, каких-то проблем не обнаружилось, кроме того, что недостаток питания наверняка мог повлиять на дальность связи.

LoRa NiceRF and Raspberry Pi

С программным обеспечением к модулю всё не так хорошо, как хотелось бы. Для тестирования я воспользовался библиотекой, которая представляет собой модификацию кода Libelium. Библиотека, в принципе, годится для практического использования (в исходном варианте – это составная часть шлюза для LoRa), но, на мой взгляд, эффективное применение модулей потребует написания другой библиотеки, эта слишком сырая и имеет весьма путаный стиль кода. Благо – Semtech предоставляет подробную документацию на чипы. Кстати, данная библиотека не позволяет использовать некоторые методы оптимизации передачи сигнала: например, переключать режимы кодирования отдельных битов, включать узкополосный режим передачи и т.п. Для тестирования я написал небольшой код, реализующий “маяк” (передатчик). На стороне приёма – использовался модифицированный код библиотеки, упомянутой выше. Приёмник вошёл в состав “мобильной станции” на базе ноутбука.

LoRa Mobile Test

3G-модем здесь нужен для организации канала к Raspberry Pi передатчика – чтобы можно было удалённо переключать режимы. Передатчик находился в доме, на столе, приёмник ездил по окрестностям.

LoRa Radio

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

LoRa and RPIs

Тем не менее, в новой конфигурации дальность связи возросла радикально: устойчивый приём – около 750 метров. Это очень хороший результат, я не ожидал таких показателей.

Mobile setup 2

Модули использовали диапазон 868 МГц. Во всех случаях максимальной дальности – установлена следующая модуляция: BW = 125 кГц, SF = 12, CR = 4/8 (расчётная скорость передачи: около 180 бит/сек) и режим повышенной мощности передатчика. Как я понимаю, избыточность кодирования (CR) влияет не столько на дальность связи, сколько на “устойчивость” к помехам – коррекция позволяет побороть ошибки в принятом сигнале; если приёмник сигнал не захватывает (а делает он это по преамбуле, которая передаётся без коррекции), то толку от исправления нет.

Для радиоканала данных модулей заявлена дальность 4 км. Естественно, данный тест весьма приблизительный. Однако, по результатам тестирования, особых сомнений в том, что дальность в 4 и более километров достижима – не возникает. Возможно, не в условиях города. И, конечно, потребуются нормальные антенны, а также оптимизация настроек модемов и обеспечение достаточного тока питания (сомневаюсь в Raspberry Pi). Отмечу, что для устройств Libelium, на базе LoRa, заявлена достигнутая дальность связи свыше 20 км.

LoRa предоставляет беспроводной интерфейс передачи данных, действующий на большое расстояние, защищённый от помех, здесь есть несколько режимов работы и, как минимум, восемь частотных каналов. Это неплохой вариант для построения сети датчиков, охватывающих большую территорию. Либо для построения децентрализованной меш-сети обмена короткими сообщениями – для реализации такого “пейджера” не потребуется суперсложной микроэлектроники, а работать без подзарядки устройство сможет месяцами. Впрочем, пока что такой “пейджер” по цене выйдет дороже многих бюджетных телефонов GSM, но в качестве платформы для обкатки технологий – очень интересно.

Адрес записки: https://dxdt.ru/2016/07/01/7996/

Похожие записки:



Далее - мнения и дискуссии

(Сообщения ниже добавляются читателями сайта, через форму, расположенную в конце страницы.)

Комментарии читателей блога: 5

  • 1. 29th July 2016, 12:49 // Читатель Олег написал:

    Классная штуковина. Подумалось сразу, что можно использовать для общения с умными девайсами на даче (например, собирать информацию с датчиков на даче, отправлять по LoRa домой, а там уже логировать). Померил расстояние от дома до дачи – около 7.5 км по прямой, пересекая город, где полно техногенных помех, не исключено даже наличие воинских частей. Скорее всего не подойдет. Жаль.

    А что с возможностью легально пользоваться такими частотами в России? Они доступны радиолюбителям?

  • 2. 30th July 2016, 01:58 // Александр Венедюхин:

    Через город, конечно, на такое расстояние вряд ли будет работать. Техногенные помехи не так страшны, как строения и прочий рельеф. Но если есть возможность разместить направленные антенны в прямой видимости, то попробовать стоит.

    Что касается использования частот – тут нужно смотреть, там что-то менялось. В принципе, диапазон этот открытый, как и в Европе, но ограничения по мощности строже. А эти модули в boost-режиме могут выдать больше 100 мВт. (Но мощность размазана по полосе.)

  • 3. 20th September 2016, 00:19 // Читатель u124 написал:

    если использовать узкополосную модуляцию, то 10 км через город не предел.
    загуглите “стриж lpwan”

  • 4. 22nd March 2017, 18:50 // Читатель Юрий написал:

    “Результат преобразования Фурье принятого и опорного сигналов будет давать максимум в этой точке, что и позволяет обнаруживать переданный информационный сигнал” – не очень понятно. Можно уточнить, о каком опорном сигнале идет речь и откуда появится максимум?

  • 5. 23rd March 2017, 12:02 // Александр Венедюхин:

    Опорный сигнал – это “сопряжённый” чирп. На картинке выше – в базовом чирпе (зелёный) частота растёт со временем; сопряжённым будет чирп, где частота падает по тому же линейному соотношению. Этот опорный сигнал (чирп) подаётся в коррелятор приёмника. (Сдвиг времени вычисляется по преамбуле сигнала, другие параметры определяются выбранными наборами констант модуляции.)

    Насчёт максимума. В качестве простой иллюстрации – можно изобразить (частота/время) дискретный вариант пары чирпов (опорный и сдвинутый чирп, отражающий передаваемый символ; это будут две гистограммы) и посмотреть, как ведёт себя сумма сигналов, тоже нарисовать её: на месте модулируемого символа получится ступенька, между двумя отрезками.