Radio Frequency Identification, of RFID, is een opwindende technologie die de laatste jaren aan populariteit heeft gewonnen. Het creëert de mogelijkheid om iets te taggen met een zeer kleine passieve chip die vervolgens op afstand lezen van de informatie op die chip mogelijk maakt. RFID-tags worden vaak gebruikt voor beveiligingskaarten met veegkaarten, identificatie voor verloren huisdieren en meer recent in de buurt van veldcommunicatie in smartphones.
In deze tutorial leg ik een paar basisprincipes uit over hoe RFID werkt, beschrijf enkele verschillende soorten RFID en laat zien hoe je een RFID-garagedeuropener kunt bouwen.
RFID is echt een coole technologie die de energie van het RFID-leessignaal gebruikt om de tag of transponder van stroom te voorzien. Dit geeft dan een signaal terug dat de inhoud van de geheugenchip van de tag bevat.
Er is een aantal RFID-typen. Op sommige tags kan een kleine hoeveelheid gegevens worden geschreven die later kunnen worden gelezen. Andere zijn zo geavanceerd dat de lezer een coderingssleutel moet signaleren voordat de tag kan decoderen en de inhoud ervan kan retourneren. De meeste tags bevatten echter eenvoudig permanente unieke ID-nummers. Meer informatie over RFID is beschikbaar op Wikipedia.
RFID-chipformaten en frequenties variëren aanzienlijk. Er is een hele alfabet soep van soorten. Veel smartphones lezen NFC- en MIFARE-indelingen.
Voor dit project ga ik echter het EM4100 125K Wiegand-type chip gebruiken. Dit type RFID maakt gebruik van goedkope lezers en tags, wat de belangrijkste reden is voor deze chip in mijn kit. Zolang u compatibele lezers en tags heeft, zal het type RFID echter niet van belang zijn voor dit project.
In dit project zal ik een RFID-tag en een Arduino gebruiken om een garagedeur te openen wanneer een geautoriseerde tag wordt gedetecteerd. Het gebruik van een RFID-component op een laag niveau is een vrij gecompliceerde taak, dus gebruiken we een breakout-kaart die de lage niveau-uitlezing uitvoert en de labelcode via seriële pinnen verzendt. Dit is hoe de meeste RFID-breakoutborden werken. Deze tutorial maakt gebruik van zo'n breakout-bord.
Voor deze tutorial zal ik het ontwerp voor de garagedeuropener uittekenen en een functioneel proof of concept maken.
Het proces is vrij eenvoudig.
Eerst leest de RFID-lezer de tag en verzendt de code naar de Arduino. De Arduino leest vervolgens de code van de seriële verbinding en vergelijkt deze met een lijst met geautoriseerde RFID-codes. Als de tag op de geautoriseerde lijst staat, trekt de Arduino een speld omhoog om 5V te leveren om een relais af te sluiten. Wanneer het relais sluit, verbindt het de aansluitpunten van de signaalcontacten van de garagedeur. De garagedeur gaat dan open.
Gebruik de datasheet of instructies op de RFID-lezer om de power-, ground-, serial- en antennepennen aan te sluiten. Hieronder staat het uitschakeldiagram van de lezer die ik heb. We gebruiken Arduino-pins 2 en 3 voor seriële communicatie met het RFID-board, zodat we pinnen 0 en 1 kunnen laten voor de console-uitvoer.
Volg deze stappen om de RFID-lezer aan te sluiten.
Mijn breadboard-opstelling wordt hieronder weergegeven.
Voeg het relais toe aan het breadboard. De twee interne pinnen lopen de elecromagne die het relais zal sluiten. U kunt in het onderstaande diagram zien hoe de lopende stroom door de pinnen 3 tot 7 het relais beïnvloedt.
Dit is mijn breadboard met het relais bedraad.
Breadboard met RFID en relay-instellingenopstelling()
functie. In dit voorbeeld: 38400
. Je zou zoiets als dit moeten zien:
RFID GDO V0.1
Tag gelezen: 3D00CFBB80
Checksum: C9 - geslaagd.
3D00CFBB80
Slechte tag. Ga weg.
Kopieer en plak je ID (3D00CFBB80
in dit voorbeeld) in de code in de lijst goodTags. Let op, een andere code kan op een nieuwe regel staan zolang deze omringd is door aanhalingstekens en een komma erna heeft. Een enkele codelijst ziet er ongeveer zo uit:
char * goodTags [] =
"3D00CFBB80",
;
Klik op uploaden in de Arduino IDE en open vervolgens de seriële monitor van de Arduino IDE door op te drukken CTRL SHIFT M of Selecteer het menu Hulpmiddelen> Seriële monitor.
Wanneer u nu de code uitvoert, ziet u zoiets als dit:
RFID GDO V0.1
Tag gelezen: 3D00CFBB80
Checksum: C9 - geslaagd.
3D00CFBB80
Opendeur!
Hieronder een foto van mij die de RFID-tag test met het relais. De multimeter is vastgehaakt aan pennen 1 en 9 van het relais, zodat het continuïteit moet detecteren wanneer het relais sluit.
Met een multimeter aangesloten, kunt u de piep van de multimeter horen om continuïteit aan te geven en vervolgens een zeer vage tink en het relais klikt terug open.
De meeste garagedeuropeners werken heel eenvoudig door ze te openen wanneer ze een contact gesloten hebben. Wanneer u op de knop op de muur drukt, sluit u het contact. Op mijn garagedeuropener heb ik aansluitingen waar de draden van de knop zijn aangesloten. U kunt de terminals hier gemarkeerd zien:
U hebt nu het basisbewijs van het concept voor het openen van de deur met een handgebaar.
/ * RFID Garagedeuropener voorbeeldcode door Ben Miller @VMfoo ReadKey-functie geïnspireerd en geleend gedeeltelijk vanuit het arduino-speelveldvoorbeeld: http://playground.arduino.cc/Code/ID12 * / // neem de SoftwareSerial-bibliotheek op zodat u kunt gebruik de volgende functies: # include // de seriële poorten van de hardware verlaten voor foutopsporing #define rxPin 2 // pin om gegevens van RFID-lezer te ontvangen #define txPin 3 // verzendpen voor softserialitialisatie #define doorPin 4 // pin om relais te activeren / / een nieuwe seriële poort instellen NewSoftSerial RFIDPort = NewSoftSerial (rxPin, txPin); byte pinState = 0; // voor binnenkomende seriële gegevens int incomingByte = 0; // tekenreeks voor de waarde van de tag-waarde van de RFID-tag [10]; // Welke tagwaarden zijn toegestaan char * goodTags [] = "3D00CFBB80", // "######", // voeg een andere tag toe door de #'s te vervangen door uw code en deze regel niet te vermelden; // Bereken het aantal tags in de array boven int tagCount = sizeof (goodTags) / sizeof (goodTags [0]); void setup () // definieer pin modes voor de opener relay pinMode (doorPin, OUTPUT); // stel de datasnelheid in voor de SoftwareSerial-poort RFIDPort.begin (9600); Serial.begin (38400); // seriële monitortarief Serial.println ("RFID GDO V0.1"); // hello world void loop () // loop en lees if (RFIDPort.available ()) if (readKey ()) // controleer tag waarde if (goodTag ()) // als dit is toegestaan openDoor (); else Serial.println ("Bad tag. Ga weg."); int goodTag () for (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) // Als we bij de checksumbyte zijn, controlesom ^ = tagBytes [bytesRead >> 1]; // Bereken de controlesom ... (XOR); else tempByte = val; // Sla eerst het eerste hexadecijfer op); bytesRead ++; // Klaar om het volgende cijfer te lezen // Verzend het resultaat naar de host die via USB is verbonden als (bytesRead == 12) // 12-cijferige leesregel is voltooid tagValue [10] = '\ 0'; // Null-beëindig de reeks Serial.print ("Tag read:"); voor (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;
In deze tutorial heb ik de basisbeginselen van RFID-technologie geschetst en hoe je deze kunt gebruiken voor je eigen projecten. Hoewel de componenten op een laag niveau die RFID lezen, voor hobbyisten moeilijk te gebruiken kunnen zijn, maken RFID-breakoutborden het mogelijk om RFID zeer eenvoudig te gebruiken in projecten met Arduino of zelfs een Raspberry Pi via een seriële poort. Zodra een ID uit een tag is gelezen, is het eenvoudig om op de informatie in te spelen. In dit voorbeeld hebben we een relais geactiveerd om een garagedeur te openen.
In aanvulling op: