MKR WAN 1300

De The Things Network Catalunya Wiki
Jump to navigation Jump to search

Introducció

El MKR WAN 1300 és un més de la nova familia MKR d'Arduino. La familia inclou el MKR ZERO, el MKR 1000 amb WiFi, el MKR FOX 1200 (amb suport SigFox) el MKR WAN 1300 i el MKR GSM 1400.


20180130 012920s.jpg


Tots ells tenen un SAMD21 ARM Cortex-M0+ de 32bit i baix consum. El controlador treballa a 48MHz, té 256Kb de memòria per emmagatzemar programes i 32Kb de SRAM. Això el fa molt més potent que un Uno o Leonardo (com el The Things Uno) i a mes consumeix d'entrada la meitat. Inclou molts ports IO, la majoria PWM, ADC de fins a 12 bits, UART, SPI i I2C per hardware i fins i tot un DAC.

EL mòdul LoRa és un Murata CMWX1ZZABZ que inclou un microcontrolador STM32 que implementa la pila LMIC (compatible LoRaWan) i exposa una interfície AT. Els dos micros (el SAMD21 i el STM32) estan connectats via UART. En el costat del SAMD21 la llibreria MKRWAN permet fer servir l'interfície AT implementada al STM32.


20180130 013102s.jpg


El firmware de l'STM32 i la llibreria per el SAMD21 són codi obert i es poden descarregar aquí:

Requeriments

Per fer servir la MKR WAN 1300 des de l'IDE d'Arduino caldrà instal·lar primer support per plaques basades en el SAMD21. Des de l'IDE ves al menú "Eines > Tarja: ... > Gestor tarjes", busca "MKR" i instal·la el paquet "Arduino SAMD Boards". Un cop fet això en el mateix menú "Eines > Tarja: ..." podràs seleccionar la MKR WAN 1300.


Arduino-ide-gestor-tarjes.jpg


Arduino-ide-gestor-tarjes-samd21.jpg


Arduino-ide-tarja-mkrwan1300.jpg


També necessitaràs la llibreria MKRWAN per connectar amb el mòdul LoRa. També des de l'IDE ves al menú "Esbòs > Inclou llibreria > Gestiona les llibreries" i busca i instal·la la llibreria "MKRWAN".


Arduino-ide-gestor-llibreries.jpg


Arduino-ide-gestor-llibreries-mkrwan.jpg


NOTA: La versió actual de la llibreria MKRWAN és la 1.0.2. Aquesta versió té un bug en el mode ABP i només funciona amb OTAA. El bug ja està solucionat però encara no s'ha alliberat una versió estable. Aquest bug requereix també actualitzar el firmware en el STM32 del mòdul LoRa. Això és pot fer directament des de l'IDE d'Arduino carregant l'exemple MKRWANFWUpdate_standalone que vé amb la llibreria. Tot això quan s'alliberi la nova versió.


Exemple

Aquest exemple fa servir OTAA (veure nota anterior) per enviar un número autoincremental cada 60 segons.

/*
MKR WAN 1300 OTAA Example

Copyright (C) 2018
Xose Pérez <xose dot perez at gmail dot com>
for The Things Network Catalunya Wiki (http://thethingsnetwork.cat)
*/

#include <MKRWAN.h>

#define SEND_EVERY      60000                                 // Envia un missatge cada 60 segons
#define APPEUI          "0123456789ABCDEF"                    // Application EUI, configura la teva, consulta la consola de TTN
#define APPKEY          "01234567890123456789012345678901"    // Application Key, configura la teva, consulta la consola de TTN

LoRaModem modem;
byte counter = 0;

void setup() {

    // Inicialitza el port serie per communicar-se amb l'ordinador
    // El programa no arrencarà fins que no es conneti via el Monitor Sèrie (Ctrl+Shift+M)
    Serial.begin(115200);
    while (!Serial);
    Serial.println("Exemple MKRWAN1300 @TTNcat");

    // Register to EU region
    if (!modem.begin(EU868)) {
        Serial.println("Error inicialitzant el mòdul");
        while (1) {}
    };

    bool connected = modem.joinOTAA(APPEUI, APPKEY);
    if (connected) {
        Serial.println("Connectat a TTN!");
    } else {
        Serial.println("Alguna cosa no ha anat bé, no he pogut connectar-me a la xarxa");
        while (1) {}
    }

    delay(1000);

}

void loop() {

    static unsigned long last = 0;

    if ((0 == last) || (millis() - last > SEND_EVERY)) {

        // Actualitza el temps del darrer missatge
        last = millis();

        // Envia el missatge
        modem.beginPacket();
        modem.write(counter++);
        int err = modem.endPacket(true);
        if (err > 0) {
            Serial.println("Missatge enviat correctament!");
        } else {
            Serial.println("Error enviat missatge :(");
        }

    }

    // Mostra resposta de la ràdio
    while (modem.available()) {
        Serial.write(modem.read());
    }
    modem.poll();


}