- Необходимые материалы
- Подключение Raspberry Pi к LoRa
- Подключение Arduino к LoRa
- pyLoRa для Raspberry Pi
- Настройка модуля Raspberry Pi для LoRa
- Программирование Raspberry Pi для LoRa
- Код Arduino для LoRa для связи с Raspberry Pi
- Тестирование связи LoRa между Raspberry Pi и Arduino
LoRa становится все более популярным с появлением IoT, Connected Cars, M2M, Industry 4.0 и т. Д. Благодаря своей способности передавать данные на большие расстояния с очень меньшей мощностью, дизайнеры предпочитают использовать его для отправки / получения данных от Thing с батарейным питанием. Мы уже обсудили основы LoRa и то, как использовать LoRa с Arduino. Хотя технология изначально предназначена для связи узла LoRa со шлюзом LoRa, существует множество сценариев, в которых узел LoRa должен связываться с другим узлом LoRa для обмена информацией на большом расстоянии. Итак, в этом руководстве мы узнаем, как использовать модуль LoRa SX1278 с Raspberry pi.для связи с другим SX1278, подключенным к микроконтроллеру, например, Arduino. Этот метод может пригодиться во многих местах, поскольку Arduino может выступать в качестве сервера для получения данных с датчиков и отправки их на Pi на большое расстояние через LoRa, а затем Pi, действующий как клиент, может получить эту информацию и загрузить ее в мог, поскольку у него есть доступ к Интернету. Звучит интересно, правда? Итак, приступим.
Необходимые материалы
- Модуль LoRa SX1278 433 МГц - 2 шт.
- Антенна LoRa 433 МГц - 2Nos
- Arduino UNO- или другая версия
- Raspberry Pi 3
Предполагается, что на вашем Raspberry Pi уже установлена операционная система и он может подключаться к Интернету. Если нет, перед продолжением следуйте руководству «Начало работы с Raspberry Pi». Здесь мы используем Rasbian Jessie, установленный Raspberry Pi 3.
Предупреждение. Всегда используйте модуль SX1278 LoRa с антеннами 433 МГц; иначе модуль может быть поврежден.
Подключение Raspberry Pi к LoRa
Прежде чем мы перейдем к программным пакетам, давайте подготовим оборудование. SX1278 представляет собой 16-контактный Lora модуль, который осуществляет связь с использованием SPI на 3.3V Logic. Raspberry pi также работает с логическим уровнем 3,3 В, а также имеет встроенный порт SPI и регулятор 3,3 В. Таким образом, мы можем напрямую подключить модуль LoRa к Raspberry Pi. Таблица подключения приведена ниже.Raspberry Pi | Lora - модуль SX1278 |
3,3 В | 3,3 В |
Земля | Земля |
GPIO 10 | MOSI |
GPIO 9 | MISO |
GPIO 11 | SCK |
GPIO 8 | Nss / Включить |
GPIO 4 | DIO 0 |
GPIO 17 | ДИО 1 |
GPIO 18 | DIO 2 |
GPIO 27 | DIO 3 |
GPIO 22 | RST |
Вы также можете использовать приведенную ниже схему для справки. Обратите внимание, что принципиальная схема была создана с использованием модуля RFM9x, который очень похож на модуль SX1278, поэтому внешний вид может отличаться на изображении ниже.
Соединения довольно просты, единственная проблема, с которой вы можете столкнуться, заключается в том, что SX1278 не совместим с макетной платой, поэтому вам нужно использовать соединительные провода напрямую для выполнения соединений или использовать две небольшие макеты, как показано ниже. Также мало кто предлагает запитать модуль LoRa отдельной шиной питания 3,3 В, поскольку Pi может не обеспечивать достаточный ток. Однако модуль Lora с низким энергопотреблением должен работать на шине 3,3 В Pi, я протестировал то же самое и обнаружил, что он работает без каких-либо проблем. Но все же отнеситесь к этому с долей скепсиса. Моя настройка подключения LoRa с Raspberry pi выглядит примерно так, как показано ниже.
Подключение Arduino к LoRa
Подключение модуля Arduino остается таким же, как и в предыдущем уроке. Единственная разница будет заключаться в том, что вместо использования библиотеки от Sandeep Mistry мы будем использовать библиотеку Rspreal на основе Radio head, которую мы обсудим позже в этом проекте. Схема приведена ниже
Опять же, вы можете использовать вывод 3.3V на Arduino Uno или использовать отдельный регулятор 3.3V. В этом проекте я использовал бортовой стабилизатор напряжения. Таблица соединений штырей приведена ниже, чтобы помочь вам легко выполнить соединения.
Модуль LoRa SX1278 | Плата Arduino UNO |
3,3 В | 3,3 В |
Gnd | Gnd |
En / Nss | D10 |
G0 / DIO0 | D2 |
SCK | D13 |
MISO | D12 |
MOSI | D11 |
RST | D9 |
Поскольку модуль не помещается в макетную плату, я использовал соединительные провода напрямую для подключения. После того, как соединение будет установлено, установка Arduino LoRa будет выглядеть примерно так, как показано ниже.
pyLoRa для Raspberry Pi
Есть много пакетов Python, которые вы можете использовать с LoRa. Также обычно Raspberry Pi используется как LoRaWAN для получения данных от нескольких узлов LoRa. Но в этом проекте наша цель - одноранговая связь между двумя модулями Raspberry Pi или между Raspberry Pi и Arduino. Итак, я решил использовать пакет pyLoRa. Он имеет модули rpsreal LoRa Arduino и rpsreal LoRa Raspberry pi, которые можно использовать в среде Arduino и Raspberry Pi. А пока давайте сосредоточимся на среде Raspberry Pi.
Настройка модуля Raspberry Pi для LoRa
Как было сказано ранее, модуль LoRa работает с SPI-связью, поэтому нам нужно включить SPI на Pi, а затем установить пакет pylora . Выполните следующие шаги, чтобы сделать то же самое, после открытия окна терминала Pi. Опять же, я использую замазку для подключения к своему Pi, вы можете использовать свой удобный способ.
Шаг 1: Войдите в окно конфигурации, используя следующую команду. Чтобы получить окно ниже
sudo raspi-config
Шаг 2. Перейдите к параметрам интерфейса и включите SPI, как показано на изображении ниже. Мы должны включить интерфейс SPI, потому что, как мы обсуждали, ЖК-дисплей и PI взаимодействуют через протокол SPI.
Шаг 3: Сохраните изменения и вернитесь в окно терминала. Убедитесь, что pip и python обновлены, а затем установите пакет RPi.GPIO , используя следующую команду.
pip установить RPi.GPIO
Этот класс пакета поможет нам контролировать вывод GPIO на Pi. В случае успешной установки ваш экран будет выглядеть так
Шаг 4: Аналогичным образом продолжите установку пакета spidev , используя следующую команду. Spidev - это привязка Python для Linux, которую можно использовать для выполнения связи SPI на Raspberry Pi.
pip install spidev
Если установка прошла успешно, терминал должен выглядеть примерно так, как показано ниже.
Шаг 5: Затем давайте установим пакет pyLoRa, используя следующую команду pip. Этот пакет устанавливает модели Radio, связанные с LoRa.
pip установить pyLoRa
Если установка прошла успешно, вы увидите следующий экран.
Пакет PyLoRa также поддерживает зашифрованную связь, которую можно беспрепятственно использовать с Arduino и Raspberry Pi. Это повысит безопасность данных в вашем общении. Но после этого шага вам необходимо установить отдельный пакет, чего я не делаю, поскольку шифрование не входит в объем данного руководства. Вы можете перейти по указанным выше ссылкам на github для получения более подробной информации.
После этого шага вы можете добавить информацию о пути к пакету в pi и попробовать программу python, указанную в конце. Но мне не удалось успешно добавить путь, и поэтому мне пришлось вручную загрузить библиотеку и использовать ее непосредственно для своих программ. Поэтому мне пришлось выполнить следующие шаги
Шаг 6: Загрузите и установите пакет python-rpi.gpio и пакет spidev, используя следующую команду.
sudo apt-get install python-rpi.gpio python3-rpi.gpio sudo apt-get install python-spidev python3-spidev
Окно терминала должно отображать что-то подобное после обеих установок.
Шаг 7: Также установите git и затем используйте его для клонирования каталога python для нашей Raspberry Pi. Вы можете сделать это с помощью следующих команд.
sudo apt-get install git sudo git clone
После завершения этого шага вы должны найти подкаталог SX127x в домашней папке Raspberry Pi. Это будет иметь все необходимые файлы, связанные с библиотекой.
Программирование Raspberry Pi для LoRa
В одноранговой связи LoRa модуль, который передает информацию, называется сервером, а модуль, который получает информацию, называется клиентом. В большинстве случаев Arduino будет использоваться в полевых условиях с датчиком для измерения данных, а Pi будет использоваться для получения этих данных. Итак, я решил использовать Raspberry Pi в качестве клиента и Arduino в качестве сервера в этом руководстве. Полная клиентская программа Raspberry Pi можно найти в нижней части этой страницы. Здесь я постараюсь объяснить важные строчки программы.
Внимание! Убедитесь, что файл программы находится в том же каталоге, что и папка библиотеки SX127x. Вы можете скопировать эту папку и использовать ее где угодно, если хотите перенести проект.
Программа довольно проста: нам нужно настроить модуль LoRa на работу на частоте 433 МГц, а затем прослушивать входящие пакеты. Если мы что-то получаем, мы просто печатаем их на консоли. Как всегда, мы начинаем программу с импорта необходимых библиотек python.
от времени импорт сна из SX127x.LoRa импорт * из SX127x.board_config импорт BOARD BOARD.setup ()
В этом случае временной пакет используется для создания задержек, пакет Lora используется для связи LoRa, а board_config используется для установки параметров платы и LoRa. Мы также настраиваем плату с помощью функции BOARD.setup () .
Затем мы создаем класс Python LoRa с тремя определениями. Поскольку мы делаем отступ только для того, чтобы программа работала как малиновый клиент, у класса есть только три функции, а именно класс init, класс запуска и класс on_rx_done . Класс init инициализирует модуль LoRa на частоте 433 МГц с полосой пропускания 125 кГц, как установлено в методе set_pa_config . Затем он также переводит модуль в спящий режим для экономии энергии.
# Средние значения по умолчанию после инициализации: 434,0 МГц, Bw = 125 кГц, Cr = 4/5, Sf = 128 чипов / символ, CRC на 13 дБм lora.set_pa_config (pa_select = 1) def __init __ (self, verbose = False): super (LoRaRcvCont, self).__ init __ (подробный) self.set_mode (MODE.SLEEP) self.set_dio_mapping (* 6)
Функция запуска - это когда мы настраиваем модуль как приемник и получаем RSSI (индикатор уровня принимаемого сигнала), состояние, рабочую частоту и т. Д. Мы устанавливаем модуль для работы в режиме непрерывного приема (RXCONT) из спящего режима, а затем используем цикл while для чтения таких значений, как RSSI и статус модема. Мы также сбрасываем данные из последовательного буфера на терминал.
def start (self): self.reset_ptr_rx () self.set_mode (MODE.RXCONT) while True: sleep (.5) rssi_value = self.get_rssi_value () status = self.get_modem_status () sys.stdout.flush ()
Наконец, функция on_rx_done запускается после чтения входящего пакета. В этой функции полученные значения перемещаются в переменную, называемую полезной нагрузкой, из буфера Rx после установки высокого флага приема. Затем полученные значения декодируются с помощью utf-8 для печати читаемых пользователем данных в оболочке. Мы также переводим модуль обратно в спящий режим до получения другого значения.
def on_rx_done (self): print ("\ nReceived:") self.clear_irq_flags (RxDone = 1) payload = self.read_payload (nocheck = True) print (bytes (payload).decode ("utf-8", 'ignore'))) self.set_mode (MODE.SLEEP) self.reset_ptr_rx () self.set_mode (MODE.RXCONT)
Оставшаяся часть программы - это просто распечатать полученные значения на консоли и завершить программу с помощью прерывания клавиатуры. Мы снова переводим плату в спящий режим даже после завершения программы для экономии энергии.
попробуйте: lora.start () кроме KeyboardInterrupt: sys.stdout.flush () print ("") sys.stderr.write ("KeyboardInterrupt \ n") наконец: sys.stdout.flush () print ("") lora. set_mode (MODE.SLEEP) BOARD.teardown ()
Код Arduino для LoRa для связи с Raspberry Pi
Как я упоминал ранее, код rpsreal поддерживает как Arduino, так и Pi, и, следовательно, возможна связь между Arduino и Pi. Он работает на основе библиотеки Radiohead от AirSpayce. Таким образом, вы должны сначала установить библиотеку радиоголовки в вашу Arduino IDE.
Для этого посетите страницу Github и загрузите библиотеку в ZIP-архиве. Затем поместите его в папку библиотеки вашей Arduino IDE. Теперь перезапустите IDE Arduino, и вы найдете файлы примеров для библиотеки Radio Head. Здесь мы запрограммируем Arduino для работы в качестве сервера LoRa для отправки тестовых пакетов, например от 0 до 9. Полный код для того же, как всегда, можно найти внизу этой страницы. Здесь я объясню несколько важных строк программы.
Мы начинаем программу с импорта библиотеки SPI (установленной по умолчанию) для использования протокола SPI, а затем библиотеки RH_RF95 из Radio head для выполнения связи LoRa. Затем мы определяем, к какому выводу Arduino мы подключили выводы Chip Select (CS), Reset (RST) и Interrupt (INT) LoRa с Arduino. Наконец, мы также определяем, что модуль должен работать на частоте 434 МГц, и инициализируем модуль LoRa.
#включают
Внутри функции настройки мы сбросим модуль LoRa, потянув его вывод сброса на низкий уровень на 10 миллисекунд, чтобы начать все заново. Затем мы инициализируем его с помощью модуля, который мы создали ранее с помощью библиотеки Radio head. Затем мы устанавливаем частоту и мощность передачи для сервера LoRa. Чем выше скорость передачи, тем больше расстояние будут проходить ваши пакеты, но они будут потреблять больше энергии.
void setup () { // Инициализируем монитор последовательного порта Serial.begin (9600); // Сброс модуля LoRa pinMode (RFM95_RST, OUTPUT); digitalWrite (RFM95_RST, LOW); задержка (10); digitalWrite (RFM95_RST, HIGH); задержка (10); // Инициализируем модуль LoRa while (! Rf95.init ()) { Serial.println ("Ошибка инициализации радио LoRa"); в то время как (1); } // Устанавливаем частоту по умолчанию 434,0 МГц if (! Rf95.setFrequency (RF95_FREQ)) { Serial.println ("setFrequency failed"); в то время как (1); } rf95.setTxPower (18); // Мощность передачи модуля Lora }
Внутри функции бесконечного цикла нам просто нужно отправить пакет данных через модуль LoRa. Эти данные могут быть чем угодно, например значением датчика команды пользователя. Но для простоты мы будем отправлять значение char от 0 до 9 для каждого 1-секундного интервала, а затем инициализировать значение обратно на 0 после достижения 9. Обратите внимание, что значения могут быть отправлены только в формате массива символов, а тип данных должен быть unit8_t составляет 1 байт за раз. Код, который делает то же самое, показан ниже.
void loop () { Serial.print ("Отправить:"); char radiopacket = char (значение)}; rf95.send ((uint8_t *) radiopacket, 1); задержка (1000); значение ++; если (значение> '9') значение = 48; }
Тестирование связи LoRa между Raspberry Pi и Arduino
Теперь, когда у нас есть готовое оборудование и программа, нам просто нужно загрузить код Arduino на плату UNO, и эскиз python должен быть запущен на пи. Моя тестовая установка с обоими подключенными аппаратными средствами выглядит примерно так, как показано ниже.
После запуска скетча клиента python на Pi (используйте только python 3), если все работает правильно, вы должны увидеть пакеты Arduino, полученные в pi, через окно оболочки. Вы должны заметить «Received: 0» до 9, как показано на изображении ниже.
Полный код Raspberry pi со всеми необходимыми библиотеками можно скачать здесь.
Теперь вы можете переместить сервер Arduino и проверить радиус действия модуля; при необходимости также можно отобразить значение RSSI в оболочке. Полный рабочий проект можно найти в видео, связанное ниже. Теперь, когда мы знаем, как установить связь LoRa с низким энергопотреблением на большом расстоянии между Arduino и Raspberry pi, мы можем продолжить добавление датчика на стороне Arduino и облачной платформы на стороне Pi, чтобы создать полный пакет IoT.
Надеюсь, вы поняли проект и получили удовольствие от его создания. Если у вас возникли проблемы с его работой, используйте раздел комментариев ниже или форумы для других технических вопросов.