[RESOLU] Communication sous LoRa 868 , multiple modèle

Bonjour,

C'est ma première demande et je vais essayer de respecter les règles d'utilisation du forum afin que ma demande déjà compliqué soit facile à comprendre.

Je me présente Dimitri, 27 ans, technicien.
J'ai pour projet de faire communiquer des compteurs d'eau à impulsions à un serveur central pour faire du suivi d'information en temps réel.

Aussi j'ai décidé d'utiliser :

  • ARDUINO MEGA 2560 R3 ELEGOO

  • Shield ETHERNET HanRun HR911105A

  • Module NRF24L01 + 2.4 Ghz ** Suite à un problème de portée changement de choix**

  • Shield Dragino Lora Shield v1.4 Lien du shield

  • Heltec Carte de Dev Wifi LoRa Esp 32 Lien du module

Je vous présente maintenant les codes initiaux pour l’émission et la récéption sous NRF24 L01 :

EMISSION :

 /**
 * Exemple de code pour la bibliothèque Mirf – Client d'envoi de variable
 */
#include <SPI.h>      // Pour la communication via le port SPI
#include <Mirf.h>     // Pour la gestion de la communication
#include <nRF24L01.h> // Pour les définitions des registres du nRF24L01
#include <MirfHardwareSpiDriver.h> // Pour la communication SPI

float valeur = 0;
float eau = 2;

void setup() {
  Serial.begin(9600);
   
  Mirf.cePin = 9; // Broche CE sur D9
  Mirf.csnPin = 10; // Broche CSN sur D10
  Mirf.spi = &MirfHardwareSpi; // On veut utiliser le port SPI hardware
  Mirf.init(); // Initialise la bibliothèque

  Mirf.channel = 1; // Choix du canal de communication (128 canaux disponibles, de 0 à 127)
  Mirf.payload = sizeof(float); // Taille d'un message (maximum 32 octets)
  Mirf.config(); // Sauvegarde la configuration dans le module radio

  Mirf.setTADDR((byte *) "nrf02"); // Adresse de transmission
  Mirf.setRADDR((byte *) "nrf01"); // Adresse de réception
   
  Serial.println("Go !"); 
}
 
void loop() {

  valeur=valeur+eau;
  delay(1000);
  
   
  Mirf.send((byte *) &valeur); // On envoie le message
  while(Mirf.isSending()); // On attend la fin de l'envoi
}

RECEPTION :

 #include <SPI.h> //bibliothèqe pour SPI
#include <Ethernet.h> //bibliothèque pour Ethernet
#include <SPI.h>      // Pour la communication via le port SPI
#include <Mirf.h>     // Pour la gestion de la communication
#include <nRF24L01.h> // Pour les définitions des registres du nRF24L01
#include <MirfHardwareSpiDriver.h> // Pour la communication SPI


byte mac[] = {xxxxxxxxxxxxxxxxxxxxxxxxxxxx}; //adresse mac de votre carte
byte ip[] = {xxxxxxxxxxxxxxxxx}; //adresse IP
EthernetServer serveur(80); // déclare l'objet serveur au port d'écoute 80
float valeur;

void setup() {
 
//setup ETHERNET

 Serial.begin (9600); //initialisation de communication série
  Ethernet.begin (mac, ip); //initialisatio de la communication Ethernet
  Serial.print("\nLe serveur est sur l'adresse : ");
  Serial.println(Ethernet.localIP()); //on affiche l'adresse IP de la connexion







//setup sansfil

  Mirf.cePin = 2; // Broche CE sur D2
  Mirf.csnPin = 3; // Broche CSN sur D3
  Mirf.spi = &MirfHardwareSpi; // On veut utiliser le port SPI hardware
  Mirf.init(); // Initialise la bibliothèque

  Mirf.channel = 1; // Choix du canal de communication (128 canaux disponibles, de 0 à 127)
  Mirf.payload = sizeof(float); // Taille d'un message (maximum 32 octets)
  Mirf.config(); // Sauvegarde la configuration dans le module radio

  Mirf.setTADDR((byte *) "nrf01"); // Adresse de transmission
  Mirf.setRADDR((byte *) "nrf02"); // Adresse de réception

  Serial.println("Go !"); 
  
}

void loop() {
  



 //void clign();

 float valeur;

  if(Mirf.dataReady()){
    Mirf.getData((byte *) &valeur); // Réception du paquet
    Serial.println(valeur); // Affiche le message
  }

  EthernetClient client = serveur.available(); //on écoute le port
  if (client) { //si client connecté
    Serial.println("Client en ligne\n"); //on le dit...
    if (client.connected()) { // si le client est en connecté
      while (client.available()) { // tant qu'il a des infos à transmettre
        char c=client.read(); // on lit le caractère  
        Serial.write(c);// on l'écrit sur le moniteur série
        delay(1); //délai de lecture
      }
      //réponse au client
      client.println("<!DOCTYPE HTML>"); // informe le navigateur du type de document à afficher
      client.println("<html>Compteur d'eau brute deferisee
</html>"); //code html
      client.println(valeur);
      client.println("m3");
      client.stop(); //on déconnecte le client
      Serial.println("Fin de communication avec le client");
    }
  }

  
  }

Jusqu'à là, pas de soucis. Ces deux programmes marchent correctement et me permettent de me connecter n'importe où dans le monde pour avoir un accès à mon information valeur.

La difficulté : :

Et oui sinon je serais pas là :slight_smile:

La portée de ce projet est de plus de 300 m et après des essais sur site j'ai du revoir mon mode de communication pour du LoRa.

Le problème c'est que je n'y connais rien, et que je n'arrive pas à adapter mes deux programmes pour du LoRa.

Trop de nouvelles bibliothèques, trop de configuration, et mon anglais est un poil léger pour le peu de vidéo qu'il y a sur Youtube.

Alors je souhaiterais savoir ...

Quelqu'un à déjà travaillé avec ma configuration matériel ?

Quelqu'un à des idées ?

Je vous remercie par avance d'avoir pris le temps de lire ce long premier post

Bonjour

Juste une remarque : le titre du message mentionne LoRa 868 MHz, le lien vers la carte Heltec mentionne , lui, du LoRa 433 MHz. Attention les puces LoRa 868MHz et 433MHz ne sont pas les mêmes.

pas encore joué avec LoRa ..... mais vu que les puces les plus courantes sur ces cartes et shields 'low cost' sont des RFM95 je serai tenté de tester deux librairies :

  • LoRa de Sandeep Mistry (voir les exemples simples LoRaSender et LoRaReceiver)

  • RadioHead qui prend également en charge cette puce LoRa

Le plus simple il me semble : tester (sur la même fréquence !) LoRaSender -> LoRaReceiver avec la première librairie

Salut,

Merci pour ta réponse.

al1fch:
Juste une remarque : le titre du message mentionne LoRa 868 MHz, le lien vers la carte Heltec mentionne , lui, du LoRa 433 MHz. Attention les puces LoRa 868MHz et 433MHz ne sont pas les mêmes.

D'après les exemples que j'ai vu, sur les mêmes modèles que moi, le 433 est une indication sur la puce, mais tout le monde choisis sa bande 868 pour l'Europe.

Après je ne suis pas super calé dans ce domaine :o

Je vais essayer la librairie que tu m'as indiqué en travaillant déjà en 433 bande commune pour les deux appareils et ensuite si j'ai un résultat je passerais en 868 et je viendrais vous faire un retour de ce que j'arrive à faire.

Comme ça pour les prochains, ca pourra aider.

Cdlt,

Merci pour le retour à venir !

concernant les puces radio je voulais juste mentionner l'existence de 2 puces différentes :

l'une dédié à 433 MHz (ou 470 MHz) : SX1278 de Semtech ou RFM96W de HoperRF
l'autre dédiée à 868 MHz (ou 915MHz : SX1276 de Semtech ou RFM95W de HopeRF

C'est du moins ce que disent les fabricants de ces puces dans les notices techniques.
Vient ensuite le marquage des modules utilisant ces puces....où une fréquence peut être parfois cochée
L'antenne accompagnant le module est, de préférence, adaptée à la fréquence

Je doute donc de la possibilité de faire fonctionner correctement à 868 MHz une puce 433Mhz
Je pense donc qu'il faut choisir la bande à l'achat des cartes ou modules

Oui je suis d'accord avec toi

Le fabricant HELTEC fournis des exemples pour son appareil, voici un des codes contenant :

#define BAND 433E6 //you can set band here directly,e.g. 868E6,915E6

Si j'en tire quelques choses de ce code, je vous tiendrais informé sur la possibilité de choisir sa bande.

/*

  www.heltec.cn
  
  this project also realess in GitHub:
  https://github.com/Heltec-Aaron-Lee/WiFi_Kit_series
*/
#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>  
#include "SSD1306.h" 
#include "images.h"

// Pin definetion of WIFI LoRa 32
// HelTec AutoMation 2017 support@heltec.cn 
#define SDA     4    // GPIO4  -- SX127x's SDA
#define SCK     5    // GPIO5  -- SX127x's SCK
#define SCL     15   // GPIO15 -- SX127X's SCL
#define MISO    19   // GPIO19 -- SX127x's MISO
#define MOSI    27   // GPIO27 -- SX127x's MOSI
#define SS      18   // GPIO18 -- SX127x's CS
#define RST     14   // GPIO14 -- SX127x's RESET
#define RST_LED 16   // GPIO16 -- OLED reset pin
#define LED     25   // GPIO25 -- LED Light pin
#define DI00    26   // GPIO26 -- SX127x's IRQ(Interrupt Request)

#define BAND    433E6  //you can set band here directly,e.g. 868E6,915E6
#define PABOOST true

#define V2   1

#ifdef V2 //WIFI Kit series V1 not support Vext control
  #define Vext  21
#endif

unsigned int counter = 0;

SSD1306  display(0x3c, SDA, SCL, RST_LED);
String rssi = "RSSI --";
String packSize = "--";
String packet ;

void logo()
{
  display.clear();
  display.drawXbm(0,5,logo_width,logo_height,logo_bits);
  display.display();
}

void setup()
{
  pinMode(Vext,OUTPUT);
  pinMode(LED,OUTPUT);
  
  digitalWrite(Vext, LOW);    // set GPIO16 low to reset OLED
  delay(50); 
  display.init();
  display.flipScreenVertically();  
  display.setFont(ArialMT_Plain_10);
  logo();
  delay(1500);
  display.clear();
  
  SPI.begin(SCK,MISO,MOSI,SS);
  LoRa.setPins(SS,RST,DI00);
  
  if (!LoRa.begin(BAND,PABOOST))
  {
    display.drawString(0, 0, "Starting LoRa failed!");
    display.display();
    while (1);
  }
  display.drawString(0, 0, "LoRa Initial success!");
  display.display();
  delay(1000);
}

void loop()
{
  display.clear();
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  display.setFont(ArialMT_Plain_10);
  
  display.drawString(0, 0, "Sending packet: ");
  display.drawString(90, 0, String(counter));
  display.display();

  // send packet
  LoRa.beginPacket();
  LoRa.print("hello ");
  LoRa.print(counter);
  LoRa.endPacket();

  counter++;
  digitalWrite(LED, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}

Bonsoir à tous,

Grand succès pour moi-même :slight_smile:

  • Après 7 heures dans les bas fond d'internet et du monde de l'Arduino.
  • Après de multiples vérifications, téléversement, grattage de cheveux, arrachage de cheveux
  • Après les visionnages Youtube en Anglais, portugais, chinois.
  • Après le désespoir.
  • Après la dernière compilation à 4h44 du matin ( c'était un signe, et puis j'avais dis que j'irais me couché si ça marchait pas ) [/i]

J'ai réussi à communiquer entre mes deux appareils.

Pour rappel, la composition du côté Hardware.

DKT77:

  • ARDUINO MEGA 2560 R3 ELEGOO

  • Shield ETHERNET HanRun HR911105A

  • Shield Dragino Lora Shield v1.4 Lien du shield

  • Heltec Carte de Dev Wifi LoRa Esp 32 Lien du module

Maintenant je vous donne les programmes légèrement commenté :

ÉMETTEUR HELTEC ESP 32 LoRa

#include <SPI.h>  //bibliothèque de communication SPI
#include <RH_RF95.h> // bibliothèque de com LoRa

#define SS 18 //broche ESP 32 DV KIT HELTEC
#define RST 14 //broche ESP 32 DV KIT HELTEC
#define DI0 26 //broche ESP 32 DV KIT HELTEC

#define RF95_FREQ 868.0 //fréquence de travail ESP32, peut être changer en 433 ou 916 en fonction de l'usage

RH_RF95 rf95(SS, DI0); // [heltec|ttgo] ESP32 Lora OLED avec puce sx1278

void setup() 
{
  pinMode(RST, OUTPUT);
  digitalWrite(RST, HIGH);
 
  while (!Serial);
  Serial.begin(115200); //Vitesse de communication HELTEC ESP32
  delay(100);
 
  Serial.println("Arduino LoRa Transmetteur!"); // Pour définire que nous sommes le transmetteur
 
  //Séquence de reset
  digitalWrite(RST, LOW);
  delay(10);
  digitalWrite(RST, HIGH);
  delay(10);
 
  while (!rf95.init()) {
    Serial.println("LoRa signal en erreur"); //Erreur de programmetion vérifier la fréquence, la tension, le paramétrage broche
    while (1);
  }
  Serial.println("LoRa Signal intialise!"); // tout va bien
 
  // Si la fréquence est incorrect
  if (!rf95.setFrequency(RF95_FREQ)) {
    Serial.println("Mauvaise frequence ?");
    while (1);
  }
  Serial.print(" Freq utilisé: "); Serial.println(RF95_FREQ); // Juste une information de la fréquence
  
   rf95.setTxPower(23, false);
}
 
int16_t packetnum = 0;  // Paquet du compteur
 
void loop()
{
  Serial.println("Envoye au Serveur Shield Lora"); //Début loop
   
  char radiopacket[20] = "Salut #      ";
  itoa(packetnum++, radiopacket+13, 10);
  Serial.print("Envoyer ! "); Serial.println(radiopacket);
  radiopacket[19] = 0;
  
  Serial.println("Envoie en cours..."); delay(10);
  rf95.send((uint8_t *)radiopacket, 20);
 
  Serial.println("Transmission"); delay(10);
  
  // Attente retour Ping Pong
  
  rf95.waitPacketSent();
  uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
  uint8_t len = sizeof(buf);
 
  Serial.println("Attente de réponse"); delay(10);
  if (rf95.waitAvailableTimeout(1000))
  { 
    // Recéption du message retour ?  
    if (rf95.recv(buf, &len))
   {
      Serial.print("Got reply: ");
      Serial.println((char*)buf);
      Serial.print("RSSI: ");
      Serial.println(rf95.lastRssi(), DEC);    
    }
    else
    {
      Serial.println("Pas de réponse");
    }
  }
  else
  {
    Serial.println("Module Shield Lora en marche ? ");
  }
  delay(1000);
}

RECEPTEUR Shield LoRa

#include <SPI.h> //bibliothèque de communication SPI
#include <RH_RF95.h> // bibliothèque de com LoRa



 
#define RFM95_CS 10 //broche Shield Lora sur Arduino MEGA
#define RFM95_RST 9 //broche Shield Lora sur Arduino MEGA
#define RFM95_INT 2 //broche Shield Lora sur Arduino MEGA
 

#define RF95_FREQ 868 //fréquence de travail Shield LoRa, peut être changer en 433 ou 916 en fonction de l'usage
 
RH_RF95 rf95(RFM95_CS, RFM95_INT); // Shield LoRa détermination des broche de communication
 

#define LED 13 // Led clignotante récéption


void setup() 
{

  
  pinMode(LED, OUTPUT);     
  pinMode(RFM95_RST, OUTPUT);
  digitalWrite(RFM95_RST, HIGH);
 
  while (!Serial);
  Serial.begin(9600); // Vitesse de Commuication pour ce shield
  delay(100);
 
  Serial.println("Arduino LoRa Récépteur");
  
  //Séquence de reset
  digitalWrite(RFM95_RST, LOW);
  delay(10);
  digitalWrite(RFM95_RST, HIGH);
  delay(10);
 
  while (!rf95.init()) {
    Serial.println("LoRa signal en erreur");//Erreur de programmetion vérifier la fréquence, la tension, le paramétrage broche
    while (1);
  }
  Serial.println("LoRa signal initialise"); // tout va bien
 
 // Si la fréquence est incorrect
  if (!rf95.setFrequency(RF95_FREQ)) {
    Serial.println("Mauvaise frequence ?");
    while (1);
  }
  Serial.print("Set Freq to: "); Serial.println(RF95_FREQ); // Juste une information de la fréquence
 

  
  rf95.setTxPower(23, false);
}
 
void loop()
{
  

  if (rf95.available())
  {
    // Récéption d'un message ? 
    uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
    uint8_t len = sizeof(buf);
    
    if (rf95.recv(buf, &len))
    {
      digitalWrite(LED, HIGH);
      RH_RF95::printBuffer("Reçu :  ", buf, len);
      Serial.print("Got: ");
      Serial.println((char*)buf);
   
       Serial.print("RSSI: ");
      Serial.println(rf95.lastRssi(), DEC);
      
      // Send a reply
      uint8_t data[] = "Message retour :  ";
      rf95.send(data, sizeof(data));
      rf95.waitPacketSent();
      Serial.println("Envoye de la réponse");
      digitalWrite(LED, LOW);
    }
    else
    {
      Serial.println("Envoie echoué");
    }
  }

  
}

Je passe donc mon sujet en RESOLU

Même si de mon côté il me reste à géré mon Shield Ethernet et la synchro SPI car deux shield l'un sur l'autre c'est pratique mais ça fou en l'ai une communication.

Et je reviendrais rajouté des photos et commentaires en Edit de ce post quand j'aurais un peu plus de temps.

Bravo et merci pour le retour.
Avec cette configuration matérielle et ce soft la 'longue portée est-elle au rendez vous ?

Les premiers tests me donnent 50 m max. avant la saccade de la récéption.

L'avantage de ces programmes c'est que j'ai le retour RSSI sur le moniteur série, donc je peux visualiser et ajuster le placement des antennes.

La bibliothèque <RH_RF95.h> permet quelques ajustements pour faire moduler le débit me semble-t-il.

Je ferais des essais plus poussés prochainement et je viendrais édité mon message avec des infos complémentaires.

C'est pareil, le HELTEC ESP 32 LoRa est équipé d'un écran OLED que je n'ai pas pris le soin de programmer pour l'instant mais ça permet de ne pas transporter le PC avec soit et ca serait pratique que je le rajoute.

Mais une chose à la fois, je tenais déjà à fournir ce début de code, qui pourra aider certains.

DKT77:
Les premiers tests me donnent 50 m max. avant la saccade de la récéption.

L'avantage de ces programmes c'est que j'ai le retour RSSI sur le moniteur série, donc je peux visualiser et ajuster le placement des antennes.

La bibliothèque <RH_RF95.h> permet quelques ajustements pour faire moduler le débit me semble-t-il.

Je ferais des essais plus poussés prochainement et je viendrais édité mon message avec des infos complémentaires.

C'est pareil, le HELTEC ESP 32 LoRa est équipé d'un écran OLED que je n'ai pas pris le soin de programmer pour l'instant mais ça permet de ne pas transporter le PC avec soit et ca serait pratique que je le rajoute.

Mais une chose à la fois, je tenais déjà à fournir ce début de code, qui pourra aider certains.

Bonsoir
:grin:

Comme indiqué par al1fch
surtout n’hésite pas à faire part des tes avancées

Ne serait ce que par par simple curiosité assuméee , tes manips "multi bandes" sont intéressantes 8)

Bonjour,

Est-ce que tu aurais les branchements de ton schéma afin de réaliser ton programme s'il te plaît?

Merci d'avance et excuse moi du dérangement. :slight_smile:

Salut,

Non désolé je n'ai aucune photo en mémoire de ce projet et je l'ai abandonné n'ayant pas réussit à configurer la portée que je voulais avoir.

Bon courage