В этом руководстве мы рассмотрим основные принципы работы протокола LoRa и то, как можно его использовать с ESP32 для IoT проектов в Arduino IDE. Для начала покажем, как запрограммировать отправителя и приемника на базе модуля приемопередатчика RFM95.
Что такое LoRa?
LoRa – это технология беспроводной передачи данных, в которой используется метод радиомодуляции, который может осуществляться приемопередатчиками Semtech LoRa.
Этот протокол модуляции обеспечивает передачу небольших данных на большие расстояния, высокую устойчивость к помехам при минимальном потреблении энергии.
Частоты LoRa
LoRa использует нелицензированные частоты, доступные по всему миру. Вот самые широко используемые частоты:
- 868 МГц для Европы (Россия – 863 – 870MГц, 433 МГц)
- 915 МГц для Северной Америки
- 433 МГц для Азии
Поскольку эти частоты не лицензированы, любой может свободно использовать их бесплатно. Вы можете проверить частоты, используемые в вашей стране
Где можно применить протокол LoRa?
У LoRa большой диапазон действия и низкое энергопотребление, что делает его подходящим для датчиков с питанием от батареи и приложений с низким энергопотреблением. Применяют LoRa в:
- Интернете вещей (IoT)
- Проектах «Умный дом»
- Межмашинное взаимодействие
- И др.
Итак, LoRa – хороший выбор для нод датчиков, работающих на батарейках типа R или на солнечной батареях, и которые передают небольшие объемы данных.
Имейте в виду, что LoRa не подходит для проектов, которые:
- Требуют высокой скорости передачи данных;
- Требуют высокой частоты передач;
- Работают в местах, где данные частоты переполнены.
Топологии LoRa
Вы можете использовать LoRa в:
- Сетях «точка-точка»
- Сетях LoRa (например, созданных с помощью LoRaWAN)
Сеть «точка-точка»
В сети точка-точка два устройства с поддержкой LoRa взаимодействуют друг с другом с помощью радиосигналов.
Применить такую сеть можно, например, для обмена данными между двумя платами ESP32, оснащенными чипами приемопередатчиков LoRa, которые при этом находятся относительно далеко друг от друга или в зонах без покрытия Wi-Fi.
В отличие от Wi-Fi или Bluetooth, которые поддерживают связь только на короткие расстояния, два устройства, работающие по протоколу LoRa могут обмениваться данными на достаточно большом расстоянии.
Достаточно легко организовать передачу данных на расстояния более 200 метров (в зависимости от местности и настроек LoRa можно получить еще больше цифры). Существуют также другие решения LoRa, которые имеют дальность действия более 30 км.
LoRaWAN
Вы также можете построить сеть LoRa, используя LoRaWAN.
Протокол LoRaWAN – это спецификация глобальной сети с низким энергопотреблением (LPWAN), полученная на основе технологии LoRa, стандартизированной LoRa Alliance. Мы не будем исследовать LoRaWAN в этом руководстве, но для получения дополнительной информации вы можете проверить веб-сайты LoRa Alliance и The Things Network .
Чем протокол LoRa может быть полезен?
Представьте, что вы хотите измерить влажность рядом с домом/на даче. Вероятнее всего, там нет покрытия Wi-Fi. То есть, нужно сделать независимый узел с ESP32 и датчиком влажности, который будет отправлять показания влажности один или два раза в день на другую ESP32 с помощью LoRa.
А с помощью ESP32 можно создать веб-сервер, на котором эти показания можно будет наблюдать.
ESP32 с LoRa
В этом разделе рассмотрим, как организовать работу протокола LoRa с платой ESP32 в Arduino IDE. В качестве примера создадим несколько отправителей и получателей.
Отправим приветственное сообщение с счетчиком. Поняв как это работает, вы сможете использовать этот код для отправки, например, показаний датчиков.
Вам потребуются следующие компоненты:
Подготовка к работе. Установка библиотеки LoRa
В этом примере мы будем использовать библиотеку arduino-LoRa от sandeep mistry .
Откройте Arduino IDE, перейдите в Скетч > Подключить библиотеку > Управлять библиотеками…, введите в поиске «LoRa». Выберите библиотеку LoRa, выделенную на рисунке ниже, и установите ее.
Модули RFM95
Для отправки и получения сообщений LoRa с ESP32 мы будем использовать 2 модуля приемопередатчика RFM95. Все модули LoRa являются трансиверами, то есть, они могут отправлять и получать информацию.
Вы также можете использовать другие совместимые модули, такие как платы на базе Semtech SX1276 / 77/78/79, включая RFM96W, RFM98W и т.д.
Перед тем, как включать модуль приемопередатчика LoRa, убедитесь, что вы выбрали правильную частоту. В этом проекте мы будем использовать RFM95, работающий на частоте 868 МГц.
Подготовка модуля приемопередатчика RFM95
Если у вас есть плата ESP32 со встроенной LoRa, вы можете пропустить этот шаг.
Приемопередатчик RFM95 несовместим с макетной платой. Обычный ряд контактов разъема 2,54 мм не подходит для контактов трансивера.
Есть несколько вариантов, которые вы можете использовать для подключения трансивера.
- Вы можете припаять провода прямо к трансиверу;
- Разломайте контакты гребенки и припаяйте каждый по отдельности;
Мы припаяли контакты к модулю, как показано на рисунке ниже.
Антенна
Для микросхемы приемопередатчика RFM95 требуется внешняя антенна, подключенная к выводу ANA.
Вы можете подключить купленную антенну или сделать ее самостоятельно, используя провод, как показано на картинке ниже.
Длина провода зависит от частоты:
- 868 МГц : 86,3 мм.
- 915 МГц : 81,9 мм.
- 433 МГц : 173,1 мм.
Для нашего модуля понадобится провод длиной 86,3 мм, припаянный непосредственно к контакту ANA трансивера. Обратите внимание, что использование правильной антенны увеличивает дальность связи.
Важно: вы должны именно припаять антенну к модулю.
Подключение модуля приемопередатчика RFM95 LoRa
Модуль приемопередатчика RFM95 обменивается данными с ESP32 с помощью протокола связи SPI. Подключите обе платы ESP32 к соответствующим модулям приемопередатчиков, как показано на следующей принципиальной схеме:
Распиновка:
- ANA: Антенна
- GND: GND
- DIO3: не подключать
- DIO4: не подключать
- 3,3 В: 3,3 В
- DIO0: GPIO 2
- DIO1: не подключать
- DIO2: не подключать
- GND: не подключать
- DIO5 не подключать
- RESET: GPIO 14
- NSS: GPIO 5
- SCK: GPIO 18
- MOSI: GPIO 23
- MISO: GPIO 19
- GND не подключать
Примечание: модуль приемопередатчика RFM95 имеет 3 контакта GND. Неважно, какой вы используете, но вам нужно подключить хотя бы один.
По практическим соображениям мы выполнили эту схему на макетной плате (это удобнее).
Скетч для платы-отправителя LoRa
Откройте Arduino IDE и скопируйте следующий код. Этот скетч основан на примере из библиотеки LoRa. Он передает сообщения каждые 10 секунд, отправляет сообщение «hello» и число, которое растет с каждым сообщением.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
/********* Modified from the examples of the Arduino LoRa library More resources: https://randomnerdtutorials.com *********/ #include <SPI.h> #include <LoRa.h> //определяем номера пинов, используемые трансивером #define ss 5 #define rst 14 #define dio0 2 int counter = 0; void setup() { //запускаем монитор порта Serial.begin(115200); while (!Serial); Serial.println("LoRa Sender"); //настраиваем трансивер LoRa.setPins(ss, rst, dio0); //замените LoRa.begin(---E-) частотой, которую вы собираетесь использовать while (!LoRa.begin(866E6)) { Serial.println("."); delay(500); } // Измените слово синхронизации (0xF3) // Слово синхронизации нужно, чтобы не получать сообщения от других трансиверов // можно изменять в диапазоне 0-0xFF LoRa.setSyncWord(0xF3); Serial.println("LoRa Initializing OK!"); } void loop() { Serial.print("Sending packet: "); Serial.println(counter); //Отправляем сообщение LoRa.beginPacket(); LoRa.print("hello "); LoRa.print(counter); LoRa.endPacket(); counter++; delay(10000); } |
Давайте пробежимся по коду.
Подключаем необходимые библиотеки.
1 2 |
#include <SPI.h> #include <LoRa.h> |
Затем определяем контакты, используемые модулем LoRa. Если ваша схема идентична нашей, то можете оставить как есть.
1 2 3 |
#define ss 5 #define rst 14 #define dio0 2 |
Инициализируем счетчик (с нуля);
1 |
int counter = 0; |
В setup () запускаем монитор порта.
1 2 |
Serial.begin(115200); while (!Serial); |
Установите пины для модуля LoRa.
1 |
LoRa.setPins (ss, rst, dio0); |
И инициализируем модуль приемопередатчика с указанной частотой.
1 2 3 4 |
while (!LoRa.begin(866E6)) { Serial.println("."); delay(500); } |
Модули приемопередатчиков LoRa принимают пакеты данных в пределах своего диапазона. Неважно, откуда они приходят. Чтобы гарантировать получение пакетов только от платы-отправителя, вы можете установить слово синхронизации (от 0 до 0xFF).
1 |
LoRa.setSyncWord (0xF3); |
И получатель, и отправитель должны использовать одно и то же слово синхронизации. Таким образом, получатель игнорирует любые пакеты, которые не содержат это слово.
Затем в loop () отправляем сообщение. Вы инициализируете его с помощью метода beginPacket ().
1 |
LoRa.beginPacket (); |
Вы записываете данные в пакет с помощью метода print (). Как можно увидеть в следующих двух строках, мы отправляем приветственное сообщение, за которым следует счетчик.
1 2 |
LoRa.print("hello "); LoRa.print(counter); |
Затем используем метод endPacket (), чтобы закончить формирование пакета.
1 |
LoRa.endPacket (); |
После этого сообщение счетчика увеличивается на единицу в каждом цикле, который происходит каждые 10 секунд.
1 2 |
counter++; delay(10000); |
Тестируем скетч
Загрузите код на плату ESP32. Убедитесь, что у вас выбран правильный COM-порт.
После этого откройте монитор порта и нажмите кнопку включения ESP32. Вы должны увидеть сообщение об успешной отправке. Счетчик должен увеличиваться каждые 10 секунд.
Скетч для платы-приемника
Теперь возьмите еще одну ESP32 и загрузите следующий скетч. Он принимает пакеты LoRa с помощью заданного вами слова синхронизации и выводит содержимое пакетов и RSSI (относительную мощность принимаемого сигнала) в монитор порта.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
/********* Modified from the examples of the Arduino LoRa library More resources: https://randomnerdtutorials.com *********/ #include <SPI.h> #include <LoRa.h> //Определяем пины, используемые трансивером #define ss 5 #define rst 14 #define dio0 2 void setup() { //запускаем монитор порта Serial.begin(115200); while (!Serial); Serial.println("LoRa Receiver"); //указываем пины трансивера LoRa.setPins(ss, rst, dio0); //замените аргумент LoRa.begin(---E-) частотой сигнала. while (!LoRa.begin(866E6)) { Serial.println("."); delay(500); } // Укажите слово синхронизации (0xF3) LoRa.setSyncWord(0xF3); Serial.println("LoRa Initializing OK!"); } void loop() { // пытаемся обнаружить пакет int packetSize = LoRa.parsePacket(); if (packetSize) { // выводим сообщение о получении пакета Serial.print("Received packet '"); // читаем пакет while (LoRa.available()) { String LoRaData = LoRa.readString(); Serial.print(LoRaData); } // выводим RSSI пакета Serial.print("' with RSSI "); Serial.println(LoRa.packetRssi()); } } |
Этот скетч очень похож на предыдущий. Отличается только функция loop ().
Возможно, вам потребуется изменить частоту и слово синхронизации, чтобы они соответствовали тому, которое использовалось в скетче для платы-отправителя.
В цикле loop () код проверяет, был ли получен новый пакет, с помощью метода parsePacket ().
1 |
int packetSize = LoRa.parsePacket (); |
Если есть новый пакет, читаем его содержимое, пока он доступен.
Для чтения входящих данных используем метод readString ().
1 2 3 4 |
while (LoRa.available()) { String LoRaData = LoRa.readString(); Serial.print(LoRaData); } |
Входящие данные сохраняются в переменной LoRaData и выводятся в монитор порта.
Наконец, следующие две строки кода выводят RSSI полученного пакета в дБ.
1 2 |
Serial.print("' with RSSI "); Serial.println(LoRa.packetRssi()); |
Тестируем скетч
Загрузите этот код в свою ESP32. На этом этапе у вас должны быть две платы ESP32 с разными скетчами: отправитель и получатель.
Откройте монитор порта для платы-получателя и нажмите кнопку включения платы-отправителя. Должны начать поступать пакеты LoRa на приемнике.
Увеличиваем расстояние между платами
Теперь вы должны проверить работоспособность проекта там, где собираетесь его использовать. Дальность связи сильно варьируется в зависимости от местности. Чтобы проверить дальность связи, вы можете добавить OLED-дисплей к приемнику LoRa и прогуляться, чтобы посмотреть, на каком расстоянии будет сохраняться соединение.
Заключение
В этом руководстве мы разобрали основы технологии LoRa:
- LoRa – это метод радиомодуляции, который позволяет передавать небольшие объемы данных на большие расстояния и имеет небольшое энергопотребление;
- Протокол LoRa может быть особенно полезен, если вы хотите получать показания датчиков, которые не охвачены вашей сетью Wi-Fi и находятся на расстоянии друг от друга.
Вопросы по прошивке и работе с кодом лучше писать напрямую автору в комментариях к статье (на англ. языке)
3 комментария. Оставить новый
Спасибо большое, очень полезое статя. Про E32-DTU-433l30 тоже напишете пожалуйста такой же обзорная статья. Как прошить, как подключить к пк, как передать и принимать данные. Спасибо
Добрый день, я ведь правильно понимаю, что я могу сделать цепочку из устройств любой длины, где каждое устройство будет и отправителем и получателем, что то вроде ретранслятора. У меня задача в каждой точке получить сигнал с датчика и передать его показания по цепочке дальше.
Добрый день, согласно информации из даташита на модули LoRa, они не имеют режима работы, который позволял бы им работать в режиме ретранслятора.