Arduino RFID(Wiegand)连续阅读

时间:2015-06-10 08:25:50

标签: arduino rfid

我有this RFID阅读器" Rosslare AY-X12",并且它正在使用Wiegand 26bit。我有一个arduino迷你Pro并连接在一起工作正常,但它只能读取卡片一次然后我什么都没有。

当我戴上卡片时,arduino会读取该卡片,但卡片中只有一次读取器附近,当我取下卡片然后我戴上卡片时,它再次读取该卡片。但是我想连续读取那张卡片,我的意思是当读卡器靠近读卡器还在读卡片时,每隔1ms读取一张卡片。

你知道怎么做吗?有没有RFID arduino库可以做到这一点?我有Mifare,它可以做到这一点。但这个可以通过Wiegand进行通信的125Khz阅读器无法做到这一点,或者我不知道该怎么做。

我正在使用此库:https://github.com/monkeyboard/Wiegand-Protocol-Library-for-Arduino

4 个答案:

答案 0 :(得分:1)

我之前的回答已删除。我将再次尝试回答这些问题。

  

你知道怎么做吗?

Arduino无法做到这一点,因为在您的情况下,Arduino只是从您的RFID阅读器读取D0和D1脉冲。由于您的RFID阅读器Rosslare AY-X12不会发送连续的wiegand协议输出,因此Arduino无法读取比未发送的更多信息。

普通RFID阅读器不会发送同一张卡的连续数据,因为在常见用例(进入/退出/出勤)中,通常一次点击即可办理登机手续,另一次点击即可结账。如果RFID阅读器发送同一张卡的连续数据,则接收多个韦根数据的主系统将会混淆,并且无法确定用户是否确实希望办理登机手续或结账。

  

是否有RFID arduino库可以做到这一点?

没有。没有这样的RFID Arduino库。如果RFID阅读器没有发送连续数据,接收器(Arduino)就无法接收它们。

  

有没有办法实现这个目标?

是的,有些读者可以选择打开连续的数据输出,例如714-52 Mifare® ID Reader with selectable outputs。在其规范中:

在字段或单次传输中使用标记 连续输出

将此阅读器配置为连续输出,然后您可以使用Arduino和monkeyboard wiegand library来读取数据。

答案 1 :(得分:0)

尝试这个计时器库Timer1并尝试使用这个代码对我有用,我的标签和卡片现在可以连续读取。 来自丹麦的问候 格里



#include <Timer1.h>

//******************************************************************
// ATmega168, ATmega328:
// - Using Timer 1 disables PWM (analogWrite) on pins 9 and 10
// ATmega2560:
// - Using Timer 1 disables PWM (analogWrite) on pins 11 and 12
// - Using Timer 3 disables PWM (analogWrite) on pins 2, 3 and 5
// - Using Timer 4 disables PWM (analogWrite) on pins 6, 7 and 8
// - Using Timer 5 disables PWM (analogWrite) on pins 44, 45 and 46
//******************************************************************

unsigned int lastTime;

#include <SoftwareSerial.h>
 
SoftwareSerial RFID = SoftwareSerial(2,4);
 
char character;
String our_id;



void setup()
{
  // Disable Arduino's default millisecond counter (from now on, millis(), micros(),
  // delay() and delayMicroseconds() will not work)
  disableMillis();
  // Prepare Timer1 to count
  // On 16 MHz Arduino boards, this function has a resolution of 4us
  // On 8 MHz Arduino boards, this function has a resolution of 8us
  startCountingTimer1();
  lastTime = readTimer1();
   Serial.begin(9600);
  RFID.begin(9600);
}

void loop()
{
   unsigned int now = readTimer1();
      
   
  while (RFID.available()>0)
  {
     
     character = RFID.read();
      our_id += character;
     lastTime = now;
  }
 
  if (our_id.length() > 10) {
      our_id = our_id.substring(1,13);
      Serial.println(our_id);
      our_id = "";
      
  }
 
  
    
  delay(1000);
}
&#13;
&#13;
&#13;

答案 2 :(得分:0)

我写了自己的韦根代码。它并不难。我将中断连接到数据引脚,当它们改变时,我记录零或一。然后你建立二进制字符串,一旦超时,因为没有进入的位。然后你将二进制转换为十进制。

#include <LiquidCrystal.h>
int data0 = 2;                      //set wiegand data 0 pin
int data1 = 3;                      //set wiegand data 1 pin

unsigned long bit_holder;           //unsigned long (positive 32 bit number)
unsigned long oldbit = 0;
volatile int bit_count = 0;
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
unsigned long badge;
unsigned int timeout;
unsigned int t = 800;

void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.print("Present Badge");
  delay(2);
  Serial.println("Present Badge");

  pinMode(data0, INPUT);
  digitalWrite(data0, HIGH);
  pinMode(data1, INPUT);
  digitalWrite(data1, HIGH);
  attachInterrupt(0, zero, FALLING);   //attach interrupts and assign functions
  attachInterrupt(1, one, FALLING);
}


void zero(){
  bit_count ++; 
  bit_holder = (bit_holder << 1) + 0;  //shift left one and add a 0
  timeout = t;
}

void one(){
  bit_count ++; 
  bit_holder = (bit_holder << 1) + 1;  //shift left one and add a 1
  timeout = t;
}

void loop() {
  timeout --;
  if (timeout == 0 && bit_count > 0){
    lcd.clear();
    lcd.print("Dec:");
    lcd.print(bit_holder);
    lcd.setCursor(0,1);
    lcd.print("Hex:");
    lcd.print(String(bit_holder,HEX));

    Serial.print("bit count= "); 
    Serial.println(bit_count);
    Serial.print("bits= "); 
    Serial.println(bit_holder,BIN);
    oldbit = bit_holder;                //store previous this value as previous
    bit_count = 0;                     //reset bit count
    bit_holder = 0;      //reset badge number

  }

}

答案 3 :(得分:0)

你可能需要找一个提供持续阅读的阅读器,因为我知道市场上的Wiegand Reader几乎不能进行连续阅读,因为他们有一个&#34;板载&#34;控制这个的控制...... 也许你可以试试Arduino Serial RFID Reader ...