LoRa – Emetteur et Récepteur

Commençons par un projet simple avec deux carte LoRa. Nous avons deux cartes Heltec LoRa32 V2. Voyons ici comment les programmer en langage C avec l’IDE Arduino afin qu’elles communiquent entre elles.

Même si les deux cartes sont bidirectionnelles, une sera utilisée comme émetteur et l’autre comme récepteur. Pour plus d’informations sur les cartes LoRa, voire l’article : LoRa et LoRaWAN – Présentation

Carte Heltec LoRa32 V2 émettrice
Carte Heltec LoRa32 V2 réceptrice

Présentation

Les cartes LoRa32  sont des ESP32 équipés de puces LoRa pour la communication longue distance. Ces cartes peuvent à la fois émettre et recevoir. Cependant, le message émis est envoyé en clair et est accessible à toutes les autres cartes LoRa proches. Néanmoins, il existe 4 paramètres permettant de « restreindre » l’accessibilité du message aux autres cartes LoRa

  • Facteur d’étalement (SF) : De 6 à 12, plus la valeur est grande, plus la portée est grande
  • Bande passante (kHz) : Au choix, 7.8, 10.4, 15.6, 20.8, 31.25, 41.7, 62.5, 125, 250, 500)
  • Sync Word (1 ou 2 octets) : Permet de différentier les communications LoRa (par défaut 0x34)
  • Fréquence (MHz): Dépend des lois du pays et de la puce LoRa utilisée. En Europe et avec la carte LoRa32 adaptée au 868Mhz, on peut fixer une fréquence de 863 à 870Mhz comme 863.1, 863.3, 863.5, …

En effet, ces 3 paramètres doivent être identiques sur les cartes LoRa pour qu’elles puissent communiquer sans problème. Cependant, cette méthode n’est pas infaillible et d’autres cartes configurées autrement sont parfois aussi capable de lire les messages. Sans nous pencher d’avantage sur la sécurité dans la communication, faisons fonctionner nos deux cartes.

Préparation

Nous n’allons pas tout détailler ici, juste les principales étapes. Premièrement il faut Installer l’IDE Arduino et le pré-configurer pour qu’il reconnaisse les cartes Heltec et qu’il ait la bonne librairie pour les faire fonctionner :

  1. Fichier > Préférences > URL de gestionnaire … : Ajoutez la ligne suivante https://resource.heltec.cn/download/package_heltec_esp32_index.json
  2. Outil > Type de carte > Gestionnaire de cartes : Recherchez puis choisissez Heltec ESP32 …
  3. Croquis > Inclure un bibliothèque > Gérer les bibliothèques : Recherchez puis choisissez Heltec ESP32 …

Une fois cela fait, il faut connecter la carte à l’IDE

  • Branchez l’antenne sur la carte LoRa32 (sauf si tu veux perdre ta carte)
  • Branchez la carte LoRa32 au PC
  • Outil > Type de carte : Choisir WiFi LoRa32 V2
  • Outil > Port : Choisissez le port apparu après avoir branché la carte

L’IDE reconnait chaque LoRa32, il ne nous reste plus qu’à la programmer nos deux cartes, l’une comme émetteur et l’autre comme récepteur.

Code

Retrouvez ici les deux codes C pour la carte émettrice et réceptrice. Les deux cartes envoient sur l’écran et affichent sur l’écran les messages transmis.

Cependant, pour que cela marche correctement, il faudra dans le code des deux cartes inclure les mêmes valeurs pour les 4 paramètres cités dans la partie présentation, par exemple :

LoRa.setSpreadingFactor(8);       //SP 8
LoRa.setSignalBandwidth(125000);  //125 kHz
LoRa.setFrequency(868100000);     //868,1 Mhz
LoRa.setSyncWord(0x97);           //0x97

Ces paramètres fonctionnent bien pour moi, je vous invite à choisir les paramètres de votre choix. Attention, certaines valeurs de paramètres ne fonctionnent pas bien ensemble. Essayez en d’autres si les cartes n’arrivent pas à communiquer.

Chaque code C est donc à téléverser sur chaque carte à l’aide du bouton Téléverser de l’IDE Arduino.

Code émetteurCode récepteur
//Code émetteur
#include "heltec.h"

void setup()
{
             //OLED  LoRa  Serial PABOOST Fréquence
  Heltec.begin(true, true, true,  true,   868100000);
  
  LoRa.enableCrc();
  LoRa.setSyncWord(0x97);
  LoRa.setSpreadingFactor(8);                         // Setup Spreading Factor (6 ~ 12)
  LoRa.setSignalBandwidth(125000);                    // Setup BandWidth, option: 7800,10400,15600,20800,31250,41700,62500,125000,250000,500000
  //LoRa.setCodingRate4(8);                           // Setup Coding Rate:5(4/5),6(4/6),7(4/7),8(4/8) 
  //LoRa.setFrequency(868100000);                     // Déjà lancé par le Heltec.begin()
  //LoRa.dumpRegisters(Serial);
  //LoRa.setTxPower(20,RF_PACONFIG_PASELECT_PABOOST); //20dB output must via PABOOST
  
  /*
  * LoRa.setTxPower(txPower,RFOUT_pin);
  * txPower -- 0 ~ 20
  * RFOUT_pin could be RF_PACONFIG_PASELECT_PABOOST or RF_PACONFIG_PASELECT_RFO
  *   - RF_PACONFIG_PASELECT_PABOOST -- LoRa single output via PABOOST, maximum output 20dBm
  *   - RF_PACONFIG_PASELECT_RFO     -- LoRa single output via RFO_HF / RFO_LF, maximum output 14dBm
  */
}

void loop()
{
  // Création du message
  static int counter = 0;
  String message = "<36>compteur=" + String(counter);
  counter++;
  
  // Log sur le port série du PC (CTRL + MAJ + M)
  Serial.print("Sending packet: ");
  Serial.println(message);

  // Log sur l'écran OLED
  Heltec.display->clear();
  Heltec.display->setFont(ArialMT_Plain_10);
  Heltec.display->setTextAlignment(TEXT_ALIGN_LEFT);
  Heltec.display->drawString(0, 0, message);
  Heltec.display->display();
    
  // Envoi du message
  LoRa.beginPacket();
  LoRa.print(message);
  LoRa.endPacket();

  // Attend 5 secondes
  delay(1000);                       // wait for a second
  digitalWrite(25, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(4000);                       // wait for a second
  digitalWrite(25, LOW);    // turn the LED off by making the voltage LOW
}
// Code Récepteur
#include "heltec.h"

void setup()
{
             //OLED  LoRa  Serial PABOOST Fréquence
  Heltec.begin(true, true, true,  true,   868100000);
  
  LoRa.enableCrc();
  LoRa.setSyncWord(0x97);
  LoRa.setSpreadingFactor(8);                         // Setup Spreading Factor (6 ~ 12)
  LoRa.setSignalBandwidth(125000);                    // Setup BandWidth, option: 7800,10400,15600,20800,31250,41700,62500,125000,250000,500000
  //LoRa.setCodingRate4(8);                           // Setup Coding Rate:5(4/5),6(4/6),7(4/7),8(4/8) 
  //LoRa.setFrequency(868100000);                     // Déjà lancé par le Heltec.begin()
  //LoRa.dumpRegisters(Serial);
  //LoRa.setTxPower(20,RF_PACONFIG_PASELECT_PABOOST); //20dB output must via PABOOST
  
  /*
  * LoRa.setTxPower(txPower,RFOUT_pin);
  * txPower -- 0 ~ 20
  * RFOUT_pin could be RF_PACONFIG_PASELECT_PABOOST or RF_PACONFIG_PASELECT_RFO
  *   - RF_PACONFIG_PASELECT_PABOOST -- LoRa single output via PABOOST, maximum output 20dBm
  *   - RF_PACONFIG_PASELECT_RFO     -- LoRa single output via RFO_HF / RFO_LF, maximum output 14dBm
  */
}

void loop()
{
  // Récupération du paquet
  int packetSize = LoRa.parsePacket();
  if (packetSize) 
  {
    String message;
    while (LoRa.available()) {message += (char)LoRa.read();}
    
    // Log sur l'écran OLED
    Heltec.display->clear();
    Heltec.display->setFont(ArialMT_Plain_10);
    Heltec.display->setTextAlignment(TEXT_ALIGN_LEFT);
    Heltec.display->drawString(0, 0, message);
    Heltec.display->display();
    
    // Log sur le port série du PC (CTRL + MAJ + M)
    Serial.print("Received packet '");
    Serial.print(message);

    // Log sur le port série du PC (CTRL + MAJ + M)
    Serial.print("' with RSSI ");
    Serial.println(LoRa.packetRssi());
  }
}

Sources

  • https://github.com/HelTecAutomation/Heltec_ESP32
  • https://heltec.org/project/wifi-lora-32/

Votez cet article :

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?

Laisser un commentaire