我有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
答案 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;
答案 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 ...