Radio Frequency Identification, eller RFID, är en spännande teknik som har blivit populär de senaste åren. Det skapar förmågan att märka något med ett mycket litet passivt chip som då tillåter fjärrläsning av informationen på det chipet. RFID-taggar används vanligtvis för säkerhetsdörrkort, identifiering för förlorade husdjur och mer nyligen närliggande fältkommunikation i smartphones.
I denna handledning ska jag förklara några grunder om hur RFID fungerar, beskriv några olika typer av RFID och visa hur du kan bygga en RFID garageportöppnare.
RFID är en riktigt cool teknik som använder energin i RFID-läsarsignalen för att driva taggen eller transpondern. Detta returnerar sedan en signal som innehåller innehållet i taggens minneskrets.
Det finns ett antal RFID-typer. Vissa taggar kan ha en liten mängd data skrivna till dem som kan läsas senare. Andra är så sofistikerade att de kräver att läsaren signalerar en krypteringsnyckel innan taggen kan avkoda och returnera innehållet. De flesta taggar innehåller dock bara permanenta unika ID-nummer. Ytterligare information om RFID finns på Wikipedia.
RFID-chipformat och frekvenser varierar kraftigt. Det finns en hel alfabet soppa av typer. Många smarta telefoner läser NFC- och MIFARE-format.
För det här projektet kommer jag dock att använda EM4100 125K Wiegand typ av chip. Denna typ av RFID använder billiga läsare och taggar som är den främsta orsaken till detta chip i mitt kit. Så länge du har kompatibla läsare och taggar, kommer dock typen av RFID inte att göra något för det här projektet.
I det här projektet använder jag en RFID-tagg och en Arduino för att öppna en garagedörr när en auktoriserad tagg är avkänd. Att använda en lågnivå-RFID-komponent är en ganska komplicerad uppgift, så vi använder ett breakout-kort som gör den låga nivån av att läsa och sänder taggkoden via seriella stift. Så fungerar de flesta RFID-brytbrädor. Denna handledning använder ett sådant breakout board.
För denna handledning kommer jag att bräda ut designen för garageportöppnaren och skapa ett funktionellt bevis på konceptet.
Processen är ganska enkel.
Först läser RFID-läsarkortet taggen och sänder koden till Arduino. Arduino läser sedan koden från den seriella anslutningen och jämför den med en lista över auktoriserade RFID-koder. Om taggen finns på den godkända listan kommer Arduino att dra en tapp hög för att ge 5V för att stänga ett relä. När reläet stängs ansluts anslutningarna till garageportens signalkontakter. Garagedörren öppnar sedan.
Använd databladet eller instruktionerna på RFID-läsaren, koppla in ström, jord, seriell och antennstiften. Nedan är pin-diagrammet för läsaren jag har. Vi använder Arduino-stift 2 och 3 för seriell kommunikation med RFID-kortet så att vi kan lämna stiften 0 och 1 för konsolutgång.
Följ dessa steg för att ansluta RFID-läsarkortet.
Min brödbrädopsinstallation visas nedan.
Lägg till reläet på brödbrädet. De två inre stiften kör den elektromagnet som stänger reläet. Du kan se i diagrammet nedan hur det går att påverka reläet att köra nuvarande genom stiften 3 till 7.
Detta är mitt brödbräda med reläet uppkopplat.
Breadboard med RFID och relä setupinrätta()
fungera. I det här exemplet: 38400
. Du borde se något så här:
RFID GDO V0.1
Taggläsning: 3D00CFBB80
Checksum: C9 - passerat.
3D00CFBB80
Dålig tagg. Gå bort.
Kopiera och klistra in ditt ID (3D00CFBB80
i det här exemplet) till koden i goodTags-listan. Observera, en annan kod kan vara på en ny rad så länge den omges av citat och har ett kommatecken efter det. En enda kodlista kan se ut så här:
char * goodTags [] =
"3D00CFBB80",
;
Klicka på uppladdning i Arduino IDE och öppna seriekontrollen för Arduino IDE genom att trycka på CTRL SHIFT M eller Välja menyn Verktyg> Seriell bildskärm.
Nu när du kör koden ser du något så här:
RFID GDO V0.1
Taggläsning: 3D00CFBB80
Checksum: C9 - passerat.
3D00CFBB80
Öppningsdörr!
Nedan följer ett foto på mig som testar RFID-taggen med reläet. Multimetern är ansluten till stift 1 och 9 i reläet så att det ska upptäcka kontinuitet när reläet stängs.
Med en multimeter ansluten kan du höra multimeterns pip för att indikera kontinuitet och sedan en mycket svag tink och reläet snäpper tillbaka öppet.
De flesta garageportöppnare fungerar helt enkelt genom att öppna när de stänger kontakten. När du trycker på knappen på väggen stänger du kontakten. På min garageportöppnare har jag terminaler där ledningarna från knappen är anslutna. Du kan se terminalerna markerade här:
Du har nu det grundläggande bevisbeviset för att öppna dörren med en våg av handen.
/ * RFID Garage dörröppnare provkod av Ben Miller @VMfoo ReadKey funktion inspirerad och lånad delvis från arduino lekplats exemplet: http://playground.arduino.cc/Code/ID12 * / // inkludera biblioteket SoftwareSerial så att du kan använd dess funktioner: #include // lämna maskinvarans seriella portar för debugging #define rxPin 2 // pin för att ta emot data från RFID-läsare #define txPin 3 // sändstift för softserial initialisering #define doorPin 4 // pin för att utlösa relä / / skapa en ny serieport NewSoftSerial RFIDPort = NewSoftSerial (rxPin, txPin); byte pinState = 0; // för inkommande seriell data int inkommandeByte = 0; // teckenuppsättning för värdet av RFID-taggen char tagValue [10]; // Vilka tagvärden är tillåtna char * goodTags [] = "3D00CFBB80", // "######", // lägg till en annan tagg genom att ersätta #: erna med din kod och uncommenting denna rad; // Beräkna antalet taggar i matrisen ovan int tagCount = sizeof (goodTags) / sizeof (goodTags [0]); tomrumsinställning () // definiera pinlägen för öppningsreläet pinMode (doorPin, OUTPUT); // Ange datahastigheten för SoftwareSerial-porten RFIDPort.begin (9600); Serial.begin (38400); // seriell övervakningshastighet Serial.println ("RFID GDO V0.1"); // hello world void loop () // loop och läs om (RFIDPort.available ()) if (readKey ()) // kolla värdet om (goodTag ()) // om det här är tillåtet openDoor (); else Serial.println ("Dålig tagg. Gå bort."); int goodTag () för (int i = 0; i < tagCount; i++) //walk through the tag list if(strcmp(tagValue, goodTags[i]) == 0) return 1; return 0; void openDoor() Serial.println("Opening Door!"); digitalWrite(doorPin, HIGH); delay(500); // half a second is plenty of time to let trigger the contact digitalWrite(doorPin, LOW); //to prevent "bounce" or secondary reads if the tag is still close to the reader //we delay 3 seconds delay(3000); int readKey() byte i = 0; byte val = 0; byte checksum = 0; byte bytesRead = 0; byte tempByte = 0; byte tagBytes[6]; // "Unique" tags are only 5 bytes but we need an extra byte for the checksum // char tagValue[10]; this is defined globaly to simplify code if((val = RFIDPort.read()) == 2) // Check for header bytesRead = 0; while (bytesRead < 12) // Read 10 digit code + 2 digit checksum if (RFIDPort.available()) val = RFIDPort.read(); // Append the first 10 bytes (0 to 9) to the raw tag value // Check if this is a header or stop byte before the 10 digit reading is complete if (bytesRead < 10) tagValue[bytesRead] = val; if((val == 0x0D)||(val == 0x0A)||(val == 0x03)||(val == 0x02)) break; // Stop reading // Ascii/Hex conversion: if ((val >= '0') && (val <= '9')) val = val - '0'; else if ((val >= 'A') && (val <= 'F')) val = 10 + val - 'A'; // Every two hex-digits, add a byte to the code: if (bytesRead & 1 == 1) // Make space for this hex-digit by shifting the previous digit 4 bits to the left tagBytes[bytesRead >> 1] = (val | (tempByte << 4)); if (bytesRead >> 1! = 5) // Om vi är i checksumbyte, checksumma ^ = tagBytes [bytesRead >> 1]; // Beräkna kontrollsumman ... (XOR); annat tempByte = val; // Spara första hex siffran först; bytesRead ++; // Klar att läsa nästa siffra // Skicka resultatet till värden ansluten via USB om (bytesRead == 12) // 12-siffrigt läs är komplett tagValue [10] = '\ 0'; // Noll-avsluta strängen Serial.print ("Tag read:"); för (i = 0; i<5; i++) // Add a leading 0 to pad out values below 16 if (tagBytes[i] < 16) Serial.print("0"); Serial.print(tagBytes[i], HEX); Serial.println(); Serial.print("Checksum: "); Serial.print(tagBytes[5], HEX); Serial.println(tagBytes[5] == checksum ? " -- passed." : " -- error."); Serial.println(tagValue); Serial.println(); return 1; //return value to indicate that we read something bytesRead=0; return 0;
I denna handledning skisserade jag grunderna för RFID-teknik och hur man utnyttjar det för dina egna projekt. Medan komponenter med låg nivå som läser RFID kan vara svåra för hobbyister att använda, tillåter RFID-brytbrädor att använda RFID mycket enkelt i projekt med Arduino eller till och med en Raspberry Pi via en seriell port. När ett ID läses från en tagg är det enkelt att agera på informationen. I det här exemplet aktiverade vi ett relä för att öppna en garageport.
För övrigt: