trame-crc.ino

Arduino MKR WAN 1300 · Archivo : trame-crc.ino · Lenguaje : Arduino · Uso : Fiabiliser les trames avec une somme de contrôle

En radio, cualquier trama puede corromperse o perderse: este protocolo mínimo añade un id de estación, un número de serie y un CRC-8 a cada paquete LoRa de la MKR WAN 1300. Así el receptor descarta tramas inválidas y detecta huecos de secuencia.

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 emisora, cualquier sensor analógico en A1 (o potenciómetro de prueba), receptor LoRa compatible.

Cableado

Sensor a A1/GND/3,3 V; revisa el pinado según el sensor, si no, un potenciómetro clásico.

Funcionamiento

La trama binaria de 6 bytes separa cabecera (id, seq), datos de 16 bits y un CRC-8 calculado sobre los bytes previos. El número de serie cuenta pérdidas incluso cuando el CRC pasa.

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

Amplía a CRC-16-CCITT para tramas largas o añade un campo flags para multiplexar varios sensores en la misma trama.

trame-crc.ino

// Trame LoRa robuste : [id][seq][donnees...][crc8] sur MKR WAN 1300.
#include <MKRWAN.h>

LoRaModem modem;

uint8_t seq = 0;

uint8_t crc8(const uint8_t *d, size_t n) {
  uint8_t crc = 0x31; // CRC-8/MAXIM-like simple polynomial 0x07
  for (size_t i = 0; i < n; i++) {
    crc ^= d[i];
    for (int b = 0; b < 8; b++)
      crc = (crc & 0x80) ? (crc << 1) ^ 0x07 : (crc << 1);
  }
  return crc;
}

void setup() {
  Serial.begin(115200);
  if (!modem.begin(EU868)) while (true);
  modem.setFrequency(868.7);
}

void loop() {
  uint8_t trame[8];
  trame[0] = 0x2A;                 // id station
  trame[1] = seq++;                // numero de serie
  int brut = analogRead(A1);
  trame[2] = brut >> 8;            // grandeur 16 bits
  trame[3] = brut & 0xFF;
  trame[4] = (uint8_t)(millis() >> 24); // minute approximative
  trame[5] = crc8(trame, 5);
  modem.beginPacket();
  modem.write(trame, 6);
  modem.endPacket(false);
  Serial.println(F("trame CRC emise"));
  delay(600000);
}

← Volver a la ficha