Что такое LoRa?
Это технология связи на большие (Long Range) расстояния, запатентованная компанией Semtech, и реализованная в их чипах SX1272 and SX1276. LoRa это протокол низкого уровня, поверх которого могут реализовываться более высокоуровневые протоколы, например LoRaWAN.
Особенность стандарта LoRa — это передача небольших пакетов данных с невысоким энергопотреблением. По заверениям производителя, дальность на открытом воздухе может достигать 10км, а время работы от батареи может составлять несколько лет. Рабочие частоты зависят от страны, и составляют 433 или 868МГц (EU-версия) или 915МГц (USA-версия).
Как это работает? Подробности под катом.
Для тестирования были выбраны модули RN2483. Они хороши тем, что просты в программировании и поддерживают разные режимы работы. RN2483 содержит чип SX1276 и контроллер в одном корпусе, управляется командами UART, что позволяет подключить его к любому устройству (ПК, Arduino, микроконтроллер, etc). Можно купить модуль без обвязки, это дешевле, однако паять было лень, так что на eBay был заказан комплект из пары готовых плат.
Это позволяет подключить модули как к ПК по USB, так и к любому устройству.
Передача данных
Для передачи была написана простая программа на Python:
import serial
from time import sleep
def deviceSend(device, cmd):
try:
print cmd
device.write(cmd + "\r\n")
line = device.readline()
if line is not None and len(line) > 0:
r = line.decode('utf-8').strip()
print "> " +r
return
except Exception as e:
pass
if __name__ == "__main__":
port = serial.Serial(port="COM20", baudrate=57600, timeout=5)
deviceSend(port, "sys reset")
sleep(2)
deviceSend(port, "mac pause")
deviceSend(port, "radio set freq 868000000")
# Output power, -3..15
deviceSend(port, "radio set pwr -3")
deviceSend(port, "radio set mod lora")
# sf12, sf7
deviceSend(port, "radio set sf sf7")
# Bandwidth: with 125KHz the sensitivity is better but time on air is longer. Chip is capable from 125KHz to 500KHz.
deviceSend(port, "radio set bw 125")
deviceSend(port, "radio tx 0123456789")
sleep(0.5)
line = port.readline()
print line.strip()
deviceSend(port, "mac resume")
Разберем основные параметры подробнее.
pwr — мощность, может варьироваться в диапазоне -3..15dB
frequency — частота передачи
mac pause — отключить режим lorawan, активируется режим передачи между двумя устройствами (p2p)
tx — пакет данных
mod — вид модуляции. Доступны 2 вида, lora или fsk.
bw — ширина полосы спектра, может быть 125, 250, 500КГц.
sf — spread factor, влияет на длительность передачи.
Так выглядит спектр при sf7 и sf12 при том же объеме данных.
Как можно видеть, данные передаются короткими блоками. Максимальный размер пакета составляет не более 255 байт, после завершения передачи от модема приходит подтверждение что данные были посланы.
Прием данных
Для приема необходимо установить те же параметры, что и для передачи, в противном случае модемы не «услышат» друг друга. Код приведен ниже, программа в бесконечном цикле «слушает» данные по serial port.
import serial
from time import sleep
def deviceSend(device, cmd):
try:
print cmd
device.write(cmd + "\r\n")
line = device.readline()
if line is not None and len(line) > 0:
r = line.decode('utf-8').strip()
print "> " +r
return r
except Exception as e:
pass
return ""
if __name__ == "__main__":
port = serial.Serial(port="COM20", baudrate=57600, timeout=5)
deviceSend(port, "sys reset")
sleep(2)
deviceSend(port, "mac pause")
deviceSend(port, "radio set freq 868000000")
# Output power, -3..15dB
deviceSend(port, "radio set pwr -3")
deviceSend(port, "radio set mod lora")
# sf12, sf7
deviceSend(port, "radio set sf sf7")
# Bandwidth: with 125KHz the sensitivity is better but time on air is longer. Chip is capable from 125KHz to 500KHz.
deviceSend(port, "radio set bw 125")
# WDT: 5s wait for each data
deviceSend(port, "radio set wdt 5000")
print "Start listening"
try:
while True:
ans = deviceSend(port, "radio rx 0")
if ans == "ok":
r = port.readline().strip()
if r != "err" and len(r) > 0:
print "> " + r
# We need time to prepare RN2483 for the next receiving
sleep(0.1)
except KeyboardInterrupt:
pass
deviceSend(port, "mac resume")
Как можно видеть, все просто, и использование модема не отличается от какой-либо другой передачи по serial port. Код программы (с небольшими улучшениями) был запущен на Raspberry Pi, прием данных можно видеть на экране.
Различных команд для настройки RN2483 весьма много, их можно найти в PDF «RN2903 LoRa Technology Module Command Reference User’s Guide». Для примерной оценки результата также можно скачать программу Semtech Lora Calculator, позволяющую ввести разные настройки (ширину спектра, частоту и пр) и увидеть результат — битрейт, потребление тока, время работы от батареи.
Так например, обещаемое время работы чипа SX1276 от батареи емкостью 1000мАч составит около 30 дней при передаче блоками по 8 байт с интервалом в 100 секунд и мощностью 10dBm.
Для практической проверки дальности один из модемов был оставлен в квартире у окна, второй был подключен к Raspberry Pi и вынесен на улицу. В некоторых источниках обещается дальность в городских условиях порядка 3км. Результат увы, не так хорош: на практике, при максимальной мощности и антенне на 868МГц, сигнал полностью глушится уже примерно через 3 многоквартирных дома. Разумеется на открытых местах дальность выше, но стоит «завернуть за угол», как сигнал весьма быстро пропадает. В общем, результат 3км в городе наверное можно получить разве что если разместить антенну на телебашне, реально можно рассчитывать в лучшем случае на 300м. Но и это не так плохо, учитывая небольшую мощность передаваемого сигнала.
Цена вопроса
Информация для тех кто захочет повторить эксперименты или использовать LoRa в своих разработках. Цена комплекта их 2х готовых к использованию модемов rn2483 на eBay составляет 80EUR. Отдельно модуль с распаянным SX1276 можно приобрести у продавцов из Китая за 12$ с бесплатной доставкой. Чип SX1276 без какой-либо обвязки можно купить там же за 9$ (описанный в статье код подходит только для RN2483, при использовании чипа SX1276, программировать его придется на более низком уровне).
Выводы
Устройства стандарта LoRa представляют собой удобное и готовое решение для низкоскоростной передачи малых объемов данных на относительно большие (сотни метров-километры) расстояния. Устройства LoRa оптимизированы под низкое энергопотребление, что позволяет их использовать с питанием от батарей или аккумуляторов (однако платой за это является низкая скорость передачи данных). К примеру, если фермер захочет выводить на домашний дисплей температуру в теплицах, это будет практически идеальным применением для LoRa — малые объемы данных, большие расстояния и прямая видимость до объектов. Модемы также могут использоваться в больших помещениях — ангары, заводы, там где тянуть провод до датчиков сложно или дорого, а объемы данных невелики. Возможно использование и в домашних условиях, высокая чувствительность модулей позволит использовать даже короткие антенны в виде «зигзага» на печатной плате. В городе же, качество связи будет сильно зависеть от наличия радиовидимости между антеннами, высоты размещения антенн и пр. Многие сейчас сильно воодушевлены возможностями «глобальных» сетей LoraWAN, однако вопрос размещения антенн будет весьма критичным для дальности в подобной сети. Впрочем, это верно для любых систем передачи радиосигналов, так что чуда здесь не случилось.
В следующей части будет рассказано о подключении RN2483 к сети LoRaWAN.
Более подробную информацию можно найти по ссылкам:
— RN2483 datasheet
ww1.microchip.com/downloads/en/DeviceDoc/40001784B.pdf
— LoRa FAQ
www.link-labs.com/lora-faqs
— Semtech SX1272
www.semtech.com/wireless-rf/rf-transceivers/sx1272
— Semtech LoRa Calculator
www.semtech.com/apps/filedown/down.php?file=SX1272LoRaCalculatorSetup1%271.zip
Библиотеки для работы с RN2483 на Raspberry Pi и Arduino можно найти на github.
Комментарии (38)
golf2109
08.10.2016 13:33какие антенны для модулей использовались в тестах?
и если можно подробней о методике тестирования дальности…DmitrySpb79
08.10.2016 13:37Антенны продавались вместе с модемами. Вот такие:
RN2483 не умеет выдавать RSSI (или я не нашел), так что методика тестирования простая — Raspberry Pi мигает светодиодом при получении данных, дальше идем и смотрим где пропал сигнал.golf2109
08.10.2016 14:08я тестировал модули типа RFM95/96/97/98 — тот же Semtech SX1272
только они подключаются по SPI, так вот для них я написал программу связи с Nucleo
и отображал на экранчике, подключенном к Nucleo параметры принимаемого сигнала, которые можно получить, прочитав регистры SX1272
//RegPktSnrValue (0x19) Variable Name — PacketSnr
//Estimation of SNR on last packet received.In two’s compliment
//format mutiplied by 4.
//SNR[dB ] = PacketSnr[twos compliment] / 4
buffer[0] = RFM_Read(0x19);
//RegPktRssiValue (0x1A) Variable Name — PacketRssi
//RSSI of the latest packet received (dBm)
// RSSI[dBm ] = – 137 + PacketRssi
buffer[1] = RFM_Read(0x1A);
//RegRssiValue (0x1B) Variable Name — Rssi
//Current RSSI value (dBm)
// RSSI[dBm ] = – 137 + Rssi
buffer[2] = RFM_Read(0x1B);
думаю RN2483 тоже такое может
было бы тогда интарестно оценить затухание сигнала в количественных единицахgolf2109
08.10.2016 14:21плохо, что RN2473 не дает прямого доступа к регистрам SX1272,
но для RN2473 есть команда
radio get snr
пункт 2.5.5.16
RN2483 datasheet
Bluewolf
09.10.2016 14:59В официальной документации про лору указано, что уровень сигнала может быть даже ниже уровня шума, а прием достигается за счет широкополосного кодирования. Поэтому конкретно RSSI мерять не слишком много смысла, он не будет сильно отличаться от любой пары трансиверов с подобными частотой, мощностью и антеннами в таких же условиях.
Зато, как написали рядом, у них есть оценка SNR, и там имеется ввиду уже качество сигнала с учетом кодирования.
dernuss
08.10.2016 13:57На алиэкспресс SX1276 стоит 225? за штуку. А например si4432 стоит 71? за штуку.
По мне silabs как то выгоднее для фермера.golf2109
08.10.2016 14:15но silabs не имеет LoRa модуляции
dernuss
08.10.2016 14:30А что она даёт? Особенно для фермера? 500 метров в городе я получал на силабс.
DmitrySpb79
08.10.2016 15:00В LoRaWAN есть много чего — mac-адреса, переключение каналов, шифрование трафика, 2 режима аутентификации, возможность подключения к «сети» в любом месте где есть gateway, серверная часть для обработки принятых пакетов.
Это в принципе основное, а p2p-соединение лишь как одно из возможных применений.dernuss
08.10.2016 16:09Да я понимаю что в LoRaWAN есть много чего). Только не понимаю зачем это фермеру для контроля температуры в теплицах. Так то наверное на любой RF протокол можно навешать 6lowpan и так далее…
DmitrySpb79
08.10.2016 16:25В теории — фермер вешает в теплицу датчик. И все, больше ему ничего не надо. Сигнал будет принят провайдером LoraWAN и он получит все сервисы, вплоть до пуш-уведомлений на телефон если температура в теплице слишком высокая :)
Все это можно сделать и самому конечно, но здесь это работает «из коробки» (при условии что вы в зоне покрытия сети).dernuss
08.10.2016 16:36Ну так то понятно, если провайдер есть. Только что то мне подсказывает что его нет. Или вы сам себе провайдер)
ИМХО. все эти LoraWAN, 6lowpan и так далее негативно влияют на батарейку датчиков.
То есть если бы я делал контроль температуры в теплицах, я бы сделал просто, датчики в основном спят, иногда просыпаются, меряют температуру, передают (без обратной связи) и опять засыпают. Батарейка работает максимально долго.
А дома стоит модуль который принимает показания датчиков. А далее по выбору, передаёт их в интернет или просто отображает на мониторе.
DmitrySpb79
08.10.2016 20:44В режиме p2p RN2483 именно так и работает — короткие посылки без подтверждения, потом можно перевести модуль в спящий режим.
Bluewolf
09.10.2016 15:02LoRa в сравнении с узкополосной передачей силабса и прочих дает очень полезную штуку — отсутствие необходимости TCXO или подстройки частоты. А если силабс настроить на более широкую полосу, дальность будет хуже, чем у лоры.
dernuss
09.10.2016 17:46В теории да. Но на деле я делал датчики из >100 устройствов на силабс, и работают они на улице. И как то ни каких проблем нет. TXCO не использовал.
Bluewolf
10.10.2016 00:18Я тоже делал. Пока полоса хоть как-то широкая, никаких проблем нет. Как только возникает желание сделать дальность максимальной с битовой скоростью 300-600, девиацией 1-2 кГц и полосой приемника 2-5 кГц, начинается веселье, при котором два модуля при старте друг друга даже не слышат, потому что 50 ppm кварца превращаются в десяток (или не один) килогерц на 868 МГц. И нужно датчику еще искать БС, потом не терять ее при изменении температуры и временных помехах...
Впрочем, это всё решаемо, и при наличии SDR-приемника в БС вполне легко решаемо, и выжать из узкополосной связи можно заметно большую дальность, да. Но это не мешает лоре иметь свою нишу с простотой, широкой полосой, одновременным приемом нескольких сигналов и несколько лучшей дальностью, чем простые решения на обычных трансиверах.
dernuss
10.10.2016 09:27Да я разве против) Я только за.
Чем быстрее будет развиваться, тем быстрее подешевеет, я надеюсь.
А в LoRa нет возможности измерять дальность до объекта?
ну как в nanoloc.Bluewolf
10.10.2016 16:43Когда занимался этим, 2-3 года назад, подобного не видел. Тогда, ничего лучшего, чем несколько БС в одном помещении\зоне и примерное вычисление по RSSI, не нашли.
dernuss
10.10.2016 17:16В железном цеху по RSSI не получается((
Bluewolf
11.10.2016 16:13Получается, но нужно МНОГО базовых станций :)
Впрочем, и с более корректной технологией есть шанс измерить расстояние более сильного отражения, а не прямого сигнала, на такой-то несущей.dernuss
11.10.2016 16:33Ну может и получится, если иметь много базовых станций и сильно уменьшить мощность маячка.
Но у меня ещё задача отслеживания человека на территории (завода). Тогда мне придётся засыпать всю территорию базовыми станциями, а она не маленькая.DmitrySpb79
11.10.2016 17:44Вроде есть готовые решения для indoor navigation на базе Bluetooth LE.
dernuss
11.10.2016 20:21А если комплексно, в одном долгоживущем маленьком маячке indoor и outdoor.
И не дорого, желательно до 20$ за маячёк.Bluewolf
12.10.2016 14:20-1В целом, не вижу нерешаемой проблемы, если маяк будет просыпаться не слишком часто, где-то раз в минуту или реже, и давать две посылки разной мощности. Полосу побольше, битовую скорость тоже, частоту 433.
Недорого — это CC430, вероятно.
DmitrySpb79
08.10.2016 14:15Тут был еще интерес как бонус попробовать LoRaWAN, благо технология «модная» и сейчас набирает некую популярность.
dernuss
08.10.2016 14:51Почитал про модуляцию лора, ЛЧМ импульсы передаются. Да, чувствительность реально должна быть выше чем у FSK. Не понятно почему у вас такие скромные дальности получились. Тут вот намного больше http://lorawan.lace.io/lora-range-test/
DmitrySpb79
08.10.2016 15:03У меня 3й этаж и окна во двор, прямой радиовидимости никакой.
Еще попробую более медленный режим sf12, может с ним побольше будет.
golf2109
08.10.2016 15:26мне тоже непонятно, у меня в экспериментах получались, такие же результаты, как и а автора топика
метров 300-500 в пределах прямой видимости,
возможно все дело в том, что по описанной ссылке применяли
«Комплект разработчика SX1276DVK1JAS»
и там другая ВЧ тополигия плат
BurlakovSG
08.10.2016 16:06Из-за такой широкой полосы адаптер очень чувствителен к помехам. Видел тесты, где ближе к краю полосы запускали сигнал с помехой очень узкой полосы и Лора уже теряла сеть, т.е. смысла в такой широкой полосе нет.
vladimir_open-dev
08.10.2016 16:47Потому как не в чувствительности счастье, а в динамическом диапазоне приемника. А тут уж лора ни чем особо не выделяется.
DmitrySpb79
09.10.2016 15:18+2Добавил вторую часть с продолжением — https://geektimes.ru/post/281312/
xpehter
09.10.2016 21:31А может кто-нибудь подсказать более дешёвую альтернативу LoRa, желательно с шифрованием трафика (про nRF24L01 и ESP8266 помню)?
x893
Все классно — а где же класс В? а так обычная разводка для л.
DmitrySpb79
RN2483 не может работать как Gateway (я на этом накололся, думал сейчас запущу, а нет, все низкоуровневые функции спрятаны). Покупайте SX1276 и подключайте напрямую (исходники есть на гитхабе).