Visualizzazione post con etichetta MKR1300. Mostra tutti i post
Visualizzazione post con etichetta MKR1300. Mostra tutti i post

venerdì 5 aprile 2019

LoraWan TheThingsNetwork con Arduino MKR1300

Dopo aver settato il gateway Dragino LG-01 vediamo come poter trasmettere i dati al cloud di TheThingsNetwork

Le impostazioni del gateway per LoraWAN sono le seguenti

Come si vede e' stato impostato uno spreading factor di 7, bandwith 125 KHz e CR 4 per una velocita' di circa 3400 bps. Tali valori devono essere compatibili con quelli dello sketch

Per prima cosa si imposta crea (dopo aver il gateway funzionante ed onlinea) una Application sulla console di TTN


dopo aver creato una App si devono creare i Devices
Ogni device e' identificato dal proprio EUI. Questo codice esadecimale puo' essere letto per esempio lanciando lo sketch FirstConfiguration degli esempi della libreria MKRWAN



Si passa poi alla programmazione Arduino.
Il dispositivo MKR1300 viene attivato come ABP (activation by personalization) e non OTAA. Mi e' stato spiegato sul forum di Arduino che Dragino LG-01 e' un gateway monocanale e gestisce solo ABP

E' stato modificato lo script di esempio LoraSendandReceive (eliminado la parte di ricezione che non mi serve). In giallo le modifiche sostanziali
----------------------------------------
#include <MKRWAN.h>

LoRaModem modem;

String devAddr;
String nwkSKey;
String appSKey;

void setup() {
  Serial.begin(115200);
  if (!modem.begin(EU868)) {
    Serial.println("Failed to start module");
    while (1) {}
  };
//chiavi
devAddr = "26011xxxx";
nwkSKey = "C05AB32C3F7B4Dxxxxxxxxxxxxxxxxxx";
appSKey = "1C8567078CB4613B168xxxxxxxxxxxxxx";

    int connected = modem.joinABP(devAddr, nwkSKey, appSKey);
    if (!connected) {
    Serial.println("Errore di connessione");
    while (1) {}
  }
    {
    Serial.println("connesso");
    }
}

void loop() {
  modem.setPort(3);
  modem.setADR(true);
  modem.dataRate(5);
  delay(5000);
  modem.minPollInterval(60);
  
  String msg = "Luca";


  int err;
  modem.beginPacket();
  modem.print(msg);
  err = modem.endPacket(false);
  if (err > 0) {
    Serial.println("Message sent correctly!");
  } else {
    Serial.println("Error sending message :(");
  }

  delay(20000);
}
----------------------------------------

Ed ecco apparire i dati sul cloud





In questo modo i dati sono pero' abbastanza inutili ..
Per processarli sullla propria macchina conviene abilitare una Integration dalla console di TTN ed nel mio caso in particolare il Data Storage


con questa modalita' i dati vengono conservati per 7 giorni

sul servizio Swagger



da cui  i dati possono essere scaricati mediante una chiamata CURL (dopo aver autorizzato il servizio mediante apposita chiave)

curl -X GET --header 'Accept: application/json' --header 'Authorization: key ttn-account-v2.p-Sxxxxxxx' 'https://hello_world_mkr1300.data.thethingsnetwork.org/api/v2/query'

e questo e' un esempio di dato ricevuto 

{"device_id":"mkr1300_1","raw":"THVjYTI=","time":"2019-04-05T08:54:01.208249737Z"}

altrimenti si possono scaricare i dati mediante Python con 

-----------------------------------------------------
import time
import ttn

app_id = "hello_world_mkr1300"
access_key = "ttn-account-v2.g_-r8AT6eTxxxxxxxxxxxxxxxxxxxxxxxxxx"

def uplink_callback(msg, client):
  print("Received uplink from ", msg.dev_id)
  print(msg)
  print("\n")

handler = ttn.HandlerClient(app_id, access_key)

# using mqtt client
mqtt_client = handler.data()
mqtt_client.set_uplink_callback(uplink_callback)
mqtt_client.connect()
time.sleep(600)
mqtt_client.close()
---------------------------------------------------

i dati ricevuti sono molto piu' dettagliati rispetto a quelli di Swagger

('Received uplink from ', u'mkr1300_1')
MSG(dev_id=u'mkr1300_1', counter=177, app_id=u'hello_world_mkr1300', payload_raw=u'THVjYTI=', hardware_serial=u'A8610A3233258909', port=3, metadata=MSG(location_source=u'registry', data_rate=u'SF7BW125', modulation=u'LORA', altitude=50, longitude=11.290198, airtime=51456000, coding_rate=u'4/5', frequency=868100000, gateways=[MSG(gtw_id=u'eui-a840411bf188ffff', timestamp=2951977680, longitude=11, rf_chain=0, snr=7.8, time=u'2019-04-05T08:58:15.615108Z', latitude=43.111, rssi=-62, channel=7)], time=u'2019-04-05T08:58:15.719069012Z', latitude=43.758617))


 

mercoledì 3 aprile 2019

Update MKRWAN1300 firmware

AGGIORNAMENTO : come suggerito dal forum di Arduino c'e' un metodo molto piu' semplice. Si aggiorna la libreria MKRWAN e poi si lancia lo skecth MKRWANFWUpdate_standalone. Nella directory della libreria c'e' l'ultimo firmware disponibile senza la necesssita' di scaricarlo a parte



Per aggiornare il firmware di una Arduino MKR1300 si parte scaricando il firmware compilato da link https://github.com/arduino/mkrwan1300-fw/releases


Al momento di scrivere questa nota l'ultima release e' la 1.1.6 (la 1.1.9 non risulta in formato bin) mentre nella Mkr1300 che mi e' arrivata e' montato un ARD-078 1.1.5

Si copia il file mlm32l07x01.bin nella stessa directory dove e' presente lo sketch MKRWANFWUpdate_standalone incluso negli esempi della libreria MKRWAN e si lancia il comando da terminale

echo -n "const " > fw.h && xxd -i mlm32l07x01.bin >> fw.h

si lancia quindi  lo sketch ed aprendo il terminale seriale si vedranno i seguenti comandi


Wrote and verified address 0x08012700 (98%)
 Wrote and verified address 0x08012800 (98%)
 Wrote and verified address 0x08012900 (98%)
 Wrote and verified address 0x08012a00 (99%)
 Wrote and verified address 0x08012b00 (99%)
 Wrote and verified address 0x08012c00 (99%)
 Wrote and verified address 0x08012d00 (100%)
 Done.

Starting execution at address 0x08000000... done.
Flashing ok :)
ARD-078 1.1.6

Geologi

  E so anche espatriare senza praticamente toccare strada asfaltata