- Matériaux nécessaires
- Connecter Raspberry Pi avec LoRa
- Connecter Arduino avec LoRa
- pyLoRa pour Raspberry Pi
- Configuration du module Raspberry Pi pour LoRa
- Programmation de Raspberry Pi pour LoRa
- Code Arduino pour LoRa pour communiquer avec Raspberry Pi
- Test de la communication LoRa entre Raspberry Pi et Arduino
LoRa devient de plus en plus populaire avec l'avènement de l'IoT, des voitures connectées, du M2M, de l'industrie 4.0, etc. En raison de sa capacité à communiquer sur de longues distances avec très moins d'énergie, il est de préférence utilisé par les concepteurs pour envoyer / recevoir des données d'une chose alimentée par batterie. Nous avons déjà discuté des bases de LoRa et comment utiliser LoRa avec Arduino. Bien que la technologie soit à l'origine destinée à un nœud LoRa pour communiquer avec une passerelle LoRa, il existe de nombreux scénarios dans lesquels un nœud LoRa doit communiquer avec un autre nœud LoRa pour échanger des informations sur de longues distances. Donc, dans ce tutoriel, nous allons apprendre à utiliser un module LoRa SX1278 avec Raspberry pipour communiquer avec un autre SX1278 connecté à un microcontrôleur comme Arduino. Cette méthode peut être utile à de nombreux endroits car l'Arduino pourrait agir comme un serveur pour récupérer les données des capteurs et les envoyer à Pi sur une longue distance via LoRa, puis le Pi agissant en tant que client peut recevoir ces informations et les télécharger sur le pourrait car il a accès à Internet. Cela semble intéressant, non? Alors, commençons.
Matériaux nécessaires
- Module LoRa SX1278 433 MHz - 2 Nos
- Antenne LoRa 433 MHz - 2Nos
- Arduino UNO ou autre version
- Raspberry Pi 3
On suppose que votre Raspberry Pi est déjà flashé avec un système d'exploitation et qu'il est capable de se connecter à Internet. Sinon, suivez le didacticiel Premiers pas avec Raspberry Pi avant de continuer. Ici, nous utilisons Rasbian Jessie installé Raspberry Pi 3.
Attention: utilisez toujours votre module LoRa SX1278 avec des antennes 433 MHz; sinon, le module pourrait être endommagé.
Connecter Raspberry Pi avec LoRa
Avant d'entrer dans les progiciels, préparons le matériel. Le SX1278 est un module Lora à 16 broches qui communique en utilisant SPI sur 3,3V Logic. Le Raspberry pi fonctionne également au niveau logique 3,3 V et dispose également d'un port SPI intégré et d'un régulateur 3,3 V. On peut donc connecter directement le module LoRa au Raspberry Pi. Le tableau de connexion est présenté ci-dessousTarte aux framboises | Module Lora - SX1278 |
3,3 V | 3,3 V |
Sol | Sol |
GPIO 10 | MOSI |
GPIO 9 | MISO |
GPIO 11 | SCK |
GPIO 8 | Nss / Activer |
GPIO 4 | DIO 0 |
GPIO 17 | DIO 1 |
GPIO 18 | DIO 2 |
GPIO 27 | DIO 3 |
GPIO 22 | RST |
Vous pouvez également utiliser le schéma de circuit ci-dessous pour référence. Notez que le schéma de circuit a été créé à l'aide du module RFM9x qui est très similaire au module SX1278, par conséquent, l'apparence peut différer dans l'image ci-dessous.
Les connexions sont assez simples, le seul problème auquel vous pourriez être confronté est que le SX1278 n'est pas compatible avec la maquette, vous devez donc utiliser des fils de connexion directement pour effectuer les connexions ou utiliser deux petites cartes d'expérimentation comme indiqué ci-dessous. De plus, peu de gens suggèrent d'alimenter le module LoRa avec un rail d'alimentation séparé de 3,3 V, car le Pi pourrait ne pas être en mesure de fournir suffisamment de courant. Cependant, Lora étant un module de faible puissance devrait fonctionner sur le rail 3,3 V de Pi, j'ai testé le même et j'ai trouvé qu'il fonctionnait sans aucun problème. Mais prenez-le toujours avec une pincée de sel. Ma configuration de connexion de LoRa avec Raspberry pi ressemble à ceci ci-dessous
Connecter Arduino avec LoRa
La connexion pour le module Arduino reste la même que celle que nous avons utilisée dans notre tutoriel précédent. La seule différence sera au lieu d'utiliser la bibliothèque de Sandeep Mistry, nous utiliserons la bibliothèque Rspreal basée sur la tête Radio dont nous parlerons plus tard dans ce projet. Le circuit est donné ci-dessous
Encore une fois, vous pouvez utiliser la broche 3,3 V sur Arduino Uno ou utiliser un régulateur 3,3 V. Dans ce projet, j'ai utilisé le régulateur de tension embarqué. Le tableau de connexion des broches est donné ci-dessous pour vous aider à effectuer les connexions facilement.
Module LoRa SX1278 | Carte Arduino UNO |
3,3 V | 3,3 V |
Gnd | Gnd |
En / Nss | D10 |
G0 / DIO0 | D2 |
SCK | D13 |
MISO | D12 |
MOSI | D11 |
RST | D9 |
Puisque le module ne rentre pas dans une maquette, j'ai utilisé les fils de connexion directement pour effectuer les connexions. Une fois la connexion établie, la configuration d' Arduino LoRa ressemblera à ceci ci-dessous
pyLoRa pour Raspberry Pi
Il existe de nombreux packages python que vous pouvez utiliser avec LoRa. Le Raspberry Pi est également couramment utilisé comme LoRaWAN pour obtenir des données de plusieurs nœuds LoRa. Mais, dans ce projet, notre objectif est de faire une communication Peer to Peer entre deux modules Raspberry Pi ou entre un Raspberry Pi et un Arduino. J'ai donc décidé d'utiliser le package pyLoRa. Il dispose de modules rpsreal LoRa Arduino et rpsreal LoRa Raspberry pi qui peuvent être utilisés sur l'environnement Arduino et Raspberry Pi. Pour l'instant, concentrons-nous sur l'environnement Raspberry Pi.
Configuration du module Raspberry Pi pour LoRa
Comme indiqué précédemment, le module LoRa fonctionne avec la communication SPI, nous devons donc activer SPI sur Pi, puis installer le package pylora . Suivez les étapes ci-dessous pour faire de même, après avoir ouvert la fenêtre du terminal de Pi. Encore une fois, j'utilise du mastic pour me connecter à mon Pi, vous pouvez utiliser votre méthode pratique.
Étape 1: Entrez dans la fenêtre de configuration en utilisant la commande suivante. Pour obtenir la fenêtre ci-dessous
sudo raspi-config
Étape 2: accédez aux options d'interfaçage et activez SPI comme indiqué dans l'image ci-dessous. Nous devons activer l'interface SPI car, comme nous l'avons vu, l'écran LCD et PI communiquent via le protocole SPI
Étape 3: Enregistrez les modifications et revenez à la fenêtre du terminal. Assurez-vous que pip et python sont mis à jour, puis installez le package RPi.GPIO à l'aide de la commande suivante.
pip installer RPi.GPIO
Cette classe de package nous aidera à contrôler la broche GPIO sur le Pi. S'il est installé avec succès, votre écran ressemblera à ceci
Étape 4: De même, procédez à l'installation du package spidev à l'aide de la commande suivante. Spidev est une liaison python pour Linux qui peut être utilisée pour effectuer une communication SPI sur Raspberry Pi.
pip installer spidev
Si l'installation réussit, le terminal devrait ressembler à ceci ci-dessous.
Étape 5: Ensuite, installons le package pyLoRa à l'aide de la commande pip suivante. Ce package installe les modèles Radio associés à LoRa.
pip installer pyLoRa
Si l'installation réussit, vous verrez l'écran suivant.
Le package PyLoRa prend également en charge la communication cryptée qui peut être utilisée avec Arduino et Raspberry Pi de manière transparente. Cela améliorera la sécurité des données dans votre communication. Mais vous devez installer un package séparé après cette étape, ce que je ne fais pas car le cryptage n'est pas dans le cadre de ce tutoriel. Vous pouvez suivre les liens github ci-dessus pour plus de détails.
Après cette étape, vous pouvez ajouter les informations de chemin du package à pi et essayer avec le programme python donné à la fin. Mais je n'ai pas pu ajouter le chemin avec succès et j'ai donc dû télécharger manuellement la bibliothèque et l'utiliser directement pour mes programmes. J'ai donc dû procéder aux étapes suivantes
Étape 6: Téléchargez et installez le package python-rpi.gpio et le package spidev à l'aide de la commande ci-dessous.
sudo apt-get install python-rpi.gpio python3-rpi.gpio sudo apt-get install python-spidev python3-spidev
La fenêtre du terminal devrait afficher quelque chose comme ça après les deux installations.
Étape 7: Installez également git, puis utilisez-le pour cloner le répertoire python de notre Raspberry Pi. Vous pouvez le faire à l'aide des commandes suivantes.
sudo apt-get install git sudo git clone
Une fois cette étape terminée, vous devriez trouver le sous-répertoire SX127x dans le dossier d'accueil de Raspberry Pi. Cela aura tous les fichiers requis associés à la bibliothèque.
Programmation de Raspberry Pi pour LoRa
Dans une communication LoRa d'égal à égal, le module qui transmet les informations est appelé un serveur et le module qui reçoit les informations est appelé un client. Dans la plupart des cas, l'Arduino sera utilisé sur le terrain avec un capteur pour mesurer les données et le Pi sera utilisé pour recevoir ces données. J'ai donc décidé d'utiliser le Raspberry Pi en tant que client et l'Arduino en tant que serveur dans ce tutoriel. Le programme client Raspberry Pi complet se trouve au bas de cette page. Ici, je vais essayer d'expliquer les lignes importantes du programme.
Attention: assurez-vous que le fichier programme se trouve dans le même répertoire que celui où se trouve le dossier de la bibliothèque SX127x. Vous pouvez copier ce dossier et l'utiliser n'importe où si vous souhaitez porter le projet.
Le programme est assez simple, nous devons configurer le module LoRa pour qu'il fonctionne en 433Mhz, puis écouter les paquets entrants. Si nous recevons quelque chose, nous les imprimons simplement sur la console. Comme toujours, nous commençons le programme en important les bibliothèques Python requises.
depuis le temps importation sleep depuis SX127x.LoRa import * depuis SX127x.board_config import BOARD BOARD.setup ()
Dans ce cas, le package time est utilisé pour créer des retards, le package Lora est utilisé pour la communication LoRa et le board_config est utilisé pour définir les paramètres de la carte et du LoRa. Nous avons également configuré la carte à l'aide de la fonction BOARD.setup () .
Ensuite, nous créons la classe python LoRa avec trois définitions. Puisque nous n'indentons que pour que le programme fonctionne comme un client Raspberry, la classe n'a que trois fonctions à savoir la classe init, la classe de démarrage et la classe on_rx_done . La classe init initialise le module LoRa à 433 MHz avec une bande passante de 125 kHz comme défini dans la méthode set_pa_config . Ensuite, il met également le module en mode veille pour économiser la consommation d'énergie.
# Les valeurs par défaut de moyenne portée après init sont 434,0 MHz, Bw = 125 kHz, Cr = 4/5, Sf = 128 puces / symbole, CRC sur 13 dBm lora.set_pa_config (pa_select = 1) def __init __ (self, verbose = False): super (LoRaRcvCont, self).__ init __ (verbose) self.set_mode (MODE.SLEEP) self.set_dio_mapping (* 6)
La fonction de démarrage est l' endroit où nous configurer le module comme récepteur et obtient comme RSSI (puissance du signal de réception indicateur), état, fréquence de fonctionnement etc. Nous configurons le module pour qu'il fonctionne en mode récepteur continu (RXCONT) à partir du mode veille, puis utilisons une boucle while pour lire des valeurs telles que RSSI et l'état du modem. Nous vidons également les données de la mémoire tampon série sur le terminal.
def start (self): self.reset_ptr_rx () self.set_mode (MODE.RXCONT) while True: sleep (.5) rssi_value = self.get_rssi_value () status = self.get_modem_status () sys.stdout.flush ()
Enfin, la fonction on_rx_done est exécutée après la lecture du paquet entrant. Dans cette fonction, les valeurs reçues sont déplacées dans une variable appelée charge utile à partir du tampon Rx après avoir mis l'indicateur de réception à l'état haut. Ensuite, les valeurs reçues sont décodées avec utf-8 pour imprimer des données lisibles par l'utilisateur sur le shell. Nous remettons également le module en mode veille jusqu'à ce qu'une autre valeur soit reçue.
def on_rx_done (self): print ("\ nReceived:") self.clear_irq_flags (RxDone = 1) payload = self.read_payload (nocheck = True) print (bytes (payload).decode ("utf-8", 'ignorer' '))) self.set_mode (MODE.SLEEP) self.reset_ptr_rx () self.set_mode (MODE.RXCONT)
La partie restante du programme consiste simplement à imprimer les valeurs reçues sur la console et à terminer le programme à l'aide d'une interruption clavier. Nous avons à nouveau mis la carte en mode veille même après la fin du programme pour économiser l'énergie.
essayez: lora.start () sauf KeyboardInterrupt: sys.stdout.flush () print ("") sys.stderr.write ("KeyboardInterrupt \ n") enfin: sys.stdout.flush () print ("") lora. set_mode (MODE.SLEEP) BOARD.teardown ()
Code Arduino pour LoRa pour communiquer avec Raspberry Pi
Comme je l'ai mentionné précédemment, le code rpsreal prend en charge à la fois Arduino et Pi et la communication entre Arduino et Pi est donc possible. Il fonctionne sur la base de la bibliothèque Radiohead d'AirSpayce. Vous devez donc d'abord installer la bibliothèque de tête radio sur votre IDE Arduino.
Pour ce faire, visitez la page Github et téléchargez la bibliothèque dans le dossier ZIP. Placez-le ensuite dans le dossier bibliothèque de votre IDE Arduino. Maintenant, redémarrez l'IDE Arduino et vous trouverez des fichiers d'exemple pour la bibliothèque de tête radio. Ici, nous allons programmer l'Arduino pour qu'il fonctionne comme un serveur LoRa pour envoyer des paquets de test comme 0 à 9. Le code complet pour faire la même chose peut être trouvé au bas de cette page comme toujours. Ici, je vais vous expliquer quelques lignes importantes du programme.
Nous commençons le programme en important la librairie SPI (installée par défaut) pour utiliser le protocole SPI puis la librairie RH_RF95 de Radio head pour effectuer la communication LoRa. Ensuite, nous définissons à quelle broche d'Arduino nous avons connecté la broche de sélection de puce (CS), de réinitialisation (RST) et d'interruption (INT) du LoRa avec Arduino. Enfin, nous définissons également que le module doit fonctionner en fréquence 434 MHz et initialiser le module LoRa.
#comprendre
À l'intérieur de la fonction de configuration , nous réinitialiserons le module LoRa en tirant sa broche de réinitialisation au niveau bas pendant 10 milli seconde pour recommencer à neuf. Ensuite, nous l' initialisons avec le module que nous avons créé précédemment à l'aide de la bibliothèque Radio head. Ensuite, nous définissons la fréquence et la puissance de transmission du serveur LoRa. Plus la distance de transmission est élevée, plus vos paquets voyageront mais consommeront plus d'énergie.
void setup () { // Initialiser Serial Monitor Serial.begin (9600); // Réinitialiser le pinMode du module LoRa (RFM95_RST, OUTPUT); DigitalWrite (RFM95_RST, LOW); retard (10); DigitalWrite (RFM95_RST, HIGH); retard (10); // Initialise le module LoRa while (! Rf95.init ()) { Serial.println ("LoRa radio init failed"); tandis que (1); } // Définit la fréquence par défaut 434.0MHz if (! Rf95.setFrequency (RF95_FREQ)) { Serial.println ("setFrequency failed"); tandis que (1); } rf95.setTxPower (18); // Puissance d'émission du module Lora }
Dans la fonction de boucle infinie, nous devons simplement envoyer le paquet de données via le module LoRa. Ces données peuvent être quelque chose comme la valeur du capteur de la commande utilisateur. Mais pour plus de simplicité, nous enverrons une valeur de char 0 à 9 pour chaque intervalle de 1 seconde, puis initialiserons la valeur à 0 après avoir atteint 9. Notez que les valeurs ne peuvent être envoyées que dans un format de tableau de caractères et le type de données doit être unit8_t est de 1 octet à la fois. Le code pour faire de même est indiqué ci-dessous
void loop () { Serial.print ("Envoyer:"); char radiopacket = char (valeur)}; rf95.send ((uint8_t *) radiopacket, 1); retard (1000); valeur ++; if (valeur> '9') valeur = 48; }
Test de la communication LoRa entre Raspberry Pi et Arduino
Maintenant que nous avons à la fois notre matériel et notre programme prêts, nous devons simplement télécharger le code Arduino sur la carte UNO et l'esquisse python doit être lancée sur pi. Ma configuration de test avec le matériel connecté ressemble à ceci ci-dessous
Une fois que l'esquisse du client python est lancée sur le Pi (utilisez uniquement python 3), si tout fonctionne correctement, vous devriez voir les paquets Arduino reçus dans pi via la fenêtre shell. Vous devriez remarquer «Reçu: 0» à 9 comme indiqué dans l'image ci-dessous.
Le code Raspberry pi complet avec toutes les bibliothèques requises peut être téléchargé à partir d'ici.
Vous pouvez maintenant déplacer le serveur Arduino et vérifier la portée du module; il est également possible d'afficher la valeur RSSI sur le shell si nécessaire. Le fonctionnement complet du projet peut être trouvé dans la vidéo ci-dessous. Maintenant que nous savons comment établir une communication LoRa longue distance à faible puissance entre Arduino et Raspberry pi, nous pouvons procéder à l'ajout d'un capteur côté Arduino et d'une plate-forme cloud du côté Pi pour créer un package IoT complet.
J'espère que vous avez compris le projet et que vous avez apprécié sa construction. Si vous avez des problèmes pour le faire fonctionner, utilisez la section commentaires ci-dessous ou les forums pour d'autres problèmes techniques.