Parallax RFID Reader + Arduino - Code w/Interrupt
April 13th, 2008 by TheKidd
So I got a reply for John Ryan on the Arduino forums and he mentioned that I would need to use an interrupt to grab RFID data to ensure it did not stop my program while waiting for a tag. I banged my head around with the implementation of interrupt code but found a solution that seems to work quite well on the forum.
Come to find out, there is an easy function already included called attachInterrupt(). Went ahead and added this to my code and rearranged everything to allow proper operation. Here is what I got out of it:
// RFID reader for Arduino
// Wiring version by BARRAGAN <http://people.interaction-ivrea.it/h.barragan>
// Modified for Arudino by djmatic
// And pieces from Arduino Playground <http://www.arduino.cc/playground/Learning/PRFID>
// And then modified again by thekidd
// 12.04.2008 - Added interrupt to ensure program does not hang on RFID reader.
#include <avr/interrupt.h>
#include <SoftwareSerial.h>
#define rxPin 2
#define txPin 3
#define ledPin 13
// set up a soft serial port
SoftwareSerial mySerial(rxPin, txPin);
int val = 0;
char code[10];
int bytesread = 0;
void setup() {
// define pin modes for tx, rx, led pins:
pinMode(rxPin, INPUT); // Set rxPin as INPUT to accept SOUT from RFID pin
pinMode(txPin, OUTPUT); // Set txPin as OUTPUT to connect it to the RFID /ENABLE pin
pinMode(ledPin, OUTPUT); // Let the user know whats up
// set the data rate for the serial ports
mySerial.begin(2400); // RFID reader SOUT pin connected to Serial RX pin at 2400bps
Serial.begin(9600); // Serial feedback for debugging in Wiring
// say something
Serial.println("Hello World!");
attachInterrupt(0, readRFID, CHANGE); // Setup interrupt for SOUT on RFID reader
digitalWrite(txPin, LOW); // Activate the RFID reader
}
void loop() {
// Do Something
}
void readRFID() {
digitalWrite(ledPin, LOW); // Turn off debug LED - Event triggered!
if((val = mySerial.read()) == 10) { // check for header
bytesread = 0;
while(bytesread<10) { // read 10 digit code
val = mySerial.read();
if((val == 10)||(val == 13)) { // if header or stop bytes before the 10 digit reading
break; // stop reading
}
code[bytesread] = val; // add the digit
bytesread++; // ready to read next digit
}
if(bytesread == 10) { // If 10 digit read is complete
digitalWrite(txPin, HIGH); // deactivate RFID reader
digitalWrite(ledPin, HIGH); // activate LED to show an RFID card was read
Serial.print("TAG code is: "); // possibly a good TAG
Serial.println(code); // print the TAG code
}
bytesread = 0;
digitalWrite(txPin, LOW); // Activate the RFID reader
}
}
Now that I got that working properly, I’m off to get my LCD set back up and add that code to the code above!
As in your other project code, it seems a LOW mode, rather than CHANGE mode in the attachInterrupt works better. For me, with CHANGE, it would hang in the read function.
attachInterrupt(0, readRFID, LOW);