trame-crc.ino
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);
}