ESP32 с LoRa в Arduino IDE — Начало работы
В этом руководстве мы рассмотрим основные принципы LoRa и то, как эта технология может использоваться с ESP32 для IoT-проектов с помощью Arduino IDE. Для начала мы покажем, как создать простой LoRa отправитель и LoRa приёмник с помощью модуля трансивера RFM95.
Смотрите видеоурок
Введение в LoRa
Что такое LoRa?
LoRa — это технология беспроводной передачи данных, которая использует метод радиомодуляции, генерируемый чипами трансиверов Semtech LoRa.
Этот метод модуляции обеспечивает передачу данных на большие расстояния с небольшими объёмами данных (что означает низкую пропускную способность), высокую устойчивость к помехам при минимальном энергопотреблении. Таким образом, он позволяет осуществлять связь на большие расстояния с низкими требованиями к мощности.
Частоты LoRa
LoRa использует нелицензируемые частоты, доступные по всему миру. Вот наиболее часто используемые частоты:
868 МГц для Европы
915 МГц для Северной Америки
433 МГц для Азии
Поскольку эти частоты нелицензируемые, любой может свободно использовать их без оплаты или необходимости получения лицензии. Проверьте частоты, используемые в вашей стране.
Применение LoRa
Дальнобойность и низкое энергопотребление LoRa делают эту технологию идеальной для датчиков с батарейным питанием и приложений с низким энергопотреблением в следующих областях:
Интернет вещей (IoT)
Умный дом
Межмашинное взаимодействие
И многое другое…
Таким образом, LoRa — хороший выбор для сенсорных узлов, работающих от батарейки или солнечной энергии, которые передают небольшие объёмы данных.
Имейте в виду, что LoRa не подходит для проектов, которые:
Требуют высокой скорости передачи данных;
Нуждаются в очень частых передачах;
Или находятся в густонаселённых сетях.
Топологии LoRa
LoRa можно использовать в:
Связь «точка-точка»
Или построить сеть LoRa (используя, например, LoRaWAN)
Связь «точка-точка»
При связи «точка-точка» два устройства с поддержкой LoRa обмениваются данными с помощью радиосигналов.
Например, это полезно для обмена данными между двумя платами ESP32, оснащёнными чипами LoRa-трансивера, которые находятся на относительно большом расстоянии друг от друга или в среде без покрытия Wi-Fi.
В отличие от Wi-Fi или Bluetooth, которые поддерживают только связь на короткие расстояния, два устройства LoRa с подходящей антенной могут обмениваться данными на большом расстоянии.
Вы можете легко настроить ESP32 с чипом 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 имеет доступ к Wi-Fi и может запускать веб-сервер, который отображает показания влажности.
Это лишь пример, который иллюстрирует, как можно использовать технологию LoRa в проектах ESP32.
Примечание: мы учим строить этот проект в нашем курсе «Learn ESP32 with Arduino IDE». Это Проект 4 в содержании: LoRa Long Range Sensor Monitoring – Reporting Sensor Readings from Outside: Soil Moisture and Temperature. Подробности на странице курса.
ESP32 с LoRa
В этом разделе мы покажем, как начать работу с LoRa на ESP32 с помощью Arduino IDE. В качестве примера мы создадим простой LoRa отправитель и LoRa приёмник.
LoRa отправитель будет отправлять сообщение «hello», за которым следует счётчик, для тестовых целей. Это сообщение можно легко заменить полезными данными, такими как показания датчиков или уведомления.
Для выполнения этой части вам понадобятся следующие компоненты:
Плата расширения RFM95 LoRa (опционально)
Альтернатива:
Вместо использования ESP32 и отдельного модуля LoRa-трансивера существуют платы разработки ESP32 со встроенным чипом LoRa и OLED-дисплеем, что значительно упрощает подключение. Если у вас есть одна из таких плат, вы можете следовать руководству: TTGO LoRa32 SX1276 OLED Board: Getting Started with Arduino IDE.
Подготовка Arduino IDE
Для Arduino IDE существует дополнение, которое позволяет программировать ESP32 с помощью Arduino IDE и его языка программирования. Следуйте одному из следующих руководств, чтобы подготовить Arduino IDE для работы с ESP32, если вы этого ещё не сделали.
Установка библиотеки LoRa
Существует несколько библиотек для удобной отправки и приёма пакетов LoRa с ESP32. В этом примере мы будем использовать библиотеку arduino-LoRa от sandeep mistry.
Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries и найдите «LoRa». Выберите библиотеку LoRa, выделенную на рисунке ниже, и установите её.
Получение модулей LoRa-трансивера
Для отправки и приёма сообщений LoRa с ESP32 мы будем использовать модуль трансивера RFM95. Все модули LoRa являются трансиверами, что означает, что они могут отправлять и принимать информацию. Вам понадобится 2 штуки.
Вы также можете использовать другие совместимые модули на основе Semtech SX1276/77/78/79, включая: RFM96W, RFM98W и т.д.
В качестве альтернативы существуют платы ESP32 со встроенными LoRa и OLED-дисплеем, такие как ESP32 Heltec Wifi Module или TTGO LoRa32 board.
Перед покупкой модуля LoRa-трансивера убедитесь, что вы выбрали правильную частоту для вашего местоположения. Вы можете посетить следующую веб-страницу, чтобы узнать больше о радиосигналах и нормативных требованиях для каждой страны. Например, в Португалии можно использовать частоту от 863 до 870 МГц или 433 МГц. Для этого проекта мы будем использовать RFM95, работающий на частоте 868 МГц.
Подготовка модуля трансивера RFM95
Если у вас плата разработки ESP32 со встроенным LoRa, вы можете пропустить этот шаг.
Трансивер RFM95 не подходит для использования с макетной платой напрямую. Стандартный ряд штырьковых разъёмов 2,54 мм не подходит к выводам трансивера. Расстояние между контактами меньше обычного.
Есть несколько вариантов доступа к контактам трансивера:
Вы можете припаять провода непосредственно к трансиверу;
Разломить штырьковые разъёмы и припаять каждый отдельно;
Или купить плату расширения, которая делает контакты совместимыми с макетной платой.
Мы припаяли разъём к модулю, как показано на рисунке ниже.
Таким образом, вы можете получить доступ к контактам модуля с помощью обычных соединительных проводов или даже вставить штырьковые разъёмы для подключения непосредственно к монтажной или макетной плате.
Антенна
Чип трансивера RFM95 требует внешней антенны, подключённой к контакту ANA.
Вы можете подключить «настоящую» антенну или сделать её самостоятельно, используя проводник, как показано на рисунке ниже. Некоторые платы расширения поставляются со специальным разъёмом для подключения надлежащей антенны.
Длина провода зависит от частоты:
868 МГц: 86,3 мм (3,4 дюйма)
915 МГц: 81,9 мм (3,22 дюйма)
433 МГц: 173,1 мм (6,8 дюйма)
Для нашего модуля нам нужно использовать провод длиной 86,3 мм, припаянный непосредственно к контакту ANA трансивера. Обратите внимание, что использование надлежащей антенны увеличит дальность связи.
Важно: вы ОБЯЗАНЫ подключить антенну к модулю.
Подключение модуля трансивера LoRa RFM95
Модуль трансивера LoRa RFM95 взаимодействует с ESP32 по протоколу связи SPI. Поэтому мы будем использовать стандартные SPI-контакты ESP32. Подключите обе платы ESP32 к соответствующим модулям трансивера, как показано на следующей принципиальной схеме:
Вот соединения между модулем трансивера LoRa RFM95 и ESP32:
ANA: Антенна
GND: GND
DIO3: не подключать
DIO4: не подключать
3.3V: 3.3V
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 секунд с помощью LoRa. Он отправляет «hello», за которым следует число, увеличивающееся с каждым сообщением.
/*********
Rui Santos & Sara Santos - Random Nerd Tutorials
Modified from the examples of the Arduino LoRa library
More resources: https://RandomNerdTutorials.com/esp32-lora-rfm95-transceiver-arduino-ide/
*********/
#include <SPI.h>
#include <LoRa.h>
//define the pins used by the transceiver module
#define ss 5
#define rst 14
#define dio0 2
int counter = 0;
void setup() {
//initialize Serial Monitor
Serial.begin(115200);
while (!Serial);
Serial.println("LoRa Sender");
//setup LoRa transceiver module
LoRa.setPins(ss, rst, dio0);
//replace the LoRa.begin(---E-) argument with your location's frequency
//433E6 for Asia
//868E6 for Europe
//915E6 for North America
while (!LoRa.begin(868E6)) {
Serial.println(".");
delay(500);
}
// Change sync word (0xF3) to match the receiver
// The sync word assures you don't get LoRa messages from other LoRa transceivers
// ranges from 0-0xFF
LoRa.setSyncWord(0xF3);
Serial.println("LoRa Initializing OK!");
}
void loop() {
Serial.print("Sending packet: ");
Serial.println(counter);
//Send LoRa packet to receiver
LoRa.beginPacket();
LoRa.print("hello ");
LoRa.print(counter);
LoRa.endPacket();
counter++;
delay(10000);
}
Давайте кратко рассмотрим код.
Он начинается с подключения необходимых библиотек.
#include <SPI.h>
#include <LoRa.h>
Затем определяются контакты, используемые вашим модулем LoRa. Если вы следовали предыдущей схеме, вы можете использовать определение контактов, указанное в коде. Если вы используете плату ESP32 со встроенным LoRa, проверьте контакты, используемые модулем LoRa на вашей плате, и сделайте правильное назначение контактов.
#define ss 5
#define rst 14
#define dio0 2
Вы инициализируете переменную счётчика, которая начинается с 0;
int counter = 0;
В setup() вы инициализируете последовательную связь.
Serial.begin(115200);
while (!Serial);
Устанавливаете контакты для модуля LoRa.
LoRa.setPins(ss, rst, dio0);
И инициализируете модуль трансивера с указанной частотой.
while (!LoRa.begin(868E6)) {
Serial.println(".");
delay(500);
}
Возможно, вам потребуется изменить частоту в соответствии с частотой, используемой в вашем регионе. Выберите один из следующих вариантов:
433E6
868E6
915E6
Модули трансивера LoRa прослушивают пакеты в своём диапазоне. Не имеет значения, откуда приходят пакеты. Чтобы убедиться, что вы получаете пакеты только от своего отправителя, вы можете установить слово синхронизации (sync word) (от 0 до 0xFF).
LoRa.setSyncWord(0xF3);
И приёмник, и отправитель должны использовать одинаковое слово синхронизации. Таким образом, приёмник игнорирует любые пакеты LoRa, которые не содержат это слово синхронизации.
Далее, в loop() вы отправляете пакеты LoRa. Вы инициализируете пакет с помощью метода beginPacket().
LoRa.beginPacket();
Вы записываете данные в пакет с помощью метода print(). Как видно из следующих двух строк, мы отправляем сообщение hello, за которым следует счётчик.
LoRa.print("hello ");
LoRa.print(counter);
Затем закрываете пакет с помощью метода endPacket().
LoRa.endPacket();
После этого сообщение счётчика увеличивается на единицу в каждом цикле, который происходит каждые 10 секунд.
counter++;
delay(10000);
Тестирование скетча отправителя
Загрузите код на плату ESP32. Убедитесь, что вы выбрали правильную плату и COM-порт.
После этого откройте монитор последовательного порта и нажмите кнопку сброса ESP32. Вы должны увидеть сообщение об успешной инициализации, как показано на рисунке ниже. Счётчик должен увеличиваться каждые 10 секунд.
Скетч LoRa приёмника
Теперь возьмите другой ESP32 и загрузите следующий скетч (скетч LoRa приёмника). Этот скетч прослушивает пакеты LoRa с определённым вами словом синхронизации и выводит содержимое пакетов в монитор последовательного порта, а также RSSI. RSSI измеряет относительную мощность принятого сигнала.
/*********
Rui Santos & Sara Santos - Random Nerd Tutorials
Modified from the examples of the Arduino LoRa library
More resources: https://RandomNerdTutorials.com/esp32-lora-rfm95-transceiver-arduino-ide/
*********/
#include <SPI.h>
#include <LoRa.h>
//define the pins used by the transceiver module
#define ss 5
#define rst 14
#define dio0 2
void setup() {
//initialize Serial Monitor
Serial.begin(115200);
while (!Serial);
Serial.println("LoRa Receiver");
//setup LoRa transceiver module
LoRa.setPins(ss, rst, dio0);
//replace the LoRa.begin(---E-) argument with your location's frequency
//433E6 for Asia
//868E6 for Europe
//915E6 for North America
while (!LoRa.begin(868E6)) {
Serial.println(".");
delay(500);
}
// Change sync word (0xF3) to match the receiver
// The sync word assures you don't get LoRa messages from other LoRa transceivers
// ranges from 0-0xFF
LoRa.setSyncWord(0xF3);
Serial.println("LoRa Initializing OK!");
}
void loop() {
// try to parse packet
int packetSize = LoRa.parsePacket();
if (packetSize) {
// received a packet
Serial.print("Received packet '");
// read packet
while (LoRa.available()) {
String LoRaData = LoRa.readString();
Serial.print(LoRaData);
}
// print RSSI of packet
Serial.print("' with RSSI ");
Serial.println(LoRa.packetRssi());
}
}
Этот скетч очень похож на предыдущий. Отличается только loop().
Возможно, вам потребуется изменить частоту и слово синхронизации, чтобы они совпадали с теми, что используются в скетче отправителя.
В loop() код проверяет, был ли получен новый пакет, с помощью метода parsePacket().
int packetSize = LoRa.parsePacket();
Если есть новый пакет, мы считываем его содержимое, пока оно доступно.
Для чтения входящих данных используется метод readString().
while (LoRa.available()) {
String LoRaData = LoRa.readString();
Serial.print(LoRaData);
}
Входящие данные сохраняются в переменной LoRaData и выводятся в монитор последовательного порта.
Наконец, следующие две строки кода выводят RSSI принятого пакета в дБ.
Serial.print("' with RSSI ");
Serial.println(LoRa.packetRssi());
Тестирование скетча LoRa приёмника
Загрузите этот код на ваш ESP32. На этом этапе у вас должны быть две платы ESP32 с разными скетчами: отправитель и приёмник.
Откройте монитор последовательного порта для LoRa приёмника и нажмите кнопку сброса LoRa отправителя. Вы должны начать получать пакеты LoRa на приёмнике.
Поздравляем! Вы создали LoRa отправитель и LoRa приёмник с помощью ESP32.
Дальнейшее развитие
Теперь вам следует протестировать дальность связи между отправителем и приёмником в вашем районе. Дальность связи значительно варьируется в зависимости от вашей среды (живёте ли вы в сельской местности или в городской зоне с множеством высотных зданий). Для тестирования дальности связи вы можете добавить OLED-дисплей к LoRa приёмнику и отправиться на прогулку, чтобы увидеть, на каком расстоянии вы можете поддерживать связь (это тема для будущего руководства).
В этом примере мы отправляем только сообщение hello, но идея состоит в том, чтобы заменить этот текст полезной информацией.
Заключение
Подведём итоги. В этом руководстве мы показали вам основы технологии LoRa:
LoRa — это метод радиомодуляции;
LoRa обеспечивает связь на большие расстояния с небольшими объёмами данных и требует малого энергопотребления;
LoRa можно использовать для связи «точка-точка» или в сети;
LoRa может быть особенно полезна, если вы хотите контролировать датчики, которые не покрыты вашей сетью Wi-Fi и находятся на расстоянии нескольких метров друг от друга.
Мы также показали вам, как создать простой LoRa отправитель и LoRa приёмник. Это простые примеры для начала работы с LoRa. Мы будем добавлять больше проектов на эту тему, так что следите за обновлениями!
Вам также может быть интересно:
[Обзор] TTGO LoRa32 SX1276 OLED: распиновка, характеристики и т.д.
[Руководство] TTGO LoRa32 SX1276 OLED Board: Начало работы с Arduino IDE
—
Это отрывок из курса: Learn ESP32 with Arduino IDE. Если вам нравится ESP32 и вы хотите узнать больше, мы рекомендуем записаться на курс Learn ESP32 with Arduino IDE.
Примечание
Источник: Random Nerd Tutorials — ESP32 with LoRa using Arduino IDE – Getting Started