web-dev-qa-db-fra.com

Comment obtenir l'UID de la RFID dans Arduino?

J'ai un module RFID-RC522 (MF-RC522) et j'utilise le programme de dessin Arduino . Pour utiliser ce RFID, j'ai téléchargé la bibliothèque Arduino MFRC522.

Et je lance l'exemple de code de la bibliothèque.

Voici le code.

/*
 * MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
 * The library file MFRC522.h has a wealth of useful info. Please read it.
 * The functions are documented in MFRC522.cpp.
 *
 * Based on code Dr.Leong   ( WWW.B2CQSHOP.COM )
 * Created by Miguel Balboa (circuitito.com), Jan, 2012.
 * Rewritten by Søren Thing Andersen (access.thing.dk), fall of 2013 (Translation to English, refactored, comments, anti collision, cascade levels.)
 * Released into the public domain.
 *
 * Sample program showing how to read data from a PICC using a MFRC522 reader on the Arduino SPI interface.
 *----------------------------------------------------------------------------- empty_skull 
 * Aggiunti pin per arduino Mega
 * add pin configuration for arduino mega
 * http://mac86project.altervista.org/
 ----------------------------------------------------------------------------- Nicola Coppola
 * Pin layout should be as follows:
 * Signal     Pin              Pin               Pin
 *            Arduino Uno      Arduino Mega      MFRC522 board
 * ------------------------------------------------------------
 * Reset      9                5                 RST
 * SPI SS     10               53                SDA
 * SPI MOSI   11               51                MOSI
 * SPI MISO   12               50                MISO
 * SPI SCK    13               52                SCK
 *
 * The reader can be found on eBay for around 5 dollars. Search for "mf-rc522" on ebay.com. 
 */

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

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.

void setup() {
    Serial.begin(9600); // Initialize serial communications with the PC
    SPI.begin();            // Init SPI bus
    mfrc522.PCD_Init(); // Init MFRC522 card
    Serial.println("Scan PICC to see UID and type...");
}

void loop() {
    // Look for new cards
    if ( ! mfrc522.PICC_IsNewCardPresent()) {
        return;
    }

    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
    }

    // Dump debug info about the card. PICC_HaltA() is automatically called.
    mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
}

Lorsque je lance ce code et que je mets une des cartes sur le lecteur RFID, de nombreuses informations apparaissent sur le moniteur série de l'IDE Arduino. Quelque chose comme ça ....__ (je ne pouvais pas poster les images)

//
Scan PICC to see UID and type...

Card UID : 84 90 6C A7

PICC type : MIFARE 1KB

Sector Block 0 1 2 3 4 5 6 7 ...

15     63   00 00 00 00 ...
//

Mais ce dont j'ai besoin, c'est simplement de la carte UID. Cette affaire est la 84 90 6C A7.

En fait, j'ai un projet. Je veux allumer la LED si je mets une certaine carte de RFID. Pour ce faire, je dois lire l'ID de la carte et l'affecter à une variable du programme de dessin Arduino.

Mais je ne sais pas comment obtenir l'UID de l'étiquette RFID dans ce cas (cette bibliothèque et ces fonctions sont compliquées pour moi). 

Si quelqu'un sait comment faire cela, aidez-moi s'il vous plaît.

8
Jinha.Kim

C'est un code non testé car je n'ai pas d'Arduino disponible pour le moment. J'espère que ca fonctionne.

Remplacez le code DumpToSerial dans votre exemple par quelque chose comme ceci

if (mfrc522.uid.uidByte[0] == 0x84 && mfrc522.uid.uidByte[1] == 0x90 && mfrc522.uid.uidByte[2] == 0x6c && mfrc522.uid.uidByte[3] == 0xa7) { // turn your LED on }

7
Hans Kilian

Voici une fonction qui retourne l'UID.

/**
 * mfrc522.PICC_IsNewCardPresent() should be checked before 
 * @return the card UID
 */
unsigned long getID(){
  if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
    return -1;
  }
  unsigned long hex_num;
  hex_num =  mfrc522.uid.uidByte[0] << 24;
  hex_num += mfrc522.uid.uidByte[1] << 16;
  hex_num += mfrc522.uid.uidByte[2] <<  8;
  hex_num += mfrc522.uid.uidByte[3];
  mfrc522.PICC_HaltA(); // Stop reading
  return hex_num;
}

Utilisez-le comme ceci:

if(mfrc522.PICC_IsNewCardPresent()) {
  unsigned long uid = getID();
  if(uid != -1){
    Serial.print("Card detected, UID: "); Serial.println(uid);
  }
}

Basé sur la réponse de Thomas Matthews dans une discussion similaire .

8
Pwdr

vous pouvez l'obtenir en faisant cela:

mfrc522.uid.uidByte

et c'est un octet [10]

1
Pontios

J'ai trouvé un autre moyen.

Dans la bibliothèque MFRC522.cpp at line 1391

Serial.print(F("Card UID:"));

for (byte i = 0; i < uid->size; i++)

J'ai créé une autre fonction de cet appel de fonction: PICC_DumpDetailsToSerialUid(Uid *uid) 

Ça ressemble à: 

 //This is just for read UID!
 void MFRC522::PICC_DumpDetailsToSerialUid(Uid *uid){
    Serial.print(F("Card JUST UID :"));
    for (byte i = 0; i < uid->size; i++) {
        if(uid->uidByte[i] < 0x10)
            Serial.print(F(" 0"));
        else
            Serial.print(F(" "));
        Serial.print(uid->uidByte[i], HEX);
    } 
    Serial.println();
 }

Vous pouvez le mettre partout où vous avez besoin, je viens de le placer près de grandes fonctions pour savoir où se trouve.

Après avoir ajouté cette fonction, vous devez aller dans MFRC522.h library à line 409 et ajouter 

void PICC_DumpDetailsToSerialUid(Uid *uid);

Après ces deux modifications dans cette bibliothèque, vous pouvez appeler la fonction où vous le souhaitez. 

Appelez-le dans Arduino avec: mfrc522.PICC_DumpDetailsToSerialUid(&(mfrc522.uid)); et vous avez une fonction juste pour l'uid. 

Vous pouvez le faire avec d'autres fonctions si vous avez besoin d'autre chose .... Bonne chance :)

0
athauf94