Skip to main content

Bonjour à tous,
Aujourd’hui, nous allons voir ensemble comment lire, comprendre et utiliser la datasheet d’un module que nous venons de recevoir. En fait, la lecture de la datasheet, qui regroupe toutes les données utiles liées à l’utilisation d’un circuit, d’un capteur ou d’un actionneur, doit être la première chose à faire lorsque vous ne réussissez pas à utiliser le matériel que vous venez de recevoir. Il est aussi très intéressant de la consulter lorsque vous utilisez une librairie depuis un certain nombre de temps et que vous souhaitez finalement pouvoir profiter pleinement de toutes les capacités offertes par le matériel que vous venez d’acheter.
La lecture d’une datasheet n’est pas forcément une chose simple. Sa compréhension peut se révéler difficile puisqu’elle contient de nombreux détails qui ne vous seront pas forcément utiles. Cependant, elle est indispensable puisqu’elle permettra, dans de nombreux cas, d’étalonner un capteur ou de comprendre le protocole utilisé par le matériel par exemple.
Dans ce tutoriel, j’aurai pu aborder l’utilisation des datasheets pour l’étalonnage d’un capteur de température mais je préfère aborder une notion plus complexe et sans doute, plus utile, découvrir de A à Z comment communiquer avec un module SM130. Le matériel utilisé dans cet article n’est pas un matériel onéreux, en voici la liste:

Matériel:

  • 1 Arduino UNO
  • Un module SM130 disponible chez Sparkfun
  • Un shield d’évaluation RFID optionnel mais j’en utiliserai un, il est disponible chez Sparkfun
  • 4 câbles M/F

 

Shield Evaluation RFID et module SM130

Ensemble Shield Evaluation RFID Sparkfun et module SM130 soudé

 

Tags RFID

Tags RFID de forme « Jeton »

Puisque nous allons aborder l’utilisation de la datasheet, voici deux liens qui nous seront utiles lors de notre progression:

Bien, nous sommes désormais prêts à comprendre le protocole de communication de notre module.

Dans un premier temps, il va falloir identifier la méthode de communication utilisée par le matériel, c’est-à-dire s’il utilise la liaison Série, I2C, One-Wire ou autre. Sur la première page de la datasheet du module SM130, nous pouvons lire « UART Interface – up to 115200bps ». UART signifie  » Universal Asynchronous Receiver Transmitter » mais est aussi synonyme d’une liaison série. Si on lit la ligne suivante, on observe que le module peut aussi être utilisé via la liaison I2C. Dans cet article, j’utiliserai la liaison Série pour faciliter son utilisation avec l’Arduino.
La seconde étape consiste à identifier la position des pins VCC, GND, Rx et Tx. Pour cela, nous avons une manière simple de procéder pour le SM130 puisqu’à la page 4, nous avons le plan des pinouts du SM130. On note la position de VCC, RFVCC, GND, RFGND, UART RX et UART TX. Pour ceux qui comme moi, auront choisi d’utiliser le shield RFID Evaluation, nous pouvons consulter sa datasheet et remarquer sur le schéma du shield que le Rx du SM130 est relié à la broche D7 et son Tx à la broche D8. VCC et GND sont respectivement liées à +5V et GND.
Pour ceux d’entre vous qui utilisent le module SM130 seul, vous devez relier les pins VCC et RFVCC à la sortie 5V de l’Arduino, les pins GND et RFGND à une masse de l’Arduino (GND). Ensuite, que vous utilisez le module avec ou sans shield, vous devez relier le UART RX à la broche D7 de l’Arduino et le UART TX à la broche D8.

Montage module SM130 et Arduino UNO

Montage du module SM130 relié à un Arduino UNO au moyen de 4 câbles et d’un shield Evaluation RFID

Maintenant, notre module est branché sur notre Arduino et nous n’avons, jusqu’ici, encore eu besoin d’aucune aide extérieur.

Le plus difficile arrive maintenant. Nous ne travaillerons désormais qu’avec la datasheet du module SM130 pour la suite de l’article. Je vous propose d’aller à la page 7/8 de cette datasheet. A la page 7, vous retrouvez l’ensemble des commandes que nous pouvons utiliser sur notre module. Dans la colonne de gauche, vous avez la commande hexadécimale correspondante à la commande du module présentée dans les deux colonnes de droite.
Mais la page 8 est bien intéréssante pour nous, nous allons trouver de nombreuses informations dedans. Tout d’abord, dans le premier paragraphe, nous retrouvons tous les débits Série disponible pour notre module mais il est bien spécifié que le débit par défaut est 19200bps, N, 8, 1 c’est-à-dire une vitesse de 19200bps avec aucun bit de parité, 8 bits de données et 1 bit de stop. Ne tenez pas compte des 3 paramètres N, 8, 1 ils ne sont pas intéressant dans notre cas, notez simplement la vitesse de 19200bps.
Le premier tableau présent sur cette page de la datasheet:

Header Reserved Length Command Data CSUM
1 Byte 1 Byte 1 Byte 1 Byte N Bytes 1 Byte

Nous permet de réellement comprendre le protocole de communication du module. Nous avons ensuite le détail du contenu de chaque bit que je vais rappeler ici:

  • Header: Toujours à 0xFF, il permet d’avertir le module que nous allons lui envoyer des données
  • Reserved: Toujours à 0x00, il est réservé à une utilisation future que le fabricant pourrait en faire
  • Length: C’est une variable qui prend pour valeur le nombre de bit transmis (Command + Data)
  • Command: C’est une variable qui prend pour valeur l’une des commandes présentes sur la page 7
  • Data: C’est une variable qui prend pour valeur les données que l’on souhaite transmettre liées à la commande
  • CSUM: c’est le « checksum », la clé de salage, elle prend pour valeur la somme de tous les bits, sauf de Header

Un retour sur la page 7 nous permet de retrouver le code correspondant à la commande que nous souhaitons. En effet, pour vérifier en permanence la présence d’un tag RFID sur l’antenne du module, nous pouvons utiliser la commande correspondante au code « 0x82 » qui ne prend pas d’argument (Data = 0).

A ce stade du tutoriel, nous sommes capables de formuler notre commande permettant, par exemple, d’attendre la présence d’un module. Ainsi, l’information à envoyer au module se découpe en trois 6 parties:

  • 0xFF = Header
  • 0x00 = Reserved
  • 0x01 = Nombre de bit Commande + Data
  • 0x82 = Command
  • 0x00 = Data
  • 0x83 = CSUM

Nous pouvons donc désormais écrire notre programme. Pour gérer deux liaisons séries via l’Arduino UNO, nous allons utiliser la librairie SoftwareSerial. Voici donc notre script à ce moment du tutoriel:

#include 

SoftwareSerial rfid(7, 8);

String readed;

void setup() {
  Serial.begin(9600);
  rfid.begin(19200);

}

void loop() {
  rfid.write((uint8_t)0xFF);
  rfid.write((uint8_t)0x00);
  rfid.write((uint8_t)0x01);
  rfid.write((uint8_t)0x82);
  rfid.write((uint8_t)0x83);
  
  delay(500);
}

Ce script a pour effet de vérifier la présence d’un tag RFID autour de l’antenne du module SM130. J’ai placé un delay(500) afin que le module ait le temps de formuler sa réponse pour la suite du tutoriel.
Ce qui nous intéresse, bien entendu, est d’être en mesure de lire la valeur du tag. Pour cela, je vous propose d’aller à la page 13 de la datasheet du module. Là, nous pouvons voir la nature du message retourné par le module lorsque la présence d’un tag RFID est constatée. Dans le cas où aucun tag n’est présent, nous aurons en retour le message suivant: « ff02824cd0 ». Pour information, j’ai déterminé ce message en ajouter une vérification du retour d’un message à l’aide de rfid.available() puis un Serial.println(String(rfid.read(), HEX)); après le delay(500); du script précédent. J’ai ainsi pu observer la forme de la réponse lors de la présence d’un tag RFID et lorsqu’il n’y en avait pas.
La forme de la réponse est donc:

  • Header, Reserved, Length, Command, Data

Attention, souvenez-vous que Reserved vaut 0x00 et qu’il n’apparaitra donc par dans la trame de données renvoyées. Il est important d’avoir connaissance aussi du fait que notre module renverra une trame de données contenant le retour pour l’exécution de la commande + le retour des données du tag présent lorsqu’il y en aura un, cela sur une seule trame.
Cela signifie que si nous voulons identifier la valeur du tag RFID de notre carte RFID par exemple, nous devrons sélectionner la chaine de caractère débutant au 17ème caractère de la trame jusqu’au 25ème, le 26/27ème correspondant au bit MSB.
En effet, la trame reçue, par exemple, pourrait ressembler à celle-ci:
« ff02924cd0ff0682210fe4e846a », trame dans laquelle on retrouve le tag de la carte, « 10fe4e84 », « 6a » correspondant au bit MSB.

Voilà donc notre script final:

#include 

SoftwareSerial rfid(7, 8);

String readed;

void setup() {
  Serial.begin(9600);
  rfid.begin(19200);

}

void loop() {
  rfid.write((uint8_t)0xFF);
  rfid.write((uint8_t)0x00);
  rfid.write((uint8_t)0x01);
  rfid.write((uint8_t)0x82);
  rfid.write((uint8_t)0x83);
  
  delay(500);
  
  while(rfid.available() > 0){
    readed += String(rfid.read(), HEX);
  }
  if(readed != "ff02824cd0"){
    Serial.println(readed);
    Serial.println(readed.substring(17, 25));
  }
  readed = "";

}

Vous êtes désormais capable d’utiliser votre module SM130, en plus d’être capable de lire et de comprendre une datasheet.
A bientôt pour un prochain tutoriel sur Simple-Duino.

Fabien A.

Fabien Aubret

Co-fondateur SimpleDuino, Co-fondateur SimpleDomo. Ingénieur de l'Ecole Nationale Supérieure des Arts Et Métiers (ENSAM). Passionné d'électronique, d'informatique et des nouvelles technologies en général, j'ai à cœur de transmettre ce que d'autres ont pu m'apprendre.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.