Test des modems radio LoRa / LoRaWAN RN2483. Partie 1, LoRa

L'une des technologies intéressantes de «l'Internet des objets» est le réseau LoRa / LoRaWAN, mais dans Runet, elles ne sont pratiquement pas décrites. Il est temps de combler cette lacune, et d'autant plus intéressant d'essayer de «vivre» comment cela fonctionne.



Qu'est-ce que LoRa?


Il s'agit de la technologie de communication longue portĂ©e propriĂ©taire de Semtech implĂ©mentĂ©e dans leurs puces SX1272 et SX1276. LoRa est un protocole de bas niveau sur lequel des protocoles de niveau supĂ©rieur tels que LoRaWAN peuvent ĂȘtre implĂ©mentĂ©s.

Une caractĂ©ristique de la norme LoRa est la transmission de petits paquets de donnĂ©es Ă  faible consommation d'Ă©nergie. Selon le constructeur, la portĂ©e en plein air peut atteindre 10 km, et la durĂ©e de vie de la batterie peut ĂȘtre de plusieurs annĂ©es. Les frĂ©quences de fonctionnement varient selon les pays et sont de 433 ou 868 MHz (version UE) ou 915 MHz (version USA).

Comment ça marche? Détails sous la coupe.

Pour les tests, des modules RN2483 ont Ă©tĂ© sĂ©lectionnĂ©s. Ils sont bons car ils sont faciles Ă  programmer et prennent en charge diffĂ©rents modes de fonctionnement. Le RN2483 contient la puce SX1276 et le contrĂŽleur dans un seul boĂźtier, il est contrĂŽlĂ© par des commandes UART, ce qui vous permet de le connecter Ă  n'importe quel appareil (PC, Arduino, microcontrĂŽleur, etc.). Vous pouvez acheter un module sans cerclage, c'est moins cher, mais c'Ă©tait trop paresseux pour ĂȘtre soudĂ©, donc un ensemble de quelques planches prĂȘtes Ă  l'emploi a Ă©tĂ© commandĂ© sur eBay.

Cela vous permet de connecter les modules Ă  un PC via USB et Ă  n'importe quel appareil.

Transfert de données


Un programme Python simple a été écrit pour le transfert:
Code source
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")


Nous analyserons plus en détail les principaux paramÚtres.
pwr - puissance, peut varier dans la plage -3..15dB
fréquence - fréquence de transmission
mac pause - désactiver le mode lorawan, le mode de transfert entre deux appareils est activé (p2p)
tx -
mod de paquet de données - type de modulation. 2 types sont disponibles, lora ou fsk.
bw - largeur de bande du spectre, peut ĂȘtre 125, 250, 500KHz.
sf - facteur d'étalement, affecte la durée de transmission.
Voici Ă  quoi ressemble le spectre avec sf7 et sf12 avec la mĂȘme quantitĂ© de donnĂ©es.


Comme vous pouvez le voir, les données sont transmises en blocs courts. La taille maximale des paquets ne dépasse pas 255 octets. Une fois la transmission terminée, le modem reçoit la confirmation que les données ont été envoyées.

Réception des données


Pour la rĂ©ception, il est nĂ©cessaire de rĂ©gler les mĂȘmes paramĂštres que pour la transmission, sinon les modems ne s'entendront pas. Le code est donnĂ© ci-dessous, le programme dans une boucle sans fin "Ă©coute" les donnĂ©es sur le port sĂ©rie.

Code source
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.

Pour une vĂ©rification pratique de la portĂ©e, l'un des modems a Ă©tĂ© laissĂ© dans l'appartement par la fenĂȘtre, le second a Ă©tĂ© connectĂ© au Raspberry Pi et sorti dans la rue. Certaines sources promettent une autonomie d'environ 3 km dans les zones urbaines. Le rĂ©sultat, hĂ©las, n'est pas si bon: en pratique, Ă  puissance maximale et une antenne Ă  868 MHz, le signal est complĂštement Ă©touffĂ© dĂ©jĂ  aprĂšs environ 3 immeubles d'habitation. Bien sĂ»r, dans les endroits ouverts, la plage est plus Ă©levĂ©e, mais cela vaut la peine de «tourner un coin», car le signal disparaĂźt trĂšs rapidement. En gĂ©nĂ©ral, le rĂ©sultat de 3km en ville ne peut probablement ĂȘtre obtenu que si vous placez l'antenne sur la tour TV, vous pouvez vraiment compter sur 300m au mieux. Mais ce n'est pas si mal, compte tenu de la faible puissance du signal transmis.

Prix ​​d'Ă©mission


Informations pour ceux qui veulent rĂ©pĂ©ter des expĂ©riences ou utiliser LoRa dans leurs conceptions. Le prix de leur ensemble de 2 modems rn2483 prĂȘts Ă  l'emploi sur eBay est de 80 €. SĂ©parĂ©ment, le module avec le SX1276 soudĂ© peut ĂȘtre achetĂ© auprĂšs de vendeurs chinois pour 12 $ avec la livraison gratuite. La puce SX1276 sans aucun cerclage peut y ĂȘtre achetĂ©e pour 9 $ (le code dĂ©crit dans l'article ne convient que pour RN2483, lorsque vous utilisez la puce SX1276, elle devra ĂȘtre programmĂ©e Ă  un niveau infĂ©rieur).

Conclusions


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.

Source: https://habr.com/ru/post/fr398229/


All Articles