Одна из интересных технологий “интернета вещей” — сети 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.
Поделиться с друзьями
-->

Комментарии (38)


  1. x893
    08.10.2016 13:17

    Все классно — а где же класс В? а так обычная разводка для л.


    1. DmitrySpb79
      08.10.2016 13:33
      +1

      RN2483 не может работать как Gateway (я на этом накололся, думал сейчас запущу, а нет, все низкоуровневые функции спрятаны). Покупайте SX1276 и подключайте напрямую (исходники есть на гитхабе).


  1. golf2109
    08.10.2016 13:33

    какие антенны для модулей использовались в тестах?
    и если можно подробней о методике тестирования дальности…


    1. DmitrySpb79
      08.10.2016 13:37

      Антенны продавались вместе с модемами. Вот такие:


      RN2483 не умеет выдавать RSSI (или я не нашел), так что методика тестирования простая — Raspberry Pi мигает светодиодом при получении данных, дальше идем и смотрим где пропал сигнал.


      1. 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 тоже такое может
        было бы тогда интарестно оценить затухание сигнала в количественных единицах


        1. DmitrySpb79
          08.10.2016 14:16

          Спасибо, интересно, посмотрю есть ли доступ к регистрам.


        1. golf2109
          08.10.2016 14:21

          плохо, что RN2473 не дает прямого доступа к регистрам SX1272,
          но для RN2473 есть команда
          radio get snr
          пункт 2.5.5.16
          RN2483 datasheet


          1. DmitrySpb79
            08.10.2016 14:43

            Не знал, спасибо.


      1. Bluewolf
        09.10.2016 14:59

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


        Зато, как написали рядом, у них есть оценка SNR, и там имеется ввиду уже качество сигнала с учетом кодирования.


  1. dernuss
    08.10.2016 13:57

    На алиэкспресс SX1276 стоит 225? за штуку. А например si4432 стоит 71? за штуку.
    По мне silabs как то выгоднее для фермера.


    1. golf2109
      08.10.2016 14:15

      но silabs не имеет LoRa модуляции


      1. dernuss
        08.10.2016 14:30

        А что она даёт? Особенно для фермера? 500 метров в городе я получал на силабс.


        1. DmitrySpb79
          08.10.2016 15:00

          В LoRaWAN есть много чего — mac-адреса, переключение каналов, шифрование трафика, 2 режима аутентификации, возможность подключения к «сети» в любом месте где есть gateway, серверная часть для обработки принятых пакетов.

          Это в принципе основное, а p2p-соединение лишь как одно из возможных применений.


          1. dernuss
            08.10.2016 16:09

            Да я понимаю что в LoRaWAN есть много чего). Только не понимаю зачем это фермеру для контроля температуры в теплицах. Так то наверное на любой RF протокол можно навешать 6lowpan и так далее…


            1. DmitrySpb79
              08.10.2016 16:25

              В теории — фермер вешает в теплицу датчик. И все, больше ему ничего не надо. Сигнал будет принят провайдером LoraWAN и он получит все сервисы, вплоть до пуш-уведомлений на телефон если температура в теплице слишком высокая :)

              Все это можно сделать и самому конечно, но здесь это работает «из коробки» (при условии что вы в зоне покрытия сети).


              1. dernuss
                08.10.2016 16:36

                Ну так то понятно, если провайдер есть. Только что то мне подсказывает что его нет. Или вы сам себе провайдер)

                ИМХО. все эти LoraWAN, 6lowpan и так далее негативно влияют на батарейку датчиков.
                То есть если бы я делал контроль температуры в теплицах, я бы сделал просто, датчики в основном спят, иногда просыпаются, меряют температуру, передают (без обратной связи) и опять засыпают. Батарейка работает максимально долго.
                А дома стоит модуль который принимает показания датчиков. А далее по выбору, передаёт их в интернет или просто отображает на мониторе.


                1. DmitrySpb79
                  08.10.2016 20:44

                  В режиме p2p RN2483 именно так и работает — короткие посылки без подтверждения, потом можно перевести модуль в спящий режим.


        1. Bluewolf
          09.10.2016 15:02

          LoRa в сравнении с узкополосной передачей силабса и прочих дает очень полезную штуку — отсутствие необходимости TCXO или подстройки частоты. А если силабс настроить на более широкую полосу, дальность будет хуже, чем у лоры.


          1. dernuss
            09.10.2016 17:46

            В теории да. Но на деле я делал датчики из >100 устройствов на силабс, и работают они на улице. И как то ни каких проблем нет. TXCO не использовал.


            1. Bluewolf
              10.10.2016 00:18

              Я тоже делал. Пока полоса хоть как-то широкая, никаких проблем нет. Как только возникает желание сделать дальность максимальной с битовой скоростью 300-600, девиацией 1-2 кГц и полосой приемника 2-5 кГц, начинается веселье, при котором два модуля при старте друг друга даже не слышат, потому что 50 ppm кварца превращаются в десяток (или не один) килогерц на 868 МГц. И нужно датчику еще искать БС, потом не терять ее при изменении температуры и временных помехах...


              Впрочем, это всё решаемо, и при наличии SDR-приемника в БС вполне легко решаемо, и выжать из узкополосной связи можно заметно большую дальность, да. Но это не мешает лоре иметь свою нишу с простотой, широкой полосой, одновременным приемом нескольких сигналов и несколько лучшей дальностью, чем простые решения на обычных трансиверах.


              1. dernuss
                10.10.2016 09:27

                Да я разве против) Я только за.
                Чем быстрее будет развиваться, тем быстрее подешевеет, я надеюсь.
                А в LoRa нет возможности измерять дальность до объекта?
                ну как в nanoloc.


                1. Bluewolf
                  10.10.2016 16:43

                  Когда занимался этим, 2-3 года назад, подобного не видел. Тогда, ничего лучшего, чем несколько БС в одном помещении\зоне и примерное вычисление по RSSI, не нашли.


                  1. dernuss
                    10.10.2016 17:16

                    В железном цеху по RSSI не получается((


                    1. Bluewolf
                      11.10.2016 16:13

                      Получается, но нужно МНОГО базовых станций :)
                      Впрочем, и с более корректной технологией есть шанс измерить расстояние более сильного отражения, а не прямого сигнала, на такой-то несущей.


                      1. dernuss
                        11.10.2016 16:33

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


                        1. DmitrySpb79
                          11.10.2016 17:44

                          Вроде есть готовые решения для indoor navigation на базе Bluetooth LE.


                          1. dernuss
                            11.10.2016 20:21

                            А если комплексно, в одном долгоживущем маленьком маячке indoor и outdoor.
                            И не дорого, желательно до 20$ за маячёк.


                            1. dernuss
                              11.10.2016 20:25

                              Метров 500 радиусом.


                            1. Bluewolf
                              12.10.2016 14:20
                              -1

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


                              Недорого — это CC430, вероятно.


    1. DmitrySpb79
      08.10.2016 14:15

      Тут был еще интерес как бонус попробовать LoRaWAN, благо технология «модная» и сейчас набирает некую популярность.


      1. dernuss
        08.10.2016 14:51

        Почитал про модуляцию лора, ЛЧМ импульсы передаются. Да, чувствительность реально должна быть выше чем у FSK. Не понятно почему у вас такие скромные дальности получились. Тут вот намного больше http://lorawan.lace.io/lora-range-test/


        1. DmitrySpb79
          08.10.2016 15:03

          У меня 3й этаж и окна во двор, прямой радиовидимости никакой.

          Еще попробую более медленный режим sf12, может с ним побольше будет.


        1. golf2109
          08.10.2016 15:26

          мне тоже непонятно, у меня в экспериментах получались, такие же результаты, как и а автора топика
          метров 300-500 в пределах прямой видимости,
          возможно все дело в том, что по описанной ссылке применяли
          «Комплект разработчика SX1276DVK1JAS»
          и там другая ВЧ тополигия плат


  1. BurlakovSG
    08.10.2016 16:06

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


    1. vladimir_open-dev
      08.10.2016 16:47

      Потому как не в чувствительности счастье, а в динамическом диапазоне приемника. А тут уж лора ни чем особо не выделяется.


  1. DmitrySpb79
    09.10.2016 15:18
    +2

    Добавил вторую часть с продолжением — https://geektimes.ru/post/281312/


  1. xpehter
    09.10.2016 21:31

    А может кто-нибудь подсказать более дешёвую альтернативу LoRa, желательно с шифрованием трафика (про nRF24L01 и ESP8266 помню)?


  1. Dark_Purple
    10.10.2016 18:17

    ПК, Arduino, микроконтроллер, etc

    т.д. и т.п. не в почёте?