passerelle-usb.ino

Arduino MKR WAN 1300 · Archivo : passerelle-usb.ino · Lenguaje : Arduino · Uso : Relayer les paquets LoRa reçus vers le port USB

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);
  }
}

← Volver a la ficha