Voici quelques exercices pas à pas pour aller plus loin dans l’utilisation de la LoPy4 et la compréhension de la couche PHY du standard LoRa.
Si vous démarrez avec la LoPy4, consultez l’article Démarrer avec Lopy4 Pycom
Nous allons utiliser 2 LoPy4. l’une en émetteur (TX), l’autre en récepteur (RX).
Le code utilisé est celui du Ping Pong. Le code est disponible ici [1].
S’il y a plusieurs LoPy actives à proximité, choisissez qui sera le noeud TX et le noeud RX et particularisez la transmission.
Exemple pour la transmission dite A:
Côté TX :
s.send('PingA')
Côté RX :
if s.recv(64) == b'PingA':
Les méthodes utilisées sont celles présentées sur cette page [2].
Vous pouvez par exemple lire la taille de la bande :
# get raw LoRa Bandwidth
lora.bandwidth()
Ou modifier le rendement de codage par exemple :
# set raw LoRa Coding Rate
lora.coding_rate(LoRa.CODING_4_5)
Pour cela, vous aurez besoin de connaitre la valeur des constantes (print).
Par exemple : LoRa.CODING_4_5 , LoRa.ALWAYS_ON, etc. [2].
print(LoRa.CODING_4_5)
Pour un affichage plus lisible de l’information :
print('Bandwidth {}'.format(lora.bandwidth()))
À chaque modification du code, vous devez charger le nouveau code (sync project to device dans Pymakr:Projects), puis rebooter le device (hard reset device sur VSC ou bouton reset de la Lopy).
Les paramètres typiques d’une transmission LoRa en Europe sont détaillés dans [8].
1) Récupérer les paramètres LoRa d’une transmission
À partir de la méthode lora.stats(),
- Du côté TX, identifiez les paramètres suivants liés à l’émission de data: spreading factor, puissance émise, fréquence utilisée, time on air
- Du côté RX, identifiez les paramètres liés à la réception de data : spreading factor, RSSI, SNR
Faire attention aux unités
À partir des méthodes et des valeurs des constantes données dans [2], lire :
- bande de transmission,
lora.bandwidth()
- coding rate,
lora.coding_rate()
- power mode,
lora.power_mode()
- taille de préambule
lora.preamble()
2) Faire varier le RSSI
Dans cette partie, nous supposons que vous avez « appairé » 2 Lopy ensemble (A et B), en particularisant la transmission. Exemple ci-dessous. Observez des 2 côtés de la transmission Tx et Rx.
Côté TX (A) :
s.send('PingA')
Côté RX (B) :
if s.recv(64) == b'PingA'
s.send('PongB')
En modifiant l’environnement de transmission
Exemple 1 : antenne couchée ou debout
Exemple 2 : éloigner les 2 noeuds, placer les noeuds derrière des objets, etc. Si vous utilisez votre PC, sortez de la salle ! Allez à l’étage (Archipel), ou allez à l’extérieur.
Laissez passer plusieurs trames et observez sur plusieurs trames avant de changer l’environnement.
Quel impact sur le RSSI côté RX B ? Expliquez.
En arrêtant l’émission du Pong
Côté RX B, commenter la partie :
s.send('PongB')
pour arrêter l’émission du Pong. Chargez le code, puis ré-initialisez les 2 Lopy.
Quel impact sur le sftx côté RX ? sur le time on air ? Expliquez.
Quel impact sur le RSSI et le sfrx côté TX A ? Expliquez. Attention, cela dépend des émissions de toute la salle …
En modifiant la puissance d’émission
Quelle est la puissance d’émission par défaut ? Diminuez la puissance d’émission d’un des 2 devices et observez le RSSI de l’autre côté.
Issu de la documentation Pycom [9] :
Vérifier les RSSI typiques
À l’aide de la data sheet ([5] p.20), vérifiez que les RSSI observés sont typiques d’une transmission LoRa, en comparant les RSSI observés avec les RSSI limite (receiver sensitivity). Attention au spreading factor utilisé.
3) Faire varier le time on air
En faisant varier la taille du message
Modifiez la taille du message envoyé pour faire varier le time on air.
Calculez le nombre d’octets (bytes) de votre message [7], le message est appelé Payload.
À l’aide du calculateur https://loratools.nl/#/airtime [4], des paramètres de transmission (spreading factor, bandwidth et coding rate) et du nombre d’octets du message (Payload length), calculez le time on air. Comparez-le au time on air observé.
dans [6], cherchez quel est le duty cycle pour la bande ISM Europe. Comment la taille du message influence le temps d’attente entre 2 envois ?
Donnez la valeur du duty cycle pour votre message telle que calculée dans [4]et vérifiez que cela correspond bien au duty cycle de la réglementation.
En faisant varier le coding rate
Quel est le time on air pour un coding rate à l’émetteur de 4/5 ? Idem pour 1/2. Déduisez quel est l’impact du coding rate sur le time on air.
Quel est l’avantage d’un coding rate de 1/2 par rapport à celui de 4/5 ?
4) Faire varier le spreading factor
Changez le spreading factor à l’émetteur de 7 à 8 : à partir du constructeur à l’initialisation, ou à partir de la méthode lora.sf()
Observez le récepteur. Pourquoi le message n’est-il pas reçu ?
Rendez cohérent le spreading factor du côté du récepteur (sf=8).
Observez les variations sur le time on air à partir de lora_stats(). Comparez avec le calculateur, et observez que le time on air double lorsqu’on augmente le SF d’un point.
Comparez la sensibilité minimale donnée dans la datasheet ([5], p.20) avec les RSSI mesurés pour différentes valeurs du SF.
Expliquez pourquoi le RSSI diminue lorsque le SF augmente.
5) Avant de partir
- formatez la Lopy4 :
import os
os.fsformat('/flash')
- rangez la carte dans le carton en faisant attention au câble de l’antenne
Prochaine étape : mettre en place une communication via le réseau The Things Network
Références bibliographiques
[1] https://gitlab.imt-atlantique.fr/clanglai/tp-lora-cooc/-/blob/main/PingPong/main.py?ref_type=heads
[2] https://docs.pycom.io/firmwareapi/pycom/network/lora/
[3] https://www.mobilefish.com/developer/lorawan/lorawan_quickguide_tutorial.html
[4] https://loratools.nl/#/airtime
[5] https://docs.pycom.io/gitbook/assets/specsheets/Pycom_002_Specsheets_LoPy4_v2.pdf
[6] https://www.thethingsnetwork.org/docs/lorawan/duty-cycle/
[7] « Fichier:ASCII-Table-wide.svg — Wikipédia ». https://commons.wikimedia.org/wiki/File:ASCII-Table-wide.svg(consulté le oct. 19, 2021).
[8] « LoRa Regional Parameters », The Things Network. https://www.thethingsnetwork.org/docs/lorawan/regional-parameters/ (consulté le 26 septembre 2023).
[9] « 5.2.2.4 LoRa · Pycom Documentation ». https://alepycom.gitbooks.io/pycom-documentation/content/chapter/firmwareapi/pycom/network/lora.html (consulté le 26 septembre 2023).