passerelle-usb.ino
La pasarela única para la red de estaciones: esta MKR WAN 1300 hace de puente entre el aire LoRa y el puerto USB, reenviando cada trama con RSSI, SNR y marca de tiempo. Conectada a un Raspberry Pi o portátil, se convierte en la pasarela de una red privada completa.
Hardware
Una Arduino MKR WAN 1300 (microcontrolador SAMD21, módem LoRa Semtech SX1272 para enlaces punto a punto, sin pila LoRaWAN integrada, antena de 868/915 MHz). MKR WAN 1300, antena de 868 MHz, cable USB a un ordenador o SBC.
Cableado
Sin cableado; coloca la pasarela en alto (desván, mástil) para maximizar el alcance de todas las estaciones.
Funcionamiento
El bucle sondea la FIFO de radio y formatea cada paquete como CSV con punto y coma, legible por un script anfitrión. El error de radio (-1) dispara un reinicio completo del SX1272.
Ejecución
Instala Arduino SAMD Boards y la librería MKRWAN, selecciona la placa y carga. Hacen falta DOS placas LoRa (dos MKR WAN 1300, o una 1300 y una 1310) para ver los intercambios; fija el mismo plan de frecuencias en el código.
Variantes
Añade una lista blanca de IDs de estación o reenvía las tramas a MQTT/UDP desde el ordenador para centralizarlas a distancia.
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);
}
}