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ésenteés sur cette page [2].
Vous pouvez par exemple récupérer la taille de la bande ou la modifier :
# get raw LoRa Bandwidth
lora.bandwidth()
# set raw LoRa Bandwidth
lora.bandwidth(LoRa.BW_125KHZ)
Pour cela, vous aurez sans doute besoin de lire la valeur des constantes (print). Par exemple : LoRa.CODING_4_5 , LoRa.ALWAYS_ON, LoRa.BW_125KHZ, etc. [2].
Utilisez la commande print pour voir l’effet de la modification des paramètres. Exemple :
print('Coding rate {}'.format(lora.coding_rate()))
À chaque modification du code, vous devez charger le nouveau code (sync project to device dans Pymakr:Projects), puis rebooter le device (ctrl+alt+f 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 d’autres méthodes (à chercher sur [2]), identifiez :
- bande de transmission,
- coding rate,
- power mode,
- taille de préambule
Pour cela, vous aurez sans doute besoin de lire la valeur des constantes (print). Par exemple : LoRa.CODING_4_5 , LoRa.ALWAYS_ON, LoRa.BW_125KHZ, etc. Ou bien consultez [2].
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.
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.
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]
À l’aide du calculateur https://loratools.nl/#/airtime [4], des paramètres de transmission et du nombre d’octets du message, calculez le time on air. Comparez-le au time on air observé.
Quel est le duty cycle pour la bande ISM Europe ? Comment la taille du message influence le temps d’attente entre 2 envois ? [6]
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 la formule de calcul du Time On Air, montrer que ce dernier 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. Pourquoi le RSSI diminue-t-il 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
[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).