Arduino有两个RC522

时间:2016-02-09 19:39:17

标签: arduino rfid

为了让我的Carrera皮条客,我要打造一个圆形柜台。 它包含一个Arduino Nano,一个lcd和2个rc522 rfid阅读器。 读者共享scd,miso,mosi的引脚,并为sda和rst提供自己的引脚。

实际上,我无法同时让两位读者一起工作。只有当一个或另一个阅读器被物理地插入(硬核!)时才能运行它(无代码更改)。但不是在一起。

它必须是我的代码的问题,但在哪里? (RFID-Communication受到[addicore] [1] http://www.addicore.com/v/vspfiles/downloadables/Product%20Downloadables/RFID_RC522/RFIDQuickStartGuide.pdf的例子的启发)

有没有人暗示过我?

    #include <AddicoreRFID.h>
    #include <SPI.h>
    #include <LiquidCrystal.h>

    #define uchar unsigned char
    #define uint unsigned int

    // create AddicoreRFID object to control the RFID module
    /////////////////////////////////////////////////////////////////////
    //set the pins
    /////////////////////////////////////////////////////////////////////
    //2 - SCK Digital 13
    //3 - MOSI Digital 11
    //4 - MISO Digital 12

    const int SS1 = 8; //RFID1
    const int RST1 = 9;
    AddicoreRFID myRFID1 (SS1, RST1);

    const int SS2 = 10; //RFID2
    const int RST2 = A0;
    AddicoreRFID myRFID2 (SS2, RST2);

    //Maximum length of the array
    #define MAX_LEN 16

    //LCD init
    // * LCD RS pin to digital pin 7
    // * LCD Enable pin to digital pin 6
    // * LCD D4 pin to digital pin 5
    // * LCD D5 pin to digital pin 4
    // * LCD D6 pin to digital pin 3
    // * LCD D7 pin to digital pin 2
    LiquidCrystal lcd1(7, 6, 5, 4, 3, 2);

    //Counter
    int a = 0;
    int b = 0;

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

      //LCD init
      init_lcd1();

      myRFID1.AddicoreRFID_Init();
      myRFID2.AddicoreRFID_Init();

    }


    void loop() {
      uchar i, tmp, checksum1;
      uchar status;
      uchar str1[MAX_LEN];
      uchar str2[MAX_LEN];

      ///////////// RFID1 ///////////////////
      // 0x4400 = Mifare_UltraLight -Tag Type
      str1[1] = 0x4400;
      //Find tags, return tag type
      // Manipuliert str1(!);
      //AddicoreRFID::AddicoreRFID_Request(byte reqMode, byte *TagType)
      status = myRFID1.AddicoreRFID_Request(PICC_REQIDL, str1);
      if (status == MI_OK) {
        serial_TagDetect(str1, 1);
      }
      //Anti-collision, return tag serial number 4 bytes
      // Manipuliert str1(!);
      status = myRFID1.AddicoreRFID_Anticoll(str1);
      if (status == MI_OK) {
        serial_TagData(str1);
        lcd_counter(str1, lcd1);
        //delay(500);
      }
      myRFID1.AddicoreRFID_Halt(); //Command tag into hibernation

      ///////////// RFID2 ///////////////////
      str2[1] = 0x4400;
      //Find tags, return tag type
      status = myRFID2.AddicoreRFID_Request(PICC_REQIDL, str2);
      if (status == MI_OK) {
        serial_TagDetect(str2, 2);
      }

      //Anti-collision, return tag serial number 4 bytes
      status = myRFID2.AddicoreRFID_Anticoll(str1);
      if (status == MI_OK) {
        serial_TagData(str2);
        lcd_counter(str2, lcd1);
        // liest sonst nonstop die Tags!
        //delay(500);
      }

      myRFID2.AddicoreRFID_Halt(); //Command tag into hibernation
    }

    void init_lcd1() {
       ... inits the lcd ...
    }

    // Zählt das Auftreten der Tags
    void lcd_counter (uchar *str, LiquidCrystal lcd ) {
       ... output to the lcd ....
    }

    // Meldet gefundenen Tag auf der Konsole
    void serial_TagDetect(uchar *str, int reader) {
        if (reader == 1) {
            Serial.print("RFID1 tag detected: ");
        } else {
            Serial.print("RFID2 tag detected: ");
        }
        Serial.print(str[0], BIN);
        Serial.print(" , ");
        Serial.print(str[1], BIN); Serial.println(" ");
   }

  // gibt  Tagdaten auf der Konsole aus
  void serial_TagData(uchar *str) {
      uchar checksum1 = str[0] ^ str[1] ^ str[2] ^ str[3];
      Serial.print("The tag's number is: ");
      //Serial.print(2);
      Serial.print(str[0]);
      Serial.print(" , ");
      Serial.print(str[1], BIN);
      Serial.print(" , ");
      Serial.print(str[2], BIN);
      Serial.print(" , ");
      Serial.print(str[3], BIN);
      Serial.print(" , ");
      Serial.print(str[4], BIN);
      Serial.print(" , ");
      Serial.println(checksum1, BIN);
  }

我想知道相同的(!!)rfid标签有不同的值,因为它从RFID1或RFID2读取:

检测到RFID1标签:1000100,0 标签的编号是:136,100,11100,1101011,111111011,111111011

检测到RFID2标签:1000100,0 标签的编号是:68,0,0,0,0,1000100

2 个答案:

答案 0 :(得分:1)

我与Ardunio mega同时使用10个RC522。

试试2 ncf阅读器的这个例子,它适用于我。我在Arduino Nano中测试过。 读卡器共用引脚3,3V,GND。 SCD,MISO,MOSI,RST和SDA都有自己的引脚。我不使用IRQ引脚。

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

#define RST_PIN         9          // Configurable, see typical pin layout above
#define SS1_PIN          10         // Configurable, see typical pin layout above
#define SS2_PIN          8         // Configurable, see typical pin layout above

MFRC522 mfrc522_1(SS1_PIN, RST_PIN);  // Create MFRC522 instance
MFRC522 mfrc522_2(SS2_PIN, RST_PIN);
void setup() {
    Serial.begin(9600);     // Initialize serial communications with the PC
    while (!Serial);        // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
    SPI.begin();            // Init SPI bus
    mfrc522_1.PCD_Init();       // Init MFRC522
    mfrc522_1.PCD_DumpVersionToSerial();    // Show details of PCD - MFRC522 Card Reader details
    Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks..."));

  mfrc522_2.PCD_Init();   // Init MFRC522
  mfrc522_2.PCD_DumpVersionToSerial();  // Show details of PCD - MFRC522 Card Reader details
}

void loop() {
    // Look for new cards
  if ( mfrc522_1.PICC_IsNewCardPresent() ||  mfrc522_2.PICC_IsNewCardPresent()) {
    Serial.println(F("New card..."));
  } else {

        return;
    }




    // Select one of the cards
    if ( ! mfrc522_1.PICC_ReadCardSerial() && ! mfrc522_2.PICC_ReadCardSerial()) {
  Serial.println(F("Read..."));
        return;
    }

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

答案 1 :(得分:-1)

//Anti-collision, return tag serial number 4 bytes
status = myRFID2.AddicoreRFID_Anticoll(str1); // <<<< needs to be strl2