passerelle-usb.ino
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);
}
}