scan-canaux.ino

Arduino MKR WAN 1300 · Fichier : scan-canaux.ino · Langage : Arduino · Usage : Mesurer l'occupation radio des canaux LoRa

Avant de choisir son canal LoRa, mesurez l'environnement : ce programme balaie neuf canaux EU868 et publie pour chacun le RSSI moyen et minimal. Un canal bruyant (passerelles voisines, interférences) se repère immédiatement à un plancher RSSI relevé.

Matériel requis

Une Arduino MKR WAN 1300 (microcontrôleur SAMD21, modem LoRa Semtech SX1272 point à point, pas de pile LoRaWAN embarquée, antenne 868/915 MHz). Une MKR WAN 1300 seule suffit ; l'antenne en place capte l'activité radio environnante.

Câblage

Aucun câblage ; déplacez-vous ou lancez le scan 24 h pour couvrir les cycles d'activité des émetteurs voisins.

Fonctionnement

readRssi() renvoie le niveau de bruit mesuré par le SX1272 sur le canal courant. En échantillonnant 20 fois par canal, on obtient une statistique stable ; le CSV s'importe dans un tableur.

Exécution

Installez Arduino SAMD Boards et la bibliothèque MKRWAN, sélectionnez la carte, téléversez. Il faut DEUX cartes LoRa (deux MKR WAN 1300, ou une 1300 et une 1310) pour voir les échanges ; réglez le même plan de fréquences dans le code.

Variantes

Ajoutez un histogramme horaire pour voir les heures de pointe d'occupation, ou déclenchez un changement de canal automatique si le RSSI moyen dépasse un seuil.

scan-canaux.ino

// Analyseur de spectre approximatif : RSSI moyen par canal EU868.
// Roll-call des canaux 868.0 a 869.5 MHz par pas de 200 kHz.
#include <MKRWAN.h>

LoRaModem modem;

const float FREQS[] = {868.0, 868.1, 868.3, 868.5, 868.7, 868.9, 869.1, 869.3, 869.5};
const int N = 9;
const int MESA = 20; // mesures par canal

void setup() {
  Serial.begin(115200);
  while (!Serial);
  if (!modem.begin(EU868)) while (true);
  modem.setSpreadingFactor(7);
  Serial.println(F("freq_mhz;rssi_moyen;rssi_min"));
}

void loop() {
  for (int c = 0; c < N; c++) {
    modem.setFrequency(FREQS[c]);
    long somme = 0;
    int minirssi = 0;
    for (int m = 0; m < MESA; m++) {
      delay(20);
      int r = modem.readRssi();
      somme += r;
      if (m == 0 || r < minirssi) minirssi = r;
    }
    Serial.print(FREQS[c], 1);
    Serial.print(';');
    Serial.print((float)somme / MESA, 1);
    Serial.print(';');
    Serial.println(minirssi);
  }
  Serial.println(F("---"));
  delay(10000); // rafraichissement toutes les 10 s
}

← Retour à la fiche