There are four basic subsystems for the project:
I picked up a cheap USB RFID card reader from Hong Kong using eBay. This device plugs into the USB port where it emulates a keyboard and any RFID card placed near it is read and output as multiple digits. The reader came with 5 cards. It works in Linux. This is a good start.
I also bought a Seeedstudio 125 KHz RFID reader from Little Bird Electronics; this is the reader used in the device. It reads the cards mentioned above and provides a 9600 bps serial output.
An electric strike is used to control the door locking and unlocking. When current is applied, the slot in the strike is allowed to move; otherwise it is locked in place.
Most electric strikes are installed in place of the existing fixed strike plate. That wasn't possible for us, because our door has a steel frame and the frame is too narrow for the commonly available strikes. After some research I found a strike which is attached behind the door frame.
This strike must be paired with a deadlatch behind the door, rather than a deadlock built into it. The Lockwood 001 deadlatch fits that requirement. It has a triangular shaped tongue rather than a cylindrical bolt. The tongue shape allows the door to close without touching the deadlatch. Also the 001 deadlatch can lock the knob closed so it cannot be opened from inside without a key. This is useful for security (even if a burglar gets in through a window, they cannot get out through the front door).
Other RFID lock projects I have seen online do not provide this capability, but I consider it a necessary feature. It's very important to not be locked out during a power failure.
Providing battery backup power is probably the hardest part of the project. The electric strike requires 300mA of current at 12 volts for 5 seconds each time the door is opened. Ordinary 9v batteries cannot supply that amount of current. Furthermore, the Arduino needs to be powered on during an outage.
I chose a small 12v, 1300 mAH lead-acid cell from Jaycar. 12v batteries come in a variety of sizes and capacities; this one should be able to power the arduino through outages of several hours.
I wrote simple firmware to control the unit. It uses the SoftwareSerial module to read characters from the RFID reader. When a valid card is read, it compares the card number to the hardcoded (in flash) set of valid cards. If it was found, it powers the strike for 5 seconds. There is an audible click. During this time, the door can be pushed open.
The firmware also sends ASCII messages out the Arduino's serial port (i.e. USB). As this RFID door lock is a standalone device and it is not close to or plugged into a computer, the messages go nowhere. But it is there for future use.