Набирающий популярность микроконтроллер Raspberry Pi Pico на базе чипа RP2040 (собственной разработки Raspberry Pi Foundation) вызывает интерес у многих, а учитывая его очень конкурентную цену, наличие у продавцов микроэлектроники и доступность для покупки в Украине, он попадает под особый прицел для рассмотрения. Сегодня в этой статье мы разберём как на его базе создать коммуникационное устройство, передающее информацию о температуре (задействуем встроенный в Raspberry Pi Pico датчик температуры) и использующее технологию LoRaWAN для передачи данных. Особой практической пользы в жизни этот конкретный проект не принесёт, но собрав что-то наподобие, можно уже будет заложить сбор и передачу каких-либо полезных данных, либо осмысленный функционал в ваш проект, а рассматриваемые технологии реализации связи будут для вас хорошей помощью.

Итак, давайте для начала рассмотрим почему именно технология LoRa так подходит для связи в данном случае: микроконтроллер Raspberry Pi Pico позволяет в том числе собирать с датчиков и передавать цифровую информацию, что может быть широко применено в сетях устройств Интренета вещей (IoT, Internet of Things), использующих маломощные и энергоэффективные автономные устройства, питающиеся от микробатарей и способных работать по нескольку лет без обслуживания. Это применяется в системах интеллектуального учета (электричество, газ и вода), охранно-пожарной сигнализации, приборах для измерения параметров здоровья, городской инфраструктуре (уличные фонари, система контроля и учета транспортных средств) и т.п. Большинство устройств IoT являются простыми сенсорами с малым объемом генерируемого трафика – несколько раз в день в пределах от 10 до 50 байт, причём основной трафик данных передается по линии в направлении вверх (от устройства IoT к базовой станции). 

LoRa (Long Range) представляет собой радиотехнологию, которая позволяет путем создания сетей радиодоступа связывать различные удаленные датчики и сенсоры с приложениями Интернета вещей. Она основывается на технологии расширения спектра, которая позволяет увеличить дальность связи почти в 10 раз по сравнению с обычными системами прямой радиосвязи (например, LTE или NB-IoT) при подобных характеристиках передатчиков. При этом потребляемый ток у абонентских устройств сети LoRa составляет порядка 40 мA при передаче сигнала и 10 мA при приеме, при напряжении питания 3 В. Технология модуляции LoRa представляет собой метод, который основывается на технологии модуляции с расширенным спектром и вариации линейной частотной модуляции (Chirp Spread Spectrum, CSS) с интегрированной прямой коррекцией ошибок (Forward Error Correction, FEC). Технология LoRa значительно повышает чувствительность приемника и, аналогично другим методам модуляции с расширенным спектром, использует всю ширину полосы пропускания канала для передачи сигнала, что делает его устойчивым к канальным шумам и нечувствительным к смещениям, вызванным неточностями в настройке частот при использовании недорогих опорных кварцевых резонаторов. Ширина канала не позволяет транслировать видео, но легко может пропускать пакеты с собранными данными со скоростью в диапазоне 0,3-11 кбит/с. 

Модуляция LoRa является физическим уровнем, а LoRaWAN (Long Range Wide-Area Networks, LoRaWAN)  — это MAC-протокол для высокоемких сетей с большим радиусом действия и низким собственным потреблением мощности, который организация LoRa Alliance стандартизировала для маломощных глобальных радиальных сетей (Low Power Wide Area Networks, LPWAN) типа звезда. Протокол LoRaWAN оптимизирован для малобюджетных сенсоров с работой от батарей и включает в себя различные классы узлов, обеспечивая компромисс между скоростью доставки информации и временем работы устройств при использовании питания от батарей/аккумуляторов. Протокол обеспечивает полную двустороннюю связь, а архитектура (посредством специальных методов шифрования) обеспечивает общую надежность и безопасность всей системы. Чтобы продлить срок службыбатарей/аккумуляторов в конечном устройстве и общую пропускную способность сети, сетевой сервер LoRaWAN управляет скоростью передачи данных и радиочастотным выходом каждого конечного устройства по отдельности. Управление осуществляется с помощью алгоритма адаптивной скорости передачи данных (Adaptive Data Rate, ADR). Это имеет решающее значение для высокой производительности сети и позволяет осуществлять ее необходимую масштабируемость. Сеть может быть развернута с минимальными инвестициями в ее инфраструктуру и с той её емкостью, которая необходима для данного конкретного применения. 

Зона покрытия сети LoRa обеспечивается радиусом действия базовых станций (шлюзов LoRa) до 2,5 км внутри города и до 15 км в сельской местности. Для работы LoRa, как правило, использует нелицензируемые участки спектра, которые определены и регулируются на основе региональных ограничений в следующих диапазонах частот:
430 МГц – для регионов Азии;
780 МГц – для региона Китай;
433 МГц – для региона Европа;
866 МГц – для региона Европа;
915 МГц – для регионов США.
В Европе для сетей LoRaWAN используются каналы ISM-диапазона, определенные стандартом ETSI EN 300.220, в полосе частот 864–868 МГц.

 

Возвращаясь к нашему проекту, стоит отметить, что недостаток в виде обратной стороны технологии LoRa — пропускной способности, измеряемой в байтах, а не в мегабайтах или даже килобайтах, нас никак не ограничивает в поставленной задаче передачи значений температуры с устройства Raspberry Pi Pico.

Поддержка подключения LoRa для Raspberry Pi Pico была создана Сандипом Мистри (Sandeep Mistry), автором библиотеки Arduino LoRa. Его библиотека добавляет поддержку LoRa для Pico и других плат на базе RP2040 с использованием радиомодуля Semtech SX1276. Это означает, что полностью будут поддерживаться и такие платы Adafruit, как  RFM95W и LoRa FeatherWing.

 

К вопросу о покрытии сетью:  

Чтобы использовать Raspberry Pi Pico с поддержкой LoraWAN, необходимо находиться в зоне действия шлюза LoRa. К счастью, есть The Things Network — сообщество LoRaWAN сети с открытым исходным кодом. Вот их короткая презентация:

The Things Network имеет глобальное покрытие:

В зависимости от того, где вы находитесь, вполне возможно, что вы уже попали в зону покрытия. Однако, если это не так, вам не нужно сильно беспокоиться. Те времена, когда стоимость базовой станции LoRaWAN составляла порядка нескольких тысяч долларов, давно прошли. Теперь вы можете получить шлюз LoRa примерно за 100 долларов

 

Приступим к реализации нашего проекта.

Если у вас уже настроен и работает набор инструментов для Raspberry Pi Pico, убедитесь, что pico-sdk обновлена до последней версии, включая подмодули. В противном случае вам следует сначала установить C/C++ SDK (инструкцию можно просмотреть здесь), а затем вам нужно скачать проект с GitHub.

 

$ git clone --recurse-submodules https://github.com/sandeepmistry/pico-lorawan.git
$ cd pico_lorawan


Прежде чем продолжить, убедитесь, что у вас установлен PICO_SDK_PATH. Например, если вы создаете что-то на Raspberry Pi и запускаете скрипт pico_setup.sh, вы должны указать следующий путь PICO_SDK_PATH:

 

$ export PICO_SDK_PATH = /home/pi/pico/pico-sdk


Теперь, в принципе,  вы готовы создать как библиотеку, так и примеры приложений. Но прежде чем вы это сделаете, нужно сделать еще две вещи: настроить облачную инфраструктуру, в которую будут отправляться данные, и подключить плату с радиомодулем LoRa к Raspberry Pi Pico.

 

Настройка приложения.

Примечание: Сеть The Things Network в настоящее время переходит со стека V2 на стек V3. В данном проекте мы будем использовать ещё работающий стек программного обеспеченияе V2. Однако, если вы используете общедоступный шлюз или создаете собственный шлюз, вам, вероятно, следует создать приложение в V3. Инструкции аналогичны, и вы сможете сделать это как будет написано ниже. Просто имейте в виду, что для нового стека V3 есть отдельная сетевая консоль, и все может выглядеть немного иначе.

В то время как любое устройство LoRa в зоне действия вашего нового шлюза получит свои пакеты и отправит их в восходящем направлении в Сеть вещей IoT, пакеты данных будут сброшены, если им некуда будет прийти. Другими словами, The Things Network необходимо знать, куда направлять пакеты, которые получает ваш шлюз.

Чтобы предоставить эту информацию, сначала нужно создать приложение внутри The Things Network Console. Для этого все, что нужно сделать, это ввести уникальную строку идентификатора приложения — это может быть что угодно — и консоль сгенерирует EUI приложения и ключ доступа по умолчанию (default Access Key), который мы будем использовать для регистрации устройств в нашем приложении.


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

 

Регистрация устройства.

Зарегистрировать устройство можно со страницы приложения в консоли.


Идентификатор устройства — это удобочитаемая строка для идентификации удаленного устройства. Поскольку коммутационная плата RFM9W от Adafruit поставляется с наклейкой с таким же номером, что и уникальный идентификатор радиомодуля, мы можем использовать ее для внесения данных, а чтобы однозначно идентифицировать нашу плату Pico, мы возьмём что-то вроде pico-xy- xy-xy-xy-xy-xy в качестве нашего идентификатора устройства.

Нам также потребуется создать EUI для устройства. Это 64-битный уникальный идентификатор. Здесь мы снова можем использовать уникальный идентификатор с наклейки, за исключением того, что на этот раз мы можем просто дополнить его двумя ведущими нулями, 0000XYXYXYXYXYXY, чтобы сгенерировать EUI устройства. Вы также можете использовать pico_get_unique_board_id () для создания EUI устройства.

Если вы посмотрите на страницу своего устройства после регистрации, вам понадобятся Application EUI и Application Key, чтобы ваша плата могла взаимодействовать с сетью LoRa, или, точнее, чтобы сеть могла правильно маршрутизировать пакеты от вашей платы к вашему приложению. (Важно! Запишите EUI устройства, EUI приложения и ключ приложения!).

 

 

Монтаж на макетной плате

После корректной настройки облачного бэкэнда,  нам нужно подключить микроконтроллер Pico к коммутационной плате LoRa. К сожалению, плата RFM95W не очень удобна для фиксации в стандартных макетных платах: если впаять в отверстия штыри, то расстояния между ними не будут равны 2,54мм, что является стандартом для макетной платы, поэтому закрепить её будет проблематично. В отличие от платы радиомодуля, плата микроконтроллера Pico отлично становится на макетную плату.

 

Как следствие, придется соединять всё гибкими перемычками типа папа-мама. Для подключения модуля RFM95W к Raspberry Pi Pico используйте следующую схему (сопоставление между физическими контактами, контактами RP2040, модулем SX1276 и выходом RFM95W):

Эти контакты используются в библиотеке по умолчанию и могут быть изменены в программном обеспечении

 


Построение и развертывание программного обеспечения

Теперь, когда у нас есть серверная часть в облаке, и мы физически «собрали» наш проект, мы можем создать и развернуть наше приложение LoRaWAN. Как мы и упоминали вначале, наше приложение с предоставляемой библиотекой, будет считывать температуру со встроенного датчика на микроконтроллере RP2040 и периодически отправлять ее в приложение Things Network по радиосвязи LoRaWAN.

Смените каталог на otaa_temperature_led в вашем случае.  В этом примере используется OTAA, поэтому здесь потребуются созданные ранее EUI устройства, EUI приложения и ключ приложения.

    $ cd examples/otaa_temperature_led/

Откройте файл config.h в своем редакторе и измените REGION, DEVICE_EUI, APP_EUI и APP_KEY на значения, показанные в сетевой консоли (Network Console). При вводе кода ожидается строковый формат (по умолчанию) без пробелов между шестнадцатеричными цифрами, а не представление массива байтов.

Если вы находитесь на территории Европы, то для связи используется разрешенный диапазон частот 868 МГц, поэтому установите для региона LORAMAC_REGION_EU868. Если вы находитесь в США, вы используете частоту 915 МГц, поэтому вам необходимо указать регион LORAMAC_REGION_US915.

Затем, после редактирования файла config.h,  можно приступить к созданию примеров приложений.

Если все идет хорошо, у вас должен быть файл UF2 в build/examples/otaa_temperature_led/ с именем pico_lorawan_otaa_temperature_led.uf2. Теперь можное загрузить этот файл UF2 на Pico обычным способом.

Возьмите плату Raspberry Pi Pico и кабель micro USB. Подключите кабель к Raspberry Pi или ноутбуку, затем нажмите и удерживайте кнопку BOOTSEL на Pico, пока вы подключаете другой конец кабеля micro USB к плате. Затем отпустите кнопку после подключения платы.

На рабочем столе должен появиться дисковый том с именем RPI-RP2. Дважды щелкните его, чтобы открыть, а затем перетащите в него файл UF2. Если у вас возникли проблемы, см. Главу 4 руководства по началу работы для получения дополнительной информации.

Ваш Pico теперь запускает ваше приложение LoRaWAN, и, если вы хотите, то сможете увидеть некоторую отладочную информацию, открыв последовательное соединение USB с вашим Pico. Откройте окно Терминала и запустите minicom.

$ minicom -D /dev/ttyACM0

 

 

Отправка данных

Вам будет необходимо обратиться к сетевой консоли, чтобы увидеть реальную информацию. Вы должны увидеть начальное сообщение о присоединении, за которым следует несколько кадров. Каждый кадр представляет собой измерение температуры, отправленное вашим Pico через LoRaWAN и приложение Gateway to The Things Network.

Значение передаваемых данных (payload) — это температура, измеренная внутренним датчиком температуры Raspberry Pi Pico в шестнадцатеричном формате. Это немного выходит за рамки начальной задачи, но вы можете добавить декодер и интеграции, которые позволят декодировать данные из шестнадцатеричной системы в удобочитаемые данные, а затем, среди множества других вариантов, сохранить их в базе данных. Чтобы проиллюстрировать возможности того, что вы можете здесь сделать, перейдите на вкладку «Форматы передаваемых данных» (“Payload Formats”) своего приложения и введите следующий Javascript в поле «декодер» (“decoder”):

затем прокрутите вниз и нажмите зеленую кнопку «Сохранить функции передаваемых данных» (“save payload functions”).

Вернувшись на вкладку «Данные» (“Data”), вы должны увидеть, что к передаваемым данным в шестнадцатеричном формате теперь добавляется температура в градусах Цельсия. Этот простой декодер взял данные и перевел их обратно в объект Javascript.

 

 

Отправка команд

Помимо отправки данных о температуре, через приложение также можно отправлять команды прямо из консоли The Things Network, что для примера позволит переключать светодиод на Raspberry Pi Pico .

Перейдите на страницу устройства (Device page) в сетевой консоли, введите «01» в поле «Данные нисходящего канала» (Downlink Payload) и нажмите кнопку «Отправить» (“Send”). Затем перейдите на вкладку «Данные». Вы должны увидеть строку «Загрузка по расписанию» (“Download scheduled”), и, если вы продолжите смотреть, вы должны увидеть байт, связанный с нисходящей линией. Когда это произойдет, на вашем Raspberry Pi Pico должен загореться встроенный светодиодный индикатор! Вернувшись в сетевую консоль (Network Console) и набрав «00» в поле Payload, вы этим выключите светодиод Pico.

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

 

Выводы.

1. Приложение-пример OTAA (OTAA example application) — это действительно хороший каркас для ваших проектов, который позволит брать данные и отправлять их в облако через LoRa, а также отправлять команды обратно из облака на микроконтроллер Pico с поддержкой LoRa. Для желающих, можно присоединиться к дискуссии  Innovation Coffee, во время которой будет проведена демонстрации LoRaWAN с Raspberry Pi Pico во время Arm Innovation Coffee:

 

2. Поддержку при проектировании на Pico можно найти на форумах Raspberry Pi. Существует также (неофициальный) сервер Discord ((unofficial) Discord server) с активным сообществом.

3. Обратную связь и документацию следует публиковать как проблему (issue) в репозитории pico-feedback на GitHub или непосредственно в соответствующем репозитории, которого он касается.

4. Всю документацию, а также множество других справок и ссылок можно найти на странице «Приступая к работе» (Getting Started). Если вы вдруг забудете о том, где это находится в будущем, вы всегда можете найти это на своём Pico: чтобы получить доступ к странице, просто нажмите и удерживайте кнопку BOOTSEL на вашем Pico, подключите его к своему ноутбуку или Raspberry Pi, затем отпустите кнопку . Идите вперед и откройте том RPI-RP2, а затем щелкните файл INDEX.HTM. Эта несложная манипуляция всегда приведёт вас на страницу «Начало работы».

 

Модифицируя предложенный вариант примера реализации LoRaWAN для передачи данных с помощью Raspberry Pi Pico можно использовать значительные преимущества технологии LoRa для построения приложений с  широким спектром назначений. 

Приобрести необходимые для реализации этого проекта компоненты, в том числе Микроконтроллер Raspberry Pi Pico и шлюз Шлюз Arduino Pro Gateway LoRa® Connectivity 868MHz с бесплатной доставкой по Украине можно в интернет-магазине evo.net.ua.