Sodaq ne v2
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
- Brancher le module en USB, l'IDE Arduino
- La carte http://support.sodaq.com/sodaq-one/
- Ajouter http://downloads.sodaq.net/package_sodaq_index.json dans fichier -> préférences
- Dans outil->gestionnaire de carte chercher Sodaq et installer
- Dans Outils vérifier que le type de port en OK
- Vérifier que le port est OK. On tape entrée et on voit la conf du module
- Taper les commandes pour récupérer l'adresses Connection Things Network
- Ajouter des applications console
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
- https://github.com/jpmeijers/RN2483-Arduino-Library/blob/master/examples/SodaqOne-TTN-Mapper-binary/SodaqOne-TTN-Mapper-binary.ino
- http://ttnmapper.org/
- Le but est d'avoir un objet de ce type : http://www.adeunis-rf.com/en/products/lorawan-products/field_test_device_lorawan_868
- et de cartographier sur http://ttnmapper.org/
- On utilise https://github.com/jpmeijers/RN2483-Arduino-Library/blob/master/examples/SodaqOne-TTN-Mapper-binary/SodaqOne-TTN-Mapper-binary.ino
- Le payload recu est C54EB47D8BC8002119
- Et décodé en
{
"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