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 读取数据。
我有 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 读取数据。