trame-crc.ino

Arduino MKR WAN 1300 · Fichier : trame-crc.ino · Langage : Arduino · Usage : Fiabiliser les trames avec une somme de contrôle

En radio, toute trame peut être corrompue ou perdue : ce protocole minimal ajoute un identifiant de station, un numéro de série et un CRC-8 à chaque paquet LoRa de la MKR WAN 1300. Le récepteur écarte ainsi les trames invalides et détecte les trous de séquence.

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 émettrice, capteur analogique quelconque sur A1 (ou potentiomètre de test), récepteur LoRa compatible.

Câblage

Capteur sur A1/GND/3,3 V ; brochage à vérifier selon le capteur, sinon potentiomètre classique.

Fonctionnement

La trame binaire de 6 octets sépare en-tête (id, seq), données 16 bits et CRC-8 calculé sur les octets précédents. Le numéro de série permet de compter les pertions même quand le CRC passe.

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

Étendez à un CRC-16-CCITT pour les longues trames, ou ajoutez un champ flags pour multiplexer plusieurs capteurs dans la même trame.

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

← Retour à la fiche