Premier projet LoRa avec ESP32 : liaison point à point avec la Heltec Wireless Stick V3

Module radio LoRa (puce SX1278) avec fils SPI connectés

Après la théorie de notre article LoRa et LoRaWAN expliqués, place au fer à souder… ou presque, puisque ce premier montage ne demande aucune soudure. L’objectif est simple : deux cartes ESP32 équipées d’une radio LoRa, l’une qui envoie un message numéroté toutes les minutes, l’autre qui l’affiche avec la force du signal reçu. Pas de passerelle, pas de serveur, pas d’abonnement : une liaison directe, idéale pour comprendre les réglages avant de passer à un réseau LoRaWAN.

Le matériel nécessaire

  • Deux Heltec Wireless Stick V3 (350 Dhs HT l’unité) : chacune associe un ESP32-S3, une puce LoRa SX1262 couvrant 863 à 928 MHz, un port USB-C, un écran OLED miniature et la gestion de charge d’une batterie Li-Po. L’antenne LoRa livrée se branche sur un connecteur IPEX (U.FL).
  • Deux câbles USB-C reliés à un ordinateur, ou un ordinateur et un chargeur USB.
  • En option, une batterie Li-Po 3,7 V avec connecteur SH1.25 pour les essais sur le terrain.
  • En option, une antenne omnidirectionnelle 863–870 MHz à connecteur SMA, reliée à la carte par un câble adaptateur IPEX vers SMA.

Vous avez déjà une carte ESP32 classique ? Le même programme fonctionne avec un module SX1262 câblé en SPI : il suffit d’adapter les numéros de broches. Notre rayon cartes ESP32 propose plusieurs modèles adaptés.

Règle n° 1 : jamais d’émission sans antenne

Un émetteur radio qui fonctionne sans antenne renvoie son énergie vers son propre amplificateur, ce qui peut l’endommager. Prenez l’habitude de visser ou clipser l’antenne avant de brancher l’USB. Le connecteur IPEX est minuscule et supporte un nombre limité de branchements : enfoncez-le bien à la verticale et évitez de tirer sur le câble.

Préparer l’IDE Arduino

  1. Installez l’IDE si ce n’est pas déjà fait ; notre guide pour télécharger l’IDE Arduino détaille chaque étape.
  2. Dans les préférences, ajoutez l’adresse du paquet Espressif : https://espressif.github.io/arduino-esp32/package_esp32_index.json, puis installez « esp32 by Espressif Systems » depuis le gestionnaire de cartes.
  3. Choisissez la carte « Heltec Wireless Stick(V3) » dans la liste des cartes ESP32.
  4. Dans le gestionnaire de bibliothèques, installez RadioLib, la bibliothèque open source de Jan Gromeš qui pilote la plupart des puces LoRa.

Heltec propose aussi ses propres bibliothèques et un paquet de cartes dédié. Nous préférons RadioLib pour ce tutoriel : le code reste portable vers d’autres cartes et la bibliothèque sait également gérer LoRaWAN, ce qui servira pour la suite.

Les broches du SX1262 sur la Wireless Stick V3

Sur cette carte, la radio est reliée en interne au bus SPI de l’ESP32-S3. Voici les correspondances à déclarer dans le code :

Signal SX1262GPIO de l’ESP32-S3
NSS (sélection de puce)8
SCK9
MOSI10
MISO11
RESET12
BUSY13
DIO1 (interruption)14

La puce utilise un oscillateur compensé en température (TCXO) alimenté par sa broche DIO3 ; on indique sa tension, 1,8 V, au moment de l’initialisation.

Le code de l’émetteur

#include <SPI.h>
#include <RadioLib.h>

// Heltec Wireless Stick V3 : NSS, DIO1, RESET, BUSY
SX1262 radio = new Module(8, 14, 12, 13);
uint32_t compteur = 0;

void setup() {
  Serial.begin(115200);
  SPI.begin(9, 11, 10, 8);  // SCK, MISO, MOSI, NSS

  // 868,1 MHz, 125 kHz, SF9, CR 4/7, mot de synchro privé,
  // 14 dBm, préambule de 8 symboles, TCXO 1,8 V
  int etat = radio.begin(868.1, 125.0, 9, 7,
                         RADIOLIB_SX126X_SYNC_WORD_PRIVATE, 14, 8, 1.8);
  if (etat != RADIOLIB_ERR_NONE) {
    Serial.print("Erreur d'initialisation : ");
    Serial.println(etat);
    while (true) { delay(1000); }
  }
  Serial.println("Emetteur pret");
}

void loop() {
  String message = "djenni#" + String(compteur++);
  int etat = radio.transmit(message);
  if (etat == RADIOLIB_ERR_NONE) {
    Serial.println("Envoye : " + message);
  } else {
    Serial.print("Echec d'envoi : ");
    Serial.println(etat);
  }
  delay(60000);  // un message par minute
}

Quelques explications sur les choix :

  • 868,1 MHz est l’un des trois canaux par défaut du plan européen, dans la bande 868–869 MHz ouverte par l’ANRT.
  • 14 dBm, soit environ 25 mW, est la limite de puissance rayonnée autorisée sur cette bande au Maroc. Si votre antenne a du gain, réduisez encore la valeur ; pour des essais sur un bureau, 2 à 5 dBm suffisent largement.
  • Avec SF9, notre message d’une dizaine d’octets occupe le canal environ 170 ms. Pour respecter un rapport cyclique de 1 %, il faudrait attendre au moins 17 secondes entre deux envois : une minute laisse une marge confortable.

Le code du récepteur

#include <SPI.h>
#include <RadioLib.h>

SX1262 radio = new Module(8, 14, 12, 13);

void setup() {
  Serial.begin(115200);
  SPI.begin(9, 11, 10, 8);
  int etat = radio.begin(868.1, 125.0, 9, 7,
                         RADIOLIB_SX126X_SYNC_WORD_PRIVATE, 14, 8, 1.8);
  if (etat != RADIOLIB_ERR_NONE) {
    Serial.print("Erreur d'initialisation : ");
    Serial.println(etat);
    while (true) { delay(1000); }
  }
  Serial.println("Recepteur a l'ecoute");
}

void loop() {
  String recu;
  int etat = radio.receive(recu);  // attend un paquet (avec délai maximal)
  if (etat == RADIOLIB_ERR_NONE) {
    Serial.printf("Recu : %s | RSSI %.1f dBm | SNR %.1f dB\n",
                  recu.c_str(), radio.getRSSI(), radio.getSNR());
  } else if (etat != RADIOLIB_ERR_RX_TIMEOUT) {
    Serial.print("Erreur de reception : ");
    Serial.println(etat);
  }
}

Les deux cartes doivent partager exactement les mêmes réglages : fréquence, bande passante, SF, taux de codage et mot de synchronisation. Une seule différence et le récepteur restera muet, sans message d’erreur particulier.

Lire le RSSI et le SNR

Le RSSI indique la puissance reçue en dBm : autour de −30 dBm quand les cartes sont côte à côte, vers −110 ou −120 dBm en limite de portée. Le SNR compare le signal au bruit. En LoRa, il peut être négatif tout en restant exploitable : la démodulation fonctionne sous le niveau de bruit, et d’autant plus profondément que le SF est élevé. Un SNR qui chute vers −15 dB en SF9 signale que vous approchez de la limite.

Tester la portée avec méthode

  1. Commencez sur le bureau, cartes à un mètre l’une de l’autre, puissance réduite. Si rien ne passe, vérifiez les paramètres avant d’accuser le matériel.
  2. Installez le récepteur en un point fixe et dégagé, relié à un ordinateur portable, idéalement à l’étage ou sur une terrasse.
  3. Alimentez l’émetteur sur batterie et éloignez-vous en notant, pour chaque position, le RSSI, le SNR et les messages perdus.
  4. Si les pertes apparaissent trop tôt, augmentez le SF d’un cran sur les deux cartes et recommencez.

La hauteur des antennes compte souvent plus que la puissance : gagner deux ou trois mètres pour dégager la ligne de vue améliore nettement la liaison. Gardez les deux antennes verticales, éloignées des surfaces métalliques et du corps.

Les erreurs les plus fréquentes

  • Code −2 (puce introuvable) : broches mal déclarées ou bus SPI non initialisé avec les bonnes broches.
  • Codes −706 ou −707 : réglage du TCXO incorrect, en général une tension inadaptée au module utilisé.
  • Aucun paquet reçu : un paramètre radio diffère entre les deux cartes, ou l’une d’elles est une version prévue pour une autre bande.
  • Portée décevante : antenne mal enfoncée, antenne prévue pour une autre fréquence ou carte posée à même le sol.

Et ensuite ?

Ce montage pose les bases. Pour un vrai capteur autonome, il reste à endormir l’ESP32 en sommeil profond entre deux mesures, à mettre la radio en veille avec radio.sleep(), et éventuellement à rejoindre un réseau LoRaWAN comme The Things Network grâce à la pile intégrée à RadioLib. Nous détaillons ces pistes dans notre article sur les usages concrets de LoRa au Maroc.

Une question sur le choix des cartes ou des antennes ? Écrivez-nous sur WhatsApp au +212 669 273 689. La livraison est offerte dès 760 Dhs d’achat, 40 Dhs en dessous.

Ce site utilise des cookies pour vous offrir une meilleure expérience de navigation. En naviguant sur ce site, vous acceptez notre utilisation des cookies.