DOMOTIQUE : Communiquer en 868Mhz avec Lora

13 janvier 2019 rdorigny 0 commentaires

Dans un article précèdent, je vous avais fait part de mes difficultés pour faire communiquer un émetteur/récepteur sur la plage de fréquence de 433Mhz. Les circuits fonctionnent correctement mais la fréquence est très encombrée. Et ce bruit sur la fréquence de 433Mhz me limite à 7-8 mètres de portée ce qui est insuffisant pour ce que je compte réaliser.

Donc, comme je suis un peu têtu, et que je ne vais pas rester sur semi-échec, je me suis décidé à tenter la même expérience sur la fréquence 868Mhz en utilisant le protocole de communication Lora. Alors, voyons cela.

Présentation du protocole LoraWan

LoRaWAN (Long Range Wide-area network) est un protocole de communication radio bas débit et à faible consommation électrique. Ce protocole d’origine grenobloise a été pensé pour les objets connectés.

Lora utilise une modulation à étalement de spectre de type Chirp spread spectrum (CSS). Cette modulation est basée sur de la vobulation linéaire de fréquence, par un signal de fréquence qui augmente un 1 et une vobulation dégressive pour 0. C'est assez proche d'une modulation FSK.

La modulation du spectre par étalement utilise une bande passante plus large que ce qui utile, mais profite de cet étalement en fréquence pour opérer avec un signal faible ou fortement bruité. La variation de fréquence effectuée par LoRa est linéaire ce qui permet aux récepteurs d’éliminer simplement les décalages de fréquences et effets Doppler inhérents à la transmission du signal. Enfin, ce fonctionnement permet aux transmetteurs LoRa d’être produits à faible coût.


La société Semtech détient la propriété intellectuelle des puces LoRa, et donc leurs fabricants lui versent des royalties. Semtech ne communique pas clairement le mode de fonctionnement de Lora pour protéger ses secrets industriels. Vous trouverez ici, une documentation assez complète néanmoins sur les principes de Lora et Lorawan.

Le matériel

Comme souvent, j'utilise deux ESP32 pour piloter les modules 868Mhz. Il s'agit juste de les faire communiquer, un en émetteur et l'autre en récepteur. Donc il nous faut un modem à 868Mhz. J'ai opté pour un tout petit circuit, le RFM95 qui est pilotable par l'intermédiaire du protocole SPI (Serial Peripheral Interface)


Tellement petit d'ailleurs, que les trous ne sont pas espacés par la distance habituelle de 2.54mm ce qui oblige à bricoler une connectique spécifique.


Le schéma de connexion

Vous trouverez ci-dessous le schéma de la connexion. A noter que l'antenne (représentée en violet sur le schéma) est une quart d'onde pour une fréquence de 868Mhz. Elle doit mesurer 8.6cm. Pour mémoire, on utilise la formule Lambda=c/f afin de mesurer la longueur d'onde, avec c=299792458 m/s pour la vitesse de la lumière.


Le circuit RFM95 est piloté par l'intermédiaire du port SPI de l'ESP32. Adafruit propose un module précâblé en 2.54mm, le PID 3072, sur lequel on peut fixer une antenne SMA. L'antenne SMA favorisera une bonne réception et allongera significativement les distances de transmission. Ceci dit, pour mon usage ( 15 mètres entre l'émetteur et le récepteur) , une simple antenne avec un bout de câble s’avère suffisant.


Le code

Pour commencer, il est nécessaire d'inclure les librairies de LoraWan dans l'IDE Arduino. Pour cela, il faudra installer la bibliothèque LoRa écrite par Sandeep Mistry grâce au gestionnaire des librairies de l'IDE Arduino. Merci à lui d'ailleurs!




Le code de l'émetteur est assez basique:
#include (SPI.h) //remplacer les () par des <>
#include (LoRa.h)  //remplacer les () par des <>

//define the pins used by the transceiver module
#define ss 5
#define rst 14
#define dio0 2

int counter = 0;

void setup() {
  //initialize Serial Monitor
  Serial.begin(115200);
  while (!Serial);
  Serial.println("LoRa Sender");

  //setup LoRa transceiver module
  LoRa.setPins(ss, rst, dio0);
  
  //replace the LoRa.begin(---E-) argument with your location's frequency 
  //433E6 for Asia
  //866E6 for Europe
  //915E6 for North America
  while (!LoRa.begin(866E6)) {
    Serial.println(".");
    delay(500);
  }
   // Change sync word (0xF3) to match the receiver
  // The sync word assures you don't get LoRa messages from other LoRa transceivers
  // ranges from 0-0xFF
  LoRa.setSyncWord(0xF3);
  Serial.println("LoRa Initializing OK!");
}

void loop() {
  Serial.print("Sending packet: ");
  Serial.println(counter);

  //Send LoRa packet to receiver
  LoRa.beginPacket();
  LoRa.print("hello ");
  LoRa.print(counter);
  LoRa.endPacket();

  counter++;

  delay(10000);
}


Pour le récepteur:
#include (SPI.h) //remplacer les () par des <>
#include (LoRa.h)  //remplacer les () par des <>
#include "esp_system.h"

//define the pins used by the transceiver module
#define ss 5
#define rst 14
#define dio0 2

int cpt=0;

void setup() {
  //initialize Serial Monitor
  Serial.begin(115200);
  while (!Serial);
  Serial.println("LoRa Receiver");

  //setup LoRa transceiver module
  LoRa.setPins(ss, rst, dio0);
  
  //replace the LoRa.begin(---E-) argument with your location's frequency 
  //433E6 for Asia
  //866E6 for Europe
  //915E6 for North America
  while (!LoRa.begin(866E6)) {
    Serial.println(".");
    delay(500);
  }
   // Change sync word (0xF3) to match the receiver
  // The sync word assures you don't get LoRa messages from other LoRa transceivers
  // ranges from 0-0xFF
  LoRa.setSyncWord(0xF3);
  Serial.println("LoRa Initializing OK!");
}

void loop() {
  //delay(1000);
  cpt++;
  // try to parse packet
  int packetSize = LoRa.parsePacket();
  if (packetSize) {
    // received a packet
    Serial.print("Received packet '");
    cpt=0;

    // read packet
    while (LoRa.available()) {
      String LoRaData = LoRa.readString();
      Serial.print(LoRaData); 
    }

    // print RSSI of packet
    Serial.print("' with RSSI ");
    Serial.println(LoRa.packetRssi());
  }

  if (cpt>1000000) esp_restart();
  }


Ces codes sont les exemples fournis avec la librairie de Sandeep Mistry. Il suffit alors d'ouvrir un moniteur série sur le récepteur pour voir si on reçoit quelque chose...



Bingo!! Ça fonctionne!!! Au final, l’émetteur fonctionne depuis plus une semaine sans soucis. Il transmet toute les dix secondes une valeur qu'il incrémente à chaque itération.

En revanche, j'ai rencontré un problème de déconnexion pour le récepteur. La communication s’arrêtait sans reprendre au bout d'un temps aléatoire. Donc j'ai modifié, le code du récepteur en introduisant un compteur, si le compteur dépasse 1000000 de boucles (correspond à 30 secondes de délais sans réception), je redémarre l'ESP32.

Conclusion

Mon petit système d'émission/réception en Lora 868Mhz fonctionne super bien et j'en suis très satisfait. J'ai réalisé quelques tests jusqu’à 30 mètres de distances entre l’émetteur et le récepteur avec beaucoup d'obstacles entre les deux, aucun soucis.

S'agissant d'un proof of concept, je referais au propre ces montages sur un projet en cours, avec un PID 3072 pour avoir un écartement standard des PIN à 2.54mm et surtout disposer d'une vraie antenne SMA omnidirectionnelle.









Pseudonyme (obligatoire) :
Adresse mail (obligatoire) :
Site web :




© 2019 www.doritique.fr par Robert DORIGNY