Cas d'usage LoRaWAN

Cas d'usage Geo-Tracking : suite de nos billets sur le réseau LoRaWAN.

Après avoir découvert le réseau LoRaWAN dans nos deux précédents posts, nous vous proposons une étude d'un cas concret d'utilisation :

Le principe du Geo-Tracking

CAS D'UTILISATION

Le Geo-Tracking peut être utilisé pour (liste non exhaustive) :

> Localiser un objet connecté

> Suivre ses déplacements

> Emettre une alerte lorsqu'un objet sort d'un zone prédéfinie

Un grand nombre d'applications peuvent bénéficier du Geo-Tracking, basé à la fois sur le GPS et/ou le réseau LoRaWAN, en fonction des exigences :

  • Avec GPS : précision accrue

    Les objets disposant d'une puce GPS couplée à une connectivité LoRaWAN disposent d'une précision de leur localisation accrue.
    L'efficacité énergétique est grévée par la forte consommation de la puce GPS, cependant l'utilisation de LoRaWAN permet de limiter cette consommation.

  • Sans GPS : estimation efficace energie / coût

    Le réseau LoRaWAN peut localiser des objets sans puce GPS. En utilisant la technique de triangulation TDoA (Time Difference on Arrival), trois stations de base avec des coordonnées GPS connues couplé à un horodatage extrèmement précis permettent la résolution de la localisation d'un objet. La précision dépend fortement de l'environnement et peut varier de quelques dizaines de mètres à plusieurs centaines.


Adaptative Data Rate

La techonologie LoRa est une technologie radio, basée sur une modulation à étalement de spectre.
Le facteur d’étalement, noté SF (pour Spread Factor), varie entre 128 (SF7) et 4096 (SF12).

Le débit et les performances radio varient en fonction du facteur d'étalement utilisé par l'objet pour communiquer avec la station de base (gateway).

  • le SF12 permet une portée maximale du signal au détriment du débit.
  • le SF7 permet un débit maximal au détriment de la portée du signal.

Le facteur d'étalement a un impact direct sur la consommation éléctrique de l'objet : la durée de transmission est directement liée au facteur (plus le facteur est grand, plus le temps d'émission est long).

L'ADR (Adaptative Data Rate) est un mécanisme de la technologie LoRaWAN qui optimise les transmissions entre les objets et la station de base.

Si l'ADR est utilisé, l'objet recevra des consignes du réseau pour adapter son facteur d'étalement de façon à optimiser la couverture radio et l'autonomie d'énergie.


/!\ > Il est conseillé d'activer l'ADR uniquement sur les objets fixes, donc dans notre cas nous désactiverons cette option.


Cas d'usage

Prenons par exemple le cas d'une ville équipée d'un système de vélos en libre-service, au-delà d'une certaine période passée en dehors d'une station, le vélo pourra émettre sa position de façon à ce que l'exploitant puisse procéder à son rapatriement.

Dans ce cas, nous avons besoin d'un position GPS précise, nous disposons d'un objet qui produit de l'énergie par l'effet du pédalage et peut donc se recharger.

D'après ces spécifications, l'utilisation d'une puce GPS et l'émission des données en LoRa seront donc la base de notre prototype.


Prototype

Pour réaliser le prototype de notre objet nous allons nous baser sur :

- 1 micro-controlleur Arduino

- 1 carte d'extension Dragino LoRa/GPS.

- 1 pile 9v ou d'un powerbank USB pour alimenter notre prototype.

Voici un exemple en image de notre prototype.


Développement

- Pour programmer notre micro-controlleur Arduino nous aurons besoin de l'environnement de développement Arduino.
- Pour exploiter la puce GPS nous utiliserons la librairie TinyGPS.
- Pour exploiter la puce LoRa nous utiliserons la librairie LMIC.

Cette librairie permet d'une part d'utiliser les modules radio LoRa Semtech SX1272, SX1276 (ou compatibles) et de d'autre part elle fournit une implémentation du protocole LoRaWAN.

Nous ne détaillerons pas ici tout le code source de notre programme, voici les lignes les plus importantes.



Réglage des clés pour effectuer la jonction au réseau et communiquer avec une application :

static const u1_t PROGMEM APPEUI[8]={ 0x23, 0x00, 0x00, 0x90, 0x52, 0x00, 0x00, 0x00 };
void os_getArtEui (u1_t* buf) { memcpy_P(buf, APPEUI, 8);}

static const u1_t PROGMEM DEVEUI[8]={ 0x11, 0xFF, 0x73, 0x21, 0x16, 0xFA, 0x49, 0x05 };
void os_getDevEui (u1_t* buf) { memcpy_P(buf, DEVEUI, 8);}

static const u1_t PROGMEM APPKEY[16] = { 0x44, 0x7C, 0x91, 0x16, 0x7E, 0xBD, 0xD5, 0xA6, 0xAB, 0xE7, 0x12, 0x88, 0x29, 0xDF, 0x4F, 0x2D };
void os_getDevKey (u1_t* buf) {  memcpy_P(buf, APPKEY, 16);}

Réglage des entrées/sorties pour connecter le module radio :

// Pin mapping
const lmic_pinmap lmic_pins = {
    .nss = 10,
    .rxtx = LMIC_UNUSED_PIN,
    .rst = 9,
    .dio = {2, 6, 7},
};

Configuration radio :

// Désactivation du mode ADR
LMIC_setAdrMode(0);

// Choix du facteur d'étalement et de la puissance du signal
LMIC_setDrTxpow(DR_SF12,14)


Jonction au réseau par OTAA :

LMIC_reset();
LMIC_startJoining();

Récupération des coordonées GPS :

float flat, flon, falt;
unsigned long age;
gps.f_get_position(&flat, &flon, &age);
falt = gps.f_altitude();


Composition et émission de la trame contenant les coordonnées GPS :

uint8_t payload[12] = {};
...
memcpy((char *)payload,(char *) &flat, sizeof(float));
memcpy((char *)payload + sizeof(float), (char *) &flon, sizeof(float));
memcpy((char *)payload + 2 * sizeof(float), (char *) &falt, sizeof(float));
...
LMIC_setTxData2(1, payload, sizeof(payload), 0);

Restitution des données

Les données émises par notre tracker (coordonnées GPS) sont reçues par nos différentes stations de base en LoRa puis acheminées jusqu'au coeur de réseau LoRaWAN pour y être stockées dans un Data Lake.

Les données peuvent être présentées par une API pour être consommées par une petite application de cartographie permettant de générer une carte dynamique.

Carte de transmission de la position d'objets connectés en LoRaWAN et leur visualisation.