Projet

Général

Profil

IOT sodaq explorer

Les cartes Sodaq Explorer sont des cartes compatibles avec l'environnement Arduino et permettant des communications avec LoRa et LoRaWAN. L'opérateur Orange les propose avec le réseau Orange LoRa.

Les cartes intègrent :
  • un microcontrôleur Atmel SAMD21, 32 bits Arm Cortex M0
  • une puce LoRa Microchip RN2483A LoRa module
  • des puces Bluetooth, de gestion de l'énergie batterie/recharge/solaire , échange sécurisé de clés
  • un capteur de température
  • une LED RGB

L'empreinte physique est classique du système Arduino et intègre aussi des connecteurs classiques du système Grove.

Installation des éléments nécessaire à l'environnement Arduino

Des explications détaillées sont disponibles sur la page Autres boards compatibles arduino

Il faut installer les deux repos liés à la carte
Cartes sodaq :
http://downloads.sodaq.net/package_sodaq_index.json http://downloads.sodaq.net/package_sodaq_samd_index.json

Ensuite, sélectionner et installer dans le Board Manager comme indiqué ci-dessous

Il faut ensuite ajouter une bibliothèque proposée par Orange, des alternatives existent et cette étape n'est pas indispensable.
https://github.com/Orange-OpenSource/Orange-ExpLoRer-Kit-for-LoRa

Une installation du driver FDTI est quelquefois nécessaire si le pilote n'est pas détecté : http://www.ftdichip.com/Drivers/VCP.htm (CDM v2.12.28 WHQL Certified.zip pour le cas de windows 7 64)

N'oubliez pas de sélectionner la board pour le compilateur, cela donne accès aux bonnes interfaces et bibliothèques.

Identifier le devEUI de la carte Sodaq

Chaque objet LoRa à une adresse unique appelée devEUI, ce qui permet d'identifier et d'enregistrer chaque objet.

Pour obtenir ce devEUI, il faut compiler et exécuter un premier code qui permet d'extraire cette donnée qui sera nécessaire à l'enregistrement de l'objet.

Sélectionner l'exemple appelé ExtractHardwareDevEUI

Compilez et uploadez le code. Une fois le code sur la carte ouvrez le terminal. Parmi toutes les informations, une ligne contient :

debugSerial.print("devEUI = ")

Notez et conservez le devEUI (c'est une notation hexadécimale).

Enregistrement de l'objet sur la plateforme orange

PS: un enregistrement sur une autre plateforme est possible comme sur la plateforme TTN The Things Network , d'autres plateformes ont un fonctionnement similaire, reportez-vous à leur documentation.

Dans l'onglet Parc , cliquez sur ajouter un équipement .

Remplir les différents champs .

DevEui est lié à la carte comme expliquer ci-dessus.
AppEui et AppKey

AppKey est fournie par le constructeur de l’équipement. Elle est requise pour la procédure d’attachement au réseau. Il s’agit d’une chaîne alphanumérique sur 32 caractères.

Dans Profil , sélectionner Microchip RN2483 (correspond à la puce)

Ces clés AppEui et AppKey seront nécessaires pour les codes et échanges de clés de la carte lors de l'envoi de message LoRaWAN. La notation de ces clés se fera dans différents formats.

Exemple de code pour la carte Sodaq

Le code suivant n'est pas le code le plus basique. Le message envoyé est la température mesurée par le capteur de température intégré à la carte Sodaq.

Le code suivant intègre une série de commandes d'optimisation de consommation de l'énergie :
  • mise en deepsleep
  • extinction du bluetooth
  • extinction de l'usb
  • ...

Remarque : Il est indispensable de modifier le code suivant avec vos clés AppEui , AppKey et d'avoir au préalable enregistré votre objet sur la plateforme de votre réseau LoRaWAN (orange par exemple).

La notation des clés est différente en code C, ci dessous l'extrait de la trame à respecter.

const uint8_t appEUI[8] = { 0xBB, 0x11, 0xAA, 0x22, 0xCC, 0x33, 0xDD, 0x44 };
//appEUI = BB11AA22CC33DD44
const uint8_t appKey[16] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF };
//appKEY = 0123456789ABCDEF0123456789ABCDEF

Le code, fichier lora_small_deepsleep_003_orange3_cleankeys.ino


//orange3
//devEUI = 00112233445566AA
//appEUI = BB11AA22CC33DD44
//appKEY = 0123456789ABCDEF0123456789ABCDEF
//serial 115200
//deep sleep

//Bluetooth off
#include <RN487x_BLE.h>
#define bleSerial Serial1

//SPI off
#include <SPI.h>

//LoRa sleep optimized
#include <Sodaq_RN2483.h>
#define loraSerial Serial2

//watchdog sodaq
#include <Sodaq_wdt.h>

#include <OrangeForRN2483.h>

//*********LoRa********//
const uint8_t appEUI[8] = { 0xBB, 0x11, 0xAA, 0x22, 0xCC, 0x33, 0xDD, 0x44 };
//appEUI = BB11AA22CC33DD44
const uint8_t appKey[16] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF };
//appKEY = 0123456789ABCDEF0123456789ABCDEF

bool first = true;  
bool joinNetwork()
{             
  OrangeForRN2483.setDataRate(DATA_RATE_1); // Set DataRate to SF11/125Khz
  return OrangeForRN2483.joinNetwork(appEUI, appKey);
}

//*********Message-LoRa********//
/*
int et float de orange
*/

void setup() {

  pinMode(LED_BUILTIN, OUTPUT);//LED13
  digitalWrite(LED_BUILTIN, HIGH);

  SerialUSB.begin(115200);   //debug
  while ((!SerialUSB) && (millis() < 10000)) ; //attend USB ou attend 10secondes
  SerialUSB.print("Start");
  OrangeForRN2483.init();

  //Set the temperature sensor pin as input
  pinMode(TEMP_SENSOR, INPUT) ;
  //Set ADC resolution to 12 bits
  analogReadResolution(12) ;  

  //bluetooth off
  rn487xBle.hwInit();
  bleSerial.begin(rn487xBle.getDefaultBaudRate());
  rn487xBle.initBleStream(&bleSerial);
  rn487xBle.enterCommandMode();
  rn487xBle.dormantMode();
  bleSerial.end();

}

void loop() {

  if(first)
  {
    first = false;
    SerialUSB.println("Join Request");
    bool res = joinNetwork();
    if(res)
    {
      SerialUSB.println("Join Success");
      OrangeForRN2483.enableAdr(); 
    }else SerialUSB.println("Join Failed");
  }

  SendLoRaMessage();
  digitalWrite(LED_BUILTIN, LOW);
  //delay(60000 * 10);  //10 minutes no deepsleep
  SerialUSB.println("deepsleep");

  loraSerial.begin(LoRaBee.getDefaultBaudRate());
  LoRaBee.init(loraSerial, LORA_RESET);
  LoRaBee.sleep();

  OrangeForRN2483.deepSleep(0, 10, 00);//deepsleep

}

bool SendLoRaMessage()
{
  SerialUSB.print("sending");

LpwaOrangeEncoder.flush();
LpwaOrangeEncoder.addFloat(getTemperature());

    uint8_t port = 5;
    int8_t len;
    uint8_t* frame = LpwaOrangeEncoder.getFramePayload(&len);
    //debugFrame(frame, len);
    bool res = OrangeForRN2483.sendMessage(frame, len, port);

    if(res) {
        SerialUSB.println("Successful transmission.");
        DownlinkMessage* downlinkMessage = OrangeForRN2483.getDownlinkMessage();

        int port = downlinkMessage->getPort();
        String message = downlinkMessage->getMessage();

        SerialUSB.print("Port :");
        SerialUSB.print(port);
        if(message == NULL) 
          SerialUSB.println("Response with empty payload"); 
        else {
          SerialUSB.print("Frame Payload :");
          SerialUSB.println(message);
        }   

      }
      else {
          //setRgbColor(RED);
          eErrorType errorType = OrangeForRN2483.getLastError();
          switch(errorType) {   
            case LORA_TIMEOUT:       
              SerialUSB.println("Connection timed-out. Check your serial connection to the device! Sleeping for 20sec.");
              delay(20000) ;
            break ;

            case LORA_INVALID_DATA_LEN:
              SerialUSB.println("The size of the payload is greater than allowed. Transmission failed!");
            break ;

            case LORA_BUSY:
              SerialUSB.println("The device is busy. Sleeping for 10 extra seconds.");
              delay(10000) ;
            break ;

            default: 
              SerialUSB.println("Other error");
              delay(10000) ;
            break ;
      } 
    } 

}

float getTemperature()
{
  uint8_t samples = 10;

  float sum = 0.0 ;    // reset averaged reading to start at 0
  // This loop does 10 readings of the voltage, and adds this to the variable
  for(int i = 0; i < samples; i++)
    sum += 3.3/4095.0 * (float)analogRead(TEMP_SENSOR) ;

  // Divide the voltage to get average
  float voltage = sum / samples ;

  // Convert voltage to temperature
  double temperature = (voltage - 0.5) * 100.0 ;
  SerialUSB.println("");
  SerialUSB.print("temperature : ");SerialUSB.println(temperature);
  return temperature;
}

Etait-ce utile? Oui Non Ajouté par Luc Hanneuse il y a 9 mois. Mis à jour il y a 9 mois.