passerelle-usb.ino

Arduino MKR WAN 1300 · Fichier : passerelle-usb.ino · Langage : Arduino · Usage : Relayer les paquets LoRa reçus vers le port USB

Le récepteur unique du réseau de stations : cette MKR WAN 1300 fait le pont entre l'air LoRa et le port USB, en rejouant chaque trame avec RSSI, SNR et horodatage. Branchée sur un Raspberry Pi ou un portable, elle devient la passerelle d'un réseau privé complet.

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). MKR WAN 1300, antenne 868 MHz, câble USB vers un ordinateur ou une SBC.

Câblage

Aucun câblage ; placez la passerelle en hauteur (grenier, mât) pour maximiser la portée de toutes les stations.

Fonctionnement

La boucle poll la FIFO radio et formate chaque paquet en CSV point-virgule, lisible par un script hôte. L'erreur radio (-1) déclenche une réinitialisation complète du SX1272.

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 une liste blanche d'IDs de stations, ou faites suivre la trame en MQTT/UDP depuis l'ordinateur pour la centraliser à distance.

passerelle-usb.ino

// Passerelle : toute trame LoRa recue est rejouee sur Serial USB.
// Format : horodatage carte, RSSI, SNR, charge utile.
#include <MKRWAN.h>

LoRaModem modem;

void setup() {
  Serial.begin(115200);
  while (!Serial);
  if (!modem.begin(EU868)) {
    Serial.println(F("modem KO"));
    while (true);
  }
  modem.setFrequency(868.5);
  modem.setSpreadingFactor(9); // comme les stations
  Serial.println(F("millis;rssi;snr;trame"));
}

void loop() {
  int n = modem.available();
  if (n > 0) {
    String trame = "";
    while (modem.available()) trame += (char)modem.read();
    Serial.print(millis());
    Serial.print(';');
    Serial.print(modem.readRssi());
    Serial.print(';');
    Serial.print(modem.readSnr());
    Serial.print(';');
    Serial.println(trame);
  }
  if (n < 0) { // erreur radio : remise a zero du modem
    Serial.println(F(";;;ERREUR_RADIO"));
    modem.begin(EU868);
    modem.setFrequency(868.5);
    modem.setSpreadingFactor(9);
  }
}

← Retour à la fiche