Arduino RFID (Wiegand) 持续阅读

Arduino RFID (Wiegand) Continuous reading

我有 this RFID reader "Rosslare AY-X12",它与 Wiegand 26 位兼容。我有一个 arduino mini Pro 并连接在一起它工作正常但它只读卡一次然后我什么都没有。

当我放上卡片时,arduino 会读取那张卡片,但在卡片靠近 reader 期间只有一次,当我放下卡片然后再戴上时,它会再次读取那张卡片。但是我想连续读取那张卡片,我的意思是当卡片靠近 Reader 仍在读取卡片时,每 1ms 读取该卡片。

你知道怎么做吗?有没有可以做到这一点的 RFID arduino 库?我有 Mifare,它可以做到这一点。但是这个可以通过韦根通讯的125Khzreader不能那样做或者我不知道怎么那样做。

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

试试这个计时器库 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);
}

我自己写了韦根代码。没那么难。我将中断附加到数据引脚,当它们发生变化时,我记录零或一。然后你建立二进制字符串,一旦超时,因为没有位进来。然后你将二进制转换为十进制。

#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

  }

}

你可能需要找一个提供连续读数的reader,因为我知道市场上几乎所有的韦根Reader都不能进行连续读数,因为他们有一个"onboard"控制这个... 也许您可以尝试使用 Arduino 串行 RFID Reader...

我之前的回答被删除了。我将再次尝试回答问题。

Do you have any idea how to do that ?

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

普通RFID readers不会发送同一张卡的连续数据,因为在普通用例(entry/exit/attendance)中,通常一次点击是check-in,另一次点击是 check-out。如果RFIDreader连续发送同一张卡的数据,主系统接收多个wiegand数据会产生混淆,无法判断用户是check-in还是check-out.

Is there any RFID arduino library which can do that?

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

Is there a way to achieve this?

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

带标签连续输出现场或单次传输

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