Как получить UID RFID в Arduino?

У меня есть модуль RFID-RC522 (MF-RC522), и я использую программу эскизов Arduino. Чтобы использовать этот RFID, я загрузил библиотеку Arduino MFRC522.

И я запускаю пример кода библиотеки.

Вот код.

/*
 * 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));
}

Когда я запускаю этот код и помещаю одну из карт в считыватель RFID, много информации отображается на последовательном мониторе Arduino IDE. Что-то вроде этого ... (я не мог опубликовать изображения)

//
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 ...
//

Но мне нужен только UID карты. Это чехол 84 90 6C A7.

Собственно, у меня есть проект. Я хочу включить светодиод, если я вставлю определенную карту RFID. Для этого мне нужно прочитать UID карты и присвоить его некоторой переменной в программе эскиза Arduino.

Но я не знаю, как в этом случае получить UID RFID-метки (эта библиотека и функции для меня сложны).

Если кто-нибудь знает, как это сделать, пожалуйста, помогите мне.


person Jinha.Kim    schedule 29.09.2015    source источник


Ответы (4)


Это непроверенный код, поскольку сейчас у меня нет доступной Arduino. Надеюсь это работает.

Замените код DumpToSerial в своем примере на что-то вроде этого

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 }

person Hans Kilian    schedule 29.09.2015

Вот функция, которая возвращает 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;
}

Используйте это так:

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

На основе ответа Томаса Мэтьюза в аналогичном обсуждении .

person Pwdr    schedule 15.10.2015
comment
Я получаю эту ошибку при компиляции: warning: left shift count >= width of type hex_num = mfrc522.uid.uidByte[0] << 24 - person yentsun; 11.02.2017

вы можете получить это, выполнив следующие действия:

mfrc522.uid.uidByte

и это байт [10]

person Pontios    schedule 12.12.2016

Я нашла другой способ.

В библиотеке MFRC522.cpp в строке 1391

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

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

Я сделал еще одну функцию из этого вызова функции: PICC_DumpDetailsToSerialUid(Uid *uid)

Это выглядит как:

 //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();
 }

Вы можете разместить его везде, где вам нужно, я просто поставил его рядом с большими функциями, чтобы знать, где находится.

После добавления этой функции вам нужно перейти в библиотеку MFRC522.h в строке 409 и добавить

void PICC_DumpDetailsToSerialUid(Uid *uid);

После этих двух правок в этой библиотеке вы можете вызывать нужную функцию.

Вызовите его в Arduino с помощью: mfrc522.PICC_DumpDetailsToSerialUid(&(mfrc522.uid));, и у вас будет одна функция только для uid.

Вы можете сделать это с другими функциями, если вам нужно что-то еще .... Удачи :)

person athauf94    schedule 26.04.2018