Prototyypin rakentaminen: RFID-sensori Arduinolla
Categories:
[school]
Tags:
[arduino],
[prototyping-course]
Sain tehtäväkseni saada toimimaan jonkinlainen RFID-lukija Arduinossa. Pienen googletuksen jälkeen löysin tämän sivuston, jossa kyseisellä saamallani lukijalla oli toteutettu autotallin oveen kulunvalvonta. Esimerkki vaikutti hankalalta, mutta löysin pienen jatko-googletuksen jälkeen kurssin edellisen toteutuksen osallistujan muistiinpanot, josta löytyikin valmis koodi jolla laitteen sai toimimaan.
Ledien lisääminen pääsyn merkiksi
Päätin lisätä kytkentään kaksi lediä, vihreän ja punaisen. Vihreä valo kertoo että pääsy on sallittu, ja punainen kertoo että pääsy on kielletty.
Koodi
Alla on toimiva versio RFID-lukijakoodista johon on lisättynä pääsyindikaattoriledit.
/*
* RFID-lukijatesti kahdella ledi-indikaattorilla.
* Author: Joni Junni (Original version: http://suvikiviniemi.com/skivinie/arduino-testailuja-ibutton/)
* Date: 20.4.2013
*/
#include
OneWire ds(10); //onewire-laitteeni on siis pinnissä 12.
byte addr[8]; //tilaa iButtonin "sormenjäljelle". Otetaan vastaan bitteinä lukijalta.
int but[6] = {195,133,181,20,0,0};
//"sormenjälki" on tätä pidempi, mutta vain osa sen numeroista on yksilöllistä tunnistetta.
String keyStatus="";
int greenLed = 12;
int redLed = 11;
void setup(void) {
Serial.begin(9600);
pinMode(greenLed, OUTPUT);
pinMode(redLed, OUTPUT);
}
void loop(void) {
getKeyCode(); //tsekataan keyCoden avulla onko koodi ylipäänsä olemassa ja ds1990a-napin koodi
Serial.println();
if(keyStatus=="ok"){
//jos getKeyCode on lukenut oikeanlaisen napin, jatketaan tähän.
byte i;
for( i = 5; i >0; i--) {
Serial.print(" : ");
Serial.print(addr[i], DEC);
}
// Jos nappi vastaa määritettyä nappia, syttyy vihreä ledi
// Jos väärällä koodilla oleva nappi, vilkutetaan punaista lediä
if(addr[1] == but[0] && addr[2] == but[1] && addr[3] == but[2] && addr[4] == but[3]) {
digitalWrite(greenLed, HIGH);
delay(1500);
digitalWrite(greenLed, LOW);
} else {
digitalWrite(greenLed, LOW);
int j;
for(j = 5; j > 0; j--) {
digitalWrite(redLed, HIGH);
delay(500);
digitalWrite(redLed, LOW);
delay(200);
}
}
} else if (keyStatus!="") {
Serial.print(keyStatus);
}
delay(1000);
}
void getKeyCode(){
keyStatus="";
//jos lukija ei saa kontaktia (l. nappia ei ole), palataan alkuun jo tässä.
if ( !ds.search(addr)) {
//keyStatus="testi";
//tämän kirjoitin testiksi, ja totesinkin lukijan olevan väärässä pinnissä
//(ohjeen mukainen 2, ei koodin mukainen 12),
//kun ohjelma tulosti koko ajan pelkkää "testiä".
ds.reset_search();
return;
}
//en ymmärrä täysin, ilmeisesti onewiren koko tunnuksen kohta 7 on aina sama tms?
if ( OneWire::crc8( addr, 7) != addr[7]) {
keyStatus="CRC invalid";
return;
}
//tämä liittyy ds1990a-mallin perhetunnukseen -
//tämän ilmoituksen siis saisi, jos yrittäisi käyttää eri mallin nappia.
//Testata en voinut, ei ole muita nappeja.
if ( addr[0] != 0x01) {
keyStatus="not DS1990A";
return;
}
//jos ei palattu missään aiemmassa kohdassa,
//keyStatus on ok = lukija luki ds1990a-mallin napin.
keyStatus="ok";
ds.reset();
}
Lähteet
- PJRC: OneWire Library (http://www.pjrc.com/teensy/td_libs_OneWire.html)
- Suvi Kiviniemi: Arduino-testailuja: iButton (http://suvikiviniemi.com/skivinie/arduino-testailuja-ibutton/)
- The iButton garage-door opener (http://www.instructables.com/id/The-iButton-garage-door-opener-Arduino/)
- Tero Karvinen: Anturit, Androidin silmät-luento (http://terokarvinen.com/2012/aikataulu-prototyypin-rakentaminen-bus4tn007-4-loppukevat-2013)