Magnetic Card lock with the Arduino
I have posted alot of projects recently, and here is another project with the Arduino!
This projects is about making a magnetic card lock using the Arduino, a servo and a $4 cheap magnetic card reader from AllElectronics.com
The card reader, which you can see in the first picture, has 7 pins. The picture below shows theese pins functionality!
I’ve made a video about the project which explains it all!
If you want to try it yourself, you can grab the code underneath and change the checkCode character array to match the string on your card!
#include <string.h> #include <Servo.h> Servo servo1; /* Magnetic Card lock with the Arduino and servo's * by Thomas Jespersen http://elec.tkjweb.dk * * Reads a magnetic stripe and opens lock (turns servo) if card is the same as programmed * */ // Connections: DATA = Pin 2, CLOCK = Pin 3, CARD IN = Pin 5 // See PDF "Magnetic Stripe Card Reader! << HACKMIAMI.pdf" for more connection information int cld1Pin = 5; // Card status pin int rdtPin = 2; // Data pin int reading = 0; // Reading status volatile int buffer[400]; // Buffer for data volatile int i = 0; // Buffer counter volatile int bit = 0; // global bit char cardData[40]; // holds card info int charCount = 0; // counter for info int DEBUG = 0; const byte checkCodeLen = 23; char checkCode[checkCodeLen+1] = ";0123456789=0123456789?"; boolean unlock = false; void setup() { Serial.begin(9600); servo1.attach(9); servo1.write(10); // The interrupts are key to reliable // reading of the clock and data feed attachInterrupt(0, changeBit, CHANGE); attachInterrupt(1, writeBit, FALLING); } void loop(){ // Active when card present while(digitalRead(cld1Pin) == LOW){ reading = 1; } // Active when read is complete // Reset the buffer if(reading == 1) { if (DEBUG == 1) { printBuffer(); } decode(); reading = 0; i = 0; int l; for (l = 0; l < 40; l = l + 1) { cardData[l] = '\n'; } // Code added by mindthomas for buffer clearing (If not, you can just insert card slightly, and then last card data will be written) for (l = 0; l < 200; l = l + 1) { buffer[l] = 0; } // End of added code charCount = 0; } } // Flips the global bit void changeBit(){ if (bit == 0) { bit = 1; } else { bit = 0; } } // Writes the bit to the buffer void writeBit(){ buffer[i] = bit; i++; } // prints the buffer void printBuffer(){ int j; for (j = 0; j < 200; j = j + 1) { Serial.println(buffer[j]); } } int getStartSentinal(){ int j; int queue[5]; int sentinal = 0; for (j = 0; j < 400; j = j + 1) { queue[4] = queue[3]; queue[3] = queue[2]; queue[2] = queue[1]; queue[1] = queue[0]; queue[0] = buffer[j]; if (DEBUG == 1) { Serial.print(queue[0]); Serial.print(queue[1]); Serial.print(queue[2]); Serial.print(queue[3]); Serial.println(queue[4]); } if (queue[0] == 0 & queue[1] == 1 & queue[2] == 0 & queue[3] == 1 & queue[4] == 1) { sentinal = j - 4; break; } } if (DEBUG == 1) { Serial.print("sentinal:"); Serial.println(sentinal); Serial.println(""); } return sentinal; } void decode() { int sentinal = getStartSentinal(); int j; int i = 0; int k = 0; int thisByte[5]; for (j = sentinal; j < 400 - sentinal; j = j + 1) { thisByte[i] = buffer[j]; i++; if (i % 5 == 0) { i = 0; if (thisByte[0] == 0 & thisByte[1] == 0 & thisByte[2] == 0 & thisByte[3] == 0 & thisByte[4] == 0) { break; } printMyByte(thisByte); } } cardData[charCount] = '\0'; Serial.print("Stripe_Data:"); for (k = 0; k < charCount; k = k + 1) { Serial.print(cardData[k]); } Serial.println(""); // Check if the card data is the same as the data in checkCode - if yes, unlock (turn servo) unlock = true; for (k = 0; k < checkCodeLen; k++) { if (cardData[k] == checkCode[k]) { if (DEBUG == 1) { Serial.print(cardData[k]); Serial.print("="); Serial.println(checkCode[k]); } } else { if (DEBUG == 1) { Serial.print(cardData[k]); Serial.print("!="); Serial.println(checkCode[k]); } unlock = false; break; } } if (unlock) { servo1.write(200); delay(2000); servo1.write(10); unlock = false; } } void printMyByte(int thisByte[]) { int i; for (i = 0; i < 5; i = i + 1) { if (DEBUG == 1) { Serial.print(thisByte[i]); } } if (DEBUG == 1) { Serial.print("\t"); Serial.print(decodeByte(thisByte)); Serial.println(""); } cardData[charCount] = decodeByte(thisByte); charCount ++; } char decodeByte(int thisByte[]) { if (thisByte[0] == 0 & thisByte[1] == 0 & thisByte[2] == 0 & thisByte[3] == 0 & thisByte[4] == 1){ return '0'; } if (thisByte[0] == 1 & thisByte[1] == 0 & thisByte[2] == 0 & thisByte[3] == 0 & thisByte[4] == 0){ return '1'; } if (thisByte[0] == 0 & thisByte[1] == 1 & thisByte[2] == 0 & thisByte[3] == 0 & thisByte[4] == 0){ return '2'; } if (thisByte[0] == 1 & thisByte[1] == 1 & thisByte[2] == 0 & thisByte[3] == 0 & thisByte[4] == 1){ return '3'; } if (thisByte[0] == 0 & thisByte[1] == 0 & thisByte[2] == 1 & thisByte[3] == 0 & thisByte[4] == 0){ return '4'; } if (thisByte[0] == 1 & thisByte[1] == 0 & thisByte[2] == 1 & thisByte[3] == 0 & thisByte[4] == 1){ return '5'; } if (thisByte[0] == 0 & thisByte[1] == 1 & thisByte[2] == 1 & thisByte[3] == 0 & thisByte[4] == 1){ return '6'; } if (thisByte[0] == 1 & thisByte[1] == 1 & thisByte[2] == 1 & thisByte[3] == 0 & thisByte[4] == 0){ return '7'; } if (thisByte[0] == 0 & thisByte[1] == 0 & thisByte[2] == 0 & thisByte[3] == 1 & thisByte[4] == 0){ return '8'; } if (thisByte[0] == 1 & thisByte[1] == 0 & thisByte[2] == 0 & thisByte[3] == 1 & thisByte[4] == 1){ return '9'; } if (thisByte[0] == 0 & thisByte[1] == 1 & thisByte[2] == 0 & thisByte[3] == 1 & thisByte[4] == 1){ return ':'; } if (thisByte[0] == 1 & thisByte[1] == 1 & thisByte[2] == 0 & thisByte[3] == 1 & thisByte[4] == 0){ return ';'; } if (thisByte[0] == 0 & thisByte[1] == 0 & thisByte[2] == 1 & thisByte[3] == 1 & thisByte[4] == 1){ return '<'; } if (thisByte[0] == 1 & thisByte[1] == 0 & thisByte[2] == 1 & thisByte[3] == 1 & thisByte[4] == 0){ return '='; } if (thisByte[0] == 0 & thisByte[1] == 1 & thisByte[2] == 1 & thisByte[3] == 1 & thisByte[4] == 0){ return '>'; } if (thisByte[0] == 1 & thisByte[1] == 1 & thisByte[2] == 1 & thisByte[3] == 1 & thisByte[4] == 1){ return '?'; } }

