🛠 Rejoindre The Things Network (OTAA)
Objectifs
Rejoindre un réseau LoRaWAN public (The Things Network) en OTAA avec la bibliothèque MKRWAN : enregistrer l'appareil avec son deviceEUI, envoyer des uplinks et recevoir des downlinks, lire RSSI/SNR. C'est la vocation première de la carte — pas de Wi-Fi, pas de HTTP ici, uniquement du LoRaWAN classe A.
Matériel
- 1 carte MKR WAN 1310 + antenne 868 MHz
- Un compte The Things Network (ou TTN Stack) et une application créée
- Exemple de référence : MKRWAN > LoraSendAndReceive
Code complet
// OTAA The Things Network — MKR WAN 1310
#include <MKRWAN.h>
LoRaModem modem;
String appEui = "0000000000000000"; // EUI de l'application TTN
String appKey = "00000000000000000000000000000000"; // APP_KEY OTAA
void setup {
Serial.begin(115200);
while (!Serial);
if (!modem.begin(EU868)) { Serial.println("Module KO"); while (1); }
Serial.print("deviceEUI : "); Serial.println(modem.deviceEUI);
if (!modem.joinOTAA(appEui, appKey)) { // blocage jusqu'au join
Serial.println("Join échoue : rapprochez-vous d'une fenetre");
while (1) {}
}
Serial.println("Joint !");
modem.minPollInterval(60);
}
void loop {
while (!Serial.available);
String msg = Serial.readStringUntil('\n');
modem.beginPacket;
modem.print(msg);
int err = modem.endPacket(true); // true = uplink confirmé (ACK)
Serial.println(err > 0 ? "Envoye !" : "Echec (duty cycle ?)");
if (modem.available) { // downlink reçu en fenetre RX
char recu[64]; int i = 0;
while (modem.available && i < 63) recu[i++] = modem.read;
recu[i] = '\0';
Serial.printf("Downlink: %s\n", recu);
}
Serial.printf("RSSI=%d SNR=%d\n", modem.rssi, modem.snr);
delay(120000); // le firmware impose 1 émission / 2 min max (EU)
}
Vérification attendue
« Joint ! » s'affiche après quelques secondes à quelques minutes ; les uplinks apparaissent dans le live data TTN avec RSSI/SNR. Un downlink programmé sur TTN revient dans la fenêtre RX qui suit l'uplink.
Erreurs fréquentes
joinOTAAqui échoue alors que tout est correct : bug connu d'erreurs fausses (issue MKRWAN #139) — réessayer, placer la carte près d'une fenêtre, vérifier qu'une passerelle TTN couvre la zone.- Envoyer plus d'un message toutes les 2 minutes : le firmware impose ce plancher de duty cycle, impossible à changer ; les envois sont rejetés.
- Clés inversées (APP_KEY dans appEui) ou en format texte au lieu d'hexadécimal.
- ABP : régression signalée depuis MKRWAN 1.0.15 (issue #85) — préférer OTAA.
- Après ~255 envois, blocage TX (bug de compteur de trames, issue #141) : voir le tutoriel avancé sur les contournements.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
join-otaa.inoArduinouplink-confirme.inoArduinodownlink.inoArduinoactivation-abp.inoArduinosuivi-adr.inoArduinoclasse-c.inoArduino