Sodaq ne v2

De Kernel Fablab Lannion
Aller à : navigation, rechercher
20180113 002119.jpg

Objet connecté permettant d'obtenir une cartographie de la réception TTN sur http://www.ttnmapper.org/

Usage

Se promener à pied avec l'objet :)

État des LEDs :

  • Blue: Busy transmitting a packet
  • Green: waiting for a new GPS fix
  • Red: GPS fix taking a long time. Try to go outdoors.
  • Off: waiting for TTN connection

Note: la tentative de fix GPS semble prendre ~20s :

[00:12:59:104] Latitude still 0.0, doing another scan␍␊
[00:13:19:122] Latitude still 0.0, doing another scan␍␊
[00:13:40:035] Latitude still 0.0, doing another scan␍␊
[00:14:00:056] Latitude still 0.0, doing another scan␍␊

Pendant celle-ci l'objet consomme ~450mA

Traces console série de démarrage (hors couverture réseau)

SODAQ LoRaONE TTN Mapper starting
When using OTAA, register this DevEUI: 
0004xxxxxxxxxxxx
RN2xx3 firmware version:
RN2483 1.0.1 Dec 15 2015 09:38:09
Trying to join TTN
Unable to join. Are your keys correct, and do you have TTN coverage?

La tentative de re-connection au réseau TTN est faite toutes les minutes

Installation


Application Sodaq

En utilisant une carte de type "SODAQ ONE" dans l'IDE Arduino, on peut pousser le code.

Il faut faire les adaptation nécessaires des valeurs par défaut des clé/identifiant du terminal.

Décodeur

Dans TTN on utilise le décodeur :

function Decoder(bytes) {
var epoch = (bytes[3] << 24) | (bytes[2] << 16) | (bytes[1] << 8) | bytes[0];
var batt = (3000+10*bytes[4])/1000;
var temp = bytes[5];
var lat = (bytes[9] << 24) | (bytes[8] << 16) | (bytes[7] << 8) | bytes[6];
var lon = (bytes[13] << 24) | (bytes[12] << 16) | (bytes[11] << 8) | bytes[10];
var alt = (bytes[15] << 8) | bytes[14];
var speed = (bytes[17] << 8) | bytes[16];
var course = bytes[18];
var sats = bytes[19];
var ttf = bytes[20];
var pfix = bytes[21];
var plat = (bytes[25] << 24) | (bytes[24] << 16) | (bytes[23] << 8) | bytes[22];
var plon = (bytes[29] << 24) | (bytes[28] << 16) | (bytes[27] << 8) | bytes[26];
return {
course: course,
satellites: sats,
time_to_fix: ttf,
latitude: lat/10000000,
longitude: lon/10000000,
epoch: epoch,
battery: batt,
speed: speed,
temperature: temp,
previous_fix : pfix
previous_latitude: plat/10000000,
previous_longitude: plon/10000000,
};
}

Données reçues

Données Brutes :

F98EC35B771891BF001D674DF2FD6800010000042F01D0BC001DE74CF2FD00

Décodées en :

{
  "battery": 4.19,
  "course": 0,
  "epoch": 1539542777,
  "latitude": 48.6588305,
  "longitude": -3.4452121,
  "previous_fix": 1,
  "previous_latitude": 48.65876,
  "previous_longitude": -3.4452249,
  "satellites": 4,
  "speed": 1,
  "temperature": 24,
  "time_to_fix": 47
}

Configuration à distance

D'après Downlink

Nous allons construire un message pour mettre à jour la configuration du terminal.

La longueur doit être correcte, voir LoRa frame content

Nous allons configurer les valeurs suivantes :

  • Intervalle entre émission 3 minutes
  • Intervalle entre émission de 30 minutes entre 21h00 et 08h00
  • Timeout GPS de 240 seconds

Il faut convertir les valeurs en hexa, ajuster la longueur et transformer en petit-boutiste

Intervalle entre émission de 3 minutes :
 3 en hexa = 03
 Correction de longueur : 00 03
 Transformation petit-boutiste: 03 00

Intervalle de transmission alternatif : 
Intervalle entre émission de 30 minutes :
 3 en hexa = 1E
 Correction de longueur : 00 1E
 Transformation petit-boutiste: 1E 00
de 21h en hexa : 15, 00 15 devient 15 00
à 8h en hexa : 08, 00 08 devient 08 00
00 00 pour les minutes
GPS:
240 en hex = F0
Correction de longueur: 00 F0
Transformation petit-boutiste: F0 00

on combine le tout :

0300 1E00 15000000 08000000 F0 00

03001E001500000008000000F000

Cette dernière valeur est à coller dans la partie downlink sur la page du device

On peut également utiliser le JSON :

{ "fix": 30, "alterfix":60, "altstartime" : "2018-10-16T20:00", "altendtime" : "2018-10-17T06:00", "gpstimeout" : 240 }

grâce à l'encodeur :

function Encoder(object, port) {
  // Encode downlink messages sent as
  // object to an array or buffer of bytes.
  //Example of JSON : 
  //{ "fix": 30, "alterfix":60, "altstartime" : "2018-10-16T20:00", "altendtime" : "2018-10-17T06:00", "gpstimeout" : 240 }
  console.log("Fix Time : " + object.fix + " minutes" );
  console.log("Alternate Fix Time : " + object.alterfix + " minutes" );
  
  console.log("Alternate Start Time : " + object.altstartime);
  startime = new Date(object.altstartime)
  epochstart = startime.getTime();
  console.log(epochstart)
  
  console.log("Alternate End Time : " + object.altendtime);
  endtime = new Date(object.altendtime)
  epochend = endtime.getTime();
  console.log(epochend)
  
  console.log("GPS timeout : " + object.gpstimeout + " seconds" );

  var bytes = [];
  bytes[0] = (object.fix & 0x00FF);
  bytes[1] = (object.fix & 0xFF00) >> 8;
  bytes[2] = (object.alterfix & 0x00FF);
  bytes[3] = (object.alterfix & 0xFF00) >> 8;
  /*Not used for the moment. enconding not correct
  bytes[4] = (epochstart & 0xFF00) >> 24;
  bytes[5] = (epochstart & 0x00FF) >> 16;
  bytes[6] = (epochstart & 0xFF00) >> 8;
  bytes[7] = (epochstart & 0x00FF);
  */
  bytes[4] = 0;
  bytes[5] = 0;
  bytes[6] = 0;
  bytes[7] = 0;
  
  bytes[8] = 0;
  bytes[9] = 0;
  bytes[10] = 0;
  bytes[11] = 0;
  
  bytes[12] = (object.gpstimeout & 0x00FF);
  bytes[13] = (object.gpstimeout & 0xFF00) >> 8;
  console.log(bytes);
  return bytes;
}

On voit que la partie tempo alternative n'est pas traitée pour le moment...

Application Minimum

{

 "alt": 33,
 "hdop": 2.5,
 "lat": 48.73179785798777,
 "lon": -3.450898137742172

}

Photos

Boîtier

Des fichiers pour la réalisation d'un boîtier en MDF 3mm sont disponibles ici :

https://github.com/FablabLannion/SodaqTTNMapper

Bibliographie

Magasin

Vue Générale