This program actuates a servo when a unique RFID is detected with an ID-20 RFID reader.
// RFID reader ID-20 for Arduino
// Based on code by BARRAGAN <http://people.interaction-ivrea.it/h.barragan>
// and code from HC Gilje – http://hcgilje.wordpress.com/resources/rfid_id12_tagreader/
// Modified for Arudino by djmatic
// Modified for ID-12 and checksum by Martijn The – http://www.martijnthe.nl/
//
// Use the drawings from HC Gilje to wire up the ID-12.
// Remark: disconnect the rx serial wire to the ID-12 when uploading the sketch
//Modified by Alejandro Lopez http://www.archinteractive.net/ with Servo Sweep and Blink light codes
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// a maximum of eight servo objects can be created
int pos = 0; // variable to store the servo position
void setup() {
Serial.begin(9600); // connect to the serial port
myservo.attach(9); // attaches the servo on pin 9 to the servo object
pinMode(13, OUTPUT); // attach LED to pin 13
}
void loop () {
byte i = 0;
byte val = 0;
byte code[6];
byte checksum = 0;
byte bytesread = 0;
byte tempbyte = 0;
myservo.write(180);
if(Serial.available() > 0) {
Serial.println(“ok”);
digitalWrite(13, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(13, LOW); // set the LED off
if((val = Serial.read()) == 2) { // check for header
bytesread = 0;
while (bytesread < 12) { // read 10 digit code + 2 digit checksum
if( Serial.available() > 0) {
val = Serial.read();
if((val == 0x0D)||(val == 0x0A)||(val == 0×03)||(val == 0×02)) { // if header or stop bytes before the 10 digit reading
break; // stop reading
}
// Do Ascii/Hex conversion:
if ((val >= ’0′) && (val <= ’9′)) {
val = val – ’0′;
} else if ((val >= ‘A’) && (val <= ‘F’)) {
val = 10 + val – ‘A’;
}
// Every two hex-digits, add byte to code:
if (bytesread & 1 == 1) {
// make some space for this hex-digit by
// shifting the previous hex-digit with 4 bits to the left:
code[bytesread >> 1] = (val | (tempbyte << 4));
if (bytesread >> 1 != 5) { // If we’re at the checksum byte,
checksum ^= code[bytesread >> 1]; // Calculate the checksum… (XOR)
};
} else {
tempbyte = val; // Store the first hex digit first…
};
bytesread++; // ready to read next digit
}
}
// Output to Serial:
if (bytesread == 12) { // if 12 digit read is complete
//Serial.print(“5-byte code: “);
for (i=0; i<5; i++) {
if (code[i] < 16) Serial.print(“0″);
Serial.print(code[i], HEX);
// Serial.print(” “);
}
Serial.println();
//Serial.print(“Checksum: “);
Serial.print(code[5], DEC);
int val = code[5];
Serial.println(code[5] == checksum ? ” — passed.” : ” — error.”);
Serial.println();
if (val == 2){
Serial.println(“open sesame”);
for(pos = 147; pos>=55; pos-=1) // goes from 180 degrees to 0 degrees
{ // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable ‘pos’
delay(120); // waits 15ms for the servo to reach the position
}
}
if (val == 19){
Serial.println(“closing er down”);
delay(3000);
digitalWrite(13, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(13, LOW); // set the LED off
delay(3000);
for(pos = 55; pos < 147; pos += 1) // goes from 0 degrees to 120 degrees
{ // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable ‘pos’
delay(150); // waits 15ms for the servo to reach the position
}
}
}
bytesread = 0;
}
}
}