[TUTORIEL] Akeru + NFC

Forum de support et d'échange sur la carte Akeru (carte compatible Arduino développée par Snootlab et intégrant la technologie Sigfox) et du shield Akene pour Arduino (shield pour Arduino développée par Snootlab et intégrant la technologie Sigfox)

[TUTORIEL] Akeru + NFC

Message non lude Florian » Ven 6 Juin 2014 17:34

MAJ le 28.07.2016 pour la sortie de la librairie Akeru v4 >> voir post suivant

Bonjour,

Dans ce tutoriel nous allons apprendre à utiliser la carte Akeru avec un Shield NFC.
akeru.jpg
akeru.jpg (38.15 Kio) Vu 2875 fois


Nous allons créer une sorte de pointeur afin de permettre à un patron de vérifier le nombre d'heures de travail de son employé.
Autrement dit, quand l'employé arrive sur son lieu de travail, il devra passer un tag qui enverra une information pour dire qu'il est arrivé.

Pour ce faire nous allons fortement nous appuyer sur ce Tutoriel.


- MATÉRIEL:



- MONTAGE:

Rien de plus simple! Il suffit de monter le shield en mezzanine sur la carte Akeru.


- CODE:

Avant de balancer le code quelques explications sur ce qu'il doit faire.
Nous voulons donc que le patron connaisse les heures de travail de son employé. Pour cela, il y a les trois tags.
Un pour quand l'employé arrive. Un pour la pause déjeuner. Et le dernier pour quand il rentre chez lui.
Lorsqu'il arrive et qu'il passe le premier tag, la carte Akeru va envoyer le mot "Bonjour" sur Actoboard. Quand il part déjeuner et quand il revient de sa pause déjeuner, "Dejeuner". Puis quand il rentre, le dernier tag envoie "A demain".
Tout ceci est géré par la structure switch/case.
Code: Tout sélectionner
#include <PN532.h>  // Déclaration des différentes librairies.
#include <SPI.h>
#include <SoftwareSerial.h>
#include <Akeru.h>


#define PN532_CS 10 // La pin CS peut être connectée à la sortie D9 ou D10.
PN532 nfc(PN532_CS);
#define NFC_DEMO_DEBUG 1

void setup()
{
  #ifdef NFC_DEMO_DEBUG
   Serial.begin(9600); // Vérification liaison série.
   Serial.println("Bonjour!");
   
  #endif
   nfc.begin(); // Démarrage puce PN532.
   
   uint32_t versiondata = nfc.getFirmwareVersion();
   
   if(!versiondata)
   {
     #ifdef NFC_DEMO_DEBUG // Vérification PN532.
      Serial.print("Puce PN532 absente");
     
     #endif
      while(1);
   }
   
  #ifdef NFC_DEMO_DEBUG  // Vérification paramétrage de la puce.
   Serial.print("Puce detectee, PN5");
   Serial.println((versiondata>>24) & 0xFF, HEX);
   Serial.print("Firmware version: ");
   Serial.print((versiondata>>16) & 0xFF, DEC);
   Serial.print('.');
   Serial.println((versiondata>>8) & 0xFF, DEC);
   Serial.print("Supports ");
   Serial.println(versiondata & 0xFF, HEX);
   
  #endif
   nfc.SAMConfig(); // Configuration de la carte pour lire des tags et cartes RFID.
   
   Akeru.begin();
}

void loop()
{
  uint32_t id;
 
  id = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A);
   
  switch(id) // Réalisation d'un switch pour gérer les différentes conditions.
  {   
    case 4267267237: // Condition à remplir si l'ID detecté est 4267267237.
     Serial.println();
     Serial.println("Bonjour!"); // Envoi au moniteur.
     Akeru.send(&"Bonjour", sizeof("Bonjour")); // Remonte la donnée sur le réseau Sigfox.
     break;
     
    case 1589696432: // Condition à remplir si l'ID detecté est 1589696432.
     Serial.println();
     Serial.println("Au revoir!"); // Envoi au moniteur.
     Akeru.send(&"A demain", sizeof("A demain")); // Remonte la donnée sur le réseau Sigfox.
     break;
     
    case 839461248: // Condition à remplir si l'ID detecté est 839461248.
     Serial.println();
     Serial.println("Pause dejeuner!"); // Envoi au moniteur.
     Akeru.send(&"Dejeuner", sizeof("Dejeuner")); // Remonte la donnée sur le réseau Sigfox.
     break;
     
    default: // Condition à remplir si aucunes des précédentes n'est vérifiées.
     Serial.println();
     Serial.println("Attente d'identification!"); // Envoi au moniteur.
  }
 
  delay(500);
}

Avant de vous montrer comment se déroule la réception sur Actoboard, explication des fonctions Akeru présentes dans le code.

Partie "envoi des données".
______________________________
Inclusion des librairies:
Code: Tout sélectionner
#include <SoftwareSerial.h>
#include <Akeru.h>

______________________________
Initialisation de la carte Akeru (Modem Sigfox):
Code: Tout sélectionner
Akeru.begin();

______________________________
Envoi des données:
Code: Tout sélectionner
Akeru.begin(&VARIABLE, sizeof(VARIABLE));

Dans le code ci-dessus, il s'agit de:
Code: Tout sélectionner
Akeru.send(&"Bonjour", sizeof("Bonjour"));
Akeru.send(&"A demain", sizeof("A demain"));
Akeru.send(&"Dejeuner", sizeof("Dejeuner"));


Maintenant pour la partie réception des données sur Actoboard. Une fois votre compte ouvert, cliquer sur "+ New Data Source".
News.PNG
News.PNG (6.81 Kio) Vu 2875 fois

Rentrer les paramètres demandés.

Dans la case suivante...
DataFormat.PNG
DataFormat.PNG (1.72 Kio) Vu 2875 fois

...pour coller au programme, il faut rentrer:
Code: Tout sélectionner
Info::char:8

Cette case renseigne à Actoboard le nom de votre variable, son type et sa taille. C'est indispensable pour qu'il puisse déchiffrer vos valeurs correctement.
Vous devrez toujours rentrer les paramètres dans cet ordre ci:
Code: Tout sélectionner
Nom_Variable::Type:Nombre_Bits

A préciser qu'il est possible d'en mettre plusieurs d'affilée.

Normalement si tout les paramètres sont rentrés correctement, et en passant les badges dans l'ordre suivant: "Bonjour" - "Dejeuner" - "Dejeuner" (On suppose qu'il faut utiliser le même badge en partant et en revenant de déjeuner.) - "A demain"... Actoboard devrait afficher quelque chose de similaire à ceci:
Last_Messages.PNG
Last_Messages.PNG (17.3 Kio) Vu 2875 fois

Le patron peut donc à partir d'une connexion internet (donc n'importe où) savoir si son employé réalise bien les heures pour lesquelles il est payé.
On voit donc qu'il est arrivé à 16h13min37s. Il a pris sa pause de 16h14min15s à 16h14min57s. Et qu'il est rentré chez lui à 16h15min57s pour la journée du 05 juin 2014.
De plus Actoboard fournit la donnée sous forme brute et la qualité du signal de diffusion.

Il est possible dans les paramètres de demander un lien URL pour afficher les données sur une page internet pour les rendre accessibles à toutes et tous. On peut également en faire une page privée si souhaité. Il n'y a rien à paramétrer pour cela. Il suffit de cliquer sur "RequestBin" qui va tout faire pour vous et vous fournir l'adresse à rentrer dans vos paramètres.

Dans notre cas, on obtient ceci:
RequestBin.PNG
RequestBin.PNG (33.06 Kio) Vu 2875 fois

Cela nous fournit les mêmes informations que le site Actoboard, juste présentées différemment.


Voilà pour un premier usage de la carte Akeru.
Florian
 
Messages: 75
Inscription: Mer 24 Juil 2013 17:36

[UPDATE] Akeru + NFC v2 (lib v4)

Message non lude Laetitia » Jeu 28 Juil 2016 17:20

MAJ le 28.07.2016 pour la sortie de la librairie Akeru v4

Le principe reste le même que ci-dessus, je détaillerai simplement les changements notoires dûs au rework de la librairie.

- MATÉRIEL:


Librairie PN532
Librairie Akeru

- MONTAGE:

Rien de plus simple! Il suffit de monter le shield en mezzanine sur la carte Akeru.

- NOUVELLE LIBRAIRIE AKERU:

Changements importants, valables dans tous vos sketchs incluant la nouvelle version de la librairie :
  • Plus besoin d'inclure la librairie SoftwareSerial dans le sketch
  • La définition des RX/TX se fait directement dans le sketch et non plus dans le fichier .cpp (pour adapter plus facilement le sketch pour un Akene ou un breakout TD1208)
  • Le payload se présente sous la forme d'un objet String au lieu d'une structure struct
  • Il faut convertir les données en hexadécimal avant de les envoyer, à l'aide de la fonction toHex(). Attention dans le cas d'une conversion d'un tableau de char il faut également indiquer la taille de celui-ci.
  • Plus besoin d'insérer des délais ou d'appeler la fonction isReady() pour gérer le timing entre deux messages, la fonction sendPayload() s'en charge.
- CODE:

Code: Tout sélectionner
/*
 * Tutoriel : Akeru + NFC
 * Matériel : Akeru (http://snootlab.com/shields-snootlab/829-akeru-beta-33-fr.html)
 *          + Shield NFC (http://snootlab.com/seeedstudio/490-nfc-shield-v20-seeedstudio-fr.html)
 *          + Porte-clés MiFare Classic (http://snootlab.com/adafruit/494-porte-clefs-mifare-classic-1356mhz-rfid-nfc-1kb-fr.html)
 * Librairie Akeru v4 : https://github.com/Snootlab/Akeru
 */
// Librairies NFC
#include <PN532.h>
#include <SPI.h>

// Librairie Akeru
#include <Akeru.h>

// Définition des RX/TX de l'Akeru
#define TX 4
#define RX 5

// Initialisation objet
Akeru Akeru(RX, TX);

#define PN532_CS 10 // La pin CS peut être connectée à la pin D9 ou D10.
PN532 nfc(PN532_CS);
#define NFC_DEMO_DEBUG 1

void setup()
{
  #ifdef NFC_DEMO_DEBUG
   Serial.begin(9600); // Vérification liaison série.
   Serial.println("Bonjour!");
   
  #endif
   nfc.begin(); // Démarrage puce PN532.
   
   uint32_t versiondata = nfc.getFirmwareVersion();
   
   if(!versiondata)
   {
     #ifdef NFC_DEMO_DEBUG // Vérification PN532.
      Serial.print("Puce PN532 absente");
     
     #endif
      while(1);
   }
   
  #ifdef NFC_DEMO_DEBUG  // Vérification paramétrage de la puce.
   Serial.print("Puce detectee, PN5");
   Serial.println((versiondata>>24) & 0xFF, HEX);
   Serial.print("Firmware version: ");
   Serial.print((versiondata>>16) & 0xFF, DEC);
   Serial.print('.');
   Serial.println((versiondata>>8) & 0xFF, DEC);
   Serial.print("Supports ");
   Serial.println(versiondata & 0xFF, HEX);
   
  #endif
   nfc.SAMConfig(); // Configuration de la carte pour lire des tags et cartes RFID.
   
   // Initialisation Akeru
  if (!Akeru.begin())
  {
    Serial.println("Akeru KO");
    while(1);
  }
  Akeru.echoOn();
}

void loop()
{
  String message = "";
 
  uint32_t id;
 
  id = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A);
   
  switch(id) // Réalisation d'un switch pour gérer les différentes conditions.
  {   
    case 4267267237: // Condition à remplir si l'ID detecté est 4267267237.
    {
       Serial.println();
       Serial.println("Bonjour!"); // Envoi au moniteur.
       message = Akeru.toHex("Bonjour", sizeof("Bonjour"));
       break;
    }
     
    case 1589696432: // Condition à remplir si l'ID detecté est 1589696432.
    {
       Serial.println();
       Serial.println("Au revoir!"); // Envoi au moniteur.
       message = Akeru.toHex("Au revoir", sizeof("Au revoir"));
       break;
    }
     
    case 839461248: // Condition à remplir si l'ID detecté est 839461248.
    {
       Serial.println();
       Serial.println("Pause dejeuner!"); // Envoi au moniteur.
       message = Akeru.toHex("Dejeuner", sizeof("Dejeuner"));
       break;
    }
     
    default: // Condition à remplir si aucunes des précédentes n'est vérifiée.
     Serial.println();
     Serial.println("Attente d'identification!"); // Envoi au moniteur.
     break;
  }

  // Envoyer l'info sur le réseau si un tag a été détecté
  if (message.length() > 0)
  {
    while (!Akeru.sendPayload(message)) // dès que possible
    {
      Serial.println("Waiting to send message...");
      delay(1000);
    }
    Serial.println("Message sent !");
  }
 
  delay(1000);
}


- PARAMÉTRAGE ACTOBOARD:

Comme sur le post précédent !
"If it's itchy, scratch it !" - "DIY or die"

RTFM (À lire avant de poster) - ANDb (Arduino Noob Database)
Avatar de l’utilisateur
Laetitia
 
Messages: 296
Inscription: Mar 7 Aoû 2012 15:07
Localisation: Toulouse


Retourner vers Akeru et Akene

Qui est en ligne

Utilisateurs parcourant ce forum: Exabot [Bot], Yahoo [Bot] et 1 invité