Рубрики
Проекты на Raspberry Pi

Подключение модуля LoRa к Raspberry Pi и одноранговая сеть с Arduino

Технология LoRa с каждым годом становится все более популярной благодаря интернету вещей, межмашинному взаимодействию (M2M), Industry 4.0 и т.д. Благодаря своим возможностям по передаче информации на дальние расстояния с минимальной потребляемой мощностью она в настоящее время все чаще выбирается ключевой технологией при создании устройств, работающих от батарейки (аккумулятора). Ранее на нашем сайте мы рассматривали подключение модуля LoRa SX1278 к плате Arduino (в этой же статье вы достаточно подробно можете прочитать и основные принципы технологии LoRa) и связь между двумя платами Arduino с помощью технологии LoRa.

Хотя изначально технология LoRa задумывалась для связи узлов (Node) LoRa со шлюзами LoRa, существует достаточно много ситуаций, в которых узлы LoRa могут взаимодействовать с другими узлами LoRa для обеспечения связи на дальние расстояния.

В данной статье мы рассмотрим подключение модуля LoRa SX1278 к плате Raspberry Pi и организацию одноранговой сети (Peer to Peer Communication) с другим модулем LoRa SX1278, подключенным к плате Arduino. Этот проект будет полезен в ситуациях, в которых, к примеру, плата Arduino выступает в роли сервера и собирает информацию со множества датчиков, а затем передает эту информацию на большое расстояние плате Raspberry Pi с помощью технологии LoRa. То есть плата Raspberry Pi в данном случае работает в качестве клиента и может загружать эту полученную информацию, к примеру, в какой-нибудь облачный сервис в сети Интернет.

Необходимые компоненты

  1. Плата Raspberry Pi 3 или выше (купить на AliExpress).
  2. Плата Arduino Uno (или любая другая) (купить на AliExpress).
  3. SX1278 433MHz LoRa Module (модуль LoRa на 433 МГц) – 2 шт. (купить на AliExpress).
  4. 433MHz LoRa antenna – 2 шт. (купить на AliExpress).

Предупреждение: всегда используйте модули LoRa SX1278 вместе с антеннами на 433 МГц, иначе модули могут повредиться во время работы.

Схема проекта

Схема подключения модуля LoRa SX1278 к плате Raspberry Pi представлена на следующем рисунке.
Примечание: на схеме вместо модуля SX1278 изображен модуль RFM9x (который очень похож на модуль SX1278) поскольку в том программном обеспечении, в котором рисовалась данная схема, не было картинки с модулем SX1278.

SX1278 представляет собой 16-ти контактный модуль Lora, взаимодействие с которым осуществляется по протоколу SPI с логикой (логическими уровнями) 3.3V. Плата Raspberry Pi также оперирует с логическими уровнями 3.3V и имеет встроенный SPI порт и регулятор напряжения на 3.3V. Поэтому мы можем непосредственно (без всяких переходников) подключать модуль Lora к плате Raspberry Pi. Схема соединений между модулем LoRa SX1278 и платой Raspberry Pi представлена в следующей таблице.

Плата Raspberry Pi Модуль LoRa SX1278
3.3V 3.3V
Ground Ground
GPIO 10 MOSI
GPIO 9 MISO
GPIO 11 SCK
GPIO 8 Nss / Enable
GPIO 4 DIO 0
GPIO 17 DIO 1
GPIO 18 DIO 2
GPIO 27 DIO 3
GPIO 22 RST

Сборка представленной схемы не должна вызвать у вас трудностей, единственная проблема, с которой вы столкнетесь – модуль Lora SX1278 по своим контактам не совместим с обычной макетной платой, поэтому чтобы его подключить необходимо либо использовать соединительные провода напрямую для осуществления соединений, либо использовать две маленькие макетные платы как показано на рисунке ниже. Также некоторые пользователи предпочитают запитывать модуль Lora SX1278 от отдельного источника питания 3.3V поскольку плата Raspberry Pi не способна обеспечить на своих контактах значительный ток. Но так как модули Lora отличаются очень низким энергопотреблением, то его питание от платы Raspberry Pi не должно вызывать никаких проблем – мы лично убедились в этом на собранной нами схеме. Внешний вид собранной конструкции проекта показан на следующем рисунке.

Подключение модуля LoRa к плате Arduino

Схема подключения модуля LoRa к плате Arduino такая же, какую мы использовали в аналогичном проекте. Разница лишь в том, что в данном проекте мы вместо библиотеки от Sandeep Mistry будем использовать библиотеку Rspreal.

Для питания модуля LoRa в данном случае мы также можем использовать либо контакт 3.3V платы Arduino Uno (мы выбрали этот вариант), либо отдельный источник питания на 3.3V. Схема соединений между модулем LoRa SX1278 и платой Arduino Uno представлена в следующей таблице.

Модуль LoRa SX1278 Плата Arduino Uno
3.3V 3.3V
Gnd Gnd
En/Nss D10
G0/DIO0 D2
SCK D13
MISO D12
MOSI D11
RST D9

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

Настройка платы Raspberry Pi для работы с модулем LoRa

В настоящее время существует достаточно много пакетов на python для работы с модулями LoRa. Обычно в платах Raspberry Pi используется протокол LoRaWAN чтобы принимать данные от множественных узлов LoRa. Но в данном проекте мы будем формировать одноранговую сеть (Peer to Peer communication) между платами Raspberry Pi и Arduino, поэтому для взаимодействия с модулями LoRa мы решили использовать пакет pyLoRa. Он включает в себя модули rpsreal LoRa Arduino и rpsreal LoRa Raspberry Pi, которые могут быть использованы в платформах Arduino и Raspberry Pi соответственно.

Рассмотрим установку и настройку пакета pyLoRa для платы Raspberry Pi.

Как мы уже рассмотрели ранее, модули LoRa работают по интерфейсу SPI, поэтому для работы с данными модулями мы должны включить использование интерфейса SPI в платы Raspberry Pi и установить на нее пакет pyLoRa. Для осуществления этих целей откройте окно терминала платы и выполните следующую последовательность шагов. Мы использовали программу putty для доступа к плате Raspberry Pi, вы можете использовать для этого любой другой подходящий вам способ.

Шаг 1. Зайдите в панель настроек платы Raspberry Pi с помощью команды:

Шаг 2. В открывшейся панели настроек выберите опции подключения (interfacing options) и включите в них использование интерфейса SPI как показано на рисунке ниже.

Шаг 3. Сохраните изменения в настройках и вернитесь снова в окно терминала. Убедитесь, что у вас установлены последние версии pip и python и затем установите пакет RPi.GPIO с помощью команды:

Этот пакет поможет нам в управлении контактами GPIO платы Raspberry Pi. При успешной установке данного пакета вы должны получить следующие сообщения на экране:

Шаг 4. Аналогичным образом установите пакет spidev. Spidev – это дополнение python для Linux, которое можно использовать для осуществления связи по протоколу SPI в плате Raspberry Pi.

Если процесс установки spidev завершился успешно, вы должны увидеть следующие сообщения на экране:

Шаг 5. Далее установим пакет pyLoRa с помощью установщика pip. Также этот пакет установит соответствующие радио модели, ассоциированные с LoRa.

Если процесс установки завершился успешно, то вы увидите на экране следующую картину.

Пакет PyLoRa также поддерживает зашифрованную связь, которую успешно можно использовать между платами Arduino и Raspberry Pi. Это повысит защищенность связи от несанкционированного доступа. Но для поддержки зашифрованной связи необходимо будет установить еще дополнительные пакеты. Эти вопросы в нашей статье не рассматриваются, более подробно вы их можете посмотреть по следующей ссылке на github.

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

Шаг 6. Скачайте и установите пакеты python-rpi.gpio и spidev с помощью следующих команд.

После этого вы в окне терминала должны увидеть следующие сообщения:

Шаг 7. Также установите инструмент git и затем используйте его чтобы клонировать каталог python для нашей платы Raspberry Pi. Это можно сделать с помощью следующих команд.

Когда этот шаг будет завершен вы должны обнаружить подкаталог SX127x в домашнем каталоге (home folder) Raspberry Pi. Этот подкаталог будет содержать все необходимые для работы библиотеки файлы.

Объяснение программы для Raspberry Pi

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

В одноранговой сети (peer to peer) LoRa модуль, передающий информацию, называется сервером, а модуль, принимающий информацию, называется клиентом. В большинстве случае плата Arduino выступает в роли сборщика информации от различных датчиков, а плата Raspberry Pi осуществляет прием этой информации. Поэтому в нашем проекте мы решили использовать плату Raspberry Pi в качестве клиента, а плату Arduino – в качестве сервера.

Предупреждение: убедитесь в том, что файл с программой находится в том же самом каталоге, в котором находится каталог SX127x.

Программа взаимодействия Raspberry Pi с модулем LoRa достаточно проста. Нам необходимо всего лишь установить модуль LoRa для работы на частоте 433 МГц и анализировать поступающие пакеты. Если мы будем принимать от модуля какую либо информацию, мы будем выводить ее в консоли. В программе первым делом нам необходимо подключить используемые библиотеки (пакеты).

Библиотека time будет использоваться для организации задержек в программе, библиотека Lora – для связи по технологии LoRa, а библиотека board_config — для установки параметров LoRa. Также мы инициализируем плату с помощью функции BOARD.setup().

Далее мы создадим python LoRa класс с тремя определениями (установками). Поскольку в данном проекте мы разрабатываем программу, в которой плата Raspberry Pi будет работать в качестве клиента, то класс будет будет содержать всего 3 функции: init class, start class и on_rx_done. Функция init class инициализирует модуль LoRa для работы на частоте 433 МГц с шириной полосы 125 кГц как устанавливается в методе set_pa_config. Также она переводит модуль в спящий режим (sleep mode) чтобы снизить энергопотребление.

В функции start мы будем конфигурировать модуль в качестве приемника и считывать значение RSSI (Receiving signal strength Indicator – индикатор мощности принимаемого сигнала), статус, рабочую частоту и т.д. В этой функции мы будем переводить модуль из спящего режима в режим дежурного приема (continuous receiver mode, RXCONT) и затем использовать бесконечный цикл (while loop) для считывания данных RSSI и статуса RSSI.

Функция on_rx_done будет запускаться на выполнение после считывания принятого пакета. В этой функции принятые значения из буфера приема сохраняются в переменной payload после установки приемного флага в high. Далее принятые значения декодируются в формате utf-8 чтобы вывести их потом на экран. Также мы переводим модуль снова в спящий режим до тех пор пока не примем следующее значение.

В оставшейся части программы мы выводим принятые значения в консоль и завершаем программу используя прерывание от клавиатуры. Далее мы снова переводим плату в спящий режим после завершения программы чтобы экономить энергопотребление.

Объяснение программы для Arduino

Как было указано раньше, код rpsreal поддерживает и Arduino, и Raspberry Pi, поэтому со связью между этими платами по технологии LoRa проблем возникнуть не должно. Его работа основана на библиотеке Radiohead от AirSpayce’s. Поэтому для начала вам необходимо установить эту библиотеку в Arduino IDE.

Для этого сначала скачайте ее с Github в форме ZIP архива. Затем поместите скачанный архив в каталог с библиотеками (library folder) Arduino IDE. После этого перезагрузите Arduino IDE и вы найдете примеры программ библиотеки Radio head. В нашем проекте программа Arduino будет работать в качестве сервера LoRa чтобы передавать пакеты от 0 до 9. Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Первым делом в программе необходимо подключить библиотеку SPI (установлена в Arduino IDE по умолчанию) для работы с протоколом SPI и библиотеку RH_RF95 от Radio head для осуществления связи по протоколу LoRa. Затем мы укажем контакты Arduino, к которым мы подключили контакты Chip select (CS), Reset (RST) и Interrupt (INT) модуля LoRa. Затем мы зададим рабочую частоту для работы модуля (434 МГц) и инициализируем модуль.

Внутри функции setup мы будем производить сброс модуля LoRa при помощи подачи на его контакт сброса (reset pin) низкого уровня на 10 миллисекунд. Затем мы инициализируем модуль, установим частоту и выходную мощность. Чем больше будет мощность излучения модуля, тем дальше будет дистанция связи, однако при этом возрастает и энергопотребление модуля.

Внутри бесконечного цикла loop мы будем передавать пакеты данных с помощью модуля LoRa. Это могут данные с датчиков или пользовательские команды. Но для упрощения работы проекта мы будем передавать символы от 0 до 9 с интервалом в 1 секунду. Необходимо отметить, что значения можно передавать только в виде символьного массива и формат данных должен быть unit8_t (1 байт).

Тестирование работы проекта

Когда аппаратная часть проекта у нас будет готова, нам остается всего лишь загрузить программу в плату Arduino и скетч на python в плату Raspberry Pi. В результате у нас получилась следующая конструкция проекта:

Когда скетч на python будет запущен на выполнение в плате Raspberry Pi (используйте только python 3), то если все работает нормально, вы должны увидеть передаваемые платой Arduino пакеты в окне плате Raspberry Pi как показано на следующем рисунке.

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

После этого вы можете перемещать наш сервер Arduino чтобы проверить дальность работы модулей LoRa. Также в окне платы Raspberry Pi вы можете выводить принимаемые значения RSSI если вам это необходимо. Более подробно работа проекта показана на видео, приведенном в конце статьи.

Если вы добавите в этот проект датчики на стороне Arduino, а плату Raspberry Pi подключите к какому-нибудь облачному сервису (cloud platform), то вы получите полноценную систему для реализации какого-нибудь сервиса интернета вещей (IoT).

Исходные коды программ

Код программы на Python для Raspberry Pi (приемная часть LoRa)

Код программы сервера Lora для Arduino (передающая часть LoRa)

Видео, демонстрирующее работу проекта

Источник статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *