Après l’essai de la passerelle LoRaWan publié il y a quelques jours, la Société Nationale des Objets Connectés (SNOC) m’a proposé de tester deux de ses produits qui permettent de déployer des solutions de Nodes LoRaWAN et Sigfox pour la famille classique Raspberry Pi (1 à 5) et pour le Raspberry Pi PICO. J’ai accepté avec plaisir car c’est une société française, basée en Anjou, dont j’avais déjà pu tester la qualité des produits.
Au sommaire :
- 1 Deux cartes LoRaWan Sigfox LSM100A pour Raspberry Pi et PICO chez SNOC
- 1.1 Déballage des cartes LoRaWAN
- 1.2 La carte pour le Raspberry Pi
- 1.3 Schéma et brochage de la carte
- 1.4 Installer minicom
- 1.5 Activer le port série du Raspberry Pi 5
- 1.6 Connectez la carte sur le Raspberry Pi et la configurer
- 1.7 Programme de test
- 1.8 Quelques copies d’écran
- 1.9 L’aide renvoyée par la carte LSM100A
- 2 Conclusion
- 3 Sources
Deux cartes LoRaWan Sigfox LSM100A pour Raspberry Pi et PICO chez SNOC
Déballage des cartes LoRaWAN
Les cartes sont arrivées dans un carton, bien protégées et à l’abri dans un sachet antistatique. tout était en parfait état à la réception
Au déballage on trouve les deux cartes.
A gauche la carte Raspberry Pi PICO, il faudra souder les connecteurs. Elle est fournie avec son connecteur U-FL, un câble et une antenne SNOC 868MHz de 2dBi de gain adaptée pour LoRa et Sigfox. La documentation de l’antenne est disponible en ligne.
A droite la carte pour Raspberry Pi 1 à 5. Un connecteur est monté sur la carte et une rehausse est fournie. Je l’ai utilisée sur le Pi5. On retrouve la même antenne et son câble U-FL vers SMA. Avec son écrou, le connecteur SMA peut se fixer sur un boîtier.
Attention de ne pas utiliser n’importe quelle antenne, les antennes WiFI sont conçues pour 2,4GHz et 5GHz et ne fonctionnent pas avec les fréquences de ces cartes.
La carte pour le Raspberry Pi
J’ai décidé de partager cette présentation en deux articles. Ce premier article traitera de la carte Raspberry Pi « classique », du 1 au 5. Je ferai un second article sur la carte pour le PICO, sachant que le module LoRaWAN est le même, l’article sera plus léger.
La carte SNOC pour le Raspberry Pi embarque un module LSM100A avec un STM32WLE5CC (Arm Cortex-M4 @48 MHz avec 256 Ko de mémoire flash et 64 Ko de SRAM). Le module est fabriqué par SEONG JI, une société Sud Coréenne, et toute la documentation est disponible en ligne. On voit la prise d’antenne au format U-FL en haut à droite de l’image, et la prise qui va se connecter sur le GPIO du Raspberry Pi en bas de la carte.
Pour mémoire, la prise U-FL est prévue pour une trentaine de connexion/déconnexion, elle n’est pas prévue pour être branchée et débranchée de multiples fois.
Schéma et brochage de la carte
Le schéma de la carte est simple du fait de l’utilisation du module LSM100A
La carte utilise une petite partie du connecteur (2 fois 6 broches), de quoi l’alimenter (3,3 volts et masse), communiquer avec le Raspberry Pi (UART2_TX et UART2_RX). et le RESET (GPIO 17).
La carte est munie d’un connecteur femelle destiné à se brancher sur le port GPIO, et on a un rehausseur que j’ai utilisé pour le Raspberry Pi 5.
La mise en place du rehausseur ne pose pas de problème. Il n’y a pas de sens à respecter.
Il vaut mieux mettre la prise U-FL en place avant de monter la carte sur le GPIO car on va devoir appuyer assez fort pour la clipser.
Si vous montez la prise après avoir mis la carte en place il y a un surplomb et c’est plus compliqué.
Ici la carte et l’antenne sont en place sur un Raspberry Pi 5.
On va pouvoir passer à la mise en service.
Installer minicom
Commencez par installer minicom sur le Raspberry Pi. Minicom est un programme de contrôle de modem et d’émulation de terminal pour les systèmes d’exploitation de type Unix.
sudo apt install minicom
Les ports UART du Raspberry posent parfois des soucis aux utilisateurs, j’ai déjà publié quelques articles là-dessus. ils ont un peu évolué au cours des versions et il faut bien savoir ce qu’on fait.
Activer le port série du Raspberry Pi 5
Il va falloir modifier le fichier config.txt qui se trouve maintenant dans /boot/firmware/config.txt
On ajoute en fin de fichier après la balise [All] la ligne
dtoverlay=uart0
Pour activer l’UART 0, accessible sur les ports GPIO 14 et GPIO 15 si vous ne modifiez pas les connexions de Tx et Rx.
Connectez la carte sur le Raspberry Pi et la configurer
Éteignez le Raspberry Pi, débranchez l’alimentation pour éviter tout risque, puis installez la carte LoRa en évitant tout décalage qui pourrait être fatal.
Démarrer minicom en 9600 bauds
minicom -D /dev/ttyAMA0 -b 9600
Configurer le mode Echo de minicom : CTRL A puis E => en bas de l’écran minicom indique que le mode Echo est activé. dans ce mode, ce que vous tapez au clavier est envoyé simultanément à l’écran et sur le port série. Si vous n’êtes pas en mode Echo, vous ne voyez pas ce que vous tapez au clavier, juste les réponses de la carte
On peut commencer à configurer la carte. J’ai commencé la découverte des fonctions en mode manuel avec minicom et les commandes AT. ça m’a rappelé mon jeune temps 😀 car lorsque j’ai installé mes premiers modems (300, puis 600, 1200 etc bauds) toute la configuration utilisait les commandes Hayes ou commandes AT.
La première chose à faire est de taper AT puis la touche Entrée. La carte doit répondre OK : si oui tout va bien et vous pouvez continuer… Pour ma part j’ai réalisé pas à pas une connexion à TTN en manuel pour avoir les billes suffisantes pour écrire le programme.
Le programme de test vous donne l’ordre dans lequel envoyer les commandes AT au LSM100A pour le configurer.
La carte LSM100A comporte d’origine ses propres identifiants qui restent « en dur ». Sur TTN quand on veut faire des modifs, il est parfois nécessaire de supprimer un device, dans ce cas TTN conserve son ID et vous empêche de le réutliser par la suite. J’ai donc choisi de générer des ID sur TTN avec le bouton GENERER. Ce sont ces ID que j’utilise pour les tests. Après, les ID sont codées sur 64 bits et on peut en générer … 18,446,744,073,709,551,616 on a donc de la marge et on peut y aller tranquille.
Le programme de test utilise un barre de progression, installer progressbar2
sudo apt install python3-progressbar2
Programme de test
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 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # ---------------------------------------------------- # Créé par framboise314 # Le 7 février 2024 # Version 1.3 # ---------------------------------------------------- # Envoyer la température CPU sur la console TTN # ==================================================== import serial import sys import time import progressbar2 # Initialiser le port série ser = serial.Serial('/dev/ttyAMA0', baudrate=9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS) time.sleep(1) # Ouvrir le port série si ce n'est pas fait if ser.isOpen() == False: ser.open() # Envoyer une commande à la carte et imprimer sa réponse + retour def sendATcommand(Commande): # Ajouter CR LF à la chaine de commande ATcommand = Commande + '\r\n' print("Commande : {0}\r\n".format(ATcommand)) # Envoyer la chaine à la carte LSM100A ser.write(ATcommand.encode()) time.sleep(1) # Lire la réponse de la carte rep = ser.read(ser.inWaiting()) print("Réponse : ", rep.decode()) # Retourner la réponse de la carte à l'appelant return(rep) # Si une commande ne retourne pas OK, sortir du programme def fin_de_prog_OK(rep) : if not b'OK' in rep : print("Une erreur s'est produite - Fin du programme") ser.close() sys.exit("La carte retourne une erreur, recommencez") # Vérifier si la carte est connectée et répond chaine = "AT" reponse = sendATcommand(chaine) print("RETOUR :", reponse.decode()) if b'OK' in reponse : print("La carte est connectée et elle fonctionne") if b'AT_ERROR' in reponse : ser.close() sys.exit("La carte retourne une erreur, recommencez") # Configurer la carte complètement # ================================ # Mettre la carte en mode LoRaWAN chaine = "AT+MODE=1" time.sleep(2) reponse = sendATcommand(chaine) print("RETOUR AT+MODE=1 :", reponse.decode()) if b'BOOTALERT' in reponse : print("La carte est en mode LORA") if b'AT_ERROR' in reponse : ser.close() sys.exit("La carte n'est pas passée en mode LoRaWAN") # Configurer pour la zone 5 : EU868 chaine = "AT+BAND=5" time.sleep(5) reponse = sendATcommand(chaine) print("RETOUR AT+BAND=5 :", reponse.decode()) DEUI="70:B3:D5:7E:D0:06:4C:A0" APPEUI="01:01:01:01:01:01:01:01" APPKEY="3D:5A:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:64:6C" NWKKEY="3D:5A:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:64:6C" # Configurer les valeurs pour TTN chaine = "AT+DEUI="+DEUI reponse = sendATcommand(chaine) fin_de_prog_OK(reponse) chaine = "AT+APPEUI="+APPEUI reponse = sendATcommand(chaine) fin_de_prog_OK(reponse) chaine = "AT+APPKEY="+APPKEY reponse = sendATcommand(chaine) fin_de_prog_OK(reponse) chaine = "AT+NWKKEY="+NWKKEY reponse = sendATcommand(chaine) fin_de_prog_OK(reponse) # Joindre la carte au réseau LoraWAN chaine = "AT+JOIN=1" reponse = sendATcommand(chaine) #time.sleep(15) for i in progressbar2.progressbar(range(150)) : time.sleep(0.1) if b'OTAA mode' in reponse : print("La carte est connectée en mode OTAA") if b'AT_ERROR' in reponse : ser.close() sys.exit("La carte ne s'est pas connectée") try: while True : # Boucle infinie - Interruption par CTRL + C # Mesure de la température CPU en milli degrés ! with open('/sys/class/thermal/thermal_zone0/temp','r') as cpu_temp : # Calculer la température en centièmes de degrés temperature = int(cpu_temp.read())/10 print ("Température CPU : ", temperature/100) # Extraire la partie entière entier = '{}'.format(int(temperature/100)) print ("Entier : ", entier) # Extraire les décimales decimale = '{}'.format((temperature/100)%1) print("Décimale : ", decimale) # Créer la chaine à envoyer à TTN print ("Température CPU reconstituée : " + entier + "." + decimale[2:4] ) # Envoyer une data sur TTN # Si la longueur de decimale est égale à 3 on a par ex. 0.5 # et il n'y a pas assez de chiffre > erreur if len(decimale) == 3 : decimale = decimale + "1" data = entier + decimale[2:4] else: data = entier + decimale[2:4] port = "1" ack = "1" chaine = "AT+SEND=" + port + ":" + ack + ":" + data reponse = sendATcommand(chaine) # Délai entre 2 envois de data time.sleep(300) except KeyboardInterrupt: ser.close() sys.exit("Programme terminé par l'utilisateur") ser.close() |
On sort du programme par CTRL + C. J’ai laissé toutes les sorties vers la console qui permettent de vérifier que tout se passe bien. L’idée ici n’est pas de fournir une recette « clé en main » mais de vous permettre de démarrer avec cette carte LoRaWAN… Après c’est à vous de jouer.
Quelques copies d’écran
Démarrage de la carte et passage en mode LoRa. La carte renvoie ses ID que je n’ai pas utilisés ici. J’ai généré des ID sur la console TTN.
Connexion de la carte en mode OTAA, la température du CPU est de 49,04 degrés (je ne fais pas d’arrondi, de toute façon le dizième de degré n’a pas d’importance). Les sodomiseurs de diptères feront le nécessaire si cela leur semble utile. On voit la barre de progression. Quand on lancera le programme en ligne de commande, elle sera « normale » sur une seule ligne.
La console TTN montre la connexion de la carte (Successfully processed) et la température arrive bien dans les data.
L’aide renvoyée par la carte LSM100A
AT?
AT+<CMD>? : Help on <CMD>
AT+<CMD> : Run <CMD>
AT+<CMD>=<value> : Set the value
AT+<CMD>=? : Get the value
ATZ: Trig a MCU reset
AT$RFS: Restore EEPROM Factory Settings
AT+VER: Get the FW version
AT$ID: Get the ID
AT$PAC: Get the PAC
ATS410: 0:Private Key 1:Public Key
ATS411: Payload Encryption 0:Off 1:On
AT$SB=<Bit>,<Opt downlink>,<Opt TxRepeat><CR>. Send a bit to the sigfox network
AT$SF=<Payload>,<Opt downlink>,<Opt TxRepeat><CR>. Send a ASCII frame to the sik
AT$SH=<PayloadLength>,<Payload>,<Opt downlink>,<Opt TxRepeat><CR>. Send a Hex fk
AT$CW=<frequency><CR> frequency in Hz or in MHz. Run CW Test mode
AT$PN=<frequency>,<bitrate><CR> frequency in Hz or in MHz, bitrate=[100, 600]. e
AT$TM=<rc>,<mode><CR> mode=[0..12]. Run Sigfox Test mode
AT+BAT: Get the battery Level in mV
ATS302=<power>,<CR> power in dBm=[0..20]. Set Radio output power in dBm
ATS300: send an out of band message once.
ATS400=<param1><param2><param3>,<param4><CR>. Configure specific variables for .
AT$RC<param1><CR> param1=[1:7]. Set/Get the Regional Config zones.
AT$RSSICAL=<param1><CR> param1=rssi value in dB. Set/Get the rssi calibration v.
ATE=<param1><CR> [0,1]. Set/Get the echo state.
AT+VL=<param1><CR> [0:3]. Set/Get the Verbose Level with integer from 0(VLEVEL_)
AT+MODE LoRa/SigFox Select 0:SigFox, 1:LoRa
AT$RL Starts listening for a local loop
AT$SL Send Tx packet for a local loop
AT$SSWVER Get SW Version
Conclusion
La carte pour Raspberry Pi fournie par SNOC embarque le module LSM100A. La documentation de ce module est pour le moment fournie par le constructeur Sud-coréen de la carte, et tourne uniquement autour du SDK en langage C. Pour ma part, à destination des makers, je suis plutôt sur du Python ou du microPython. Ça me semble plus simple de mise en œuvre. Pour les râleurs qui vont me dire que le C c’est bien, je vais juste signaler que j’ai été formateur d’adultes en informatique industrielle et que j’ai fait « manger » à mes stagiaires du C, du C++, du temps réel et autres développements Xwindows à l’époque. Je suis aussi passé par le le Basic, le VBasic, le Basic Industriel (8051), l’assembleur (Z80, 6809, x86…), le pascal, le PHP, le js, le node-js, le java, scratch et j’en oublie…
Comme je travaille beaucoup maintenant avec des débutants, des lycéens ou des étudiants, je privilégie le Python. C’est mon choix, point à la ligne.
En Python la mise en route d’un Node LoRaWAN avec la carte SNOC me semble assez facile une fois qu’on a intégré la logique du LSM100A.
Je vous en reparlerai bientôt car je vais essayer l’autre carte que SNOC m’a envoyée, celle qui se monte sur le Raspberry Pi PICO.
La carte travaille également avec Sigfox. j’ai demandé un compte de test il y a plus d’une semaine sur la page SigFox, sans réponse de leur part, j’ai laissé tombé le test avec Sigfox…
Edit du 12/2/2024 : J’ai eu un contact chez Sigfox et peut être la possibilité d’avoir des tokens de test. Je vous en reparle bientôt
Sources
Kit LoRa/Sigfox LSM100A Raspberry Pi : 34,68 €
Kit LoRa/Sigfox LSM100A Raspberry Pi PICO : 27,48 €
Toute la documentation en ligne
https://support.seongji.co.kr/lora-main-2-2/
https://support.seongji.co.kr/sigfox-product/
https://github.com/Support-SJI/LSM100A
1 |
Ping : Deux cartes LoRaWan Sigfox LSM100A pour Raspberry Pi et PICO chez SNOC [1/2]
Ping : Deux cartes LoRaWan Sigfox LSM100A pour Raspberry Pi et PICO chez SNOC [2/2] - Framboise 314, le Raspberry Pi à la sauce française....
Bonsoir
Merci pour cette intéressante présentation des breakouts Yadom à base de LSM100A
La data sheet du LSM100A annonce moins de 5µA en mode SLEEP (stop2)
Dans la liste des commandes AT je ne vois pas de commande de mise en sommeil
Le LSM100A passe-t-il en sommeil (I <5µA) après une commande de reset ATZ ?
Le LSM100A passe-t-il en siommeil (I < 5µA) une fois écoulée la fenêtre temporelle RX2 de réception quand on l’utilise en LoRaWAN Classe A ?