Read RFID by Arduino
From Imperial College Robotics Society
Written by Thomas Branch, Adeline Zeng and Harry Eakins
#include <Wire.h>
#define ADDRESS 0x50
#define RESETPIN 5
#define INTERUPT 0 /* Digital Pin 2*/
/* Transmit Macro e.g: trans({0x02,0x20,0x22}); */
#define trans(...) \
byte arr[] = __VA_ARGS__;\
Wire.beginTransmission(ADDRESS);\
Wire.send(arr,sizeof(arr));\
Wire.endTransmission();\
delay(50);
void readCardSerial(){
trans({0x02,0x20,0x22});
Wire.requestFrom(ADDRESS, 7);
while(Wire.available()) // slave may send less than requested
{
byte b = Wire.receive();
printhex(b);
}
}
void cardfound(){
Serial.print("cardfound ^_^\n");
interrupts();
readCardSerial();
Serial.print("\n");
}
void setup() {
Serial.begin(9600);
Wire.begin();
Serial.print("Setup Finished\n");
attachInterrupt(INTERUPT,cardfound, FALLING);
pinMode(RESETPIN /*reset pin*/, OUTPUT);
digitalWrite(RESETPIN, HIGH);
}
void hardwareReset(){
Serial.print("Resetting(hardware):\n");
digitalWrite(RESETPIN, LOW);
delay(10);
digitalWrite(RESETPIN, HIGH);
}
void hardwareSleep(){
Serial.print("Sleeping(hardware):\n");
trans({0x02,0x03,0x01});
Wire.requestFrom(ADDRESS, 3);
while(Wire.available()) // slave may send less than requested
{
byte b = Wire.receive();
//Serial.print(b, HEX);
printhex(b);
}
}
void printhex(byte b){
if(b < 0x10){
Serial.print(0, HEX);
}
Serial.print(b, HEX);
}
void printSerialNumber(){
trans({0x02,0x01,0x03});
Wire.requestFrom(ADDRESS, 11);
while(Wire.available()) // slave may send less than requested
{
byte b = Wire.receive();
//Serial.print(b, HEX);
printhex(b);
}
}
void printModelNumber(){
trans({0x02,0x02,0x00});
Wire.requestFrom(ADDRESS, 7);
while(Wire.available()) // slave may send less than requested
{
byte b = Wire.receive();
//Serial.print(b, HEX);
printhex(b);
}
}
void printFirmwareNumber(){
trans({0x02,0x10,0x12});
Wire.requestFrom(ADDRESS, 7);
while(Wire.available()) // slave may send less than requested
{
byte b = Wire.receive();
//Serial.print(b, HEX);
printhex(b);
}
}
void softwareSleep(){
Serial.print("Sleeping(Software):\n");
trans({0x03,0x11,0x00,0x12});
}
void softwareReset(){
Serial.print("Resetting(software):\n");
trans({0x03,0x11,0xFF, 0x03^0x11^0xFF});
}
void loop(){
while(true){
Serial.print("Loop:\n");
Serial.print("SerialNumber:");
printSerialNumber();
Serial.print("\n");
Serial.print("ModelNumber:");
printModelNumber();
Serial.print("\n");
hardwareSleep();
delay(2000);
hardwareReset();
delay(2000);
Serial.print("FirmwareNumber:");
printFirmwareNumber();
Serial.print("\n");
softwareSleep();
delay(2000);
softwareReset();
delay(2000);
Serial.print("AutoCardSearch:\n");
trans({0x03,0x13,0x00,0x10});
Wire.requestFrom(ADDRESS, 3);
while(Wire.available()) // slave may send less than requested
{
byte b = Wire.receive();
//Serial.print(b, HEX);
printhex(b);
}
delay(2000);
delay(5000);
}
}