ESP32 с LoRa в Arduino IDE — Начало работы

В этом руководстве мы рассмотрим основные принципы LoRa и то, как эта технология может использоваться с ESP32 для IoT-проектов с помощью Arduino IDE. Для начала мы покажем, как создать простой LoRa отправитель и LoRa приёмник с помощью модуля трансивера RFM95.

Смотрите видеоурок

Введение в LoRa

Что такое LoRa?

LoRa — это технология беспроводной передачи данных, которая использует метод радиомодуляции, генерируемый чипами трансиверов Semtech LoRa.

LoRa Semtech радиомодуляция

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

Введение в LoRa

Частоты LoRa

LoRa использует нелицензируемые частоты, доступные по всему миру. Вот наиболее часто используемые частоты:

  • 868 МГц для Европы

  • 915 МГц для Северной Америки

  • 433 МГц для Азии

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

Применение LoRa

Дальнобойность и низкое энергопотребление LoRa делают эту технологию идеальной для датчиков с батарейным питанием и приложений с низким энергопотреблением в следующих областях:

  • Интернет вещей (IoT)

  • Умный дом

  • Межмашинное взаимодействие

  • И многое другое…

Таким образом, LoRa — хороший выбор для сенсорных узлов, работающих от батарейки или солнечной энергии, которые передают небольшие объёмы данных.

Питание от батарейки и солнечной панели

Имейте в виду, что LoRa не подходит для проектов, которые:

  • Требуют высокой скорости передачи данных;

  • Нуждаются в очень частых передачах;

  • Или находятся в густонаселённых сетях.

Топологии LoRa

LoRa можно использовать в:

Топологии LoRa
  • Связь «точка-точка»

  • Или построить сеть LoRa (используя, например, LoRaWAN)

Связь «точка-точка»

При связи «точка-точка» два устройства с поддержкой LoRa обмениваются данными с помощью радиосигналов.

Например, это полезно для обмена данными между двумя платами ESP32, оснащёнными чипами LoRa-трансивера, которые находятся на относительно большом расстоянии друг от друга или в среде без покрытия Wi-Fi.

LoRa точка-точка с ESP32

В отличие от Wi-Fi или Bluetooth, которые поддерживают только связь на короткие расстояния, два устройства LoRa с подходящей антенной могут обмениваться данными на большом расстоянии.

Сравнение LoRa, Wi-Fi и Bluetooth

Вы можете легко настроить ESP32 с чипом LoRa для надёжной передачи и приёма данных на расстоянии более 200 метров (вы можете получить лучшие результаты в зависимости от вашей среды и настроек LoRa). Существуют также другие решения LoRa, которые легко обеспечивают дальность более 30 км.

LoRaWAN

Вы также можете построить сеть LoRa с использованием LoRaWAN.

LoRaWAN

Протокол LoRaWAN — это спецификация сети с низким энергопотреблением и большой зоной покрытия (LPWAN), производная от технологии LoRa, стандартизированная LoRa Alliance. Мы не будем подробно рассматривать LoRaWAN в этом руководстве, но для получения дополнительной информации вы можете посетить сайты LoRa Alliance и The Things Network.

Как LoRa может быть полезна в проектах домашней автоматизации?

Давайте рассмотрим практическое применение.

Представьте, что вы хотите измерить влажность почвы на своём участке. Хотя он находится недалеко от вашего дома, вероятно, там нет покрытия Wi-Fi. Поэтому вы можете создать сенсорный узел с ESP32 и датчиком влажности, который отправляет показания влажности один или два раза в день на другой ESP32 с помощью LoRa.

Пример IoT с LoRa

Второй ESP32 имеет доступ к Wi-Fi и может запускать веб-сервер, который отображает показания влажности.

LoRa с ESP32 веб-сервером

Это лишь пример, который иллюстрирует, как можно использовать технологию 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», за которым следует счётчик, для тестовых целей. Это сообщение можно легко заменить полезными данными, такими как показания датчиков или уведомления.

Необходимые компоненты для ESP32 LoRa

Для выполнения этой части вам понадобятся следующие компоненты:

Альтернатива:

Вместо использования ESP32 и отдельного модуля LoRa-трансивера существуют платы разработки ESP32 со встроенным чипом LoRa и OLED-дисплеем, что значительно упрощает подключение. Если у вас есть одна из таких плат, вы можете следовать руководству: TTGO LoRa32 SX1276 OLED Board: Getting Started with Arduino IDE.

ESP32 плата со встроенным LoRa и OLED

Подготовка 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-трансивера

Для отправки и приёма сообщений LoRa с ESP32 мы будем использовать модуль трансивера RFM95. Все модули LoRa являются трансиверами, что означает, что они могут отправлять и принимать информацию. Вам понадобится 2 штуки.

Модуль трансивера RFM95

Вы также можете использовать другие совместимые модули на основе Semtech SX1276/77/78/79, включая: RFM96W, RFM98W и т.д.

В качестве альтернативы существуют платы ESP32 со встроенными LoRa и OLED-дисплеем, такие как ESP32 Heltec Wifi Module или TTGO LoRa32 board.

ESP32 LoRa OLED

Перед покупкой модуля LoRa-трансивера убедитесь, что вы выбрали правильную частоту для вашего местоположения. Вы можете посетить следующую веб-страницу, чтобы узнать больше о радиосигналах и нормативных требованиях для каждой страны. Например, в Португалии можно использовать частоту от 863 до 870 МГц или 433 МГц. Для этого проекта мы будем использовать RFM95, работающий на частоте 868 МГц.

Подготовка модуля трансивера RFM95

Если у вас плата разработки ESP32 со встроенным LoRa, вы можете пропустить этот шаг.

Трансивер RFM95 не подходит для использования с макетной платой напрямую. Стандартный ряд штырьковых разъёмов 2,54 мм не подходит к выводам трансивера. Расстояние между контактами меньше обычного.

RFM95 узкие расстояния между контактами

Есть несколько вариантов доступа к контактам трансивера:

  • Вы можете припаять провода непосредственно к трансиверу;

  • Разломить штырьковые разъёмы и припаять каждый отдельно;

  • Или купить плату расширения, которая делает контакты совместимыми с макетной платой.

Мы припаяли разъём к модулю, как показано на рисунке ниже.

RFM95 припаянные разъёмы

Таким образом, вы можете получить доступ к контактам модуля с помощью обычных соединительных проводов или даже вставить штырьковые разъёмы для подключения непосредственно к монтажной или макетной плате.

Антенна

Чип трансивера RFM95 требует внешней антенны, подключённой к контакту ANA.

Контакт антенны ANA

Вы можете подключить «настоящую» антенну или сделать её самостоятельно, используя проводник, как показано на рисунке ниже. Некоторые платы расширения поставляются со специальным разъёмом для подключения надлежащей антенны.

Антенна RFM95

Длина провода зависит от частоты:

  • 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 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 отправителя

Скетч 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 отправитель — монитор последовательного порта

Скетч 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 отправитель и LoRa приёмник с помощью ESP32.

Дальнейшее развитие

Теперь вам следует протестировать дальность связи между отправителем и приёмником в вашем районе. Дальность связи значительно варьируется в зависимости от вашей среды (живёте ли вы в сельской местности или в городской зоне с множеством высотных зданий). Для тестирования дальности связи вы можете добавить OLED-дисплей к LoRa приёмнику и отправиться на прогулку, чтобы увидеть, на каком расстоянии вы можете поддерживать связь (это тема для будущего руководства).

ESP32 LoRa в полевых условиях

В этом примере мы отправляем только сообщение hello, но идея состоит в том, чтобы заменить этот текст полезной информацией.

Заключение

Подведём итоги. В этом руководстве мы показали вам основы технологии LoRa:

  • LoRa — это метод радиомодуляции;

  • LoRa обеспечивает связь на большие расстояния с небольшими объёмами данных и требует малого энергопотребления;

  • LoRa можно использовать для связи «точка-точка» или в сети;

  • LoRa может быть особенно полезна, если вы хотите контролировать датчики, которые не покрыты вашей сетью Wi-Fi и находятся на расстоянии нескольких метров друг от друга.

Мы также показали вам, как создать простой LoRa отправитель и LoRa приёмник. Это простые примеры для начала работы с LoRa. Мы будем добавлять больше проектов на эту тему, так что следите за обновлениями!

Вам также может быть интересно:

Это отрывок из курса: Learn ESP32 with Arduino IDE. Если вам нравится ESP32 и вы хотите узнать больше, мы рекомендуем записаться на курс Learn ESP32 with Arduino IDE.