У цьому посібнику ми розглянемо основні принципи роботи протоколу 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. Як приклад створимо кілька відправників та одержувачів.
Відправимо вітальне повідомлення із лічильником. Зрозумівши, як це працює, ви зможете використовувати цей код для відправки, наприклад, показань датчиків.

Вам потрібні такі компоненти:
- 2 плати ESP32
- 2 модулі приймача LoRa (RFM95)
- Провід DuPont
- Макетна плата

ПІДГОТОВКА ДО РОБОТИ. ВСТАНОВЛЕННЯ БІБЛІОТЕКИ 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 і знаходяться на відстані один від одного.