J’ai déjà eu l’occasion de vous présenter plusieurs solutions LoRawan sur le blog. Le temps passe et certaines solutions disparaissent car les modules sont obsolètes et plus distribués. Alors quand de nouveau modules comme cette gateway LR1302 Elecrow sortent, c’est l’occasion de remettre à jour les informations sur ce mode de transmission.
Au sommaire :
- 1 Une passerelle LoRa LR1302 chez Elecrow
- 2 LoRa, LoRaWAN ???
- 3 Trouver l’EUI (identifiant unique) de la passerelle
- 4 Modifier le fichier .json
- 5 Mise en route du noeud LoRa Elecrow Ra-O8H
- 6 Utilisation avec Thonny et MicroPython
- 7 Ajouter la carte à TTN
- 8 Connecter la carte à TTN
- 9 Conclusion
- 10 Sources
Une passerelle LoRa LR1302 chez Elecrow
LoRa, LoRaWAN ???
L’objectif
L’idée est de surveiller un local distant d’un peu plus d’un kilomètre. Un pont WiFi était une solution, mais le prix piquait un peu, il fallait partir sur une solution à 3Km, des antennes extérieures… Pas simple.
L’autre solution c’était de dégainer les cartes LoRa qu’Elecrow m’avait envoyées et qui attendaient depuis un moment, au fond d’un tiroir.
Le synoptique ci-dessus montre ce que nous allons mettre en œuvre dans ce tutoriel.
A gauche le Nœud LoRa qui va envoyer les valeurs par radio. Plusieurs nœuds pourraient envoyer tout un tas de données. La passerelle (Gateway) est chargée de recevoir les infos et de les relayer vers le serveur The Things Network (TTN). Ici il n’y aura qu’une passerelle. Lorsque plusieurs passerelles sont accessibles et qu’un nœud envoie les infos vers plusieurs passerelles, le serveur se charge de supprimer les doublons, et ne garde que la trame provenant de la gateway qui reçoit le mieux le signal du nœud. Ce sera aussi sur cette passerelle qu’un éventuel envoi de données vers le nœud sera effectué. Dans mon cas j’ai un seul nœud et une seule passerelle, ce qui simplifie le schéma
Une fois que les données sont arrivées sur le serveur TTN elles sont stockées pendant un temps limité. Il faut donc les renvoyer vers une base de données (BDD) pour les enregistrer de façon pérenne. Vous pouvez utiliser votre propre base de données. Il y a eu la solution toute faite de MyDevices Cayenne dans sa version gratuite qui a disparu au profit d’une version commerciale. Il faudra donc prévoir de rapatrier les données de TTN vers un serveur perso ou utiliser la solution Vittascience dont je vous reparlerai prochainement.
LoRa qu’est ce c’est ?
Définitions
LoRa est l’acronyme de Long Range (Grande portée). c’est une technologie radio (sans fil) dans laquelle eun émetteur à très faible consommation envoie de petits paquets de données à faible vitesse (0.3kb/s à 5,5kb/s) à un récepteur situé à grande distance.
LoRaWAN est un protocole de télécommunication permettant la communication à bas débit, par radio. Il est utilisé pour des objets à faible consommation électrique communiquant selon la technologie LoRa et connectés à l’Internet via des passerelles, participant ainsi à l’Internet des objets (IoT). (source Wikipedia)
Sur cette image on voit l’architecture d’un réseau LoRaWAN (crédit image) A gauche les « nœuds » collectent les données. Ils sont capables de les envoyer en consommant une énergie minime, grâce à une transmission à bas débit. La portée est très variable mais on atteint couramment plusieurs kilomètres. Dans de (très) bonnes conditions, un signal LoRa a été reçu à 1300Km. C’est actuellement le record du monde.
Les Gateways sont chargées de collecter les données des nœuds et de les transférer à un serveur qui pourra les traiter, les redistribuer… Il existe des solutions propriétaires, pour ma part j’ai choisi d’utiliser The Things Network (TTN) un réseau international gratuit, open source et communautaire. Les serveurs de TTN vous permettent de recevoir dans vos applications les données de vos appareils, même à des milliers de kilomètres de chez vous !
En janvier 2020 le réseau se composait de plus de 40000 contributeurs regroupés en plus de 400 communautés dans 90 pays ayant déployé plus de 4000 passerelles.
Il est possible pour les particuliers, universités, entreprises, ou encore les communes de contribuer au déploiement ou d’utiliser gratuitement The Things Network.
Il existe également un mode P2P (peer to peer) dont je ne parle pas ici. Il est utilisé pour communiquer entre des noeuds, sans gateway. Le protocole est différent de LoRaWAN et n’est pas compatible.
Sur quelles fréquences ?
En Europe c’est la bande 868MHz qui est utilisée pour LoRaWAN
Uplink:
- 868.1 – SF7BW125 to SF12BW125
- 868.3 – SF7BW125 to SF12BW125 and SF7BW250
- 868.5 – SF7BW125 to SF12BW125
- 867.1 – SF7BW125 to SF12BW125
- 867.3 – SF7BW125 to SF12BW125
- 867.5 – SF7BW125 to SF12BW125
- 867.7 – SF7BW125 to SF12BW125
- 867.9 – SF7BW125 to SF12BW125
- 868.8 – FSK
Downlink:
- Uplink channels 1-9 (RX1)
- 869.525 – SF9BW125 (RX2 downlink only)
A quoi correspond la modulation ?
Un très bon article sur LoRa est disponible sur linuxembedded.fr. Ce paragraphe en résume la partie concernant la modulation.
La modulation LoRa utilise un étalement de spectre appelée Chirp Spread Spectrum pour coder l’information. SigFox utilise l’Ultra Narrow Band.
Un chirp ou gazouillis est un signal sinusoïdal dont la fréquence varie au cours du temps. Initialement destinée à des applications militaires, cette modulation est également utilisée par les radars et les sonars. Elle est robuste contre différents types de perturbations.
Sur la copie d’écran ci-dessus on voit que le signal émis par un appareil LoRa « glisse » en fréquence. C’est cette modulation qui est utilisée pour transmettre les données.
La modulation peut également être plus ou moins rapide. Si elle est rapide, le temps d’occupation de la bande est faible mais la portée est plus réduite. Si la modulation est plus lente, le temps de transmission est plus long mais la portée augmente. En fonction des applications, il faudra trouver le bon compromis pour une occupation raisonnable de la bande avec une portée suffisante.
LoRaWAN supporte 6 facteurs d’étalement SF = Spreading Factor (SF7, SF8, SF9, SF10, SF11, SF12) comme le montre le schéma ci-dessus. L’utilisation des SF permet la réception de plusieurs signaux en parallèle sur le même canal. Une passerelle multicanaux comme celle de PiSupply peut traiter les signaux de centaines de nœuds. On voit sur les schémas ci-dessus que plus la vitesse de transmission est faible, plus la portée est grande.
Par défaut, le réseau doit au minimum supporter les trois canaux suivants (de 125 KHz de bande passante chacun) : 868,10 ; 868,30 et 868,50 MHz.
Quelle est la différence entre LoRa et LoRaWAN ?
Tout est résumé ici, LoRa concerne la modulation radio, la couche physique alors que LoRaWAN gère les couches supérieures qui s’occupent de la connexion et des applications
Les différents éléments
Passerelle LR1302
La passerelle est un circuit LR1302 au format mini PCIe.
C’est un module LoRaWAN® de nouvelle génération. Il se caractérise par une faible consommation d’énergie et de hautes performances.
Basé sur la puce LoRaWAN® SX1302 de Semtech Network, la passerelle LR1302 offre une capacité de transmission sans fil à longue distance.
Par rapport aux puces LoRa précédentes SX1301 et SX1308, la puce SX1302 a une sensibilité plus élevée, une consommation d’énergie plus faible et une température de fonctionnement plus basse.
Elle prend en charge la transmission de données sur 8 canaux, améliore l’efficacité et la capacité de communication et prend en charge la connexion et la transmission de données d’un plus grand nombre d’appareils.
Elle possède deux interfaces d’antenne, l’une pour la transmission et la réception des signaux LoRa et une interface U.FL (IPEX) pour une transmission indépendante. Elle est munie d’un blindage métallique pour la protéger contre les interférences externes et fournir un environnement de communication fiable.
Le module passerelle LoRaWAN® LR1302 est disponible en versions SPI et USB, couvrant les bandes de fréquences US915 et EU868, ce qui vous permet de choisir parmi les solutions de fréquences LoRaWAN®, notamment EU868 et US915. Ici c’est le modèle EU à 868MHz qui est utilisé.
Conçu spécifiquement pour l’IoT, le LR1302 convient à une variété d’applications. Qu’il soit utilisé dans les villes intelligentes (smart city), l’agriculture, l’automatisation industrielle ou d’autres domaines, le module LR1302 peut fournir des connexions fiables et une transmission de données efficace.
Toute seule cette passerelle elle n’est pas utilisable, il faut la monter sur une carte HAT qui se monte sur un Raspberry Pi.
Carte HAT LR1302 LoRaWAN HAT
Le LR1302 LoRaWAN HAT est une carte d’extension Raspberry Pi qui connecte le module de passerelle LoRaWAN LR1302 basé sur le SX1302 à un Raspberry Pi (tous modèles jusqu’au Raspberry Pi 5).
Elle intègre également un module GPS et une horloge en temps réel RTC afin d’améliorer la précision de la synchronisation et du positionnement du module LR1302.
Le L76K, est un module GPS extrêmement compact. C’est un récepteur qui permet la réception simultanée de GPS, GLONASS, Galileo, BDS et QZSS. Avec 33 canaux de poursuite, 99 canaux d’acquisition et 210 canaux PRN, le L76 peut acquérir et suivre n’importe quel mélange de signaux satellites.
La carte prend en charge le mini-PCIe du module de passerelle LR1302.
La carte HAT LoRaWAN LR1302 se charge de relier le connecteur PCIe doré à 52 broches au connecteur GPIO à 40 broches du Raspberry Pi.
Cela simplifie le processus de développement pour les utilisateurs et facilite la mise en œuvre avec le Raspberry Pi.
De plus la carte comporte un ventilateur de refroidissement qui dissipe efficacement la chaleur et peut améliorer les performances du Raspberry Pi.
Carte Node LoRaWAN Ra-08H
Présentation
La carte LoRaWAN RA-08H Node Board est une carte de développement basée sur la combinaison du microcontrôleur Raspberry Pi RP2040 et du circuit LoRaWAN RA-08H avec plusieurs interfaces d’E/S au format Crowtail. Elle peut donc être utilisée avec les modules de la série Crowtail. Le module LoRaWAN embarqué est connecté à la plateforme LoRaWAN et permet le développement rapide d’applications pour la formation des makers, pour la maison intelligente, le contrôle industriel, etc.
Les modules peuvent être analogiques ou numériques.
Photos
La carte Ra-08H Elecrow vue de dessus. A gauche les GPIO disponibles, à droite de haut en bas, la prise pour le panneau solaire, la prise USB-C pour l’alimentation et/ou la programmation, la prise pour raccorder une batterie. Vers les prises on trouve les boutons poussoirs reliés au RP2040 (BOOT et RESET) et au dessus du Ra-O8H, le bouton poussoir BOOT de ce circuit. L’antenne fournie est une antenne miniature de taille réduite.
Deux LED indique l’état de la carte, la LED P/D est pilotable (voir le programme Blink un peu plus loin). L’autre LED indique la charge de la batterie.
Sur cette vue de dessous on voit les prises crowtail bien identifiées sur la sérigraphie.
Carte Ra-08H vue de dessus.
Le RP2040 et les connecteurs de la carte Ra-08H
Connecteurs de la carte Ra-08H
Caractéristiques
- Intégre un microcontrôleur RP2040 et un module LoraWAN RA-08H (documentation ici)
- Contrôleur principal chip Raspberry Pi RP2040, 264KB SRAM intégré, 4MB Flash embarqué
- Double cœur Arm Cortex-M0+ @ 133MHz
- Module RA-08H avec mémoire intégrée, 128KB Flash, 16KB SRAM
– prise en charge la bande de fréquence : 803MHZ-930MHZ
– Le module RA-08H prend en charge l’antenne externe, l’interface SMA ou l’interface IPEX de première génération. - Compatible avec Arduino IDE et Micropython
- 6 interfaces 5V Crowtail (2 interfaces analogiques, 2 interfaces numériques, 1 interface UART, 1 interface IIC)
- 2*10 interfaces GPIO universels
- 1 interface batterie
- 1 interface solaire
Capteurs
Elecrow m’a envoyé 3 capteurs, un DHT11 (Température, humidité), un capteur de lumière à LDR et un capteur d’humidité de sol. Les capteurs sont au format Crowtail et se connectent directement sur les cartes Elecrow. Dans ma configuration, je ne pouvais pas utiliser le capteur d’humidité de sol.
DHT11
Le module est présenté sur la page https://www.elecrow.com/crowtail-temperature-humidity-sensor-p-1229.html
Nota pour utiliser ce capteur DHT11 il faut installer installer la librairie Adafruit Unified Sensor.
Capteur de lumière
Ce module capteur de lumière utilise une photorésistance GL5516 pour détecter l’intensité lumineuse de l’environnement. La résistance du capteur diminue lorsque l’intensité lumineuse de l’environnement augmente. La puce (amplificateur opérationnel) LMV358 est utilisée comme suiveur de tension pour vous permettre d’obtenir des données précises. Le module est disponible sur la page https://www.elecrow.com/crowtail-light-sensor-p-1244.html
Capteur d’humidité du sol
Il s’agit d’un capteur capacitif d’humidité du sol, qui peut mesurer le niveau d’humidité du sol dans un pot de fleur ou dans le sol, par détection capacitive. Comparé à d’autres types de capteurs d’humidité, ce capteur capacitif est fabriqué dans un matériau résistant à la corrosion, ce qui lui confère une longue durée de vie. Ce capteur d’humidité peut être utilisé pour détecter l’humidité du sol afin de contrôler si les plantes ont besoin d’eau. Il se connecte sur un port analogique Crowtail. Vous le trouverez sur cette page https://www.elecrow.com/crowtail-capacitive-soil-moisture-sensor.html
Montage de la passerelle
Montage du LR1302
Insérez le module LR1302 dans le connecteur mini PCIe
Appuyez sur le module pour que les trous (flèches jaunes) arrivent au dessus des filetages de la carte.
Mettez en place et vissez les deux vis fournies.
Après montage du module, on voit que deux petites prises u-FL sont visibles : RFIO et LoRa-ANT. Il va falloir les relier.
Connexion du câble u-Fl
Dans le sachet vous trouverez un petit câble coaxial muni d’une prise u-FL à chaque extrémité. Connectez une des extrémités. Il faut bien appuyer à plat sur la prise et vous sentez/entendez un clic qui indique le verrouillage du connecteur.
Attention ! Ce type de connecteur (contrairement aux connecteurs SMA) ne supporte que quelques montages/démontages (environ 30 selon Wikipedia). Il n’est pas prévu pour de nombreuses manipulations. Evitez de trop le manipuler…
Connectez l’autre extrémité du câble.
Le module passerelle LR1302 est maintenant relié à la prise SMA LoRa-ANT.
Les antennes
Le kit passerelle est fourni avec deux antennes, une antenne 868MHz pour LoRaWAN et une antenne GPS 1.5GHz amplifiée qui reçoit une tension envoyée par la carte pour alimenter un LNA (Low Noise Amplifier) intégré à l’antenne. Il faudra les connecter au bon endroit, c’est précisé en sérigraphie sur le circuit imprimé de la carte HAT.
Montage sur le Raspberry Pi
Vu le faible débit de LoRaWAN, j’ai choisi un Raspberry Pi 3 B+ qui fera largement l’affaire ici. En plus je l’avais en stock… Bien entendu si vous voulez le top du top vous mettrez un Raspberry Pi 4 ou même un Raspberry Pi 5 mais ce serait un peu utiliser un bazooka pour tuer une mouche… Enfin, c’est vous qui voyez.
Allez pour les collectionneurs celui-ci est un Raspberry Pi bleu (eh oui !) vendu au Brésil et qu’on ne peut pas importer (sauf si on a un copain radioamateur au Brésil, qui l’achète et vous l’envoie).
La couleur est différente car les normes sont différentes pour la partie WiFi-Bluetooth : Anatel au Brésil et Subtel pour le Chili. C’est ce qui est sérigraphié sur cette carte. Après, je n’utilise pas la liaison radio avec la passerelle, elle est connectée en dur , avec un câble Ethernet à ma box.
Parmi ces pièces on a déjà utilisé le câble U-FL et les deux vis de la mini PCIe. Il nous reste les 4 entretoises et 8 vis.
On commence par monter les entretoises sur le Raspberry Pi.
Mettez la carte LR1302 LoRaWAN HAT en place sur le connecteur (vérifier qu’il n’y a pas de décalage !)
et enfoncez jusqu’à ce que la carte repose sur les entretoises.
Terminez en mettant les 4 vis supérieures qui vont solidariser la carte HAT au Raspberry Pi 3 B+.
La passerelle est prête à être utilisée.
ATTENTION : Ne mettez pas la passerelle sous tension sans brancher les antennes. Si le module LoRa passe en émission sans antenne, l’énergie de l’émetteur ne sera pas dissipée dans l’antenne et l’étage de sortie risque de chauffer et d’être détruit !! La passerelle ne fonctionnera plus.
Connectez les antennes, vous êtes prêt(e) à utiliser la passerelle.
Connexion à TTN
Créez un compte sur TTN, ou connectez vous si vous avez déjà un compte. Cliquez sur les gateways.
Comme j’utilise TTN j’ai déjà des gateways inscrites, je vais en ajouter une nouvelle, celle d’Elecrow : Cliquez sur + Register gateway .
Récupérez l’EUI de votre gateway (voir un peu plus bas dans l’article). C’est un identifiant unique sur 64 bits de la passerelle, fourni par le fabricant. Un utilitaire permet de le récupérer. Ne rentrez pas le 0x de début qui indique que c’est de l’hexadécimal. Rentrez les 16 chiffres et lettres les plus à droite (4 bits x 16 caractères = 64 bits).
Renseignez le plan de fréquence : Europe 863-870 MHz (SF9 for RX2…) puis cliquez sur Register gateway .
Votre Gateway est créée, vous pouvez positionner sur la carte ou laisser pour plus tard, le GPS de la gateaway Elecrow devrait configurer la position automatiquement… On verra ça !
Update : Non, le GPS de la passerelle ne permet pas, dans le mode qu’on utilise, de positionner le point sur la carte, il faudra le faire manuellement.
Vous pouvez télécharger le fichier global_conf.json qui contient les paramètres pour configurer la gateway, voir plus bas Modifier le fichier .json.
Installation de l’OS et de la gateway LoRawan
J’ai utilisé un Raspberry Pi 3, à mon avis bien suffisant pour cette application, sur lequel j’ai installé un Bullseye 32 bits avec Raspberry Pi Imager (carte SD 64Go).
L’étape suivante consiste à valider SPI et I2C pour la carte HAT de la gateway. Laisser le port série non validé. (pour des raisons de commodité et pour l’utilisation lors de l’écriture de cet article, j’ai activé SSH et VNC).
On peut ensuite passer à l’installation du logiciel de la passerelle.
1 2 3 4 5 6 7 8 9 10 11 |
cd ~ pi@loragateway:~ $ <strong>git clone https://github.com/Elecrow-RD/LR1302_loraWAN.git</strong> Clonage dans 'LR1302_loraWAN'... remote: Enumerating objects: 171, done. remote: Counting objects: 100% (171/171), done. remote: Compressing objects: 100% (110/110), done. remote: Total 171 (delta 54), reused 171 (delta 54), pack-reused 0 Réception d'objets: 100% (171/171), 431.83 Kio | 1.79 Mio/s, fait. Résolution des deltas: 100% (54/54), fait. pi@loragateway:~ $ <strong>cd LR1302_loraWAN/LR1302_HAL/sx1302_hal/</strong> pi@loragateway:~/LR1302_loraWAN/LR1302_HAL/sx1302_hal $ |
On peut maintenant lancer la compilation :
1 2 3 4 5 6 7 |
pi@loragateway:~/LR1302_loraWAN/LR1302_HAL/sx1302_hal $ <strong>make</strong> make all -e -C libtools make[1] : on entre dans le répertoire « /home/pi/LR1302_loraWAN/LR1302_HAL/sx1302_hal/libtools » mkdir -p obj gcc -c -O2 -Wall -Wextra -std=c99 -Iinc -I. src/tinymt32.c -o obj/tinymt32.o ar rcs libtinymt32.a obj/tinymt32.o ... |
Lorsque la compilation est terminée, on va modifier un fichier JSON pour l’adapter avec notre passerelle :
1 |
pi@loragateway:~/LR1302_loraWAN/LR1302_HAL/sx1302_hal/packet_forwarder $ <strong>nano global_conf.json.sx1250.EU868</strong> |
Trouver l’EUI (identifiant unique) de la passerelle
La mise en route de la passerelle nécessite des aller-retours entre TTN et la console du Raspberry PI. Pour trouver l’EUI de la passerelle il y a un utilitaire dans le dossier util_chip_id. Mais pour l’exécuter il faut que le fichier reset_lgw.sh soit présent dans le dossier. Or il n’y est pas, il faut le copier depuis le dossier tools ! puis lui mettre des droits d’exécution…
1 2 3 |
pi@loragateway:~/LR1302_loraWAN/LR1302_HAL/sx1302_hal $ sudo cp ./tools/reset_lgw.sh ./util_chip_id/ pi@loragateway:~/LR1302_loraWAN/LR1302_HAL/sx1302_hal $ cd util_chip_id/ pi@loragateway:~/LR1302_loraWAN/LR1302_HAL/sx1302_hal/util_chip_id $ sudo chmod 775 reset_lgw.sh |
On peut ensuite exécuter chip_id qui récupère et affiche l’EUI De notre passerelle. C’est ce N° qu’il faut entrer dans l’EUI de TTN…
Modifier le fichier .json
Nous allons modifier le fichier .json qu’utilise la passerelle pour communiquer avec TTN. Si le packet forwarder tourne (ce ne devrait pas être le cas lors du démarrage) arrêtez le avec CTRL + C.
Utilisez nano pour modifier le fichier json qui concerne la gateway.
1 2 3 4 5 |
# Please select one of the following comands based on your module # for WM1302 LoRaWAN Gateway Module (SPI) - EU868 pi@loragateway:~/LR1302_loraWAN/LR1302_HAL/sx1302_hal $ cd packet_forwarder/ pi@loragateway:~/LR1302_loraWAN/LR1302_HAL/sx1302_hal/packet_forwarder $ nano global_conf.json.sx1250.EU868 nano global_conf.json.sx1250.EU868 |
Descendez dans le fichier (presque jusqu’en bas) jusqu’à trouver :
Vous pouvez aussi remplacer les valeurs 0 des coordonnées par vos coordonnées réelles.
Remplacez la gateway_ID par celle que vous avez relevée ci-dessus, et qui correspond à l’EUI enregistrée dans TTN. Sortez par CTRL + X pour enregistrer.
Pour info dans le dossier packet_forwarder, pour que la passerelle fonctionne, j’ai dû :
modifier les droits de reset_lgw.sh et renommer le fichier json :
1 2 |
sudo chmod 755 reset_lgw.sh mv global_conf.json.sx1250.EU868 global_conf.json |
Vous pouvez maintenant démarrer la passerelle pour vérifier si elle fonctionne.
1 |
./lora_pkt_fwd -c global_conf.json |
On vérifie que la passerelle envoie bien les paquets de données vers TTN.
Les données de test arrivent bien dans la console TTN. A partir de là on peut continuer et mettre le node en route pour envoyer des « vraies » données à la gateway. Pour arrêter proprement la passerelle, utilisez CTRL + C dans la fenêtre de terminal du Raspberry Pi où le packet forwarder s’exécute.
Mise en route du noeud LoRa Elecrow Ra-O8H
On peut programmer le noeud LoRa avec l’IDE Arduino ou Thonny en micropython.
Je vous propose les deux méthodes, vous verrez comment installer l’IDE Arduino pour qu’il communique avec la carte Ra-08H. Pour ma part je préfère Thonny et micropython, avec lequel je développe le programme d’envoi des data à la passerelle.
Présentation
Installation RP2040 sur l’IDE Arduino
Si ce n’est pas déjà fiat, installez l’IDE Arduino. Dans préférences ajouter la ligne
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json pour accéder aux fonctions du RP2040.
Ouvrez le menu Outils > Carte > Gestionnaire de carte
Entrez « RP2040 » dans la boîte de recherche, sélectionnez « Raspberry Pi Pico/RP2040 » et installez l’environnement de développement.
Appuyez sur le bouton BOOT le plus proche des prises.
Connectez le port USB-C à un PC ou un Raspberry Pi,
Une fenêtre s’ouvre, c’est ici que vous pourrez accéder à la mémoire de la carte, comme sur un Raspberry Pi Pico.
Test de la carte
On va tester si tout fonctionne en lançant un programme de test qui fait clignoter la LED interne de la carte.
Après compilation le programme est chargé dans la mémoire du RP2040 et la LED bleue de la carte clignote.
La chaîne de programmation de notre carte Elecrow Ra-08H est en place et fonctionne, on peut passer à la suite.
Test du capteur température humidité
On va connecter le capteur de température DHT11 Crowtail sur le connecteur D1 qui envoie les données sur GP2. Il suffira de renseigner la pin DHTPIN en conséquence dans le programme test_DHT11 ci-dessous. Le programme provient de la page du Wiki de la carte Crowtail DHT11.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
// Example testing sketch for various DHT humidity/temperature sensors #include "DHT.h" #define DHTPIN 2 // what pin we're connected to // Uncomment whatever type you're using! #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) // Connect pin 1 (on the left) of the sensor to +5V // Connect pin 2 of the sensor to whatever your DHTPIN is // Connect pin 4 (on the right) of the sensor to GROUND // Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); Serial.println("DHTxx test!"); dht.begin(); } void loop() { // Reading temperature or humidity takes about 250 milliseconds! // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) float h = dht.readHumidity(); float t = dht.readTemperature(); // check if returns are valid, if they are NaN (not a number) then something went wrong! if (isnan(t) || isnan(h)) { Serial.println("Failed to read from DHT"); } else { Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C"); } delay(1000); } |
Ce programme affiche l’humidité et la température toutes les secondes.
Télécharger le programme test_DHT11
On sait maintenant que la carte fonctionne et qu’elle lit les données de ce capteur, on peut la connecter à TTN via la passerelle. Si vous utilisez l’IDE Arduino pour la connexion à TTN je peux ajouter vos programmes à cet article (toujours avec le nom de l’auteur !)
Utilisation avec Thonny et MicroPython
Puisque la carte utilise un RP2040, le même MCU (Micro Controler Unit) que le Raspberry Pi PICO, on peut aussi utiliser Thonny. c’est la méthode que je préfère. J’ai déjà fait plusieurs articles sur le blog avec Thonny et microPython, reportez-vous à ces articles pour démarrer si vous ne connaissez pas.
La version actuelle de Thonny propose de mettre microPython à jour sur le RP2040. Dites lui OK et faites la mise à jour pour utiliser la dernière version. Ce programme de µPESY en microPython permet de lire les données du DHT11 et de les afficher :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
from machine import Pin from time import sleep import dht capteur = dht.DHT11(Pin(2)) while True: try: sleep(1) # Le DHT11 renvoie au maximum une mesure toute les 1s capteur.measure() # Récupère les mesures du capteur print(f"Temperature : {capteur.temperature():.1f}") print(f"Humidite : {capteur.humidity():.1f}") # Transmet la température sur la console de l'ordinateur except OSError as e: print('Echec reception') # Si la pico ne reçoit pas les mesures du capteur |
Le programme fonctionne et la carte renvoie bien les infos de température et humidité.
Ajouter la carte à TTN
Retournez sur la page de TTN
Cette fois ajoutez une application. Cliquez sur + Create application .
L’ID de l’application ne peut contenir que des minuscules et des chiffres…
Cliquez sur Create appication
On peut maintenant ajouter notre carte, appelée device.
Cliquez sur + Register end device . Le paramétrage de TTN est commenté dans cet article.
Sélectionnez « Enter end device specifics manually« . (La méthode d’accès par défaut pour créer un appareil est OTAA). En mode de connexion OTAA (Over-The-Air-Activation), nous devons enregistrer les trois paramètres suivants : Device EUI, APP EUI et APP KEY, qui seront utilisés pour la connexion ultérieure de l’appareil.
Vous pouvez compléter la configuration comme ci-dessus puis ajouter le JoinEUI (flèche rouge) qui est le ID de votre passerelle, et cliquez sur Confirm, ce qui donne accès à :
Cliquez sur les boutons Generate pour générer votre ID de device (l’identifiant de votre carte Ra-08H Elecrow) et l’AppKey.
Notez précieusement ces informations qui vous serviront pour que la carte puisse se connecter à TTN. Cliquez sur Register end device .
Vous pouvez consulter le résumé de votre carte Ra-08H qui est maintenant déclarée…
Dans la rubrique (l’onglet) Payload formatters il faut encore ajouter un peu de code pour que les infos humidité et température soient décodés et affichés. Choisissez Javascript et remplacez le code par celui-ci
1 2 3 4 5 6 7 8 9 |
function Decoder(b, port) { var var1 = b[0]; var var2 = (b[1] << 8) | b[2]; return { Humidity: var1, Temperature: var2/10 } } |
L’humidité est codée sur un octet, la température est codée sur 16 bits (2 octets). Reste à connecter la carte à TTN !
Connecter la carte à TTN
Le programme suivant va connecter la carte à TTN et envoyer des données de température et humidité « bidons » car fixées dans le programme, le but est de voir si ça se connecte.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# Programme de test des commandes AT # framboise314 le 19 janvier 2024 # d'après https://khunsomsak.medium.com/elecrow-lora-ra-08h-node-board-%E0%B8%81%E0%B8%B1%E0%B8%9A-micropython-90ad1bb6058d from machine import UART from machine import ADC, Pin import time from time import sleep # Pin du capteur de lumière A1 adc = ADC(0) uart = UART(0, 9600,timeout=1000) rstr="" def sendATcommand(ATcommand): print("Command: {0}\r\n".format(ATcommand)) uart.write("{0}\r\n".format(ATcommand)) rstr=uart.read().decode('utf-8') print(rstr) return (rstr) # Configurer le module pour TTN # Entrez vos valeurs sendATcommand ("AT+CDEVEUI=70Bxxxxxxxxxx2C") sendATcommand ("AT+CAPPKEY=C12xxxxxxxxxxxxxxxxxxxxxxxxxx6302") sendATcommand ("AT+CAPPEUI=0016xxxxxxxxxxxxxxxxx56") # Relire les infos pour confirmer l'écriture sendATcommand ("AT+CDEVEUI?") sendATcommand ("AT+CAPPKEY?") sendATcommand ("AT+CAPPEUI?") # Se connecter à TTN sendATcommand ("AT+CJOIN=1,0,8,1") time.sleep(15.0) rstr=sendATcommand ('AT+CSTATUS?') print('\n++++++++++++++++++++') print('Res='+rstr) print('\n++++++++++++++++++++') # Continuer les tentatives de connexions si pas connecté # Le while ne sert pas si on se connecte ci-dessus while '+CSTATUS:04' not in rstr: print('Retry OTAA Continue') sendATcommand ('AT+CJOIN=1,0,8,2') time.sleep(20) rstr=sendATcommand ('AT+CSTATUS?') print('################ Chaine réponse') print(rstr) if '+CSTATUS:04' in rstr: print('\n++++ OTAA OK +++++') break # Si on est connecté : envoyer la trame ici c'est un test de 3 caractères # Correspondant à Humidité = 37 Température = 20.1 count=1 while True: if '+CSTATUS:04' in rstr: print('\n++++OTAA OK+++++') # La chaine 25 00 C9 correspond à 37% hum et 20.1°C sendATcommand ('AT+DTRX=0,2,3,2500C9') count+=1 print('Nombre de paquets : ', count) time.sleep(60) |
Dans la console de Thonny, la connexion de la carte Ra-08H est confirmée :
et sur la console TTN (ci-dessous) on voit arriver les données
La chaîne envoyée est bien reçue et interprétée par le JavaScript que nous avons ajouté.
25 en hexa = 37 en décimal
00 C9 en hexa = 201 en décimal / 10 = 20.1 °C
Pour la lumière je lis le port A0 où est connecté le light sensor. J’ai modifié le javascipt du Payload formater pour traiter la lumière, et on envoie maintenant 5 octets :
1 2 3 4 5 6 7 8 9 10 11 |
function Decoder(b, port) { var var1 = b[0]; var var2 = (b[1] << 8) | b[2]; var var3 = (b[3] << 8) | b[4]; return { Humidity: var1, Temperature: var2/10, Lumiere: var3 } } |
On va pouvoir insérer les données réelles dans la chaîne et les recevoir sur le serveur TTN.
Programme envoi-data.py. Vous pouvez télécharger le programme ici.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
# Programme d'envoi de datas à TTN # framboise314 le 19 janvier 2024 # d'après https://khunsomsak.medium.com/elecrow-lora-ra-08h-node-board-%E0%B8%81%E0%B8%B1%E0%B8%9A-micropython-90ad1bb6058d from machine import UART from machine import ADC, Pin import time from time import sleep import dht # Pin du DHT11 capteur = dht.DHT11(Pin(2)) # Pin du capteur de lumière A1 adc = ADC(0) # Communication avec le Ra-08H uart = UART(0, 9600,timeout=1000) rstr="" def sendATcommand(ATcommand): print("Command: {0}\r\n".format(ATcommand)) uart.write("{0}\r\n".format(ATcommand)) rstr=uart.read().decode('utf-8') print(rstr) return (rstr) # Configurer le module pour TTN # Remplacer par vos valeurs sendATcommand ("AT+CDEVEUI=70Bxxxxxxxxxx2C") sendATcommand ("AT+CAPPKEY=C12xxxxxxxxxxxxxxxxxxxxxxxxx302") sendATcommand ("AT+CAPPEUI=0016xxxxxxxxxxx56") # Relire les infos pour confirmer l'écriture # On peut supprimer quand on est certain que tout fonctionne sendATcommand ("AT+CDEVEUI?") sendATcommand ("AT+CAPPKEY?") sendATcommand ("AT+CAPPEUI?") # Se connecter à TTN sendATcommand ("AT+CJOIN=1,0,8,1") time.sleep(15.0) rstr=sendATcommand ('AT+CSTATUS?') print('\n++++++++++++++++++++') print('Res='+rstr) print('\n++++++++++++++++++++') # Continuer les tentatives de connexions si pas connecté # Le while ne sert pas si on se connecte ci-dessus while '+CSTATUS:04' not in rstr: print('Retry OTAA Continue') sendATcommand ('AT+CJOIN=1,0,8,2') time.sleep(20) rstr=sendATcommand ('AT+CSTATUS?') print('################ Chaine réponse') print(rstr) if '+CSTATUS:04' in rstr: print('\n++++ OTAA OK +++++') break # Si on est connecté : envoyer la trame count=1 while True: try: sleep(1) # Le DHT11 renvoie au maximum une mesure toute les 1s # Comme sa précision est de 1° on ne prend pas en compte les chiffres après la virgule # mais le programme est prêt si vous utilisez un capteur plus précis capteur.measure() # Récupère les mesures du capteur et les affiche temp = capteur.temperature() hum = capteur.humidity() # Transmet la température sur la console de l'ordinateur print(f"Temperature : {temp:.1f}") print(f"Humidite : {hum:.1f}") except OSError as e: print('Echec reception') # Si la pico ne reçoit pas les mesures du capteur # Convertir la température en hexadécimal sur 2 octets temp_hex = "{:04x}".format(temp*10) # Afficher la température en hexadécimal print("Température en hexadécimal : 0x{}".format(temp_hex)) # Convertir l'humidité en hexadécimal sur 1 octets hum_hex = "{:02x}".format(hum) # Afficher la chaine hexadécimale print("Humidité en hexadécimal : 0x{}".format(hum_hex)) # Lire le port ADC lumière lum = adc.read_u16() print("Lumière mesurée : ", lum) # Convertir la lumière en chaien hexa lum_hex = "{:04x}".format(lum) # Créer la chaine à envoyer à la passerelle chaine = hum_hex + temp_hex + lum_hex print (chaine) if '+CSTATUS:04' in rstr: print('\n++++OTAA OK+++++') ATcommand = "AT+DTRX=0,2,5," + chaine sendATcommand (ATcommand) count+=1 print('Nombre de paquets : ', count) time.sleep(15) |
J’ai laissé tous les print ce qui permet de suivre le déroulement du programme. Ici le cycle de répétition n’est que de 15 secondes ! Cela permet de voir si tout se passe bien mais il faudra mettre un temps plus long sur la dernière ligne pour respecter les règles d’occupation de LoRaWAN.
Dans la console TTN on obtient :
On voit ici les 5 octets envoyés 21 00 DC 06 E0 et leur extaction par notre programme javascipt, qui affiche les bonnes valeurs de température, humidité et lumière.
Conclusion
Avec cette passerelle LoRaWan, Elecrow met à disposition de tous ceux qui souhaitent se lancer dans LoRa (éducation, collectivités, entreprises…), un matériel abordable et facile à mettre en oeuvre. L’accès gratuit à TTN permet de se lancer dans des expériences rapidement. Le seul inconvénient est alors la durée de conservaton des données sur TTN.
La carte Node Ra-08H programmable avec l’IDE Arduino ou Thonny a l’avantage d’embarquer un circuit RP2040 bien connu et très documenté sur Internet.
Si vous mettez cet ensemble n’hésitez pas à faire un retour sur votre expérience, les portées obtenues, les soucis que vous avez rencontrés…
Sources
Les prix peuvent varier en fonction du cours du Dollar. TVA en sus. Liens affiliés
Module LR1302 868MHz miniPCIe : 23,90$
Module LR1302 915MHz miniPCIe : 23,90$
Carte Node LoRaWAN 868/915MHz Ra-08H : 12,99$
Carte HAT Raspberry Pi pour LoRaWAN LR1302 : 16,90$
https://www.elecrow.com/wiki/index.php?title=LR1302_LoRaWAN_HAT_for_RPI_PRD
https://www.elecrow.com/wiki/index.php?title=Lora_RA-08H_Node_Board
https://github.com/Elecrow-RD/LR1302_loraWAN/tree/master/LR1302_HAL/sx1302_hal/packet_forwarder
https://www.elecrow.com/crowtail-capacitive-soil-moisture-sensor.html?idd=5
https://www.elecrow.com/crowtail-temperature-humidity-sensor-p-1229.html?idd=5
https://www.elecrow.com/crowtail-light-sensor-p-1244.html?idd=5
https://www.linkedin.com/pulse/global-controllable-ai-thinker-ra-08h-supports-lorawan-protocol-/
Ping : Une passerelle LoRaWan pour le Raspberry Pi chez Elecrow
Superbe article passionnant ! Merci
Bonjour François,
Très intéressant, je vais travailler ça plus en détails.
Petite question : je n’arrive pas à avoir d’infos sur la possibilité d’envoi en France depuis leur site WEB. Avez-vous déjà testé ? Vaut-il mieux passer par Elektor (par ex.) qui vend le matériel, certes plus cher mais sans doute sans souci de douane etc. ?
Merci et bonne journée,
Stéphane.
Bonjour Stéphane
Comme ils m’envoient le matériel en test je n’ai pas ce souci …
par contre il est possible que la TVA s’ajoute au prix, là je n’ai pas d’info
si le prix Elektor est + élevé c’est sans doute à cause des taxes (et leur marge…)
cdt
francois
Bonjour François,
Merci pour votre réponse. Je pense commander sur Elektor pour éviter des frais de dossier en plus des frais de douane…
(Je n’arrive pas à répondre directement via « Répondre » à la fin de votre message : le curseur ne s’affiche pas dans la fenêtre de message (Safari et Brave sur MacOS)…)
Merci Stéphane
oui WordPress et ses addons nous font parfois des misères…
Tenez nous au courant de vos essais
a bientôt
cdt
francois
Ping : Deux cartes LoRaWan Sigfox LSM100A pour Raspberry Pi et PICO chez SNOC [2/2] - Framboise 314, le Raspberry Pi à la sauce française....
Ping : Le dixième anniversaire d'Elecrow : Des promos ! - Framboise 314, le Raspberry Pi à la sauce française....
Merci pour ce travail!
J’ai une question, étant donné que le gateway est le raspberry, ne peut-on pas pour s’affranchir du cloud et de TTN, installer directement sur le raspi un server type Chirpstack pour la gestion des devices lora?
J’ai quand même l’ambition de truffer mon jardin et ma maison de ces bêtes et 10 devices maxi sur TTN c’est limitant.
Au plaisir de vous lire (encore et toujours)…
Bonjour
Oui sans doute mais je ne l’ai jamais fait. Je passe per TTN systématiquement
Cdt
Francois
Bonjour François,
Je vous remercie pour le tuto que j’ai suivi à la lettre et qui m’a permis de mettre en place et de mieux cerner le fonctionnement du protocole LoraWAN.
Je voulais savoir s’il était possible de piloter automatiquement une électrovanne relié à la Raspberry (et donc la passerelle). Mon problème réside dans le fait que comme le capteur envoie une chaîne d’octets lisible uniquement sur TTN et que le downlink permet uniquement d’envoyer un message vers le capteur, est-il possible d’envoyer les données sur la Raspberry pour qu’un script python puisse prendre le relais et gérer automatiquement l’électrovanne ?
Actuellement, dans mon cas j’utilise RaspController pour gérer l’électrovanne manuellement.
Je n’ai encore que de maigres connaissances en électronique et informatique, merci d’avance pour votre retour.
Cordialement,
Babar
Bonjour
ne connaissant pas votre installation c est difficile de le dire
c’est quoi votre noeud Lora ?
parce que le Downlink repart vers le noeud (pas vers le capteur, le capteur c’est le dispositif qui mesure la température, la pression, l’humidité… / le noeud c’est l’ensemble ESP32 + capteur)
et le noeud ecoute le retour si vous devez piloter une électrovanne c est le noeud qui peut s’en charger
regardez https://www.univ-smb.fr/lorawan/wp-content/uploads/2022/01/Livre-LoRa-LoRaWAN-et-lInternet-des-Objets.pdf
cdt
francois
bonjour François & tous
merci pour cet article complet, j’ai aussi regardé la vidéo de Sylvain Montagny dont tu parlais dans un autre article, et quelques autres ressources sur le sujet.
j’ai franchi le pas, le matériel est commandé (passerelle, hat et carte de dev) pour expérimenter cela sur cette fin d’année, avec un jeune stagiaire (plutôt bon niveau technique, en bac pro ciel) qu’on aura au fablab, ta passerelle est encore en fonctionnement ? j’aimerais aussi interfacer cela avec un home assistant (en cours de mise en place) dans un deuxième temps, j’ai vu que c’est possible. L’idée est aussi de fabriquer des nœuds DIY à base de Sx1276 , d’arduino et de capteurs, il restera à les faire communiquer avec la gateway LR1302… nous verrons si on y arrive 😉
amicalement,
Jean-Philippe
Bonjour Jean Philippe
merci pour le retour
non, la passerelle est en fonctionnement en intérieur uniquement lors des tests. Je suis mal placé et juste un peu dégagé vers le sud
cdt
francois