LoRa связь Arduino: дальняя радиосвязь для IoT
LoRa у меня появилась после истории с дачей:WiFi-роутер на участке не ловил дальше 30 метров, а GSM-сигнал пропадал в низине у реки. Купил два модуля RA-02 (на чипе SX1276) за 250 ₽ каждый, подключил к двум Arduino Uno — и получил радиоканал на 868 МГц с дальностью 1.5 км в лесу и 5 км на открытой местности. LoRa — это не WiFi и не Bluetooth: медленно (до 300 бит/с), но далеко и сквозь препятствия. Идеально для IoT-сценариев: датчик протечки, метеостанция, GPS-трекер — где данные малы, а расстояние большое.
Ниже — связка двух Arduino + RA-02: SPI-подключение, библиотека LoRa.h, отправка и приём пакетов, дальность в реальных условиях, питание 3.3 В и антенна 868 МГц. Грабли с согласованием уровней 3.3V/5V (Arduino 5V, RA-02 3.3V), частоты в РФ/EU (868 МГц) и US (915 МГц), и почему без антенны модуль живёт 10 секунд. Симулятор LoRa не поддерживает — кодовые блоки иллюстративные, проверяются на живой паре плат.
LoRa, LoRaWAN и SX1276: что к чему
LoRa — модуляция (LF Spread Spectrum), физический уровень. LoRaWAN — сетевой протокол поверх LoRa, с шифрованием и адресацией. SX1276 — чип Semtech, реализует LoRa-модуляцию, и к Arduino подключается по SPI. Модуль RA-02 (на базе SX1276) — 25x25 мм за 250 ₽, питание 3.3 В, частота 868 МГц (РФ/EU) или 915 МГц (US). LoRa сама по себе — точка-точка: две платы общаются напрямую. LoRaWAN — сеть с шлюзом и сервером, как MQTT-брокер для LoRa. Для простых проектов — LoRa точка-точка, для десятков устройств — LoRaWAN.
- SX1276: чип Semtech, модуляция LoRa, SPI-интерфейс, питание 3.3 В.
- RA-02: модуль 25x25 мм на SX1276, 250 ₽, антенна 868 МГц обязательна.
- LoRa.h: библиотека Sandeep Mistry, ставится через Менеджер библиотек.
- Частоты: 868 МГц в РФ и EU, 915 МГц в US, 433 МГц в Азии. В РФ 868 МГц без лицензии до 25 мВт.
- Дальность: 1-5 км на открытой местности, 500 м в лесу, 100-300 м в здании.
Подключение: SPI и согласование 3.3V/5V
RA-02 подключается к Arduino по SPI: NSS на D10, MOSI на D11, MISO на D12, SCK на D13, RST на D9, DIO0 на D2 (для прерываний). Питание 3.3 В с платы Arduino (на Uno — отдельный пин 3V3). Грабля: Arduino Uno работает на 5V, RA-02 на 3.3V, и прямое подключение MOSI/SCK/RST (выходы Arduino к входам RA-02) — работает, но MISO (выход RA-02 к входу Arduino) — нет, уровень 3.3V недостаточен для логической единицы на 5V-логике. Решение: согласователь уровней CD4050B (10 ₽) или делитель на MISO. На Arduino с 3.3V-логикой (Pro Mini 3.3V, ESP32) — прямое подключение работает без согласования.
Передатчик: отправка пакетов с датчика
Сценарий: метеостанция на даче отправляет температуру раз в 10 минут. Скетч: LoRa.begin(868E6), LoRa.beginPacket(), LoRa.print("T=22.5"), LoRa.endPacket(). На приёмной стороне дома — вторая Arduino с LoRa.onReceive(callback) и LoRa.receive(). Пакет приходит за 50-200 мс, в зависимости от spreading factor (SF7-SF12): SF7 — быстро, SF12 — далеко, но медленно. Подробно — в библиотеке LoRa.h и её примерах.
#include <SPI.h>#include <LoRa.h> const int NSS = 10, RST = 9, DIO0 = 2; void setup() { Serial.begin(9600); while (!Serial); LoRa.setPins(NSS, RST, DIO0); if (!LoRa.begin(868E6)) { Serial.println("LoRa init failed"); while (1); } Serial.println("LoRa TX ready");} void loop() { float t = 22.5; // читаем с датчика LoRa.beginPacket(); LoRa.print("T="); LoRa.print(t, 1); LoRa.endPacket(); Serial.println("Sent"); delay(600000); // 10 минут}#include <SPI.h>#include <LoRa.h> const int NSS = 10, RST = 9, DIO0 = 2; void onReceive(int packetSize) { String msg = ""; for (int i = 0; i < packetSize; i++) { msg += (char)LoRa.read(); } Serial.print("RSSI="); Serial.print(LoRa.packetRssi()); Serial.print(" msg="); Serial.println(msg);} void setup() { Serial.begin(9600); LoRa.setPins(NSS, RST, DIO0); if (!LoRa.begin(868E6)) { Serial.println("LoRa init failed"); while (1); } LoRa.onReceive(onReceive); LoRa.receive(); Serial.println("LoRa RX ready");} void loop() { // callback срабатывает по прерыванию DIO0}Передатчик шлёт строку «T=22.5» с разметкой, приёмник ловит в callback и печатает RSSI и текст. RSSI ниже -90 dBm — слабый сигнал, -70 — хороший, -50 — отличный. Дальше — шифрование (AES-128 через библиотеку LoRaWAN), адресация (по deviceID), и ретрансляция (многоскачковая связь). Для простого IoT — этих двух скетчей достаточно.
Дальность: что влияет на радиус
Дальность LoRa зависит от четырёх параметров. Spreading factor SF7-SF12: SF7 — 1 км, SF12 — 5 км (но скорость падает в 32 раза). Мощность передатчика TX power: от 2 до 17 dBm, выше — дальше, но больше ток. Антенна: внешняя 868 МГц диполь — 5 км, PCB-антенна — 1 км, без антенны — 50 метров и быстрый выход чипа из строя. Препятствия: лес съедает дальность в 3-5 раз, бетонные стены — в 10-20 раз, открытая местность — максимум. На открытой местности с внешней антенной и SF12 я получил 4.8 км, в лесу — 800 м, в здании — 80 м.
Грабли LoRa, на которые я наступал
- Без антенны модуль живёт 10 секунд: TX power без нагрузки отражается обратно в чип и сжигает выходной каскад. Антенна обязательна перед LoRa.begin().
- 5V на MISO: Arduino не видит логическую единицу с RA-02. CD4050B согласователь или делитель на MISO обязателен на 5V-логике.
- Частота 915 МГц в РФ: запрещена, и модуль конфискуют. Только 868 МГц, как в РФ, так и в EU.
- DIO0 на D2: прерывание на приёме. Без него callback не срабатывает, и пакеты теряются. Если D2 занят — на D3 с attachInterrupt.
- Ток при передаче 120 мА: на батарее 18650 это норма, на CR2032 — 50 передач и сядет. LoRa для батарейных IoT — AA или 18650.