Prototyypin rakentaminen: RFID-sensori Arduinolla


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.

kaaviokuva-kytkennöistä

Valmis-ratkaisu-ledeineen

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