Rapportfil - RTGkom.dk

Adgangskontrol med Arduino
Af Asbjørn Andreasen, Basthiann Bilde og Tobias Højsgaard Klasse 2.4 Roskilde Tekniske Gymnasium Formål med system
Vi har forsøgt at fremstille et system, der skal kunne forhindre eller tillade adgang til én eller anden vilkårlig funktion ved hjælp af Arduino Uno og RFID tags. I hvilken situation skal vores system bruges?
Et system, der kan forhindre eller tillade en person adgang kan bruges i mange forskellige scenarier. Vi tiltænker at vores system skal kunne bruges i parkeringssystemer, sådan at folk der benytter sig af parkeringshuset/kælderen dagligt kan anskaffe sig et “tag”, sådan at brugerne bare kan holde deres “tag” oppe for en sensor sådan at de ved hjælp af dette tag kan få adgang til parkeringshuset. Hvis en bruger så skal tilkobles systemet kan man gå til en administration og købe et abonnement til p­huset. Når man så for eksempel flytter, kan man få slettet sit tag fra systemet. Man kunne også indkode en “timer” for nogle udvalgte tags, sådan at de ville være granted access til systemet i en bestemt periode. Det er også dette princip der ligger bag “brobizz” sådan at folk kan køre lige igennem betalingsportene ved broer. Vi tænker også på et lignende system til metroen i de større byer, hvor folk så kan købe et tag som så giver adgang til perronerne ved et adgangssystem som på billedet til højre. Adgangskontrol­systemet kan selvfølgelig også bruges til døre, sådan at de kan låses op, når et tag bliver ført foran en læser på et panel ved siden af døren. 1 ud af 5 Hvordan skal det implementeres?
Arduino er en open source omprogrammérbar elektronisk platform. Arduino kan fornemme eksterne inputs og reagere på dem efter kode skrevet i den teksteditor, der kan downloades fra den officielle hjemmeside1 . RFID står for radio frequency identification. RFID tags er små kort eller plastik­agtige nøgleringe med magneter inde i dem, der er cirkulære i form. Begge disse kan ses i videoen eller på følgende side, der også lærer om hvordan man bruger RFID sammen med Arduino2 . Som træningssiden beskriver er RFID ligesom små nøgler med en unik kode af numre og bogstaver, der adskiller dem fra hinanden. De unikke eksterne inputs de kan levere er noget vi kan bruge til at fremstille vores adgangssystem. Vi fulgte en tutorial, som viser hvordan man kan forbinde en RFID læser til de elektroniske kredsløber i Arduino­brættet3 . På denne tutorial blev også beskrevet den kode man skulle bruge til at få systemet til at virke, da systemets funktionalitet afhænger af hvilke porte de forskellige ledninger er knyttet til og den software, der kører over det elektroniske bræt. Vi ændrede nogle få ting i koden. De ting vi ændrede var for det første ændrede vi SoftwareSerial rifd variablens værdi til at være SoftwareSerial(2,3), da koden ellers ikke ville virke. Vi indsatte også et stykke kode fra det blinke­eksempel, som følger med Arduino softwaren, ind under “void verifica()” funktionen, som tjekker hvorvidt tagget er blevet givet adgang og printer “Access Granted” eller “Access Denied” afhængig af om det er eller ej. LED’en på brættet vil kun blinke når adgangen er tilladt. Selve koden er delt op i fire dele. Vi har en setup del, en “add”, “delete” og “verification” funktion. Setupfunktionen starter det modul, som vi skal bruge (SoftwareSerial) sådan at det er klart til brug og skriver samtidig en besked i brugergrænsefladen. Formålet med tilføj­ og slet­funktionerne giver i det store hele sig selv, men virkemåden er lidt mere vanskelig. Helt i begyndelsen af koden deklarerer vi nogle variabler, som vi i løbet af funktionerne bruger. “msg” og “ID” som begge er strengvariabler. De to funktioner virker begge ved at bruge “msg”­variablen til at holde den kode, som vi får fra RFID­læseren. Funktionerne tjekker derefter koden og ser om denne kombination af numre og bogstaver er til stede i “ID”­variablen. Hvis den er, så gør tilføj­funktionen ikke noget mens slet­funktionen fjerner denne streng af numre og bogstaver fra “ID” variablen. Hvis den ikke er lægger 1
Arduionos oficielle hjemmeside: http://www.arduino.cc/ RFID tutorial reference: http://www.instructables.com/id/Arduino­Tutorials­RFID/ 3
How To Connect Arduino and RFID: http://www.instructables.com/id/Arduino­and­RFID­from­seeedstudio/ 2
2 ud af 5 tilføj­funktionen strengen til mens slet­funktionen ikke gør noget. Begge printer bagefter resultatet af deres søgning sammen med en besked og taggets ID. Potentielt kunne disse to funktioner kombineres til en enkelt, men da vi ønsker at kunne aktivere dem hver for sig er det mere hensigtsmæssigt at have dem delt op i to. Verifikations­funktionens virkemåde er beskrevet tidligere, da denne hedder “void verifica()” i koden. Vi har lavet en video, der viser at vi kan påkalde os slet­ og tilføj­funktionerne ved hjælp af to tags og at brættet blinker når adgangen bliver tilladt. Link til demonstrationsvideo: http://www.rtgkom.dk/~tobiasah13/Ad/Film.mp4 Kode:
#include <SoftwareSerial.h> #define ADD_TAG_CODE "400087190CD2" #define DEL_TAG_CODE "3E000C274055" SoftwareSerial rfid = SoftwareSerial(2, 3); String msg; String ID ; //string to store allowed cards //This is the setup function void setup() { Serial.begin(9600); Serial.println("Serial Ready"); rfid.begin(9600); Serial.println("RFID Ready"); } char c; void loop(){ while(rfid.available()>0){ c=rfid.read(); msg += c; 3 ud af 5 Serial.println(msg); Serial.println(msg.length()); } msg=msg.substring(1,13); if(msg.indexOf(ADD_TAG_CODE)>=0) add(); else if(msg.indexOf(DEL_TAG_CODE)>=0) del(); else if(msg.length()>10) verifica(); msg=""; } //This is the add function void add(){ Serial.print("What TAG do you wanna grant access?: "); msg=""; while(msg.length()<13){ while(rfid.available()>0){ c=rfid.read(); msg += c; } } if(ID.indexOf(msg)>=0) { Serial.println("\nAccess already granted for this card."); msg=""; } else{ Serial.print("Card: "); Serial.println(msg); ID += msg; ID += ","; Serial.print("ID: "); Serial.println(ID); msg=""; Serial.println("Access granted for this card."); } } //This is the delete function void del(){ msg=""; Serial.print("What TAG do you wanna deny access?: "); while(msg.length()<13){ 4 ud af 5 while(rfid.available()>0){ c=rfid.read(); msg += c; } } msg=msg.substring(1,13); if(ID.indexOf(msg)>=0){ Serial.println(msg); Serial.println("TAG found. Access for this card denied."); //ID.replace(card,""); int pos=ID.indexOf(msg); msg=""; msg += ID.substring(0,pos); msg += ID.substring(pos+15,ID.length()); ID=""; ID += msg; Serial.print("ID: "); Serial.println(ID); } else Serial.println("\nTAG not found or already denied"); msg=""; } //This is the verification function void verifica(){ msg=msg.substring(1,13); if(ID.indexOf(msg)>=0) { Serial.println("Access granted."); digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000);
// wait for a second digitalWrite(13, LOW); // turn the LED off by making the voltage LOW } else Serial.println("Access denied."); } 5 ud af 5