Remplacer un Module RFID-RC522 par un PN5180-NFC sur un projet de démarreur de moto par lecture de carte RFID

Bonjour à tous,

Je suis très novice dans le domaine du arduino, mais un peu bricoleur dans l'âme...

Pour les besoins d'un ami, je me suis lancé dans la conception d'un projet arduino crée par un youtubeur (Et grand merci à RAOM Electronica pour son travail ! ) qui permet de démarrer sa moto avec un arduino nano, une carte électronique et un module RFID-RC522. Apres avoir suivi les instructions vidéos et diffèrent documentations mise à dispo par le concepteur du projet, j'ai réussi à le faire fonctionner. youpi...

Cependant, la détection par le module RFID-RC522 de la carte rfid est assez faible, car le module se trouve derrière le carénage (pour ne pas être visible de l'extérieur).

J'ai donc pensé à remplacer le module RFID-RC522 par un module PN5180-NFC.... Plus puissant à ce que j'ai compris.

Mon problème est justement dans ce changement de module (RFDI-RC522 vers un PN5180-NFC), je ne sais pas si c'est vraiment faisable, et si c'est le cas, je ne sais pas non plus comment adapter le code et le câblage pour assurer que cela fonctionne.

Voici les informations que j'ai utilisées pour concevoir le projet :

Matériels
Module: Arduino Nano
RFID (original): RFID-RC522
RFID (souhaité): PN5180-NFC

Schéma Électrique
J'ai mis en couleur les liaisons entre le arduino nano et le module RFID pour que ce soit plus lisible.

Code Utilisé

//CE CODE A ÉTÉ CRÉÉ PAR RAOM ELECTRONICA 
//WWW.YOUTUBE.COM/RAOMELECTRONICA

#include <SPI.h>      
#include <MFRC522.h>      

#define RST_PIN  9      
#define SS_PIN  10     

MFRC522 mfrc522(SS_PIN, RST_PIN); 

byte LecturaUID[4];          // Tableau pour stocker l'identifiant lu depuis la carte RFID

byte Usuario1[4]= {0x89, 0xC5, 0x43, 0xE8} ;    // UID de l'utilisateur 1: 89 C5 43 E8
byte Usuario2[4]= {0xBA, 0x8D, 0x35, 0x29} ;    // UID de l'utilisateur 2: BA 8D 35 29
byte Usuario3[4]= {0xBF, 0xBF, 0x5B, 0xDC} ;    // UID de l'utilisateur 3: BF BF 5B DC

int suma = 0;    // Variable pour compter le nombre de lectures
unsigned long tanterior;
unsigned long tiempo;

void setup() {
  pinMode (4,OUTPUT);   // Configure le pin 4 comme sortie, pour activer la moto
  pinMode (3,OUTPUT);   // Configure le pin 3 comme sortie, pour activer le CDI de la moto
  pinMode (2,OUTPUT);   // Configure le pin 2 comme sortie, pour démarrer la moto
  pinMode (6,OUTPUT);
  digitalWrite(4, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(6, HIGH);
  SPI.begin();        
  mfrc522.PCD_Init();     // Initialise le module lecteur RFID
}

void loop() {
  tiempo=millis();

   if(tiempo- tanterior> 10000UL) {             // Réinitialise la connexion à la carte
    tanterior=tiempo;
    mfrc522.PCD_Reset();      // Réinitialise le module lecteur RFID
    SPI.end();
    delay(10);
    SPI.begin(); 
    mfrc522.PCD_Init();     // Réinitialise le module lecteur RFID
   } 
   
  if ( ! mfrc522.PICC_IsNewCardPresent())   // Vérifie si une nouvelle carte RFID est détectée
    return;           
  
  if ( ! mfrc522.PICC_ReadCardSerial())     // Lit les données de la carte RFID
    return;           
    
  for (byte i = 0; i < mfrc522.uid.size; i++) { 
          LecturaUID[i]=mfrc522.uid.uidByte[i];          // Stocke l'identifiant lu dans un tableau
          }
                      
          // Vérifie si l'identifiant lu correspond à l'un des utilisateurs enregistrés
          if(comparaUID(LecturaUID, Usuario1))    // Utilisateur 1
            {       
            suma = suma + 1;}
            
          else if(comparaUID(LecturaUID, Usuario2)) // Utilisateur 2
            {     
            suma = suma + 1;}
            
          else if(comparaUID(LecturaUID, Usuario3)) // Utilisateur 3
            { 
            suma = suma + 1;} 
            
           
          
 mfrc522.PICC_HaltA();      // Met fin à la communication avec la carte RFID
 
 if(suma == 1) {              // Moto prête à démarrer
    digitalWrite(4, LOW);
    digitalWrite(3, LOW);
    digitalWrite(6, LOW);
    delay(100);
    digitalWrite(6,HIGH);
    delay(50);
    digitalWrite(6,LOW);
    delay(100);
    digitalWrite(6,HIGH);
   }   
          
 if(suma == 2) {             // Démarrage de la moto
    digitalWrite(2, LOW);
    delay(700);
    digitalWrite(2,HIGH);
    delay(1500);
    SPI.begin();        
    mfrc522.PCD_Init();
   }   
    
        
 if(suma == 3) {             // Arrêt de la moto
    digitalWrite(4, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(6, LOW);
    delay(100);
    digitalWrite(6,HIGH);
    delay(50);
    digitalWrite(6,LOW);
    delay(100);
    digitalWrite(6,HIGH);
    
    suma=0;
   }                  
}


// Fonction pour comparer deux identifiants
boolean comparaUID(byte lectura[],byte usuario[]) 
{
  for (byte i=0; i < mfrc522.uid.size; i++){    
  if(lectura[i] != usuario[i])        
    return(false);          
  }
  return(true);           
}

J'espère avoir mis suffisaient d'informations... Merci à ceux qui prendront le temps de lire ma demande et d'y répondre.

Bonjour sleepwalkertex

Je n'ai malheureusement pas ce module, je n'ai que des RC522, donc je ne peux pas t'aider "en vrai"
Par contre j'ai vu qu'il y avait une bibliothèque spécifique pour ton module, donc à modifier dans ton programme.
Au niveau du câblage, du fait que tu as un Arduino Nano donc en 5V, il est préconisé de mettre un convertisseur de niveau: pour passer les signaux du bus en 3,3V.
image
image

Navré de ne pouvoir faire plus :woozy_face:

Cordialement
jpbbricole

Merci beaucoup Jpbbricole pour ta réponse !

Je vais voir pour faire l'acquisition de ce module et suivre le plan de câblage proposé que j'adapterai pour l'arduino nano.

Par contre, j'ai essayé avec mes modestes connaissances en code, quasi-inexistant, faut pas se mentir, de faire les modifications pour passer du RFID-RC522 au PN5180. Mais ça n'a pas été très concluant... J'ai donc essayé d'utiliser chatgpt (je ne sais pas si c'est une bonne idée... mais bon) pour faire la conversion. Le résultat est meilleur que ce que j'ai fait, mais reste non-fonctionnel.

Voici la modification proposée par chatgpt:

#include <Wire.h>
#include <PN5180.h>

#define SS_PIN 10
#define BUSY_PIN 7
#define RST_PIN 9

PN5180 nfc(SS_PIN, BUSY_PIN, RST_PIN);

byte Usuario1[7] = {0x89, 0xC5, 0x43, 0xE8, 0x00, 0x00, 0x00}; // UID de l'utilisateur 1: 89 C5 43 E8
byte Usuario2[7] = {0xBA, 0x8D, 0x35, 0x29, 0x00, 0x00, 0x00}; // UID de l'utilisateur 2: BA 8D 35 29
byte Usuario3[7] = {0xBF, 0xBF, 0x5B, 0xDC, 0x00, 0x00, 0x00}; // UID de l'utilisateur 3: BF BF 5B DC

unsigned long tanterior;
unsigned long tiempo;
int suma = 0;

void setup() {
  pinMode(4, OUTPUT); // Configure le pin 4 comme sortie, pour activer la moto
  pinMode(3, OUTPUT); // Configure le pin 3 comme sortie, pour activer le CDI de la moto
  pinMode(2, OUTPUT); // Configure le pin 2 comme sortie, pour démarrer la moto
  pinMode(6, OUTPUT);

  digitalWrite(4, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(6, HIGH);

  Wire.begin();
  nfc.begin();
}

void loop() {
  tiempo = millis();

  if (tiempo - tanterior > 10000UL) { // Réinitialise la connexion NFC
    tanterior = tiempo;
    nfc.begin(); // Peut-être besoin de reconfigurer les paramètres NFC ici
  }

  if (nfc.passiveTargetFound()) { // Vérifie si une carte NFC est détectée
    byte uid[7];
    if (nfc.readPassiveTargetID(PN5180::Baud::BR106, uid)) {
      if (memcmp(uid, Usuario1, 7) == 0 || memcmp(uid, Usuario2, 7) == 0 || memcmp(uid, Usuario3, 7) == 0) {
        suma++;
      }
    }
  }

  if (suma == 1) { // Moto prête à démarrer
    digitalWrite(4, LOW);
    digitalWrite(3, LOW);
    digitalWrite(6, LOW);
    delay(100);
    digitalWrite(6, HIGH);
    delay(50);
    digitalWrite(6, LOW);
    delay(100);
    digitalWrite(6, HIGH);
  }

  if (suma == 2) { // Démarrage de la moto
    digitalWrite(2, LOW);
    delay(700);
    digitalWrite(2, HIGH);
    delay(1500);
    nfc.begin(); // Réinitialise la connexion NFC
  }

  if (suma == 3) { // Arrêt de la moto
    digitalWrite(4, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(6, LOW);
    delay(100);
    digitalWrite(6, HIGH);
    delay(50);
    digitalWrite(6, LOW);
    delay(100);
    digitalWrite(6, HIGH);

    suma = 0;
  }
}

et il me retourne le message d'erreur suivant quan je demande la vérification par le logiciel arduino IDE:

Arduino : 1.8.19 (Windows 10), Carte : "Arduino Nano, ATmega328P (Old Bootloader)"

d:\Documents\Arduino\sketch_mar23a\sketch_mar23a.ino: In function 'void loop()':

sketch_mar23a:41:11: error: 'class PN5180' has no member named 'passiveTargetFound'

   if (nfc.passiveTargetFound()) { // Vérifie si une carte NFC est détectée

           ^~~~~~~~~~~~~~~~~~

sketch_mar23a:43:13: error: 'class PN5180' has no member named 'readPassiveTargetID'

     if (nfc.readPassiveTargetID(PN5180::Baud::BR106, uid)) {

             ^~~~~~~~~~~~~~~~~~~

sketch_mar23a:43:41: error: 'PN5180::Baud' has not been declared

     if (nfc.readPassiveTargetID(PN5180::Baud::BR106, uid)) {

                                         ^~~~

exit status 1

'class PN5180' has no member named 'passiveTargetFound'

Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.

Du coup, je me pose la question de savoir s'il y a bien une erreur dans le code ou si la fonction de "vérification" du logiciel nécessite de brancher le arduino nano et le module rfid correctement pour faire valider le code ? (ce qui n'est pas le cas pour le moment, car je n'ai pas encore le module "Logic Level Converter Bi-Directional")

merci a vous!

La validation du code repose uniquement sur la compilation du code que tu as écrit et des librairies.
Les erreurs correspondent à des différences de fonctionnement des librairies. Il y a manifestement des fonctions de l'ancienne librairie qui n'existent pas dans la nouvelle,
Il faut donc faire une analyse du code original et chercher les fonctions équivalentes dans la nouvelle librairie.

Je pense que tu trouveras une partie de la solution en regardant les exemples qui sont installés avec la nouvelle librairie.

Une autre librairie là

Et on trouve pas mal d'exemples d'utilisation de ce lecteur sur le net ce qui peut te donner une bonne base de travail.

Merci de ton aide !

Bon, je n'ai pas le module "Logic Level Converter Bi-Directional" pour le moment, je me suis donc penché sur le code en lui-même... Ça m'a pris une bonne partie de la journée...

Voici le premier que j'ai réussi à avoir avec un résultat valide à la compilation :

#include <SPI.h>
#include <PN5180.h>

#define PN5180_SS   8 // Choisir la broche SS de votre choix
#define PN5180_BUSY 7 // Choisir la broche BUSY de votre choix
#define PN5180_RST  6 // Choisir la broche RST de votre choix

// Broches pour contrôler la moto
#define BROCHE_MOTO_PRETE 4
#define BROCHE_CDI 3
#define BROCHE_ALLUMAGE 2
#define BROCHE_LED 6

PN5180 pn5180(PN5180_SS, PN5180_BUSY, PN5180_RST); // Initialise l'objet PN5180

byte uid[10]; // Tableau pour stocker l'UID de la carte NFC

// UID des utilisateurs autorisés
byte uidAutorises[][4] = {
  {0x89, 0xC5, 0x43, 0xE8}, // Utilisateur 1
  {0xBA, 0x8D, 0x35, 0x29}, // Utilisateur 2
  {0xBF, 0xBF, 0x5B, 0xDC}  // Utilisateur 3
};

int nbLectures = 0;  // Compte le nombre de lectures réussies

bool comparerUID(byte uidLecture[], byte uidAutorise[]) {
  for (byte i = 0; i < sizeof(uid); i++) {
    if (uidLecture[i] != uidAutorise[i]) {
      return false;
    }
  }
  return true;
}

void setup() {
  // Définir les broches de contrôle de la moto en sortie
  pinMode(BROCHE_MOTO_PRETE, OUTPUT);
  pinMode(BROCHE_CDI, OUTPUT);
  pinMode(BROCHE_ALLUMAGE, OUTPUT);
  pinMode(BROCHE_LED, OUTPUT);

  // État initial (haut) pour la sécurité
  digitalWrite(BROCHE_MOTO_PRETE, HIGH);
  digitalWrite(BROCHE_CDI, HIGH);
  digitalWrite(BROCHE_ALLUMAGE, HIGH);
  digitalWrite(BROCHE_LED, HIGH);

  // Initialiser la communication SPI
  SPI.begin();

  // Initialiser le module PN5180
  pn5180.begin();
}

void loop() {
  unsigned long previousMillis = 0;
  const long interval = 500;  // Interval en millisecondes

  while (true) {
    unsigned long currentMillis = millis();

    // Vérifier si le délai s'est écoulé
    if (currentMillis - previousMillis >= interval) {
      previousMillis = currentMillis;  // Sauvegarder le moment de cette vérification

      // Simuler la lecture de l'identifiant du tag NFC (similaire à pn5180.readPassiveTargetID)
      for (int i = 0; i < 10; i++) {
        uid[i] = random(256); // Générer des octets aléatoires pour simuler un UID NFC
      }

      nbLectures++;

      // Vérifier si l'UID lu correspond à un utilisateur autorisé
      for (int i = 0; i < sizeof(uidAutorises) / sizeof(uidAutorises[0]); i++) {
        if (comparerUID(uid, uidAutorises[i])) {
          break;  // Utilisateur trouvé, quitter la boucle
        }
      }

      // Actions en fonction du nombre de lectures (similaire au code original)
      if (nbLectures == 1) {
        // Moto prête
        digitalWrite(BROCHE_MOTO_PRETE, LOW);
        digitalWrite(BROCHE_CDI, LOW);
        digitalWrite(BROCHE_LED, LOW);
        delay(100);
        digitalWrite(BROCHE_LED, HIGH);
        delay(50);
        digitalWrite(BROCHE_LED, LOW);
        delay(100);
        digitalWrite(BROCHE_LED, HIGH);
      }

      if (nbLectures == 2) {
        // Démarrage de la moto
        digitalWrite(BROCHE_ALLUMAGE, LOW);
        delay(700);
        digitalWrite(BROCHE_ALLUMAGE, HIGH);
        delay(1500);
      }

      if (nbLectures == 3) {
        // Arrêt de la moto
        digitalWrite(BROCHE_MOTO_PRETE, HIGH);
        digitalWrite(BROCHE_CDI, HIGH);
        digitalWrite(BROCHE_LED, LOW);
        delay(100);
        digitalWrite(BROCHE_LED, HIGH);
        delay(50);
        digitalWrite(BROCHE_LED, LOW);
        delay(100);
        digitalWrite(BROCHE_LED, HIGH);

        nbLectures = 0; // Réinitialiser le compteur de lectures
      }
    }
  }
}

Je me suis encore une fois aidé de chatgpt pour faire la conversion, et même avec son aide ça n'a pas été simple...

Je vous le laisse à disposition au cas où une personne plus expérimentée en code que moi y verrai des anomalies/améliorations.

Je testerai le code sur mon arduino quand j'aurai reçu le module de conversion de voltage.

Encore merci a vous!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.