Тестирование радиомодемов LoRa/LoRaWAN RN2483. Часть 1, LoRa
Одна из интересных технологий «интернета вещей» — сети Lora/LoraWAN, однако в рунете они практически не описаны. Пора восполнить этот пробел, и тем более интересно попробовать «вживую», как это работает.
Что такое 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.