RFID-lezer: praten over de technologie. RFID gemakkelijk gemaakt. Implementatie van uw eigen RFID-transponder en -lezer

RFID (Radio Frequency Identification) maakt gebruik van elektromagnetische velden om tags die aan objecten zijn bevestigd automatisch te identificeren en te volgen. Tags bevatten elektronisch opgeslagen informatie. Passieve tags verzamelen energie uit radiosignalen van een nabijgelegen RFID-lezer. Actieve tags hebben een lokale stroombron (zoals een batterij) en kunnen honderden meters van de lezer verwijderd zijn. In tegenstelling tot een streepjescode hoeft de tag niet in het zicht van het apparaat te zijn, zodat deze kan worden ingebed in het object dat wordt gevolgd. RFID is een van de methoden voor automatische identificatie en gegevensverzameling.

Sollicitatie

RFID-tags worden in veel industrieën gebruikt. Een RFID-lezer die tijdens de productie aan een voertuig is bevestigd, kan bijvoorbeeld worden gebruikt om de voortgang langs een assemblagelijn te volgen. Gelabelde geneesmiddelen kunnen via magazijnen worden gevolgd. Door RFID-microchips in vee te implanteren, kunnen dieren worden geïdentificeerd.

Doordat RFID-tags aan geld, kleding en eigendommen kunnen worden bevestigd, of bij dieren en mensen kunnen worden geïmplanteerd, wordt het leesvermogen vergroot persoonlijke informatie bellen zonder toestemming van de gebruiker serieus probleem privacy. Deze risico's hebben geleid tot de ontwikkeling van standaardspecificaties voor het aanpakken van kwesties op het gebied van de beveiliging van persoonsgegevens. Tags kunnen ook in winkels worden gebruikt om het afrekenen te versnellen en diefstal te voorkomen.

Verhaal

In 1945 vond Leon Theremin een luisterapparaat uit Sovjet-Unie, die radiogolven opnieuw uitzond met toegevoegde audio-informatie. Geluidstrillingen tijdens trillingen beïnvloedden het diafragma, waardoor de vorm van de resonator enigszins veranderde en de gereflecteerde radiofrequentie werd gemoduleerd. Hoewel dit apparaat een verborgen afluisterapparaat was en geen ID-tag, wordt het beschouwd als een voorloper van de USB RFID-lezer omdat het werd geactiveerd door audiogolven van externe bron. Transponders worden nog steeds gebruikt door de meeste operationele vliegtuigen. Voorheen werd soortgelijke technologie, zoals RFID-taglezers, in de Tweede Wereldoorlog regelmatig door de geallieerden en Duitsland gebruikt om vliegtuigen te identificeren.

Het apparaat van Mario Cardullo, gepatenteerd op 23 januari 1973, was de eerste echte voorloper van de moderne RFID, aangezien het een passieve radio-ontvanger met geheugen was. Het oorspronkelijke apparaat was passief en werd aangedreven door een polling-signaal. Het werd in 1971 gedemonstreerd aan de regering van New York City en anderen potentiële gebruikers en bestond uit een transponder met een 16-bits geheugen voor gebruik als betaald apparaat. Het kernoctrooi van Cardullo heeft betrekking op het gebruik van radiofrequenties, geluid en licht als transmissiemedia.

Gebruiksgebied

Het oorspronkelijke bedrijfsplan dat in 1969 aan investeerders werd gepresenteerd, demonstreerde de volgende toepassingen voor de RFID-lezer:

  • gebruik in transport (voertuigidentificatie, automatisch betalingssysteem, elektronisch kenteken, elektronisch manifest, routing voertuig, monitoring van de voertuigefficiëntie);
  • bankieren (elektronisch chequeboek, elektronisch creditcard);
  • personeel, automatische poorten, bewaking); medische industrie (identificatie, patiëntgeschiedenis).

Een vroege demonstratie van het gereflecteerde vermogen (gemoduleerde terugverstrooiing) van RFID-tags, zowel passief als semi-passief, werd uitgevoerd door Stephen Depp, Alfred Koelle en Robert Fryman in het Los Alamos National Laboratory in 1973. Draagbaar systeem draaide op 915 MHz en gebruikte 12-bits tags. Deze methode wordt gebruikt door de meeste moderne UHFID- en microgolf-RFID-lezers. In het moderne leven is er veel vraag naar dergelijke apparaten.

Specificatie

RFID maakt gebruik van tags die aan identificeerbare objecten zijn bevestigd. Houd er bij het maken van uw eigen RFID-lezer rekening mee dat tweewegradiozender-ontvangers, ondervragers of lezers genoemd, een signaal naar de tag sturen en de reactie ervan lezen. RFID-tags kunnen passief, actief of passief zijn. De actieve tag heeft een ingebouwde batterij en zendt periodiek zijn ID-signaal uit. De batterij passief (BAP) heeft een kleine batterij aan boord en wordt geactiveerd door de aanwezigheid van een RFID-lezer. Een passieve tag is goedkoper en kleiner omdat deze geen batterij heeft. In plaats daarvan gebruikt de tag een radiogolf die door de lezer wordt uitgezonden. Om een ​​passieve tag te laten werken, moet deze echter worden verlicht op een vermogensniveau dat ongeveer duizend keer sterker is dan om het signaal te verzenden. Dit heeft invloed op interferentie en instraling.

Dit project is op verzoek van een vriend gemaakt om op een deur van een opslagruimte te worden geïnstalleerd. Vervolgens zijn er op verzoek van vrienden en kennissen nog een aantal gemaakt. Het ontwerp bleek eenvoudig en betrouwbaar. Werken dit apparaat op deze manier: het laat alleen die RFID-kaarten door die eerder in het geheugen van het apparaat waren opgeslagen.

Belangrijkste kenmerken van de toegangscontroller:

RFID-kaarten EMmarin 125kHz-formaat

Microcontroller ATtiny13

Aantal kaarten/sleutelhangers - 10.
De knop "OPEN" is normaal gesproken open en beschermd tegen vastlopen.
Vergrendel de bedieningsuitgang, hoge stroom veldeffecttransistor, bedrijfsmodus vergrendelen (gaat tijdelijk aan).

Voeding - 12v.
Het verbruik in de standby-modus bedraagt ​​35 mA.
Aantal toegangskaarten/fobs - 10 st.
De communicatielengte met de knop "OPEN" bedraagt ​​10 meter.
Uitgangstype vergrendelingsregeling - open drain (krachtige veldeffecttransistor, stroom tot 2A).

Schematisch diagram van een toegangsbeperkingscontroller op RFID-kaarten 125 KHz (Em-Marin) voor 10 kaarten (op een ATtiny13-microcontroller):

Als u een elektromagnetisch slot moet besturen, moet u een uitgangsrelais met de vereiste contactgroep installeren.

Uiterlijk van de gemonteerde RFID-validator:

Fuse-bits instellen in PonyProg:

Bediening van het apparaat, download een video opgenomen door de auteur.
Een van de lezers publiceerde ook een video van het geassembleerde apparaat in actie:

Programmeerinstructies

Bedrijfsmodus - wanneer 12V wordt geleverd aan de controller, knippert de LED 1 Hz.
Programmeermodus - LED knippert 2 Hz.
Wanneer u op de knop "OPEN" drukt, klinkt er een reeks korte pieptonen terwijl het slot wordt geopend.

Geluidssignalen

1 kort signaal - de kaart of sleutelhanger wordt naar het geheugen van de controller geschreven.
2 korte pieptonen - de kaart of sleutelhanger is al opgeslagen in het geheugen van de controller.
5 korte pieptonen - verlaat de programmeermodus.
1 lange piep- het sleutelkaartgeheugen wordt uit de controller gewist.
Continu korte signalen- kaart-/sleutelgeheugen is vol, maximaal 10 stuks. (vereist dat de stroom naar de controller wordt uitgeschakeld).

Registratie van MASTER CARD en slotopeningstijd

1 - Schakel de voeding van de controller uit.
2 - Druk op de knop "OPENEN".
3 - Terwijl u de knop ingedrukt houdt, sluit u na 5 seconden de stroom aan op de controller. de controller “BEEPS”, de LED knippert met een frequentie van 2 Hz.
4 - Laat de knop los.
5 - Breng een kaart of sleutelhanger naar de leesruimte. Er klinkt een enkel geluid piep, De masterkaart of sleutelhanger wordt GEREGISTREERD en de openingstijd van het slot van 1 seconde wordt geregistreerd.

6 - Houd de kaart of sleutelhanger in het leesgedeelte en tel de geluidssignalen. De hoeveelheid bepaalt de benodigde tijd om het slot te openen, in stappen van 1 seconde, maar niet meer dan 32 seconden.
7 - Schakel de stroom naar de controller uit of pauzeer gedurende 30 seconden.

Alle geheugen van sleutelhangerkaarten wissen

1 - Bedrijfsmodus.
2 - Druk op de knop "OPEN" en houd deze ingedrukt, breng de MASTER-kaart of sleutelhanger naar de lezer en houd deze ingedrukt. Na 5 seconden klinkt een lange pieptoon - het geheugen van de kaarten/sleutelhangers wordt gewist.
3 - Laat de knop los en verwijder de kaart of sleutelhanger.

Na een aantal jaren aan RFID-onderwerpen te hebben gewerkt en verschillende lezers te hebben ontwikkeld voor transpondermodellen van populaire standaarden zoals Mifare, EMMARINE, TIRIS... begon ik vaak verbaasd te zijn over deze vraag - letterlijk vorig jaar Verschillende soorten emulators onder de tags van populaire protocollen en verschillende sleutel-/sleutelhangerkopieerapparaten zijn enorm populair geworden.

Gezien het grote aantal in de handel verkrijgbare speciale chips voor populaire RFID-protocollen en goedkope lezers, het wijdverbreide gebruik van apparatuur zoals digitale oscilloscopen, sniffers en spectrumanalysatoren, deze vraag is voor veel ontwikkelaars relevanter geworden. Toen besloot ik voor een van de projecten een uitwisselingsprotocol te maken dat afweek van de hierboven beschreven standaarden.

Ongetwijfeld dit idee lost niet op mondiale problemen beveiliging nieuw systeem en kan door andere ontwikkelaars worden geanalyseerd als ze over de apparatuur beschikken, maar het punt is dat niets hiervan hetzelfde is als bestaande normen en met alle hardware van kopieerapparaten kun je zo'n algoritme niet snel kopiëren en opnieuw maken. Natuurlijk vergelijkbaar systeem hier niet gepresenteerd volledige oplossing beveiligingsproblemen, maar hoe RFID aan te passen gesloten systeem. Een goed pluspunt over de kwestie van de veiligheid, onder andere soortgelijke draadloze systemen is de laagfrequente RFID-technologie zelf: tags kunnen niet over een lange afstand worden gelezen.

Passieve tags hebben een vrij laag vermogen en vereisen een redelijk krachtige lezergenerator om ze van stroom te voorzien; de eigenaardigheden van de voortplanting van radiogolven op deze frequenties beperken ook de werkingslimieten van dit systeem. Het daadwerkelijke leesbereik van transponders overschrijdt zelden 20 cm voor 125 KHz-standaarden zoals EmMarine, volgens de EM4001-standaard voor andere protocollen zoals Mifare (13,56 MHz) kan het langer zijn (1,5 meter voor iso15693). U kunt een grotere leesafstand voor laagfrequente lezers bereiken door respectievelijk de spoelgrootte, de voedingsspanning en het vermogen van de lezer te vergroten. Dergelijke systemen zijn echter omvangrijk en doorgaans moeilijk draagbaar te maken. In de regel worden dergelijke systemen alleen permanent geïmplementeerd – bijvoorbeeld voor auto's.

Dus nu over de daadwerkelijke architectuur van ons RFID-systeem. Voor de experimenten werd gekozen voor de atmel atmega8-controller. Voor de doeleinden van de transponderproductie lijkt dit overdreven. Echter, binnen in dit geval De primaire taak van het ontwikkelen van een nieuwe interface op een kant-en-klaar ontwikkelbord met atmega werd opgelost, gevolgd door het porten van deze code naar goedkopere controllers zoals tiny13. Voor de transponder werd het werkingsalgoritme gebouwd op basis van de PWM-generatiemodus met behulp van timer T1 in CTC-modus met onderbreking en reset in samenwerking met OCR1. Gegevens voor transpondertransmissie worden uit de EEPROM gelezen wanneer de controller wordt ingeschakeld. In totaal verzendt de transponder 10 bytes. De inhoud van de transponder-EEPROM is te zien op Figuur 1. De eerste byte 0xE7 is een vereiste pakketheader, aangezien de aanwezigheid ervan eerst wordt gecontroleerd wanneer de lezer het pakket parseert.

De eerste 8 bytes zijn de inhoud van het transponderpakket, de laatste 2 bytes bevatten de CRC16-controlesom van de eerste acht bytes van het pakket. In onze transponder zijn bijvoorbeeld de volgende gegevens vastgelegd: pakket 0xE7, 0x05, 0xE8, 0x93, 0x43, 0x7F, 0x20, 0xFF en dienovereenkomstig controlesom 0xF5 0xA8. Om uw eigen unieke transponder te maken, moet u, naast de eerste byte 0xE7, de volgende zeven bytes in de EEPROM schrijven en vervolgens de controlesom voor de eerste acht bytes berekenen. Schrijf hierna twee CRC16-bytes aan het einde van het pakket naar EEPROM. We laten de eerste byte ongewijzigd: 0xE7. Wanneer de transponder wordt ingeschakeld, worden de gegevens van deze bytes opgesplitst in bits en gecodeerd met de juiste pulslengte in overeenstemming met de waarde van het OCR-register. Voor transmissie worden 2 frequenties van 2 KHz en 5 KHz gebruikt om logische “0” en “1” uit te zenden. Bovendien worden de gegevens gescheiden door synchronisatiepulsen - pakketstartmarkeringen.

Afb.1 Inhoud van het transponderpakket.


Afb.2 Transpondertransmissiedump op het virtuele oscilloscoopscherm.

Het transponderdiagram is te zien op Figuur 3. De frequentie van de masteroscillator is 8 MHz. Voeding controller +5V. Je kunt een mega8-controller gebruiken die is gemarkeerd met "L", waarna de stroom kan worden geleverd door een 3V-lithiumbatterij (parameters voor zo'n chip zijn +2,7.... +3,5). In plaats van deze transistor kunt u elke andere NPN-transistor met laag vermogen gebruiken. De transponderspoel is met draad van 0,22 mm op een doorn met een diameter van 50 mm gewikkeld en heeft 50 windingen. Op op dit moment de transponder wordt actief gemaakt - met externe voeding. In de volgende fase is het de bedoeling om een ​​passieve versie van de transponder te maken, wat vrij eenvoudig is: maak een isolatie voor de stroom van deze spoel, voeg gelijkrichtbrugdiodes en een stabilisator toe.


Afb.3 Transpondercircuit.

Laten we het nu hebben over het leescircuit voor deze transponder. De schakeling werd aangepast op basis van de eerder gebruikte EMMARINE-kaartlezer. Een deel van het circuit met een 74hc4060 generator is te vinden op in dit stadium voel je vrij om te verwijderen, aangezien we voorlopig een actief label gebruiken. We zullen dit deel van het circuit echter later nodig hebben, wanneer we een passieve tag maken en we stroom van de lezer moeten krijgen. Voor het overige verschilt het circuit niet significant van het leescircuit voor EMMARINE: passieve piekdetector - filter - versterker - comparator. De schakeling heeft de grootst mogelijke eenvoud en maakt het mogelijk om transpondergegevens op een afstand van 10-12 cm uit te lezen met goed afgestemde circuits.

Je kunt de schakeling nog verder vereenvoudigen, door alleen een detector en een filter over te laten, en één transistor aan de uitgang te plaatsen die de rol van comparator zal spelen, maar dat heb ik niet gedaan. Aan de uitgang ontvangen we een binair rechthoekig signaal in overeenstemming met de gecodeerde pulsduur die door de transponder wordt verzonden. De toegestane afwijkingen van elementwaarden waarbij het circuit operationeel is, is 5-10%. Voeding voor de controller en opamp +5V. De kwartsfrequentie van de master-oscillator van de controller is 12 MHz. De comparatoruitgang op LM358 is verbonden met de externe interrupt-pin van de IN0-controller. Het controllerprogramma is geconfigureerd om een ​​interrupt aan te roepen bij een stijgende flank op de externe interrupt-pin INTO. De interrupthandler controleert de klokpulsen en controleert vervolgens de pakketkop en schrijft de inhoud naar de controllerbuffer. De gegevens van de gelezen pakketten worden via de RS232-interface naar de pc verzonden. Geef aan om de terminal te configureren volgende parameters: snelheid 57,6Kb/s, 8 databits, 1 stopbit, geen pariteit.

Bij ontvangst van een pakket berekent de controller de controlesom van de ontvangen bytes en verzendt de gegevens naar de terminal (pakket en CRC). Als er een match is controlesommen berekend door de controller en ontvangen in het pakket, wordt een signaal uitgevoerd naar de PORTB.0 (14) pin van de controller (LED1 in het diagram). Kan worden aangesloten dit punt een tweeter met ingebouwde generator of een LED via een weerstand. Bij het lezen van de juiste sleutel schakelt de controller externe interrupts uit en maakt een vertraging van 1 seconde vóór de volgende meting. Er is ook een bedieningsmodus voor deze lezer als RFID-basisprincipes kasteel Om dit te doen, is het noodzakelijk om de volledige transponderdumpbytes in de EEPROM van de lezercontroller te schrijven - 10 bytes. Gegevens worden op dezelfde manier naar de EEPROM van de lezer geschreven als naar de EEPROM van de transponder. In dit geval, wanneer de volgende transponder wordt gelezen en deze overeenkomt met wat er in de EEPROM van de lezer is geschreven, wordt er een signaal uitgevoerd naar de PORTB.1 (15) pin van de controller (LED2 in het diagram). Op dit punt kunt u een LED aansluiten via een weerstand of een uitgangsschakelaar (transistor) op een relais aandrijving. Nu hebben we een RFID-slot voor een specifieke sleutel en een gewone lezer in één fles.


Afb.4 Diagram van RFID-taglezer. (vergroot diagram)

Laten we dus de tussenresultaten samenvatten. Voor deze reader hebben wij onze eigen reader en transponder gemaakt. Wij hebben onze apparatuur beschermd tegen buitenlandse apparaten werken met populaire RFID-protocollen. De volgende stap is het maken van een passieve tag voor onze lezer, zoals zij dat ook doen bekende fabrikanten industriële transponders en het porten van apparatuurcode naar goedkopere controllermodellen. In het archief voeg ik de firmware voor de transponder en lezer toe aan het artikel.

Firmware downloaden:
U heeft geen toegang om bestanden van onze server te downloaden

Vandaag zal ik het hebben over de RFID-module RC522, gebaseerd op de MFRC522-chip. Voeding 3,3V, detectiebereik tot 6cm. Ontworpen voor lezen en RFID-records tags met een frequentie van 13,56 MHz. De frequentie is in dit geval erg belangrijk, omdat RFID-tags in drie frequentiebereiken bestaan:


  • LF-bereikmarkeringen (125-134 kHz)

  • HF-bandtags (13,56 MHz)

  • UHF-bandtags (860-960 MHz)

Deze specifieke module werkt met HF-bandtags, in het bijzonder met het MIFARE-protocol.

Om met de module te werken kunt u gebruik maken van standaard bibliotheek Inclusief RFID Arduino-IDE Er is echter nog een andere bibliotheek die speciaal voor deze module is geschreven: MFRC522 (1 MB). Beide bibliotheken zijn best handig, maar MFRC522 heeft meer speciale functies, waardoor de uiteindelijke programmacode zoveel mogelijk kan worden beperkt.

Verbinding

Sommige mensen zullen een probleem tegenkomen: de naam van de pinnen in de meeste lessen en handleidingen komt mogelijk niet overeen met de pin-out op uw module. Als de schetsen de SS-pin aangeven, maar uw module heeft deze niet, dan is deze hoogstwaarschijnlijk gemarkeerd als SDA. Hieronder geef ik een module-aansluittabel voor de meest voorkomende printplaten.

MFRC522 Arduino Uno Arduino Mega Arduino Nanov3

ArduinoLeonardo/Micro

Arduino ProMicro
RST 9 5 D9 RESET/ICSP-5 RST
SDA(SS) 10 53 D10 10 10
MOSI 11 (ICSP-4) 51 D11 ICSP-4 16
MISO 12 (ICSP-1) 50 D12 ICSP-1 14
SCK 13 (ICSP-3) 52 D13 ICSP-3 15
3,3V 3,3V 3,3V Stabilisator 3,3V Stabilisator 3,3V Stabilisator 3,3V
GND GND GND GND GND GND

De SS(SDA)- en RST-controlepinnen zijn gespecificeerd in de schets, dus als je bord anders is dan degene die ik in mijn voorbeelden zal gebruiken, en ik gebruik UNO R3, geef dan de pinnen aan uit de tabel aan het begin van de schets :


#define SS_PIN 10 #define RST_PIN 9

Voorbeeld nr. 1: Het kaartnummer lezen

Laten we eens kijken naar een voorbeeld uit de RFID-bibliotheek - cardRead. Het geeft geen gegevens van de kaart weer, maar alleen het aantal, wat meestal voldoende is voor veel taken.


#include #include #define SS_PIN 10 #define RST_PIN 9 RFID rfid(SS_PIN, RST_PIN); // Gegevens over het kaartnummer worden opgeslagen in 5 variabelen, we zullen ze onthouden om te controleren of we zo'n kaart al hebben gelezen int serNum0;

int serNum1;

int serNum2; int serNum3; int serNum4; void setup() ( Serial.begin(9600); SPI.begin(); rfid.init(); ) void loop() ( if (rfid.isCard()) ( if (rfid.readCardSerial()) ( // Vergelijk het kaartnummer met het nummer van de vorige kaart if (rfid.serNum != serNum0 && rfid.serNum != serNum1 && rfid.serNum != serNum2 && rfid.serNum != serNum3 && rfid.serNum != serNum4) ( / * Als de kaart nieuw is, lees dan */ Serial.println("Kaart gevonden"); serNum0 = rfid.serNum; = rfid.serNum; // Druk het kaartnummer af Serial.println("Kaartnummer: "); .print(rfid.serNum,DEC); Serial.print(", "); Serial.print(rfid.serNum,DEC); Serial.print(rfid.serNum,DEC); Serial.print(", "); Serieel.print(rfid.serNum,DEC); Serieel.print("Hex: "); .print(", "); Serieel.print(rfid.serNum,HEX);


Serieel.print(rfid.serNum,HEX);

Serieel.print(", ");

Serieel.print(rfid.serNum,HEX);


#include #include #define RST_PIN 9 // #define SS_PIN 10 // MFRC522 mfrc522(SS_PIN, RST_PIN); // Maak een MFRC522 instance void setup() (Serial.begin(9600); // Initialiseer de seriële poortmonitor terwijl (!Serial); // Doe niets totdat deze open is (voor Arduino op de ATMEGA32U4-chip) SPI.begin( ); // Initialiseer de SPI-bus mfrc522.PCD_Init(); RFID-module ShowReaderDetails(); // Gegevens afdrukken over de MFRC522-module Serial.println(F("Scan PICC om UID, type en datablokken te zien...")); ) void loop() ( // Op zoek naar nieuwe kaart if (! mfrc522.PICC_IsNewCardPresent()) ( return; ) // Selecteer een van de kaarten if (! mfrc522.PICC_ReadCardSerial()) ( return; ) // Voer gegevens uit van de kaart mfrc522.PICC_DumpToSerial(&(mfrc522.uid) ); ) void ShowReaderDetails() ( // Haal het moduleversienummer op byte v = mfrc522.PCD_ReadRegister(mfrc522.VersionReg); Serial.print(F("MFRC522 softwareversie: 0x")); Serial.print(v, HEX); if (v == 0x91) Serial.print(F(" = v1.0")); else if (v == 0x92) Serial.print(F(" = v2.0")); ")); Serial.println(""); // Wanneer we 0x00 of 0xFF ontvangen, wordt de gegevensoverdracht verbroken als ((v == 0x00) || (v == 0xFF)) ( Serial.println( F(" WAARSCHUWING: Communicatiefout, is de MFRC522 goed aangesloten?"));

Als het vorige voorbeeld zonder fouten werkte, zou dit ook geen probleem moeten zijn. Hoewel de metropas, die in het vorige voorbeeld zonder problemen het kaartnummer doorgaf, in deze een niet-detecteerbaar gegevenstype bleek te hebben en de module niets anders kon lezen dan het kaartnummer.

Als gevolg hiervan krijgen we, nadat we de gegevens van de kaart hebben gelezen, het type, de identificatie en de gegevens uit 16 geheugensectoren. Opgemerkt moet worden dat MIFARE 1K-standaardkaarten uit 16 sectoren bestaan, elke sector uit 4 blokken bestaat en elk blok 16 bytes aan gegevens bevat.


Voorbeeld nr. 3: Een nieuwe identificatie naar de kaart schrijven

In dit voorbeeld kijken we naar het wijzigen van de kaartidentificatie (UID). Het is belangrijk om te weten dat niet alle kaarten het wijzigen van de ID ondersteunen. De kaart kan herschrijfbaar zijn, maar dat betekent alleen dat de gegevens herschrijfbaar zijn. Helaas ondersteunden de kaarten die ik in mijn handen had het herschrijven van UID niet, maar ik zal hier voor de zekerheid de schetscode verstrekken.


#include #include /* Stel hier een nieuwe UID in */ #define NEW_UID (0xDE, 0xAD, 0xBE, 0xEF) #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); MFRC522::MIFARE_Key-sleutel; void setup() ( Serial.begin(9600); while (!Serial); SPI.begin(); mfrc522.PCD_Init(); Serial.println(F("Waarschuwing: dit voorbeeld overschrijft de UID van uw UID-verwisselbare kaart, wees voorzichtig!"); voor (byte i = 0; i< 6; i++) { key.keyByte[i] = 0xFF; } } void loop() { if (! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial()) { delay(50); return; } // Считываем текущий UID Serial.print(F("Card UID:")); for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); } Serial.println(); // Записываем новый UID byte newUid = NEW_UID; if (mfrc522.MIFARE_SetUid(newUid, (byte)4, true)) { Serial.println(F("Wrote new UID to card.")); } // Halt PICC and re-select it so DumpToSerial doesn"t get confused mfrc522.PICC_HaltA(); if (! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial()) { return; } // Считываем данные с карты Serial.println(F("New UID and contents:")); mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); delay(2000); }

Voorbeeld nr. 4: Gegevens naar een kaart schrijven

Hier is eindelijk waar we al zo lang mee bezig zijn: het vastleggen van gegevens op de kaart. Het leukste aan het werken met de module is de mogelijkheid om een ​​kopie te maken van een bestaande kaart, iets toe te voegen of te wijzigen, dit is veel interessanter dan alleen maar lezen.

Laten we een van de datablokken op de kaart wijzigen:


#include #include #define RST_PIN 9 #define SS_PIN 10 MFRC522 mfrc522(SS_PIN, RST_PIN); MFRC522::MIFARE_Key-sleutel; void setup() ( Serial.begin(9600); while (!Serial); SPI.begin(); mfrc522.PCD_Init(); // Bereid de sleutel voor // gebruik de sleutel FFFFFFFFFFFFh die de standaard is voor blanco kaarten voor (byte i = 0; i< 6; i++) { key.keyByte[i] = 0xFF; } Serial.println(F("Scan a MIFARE Classic PICC to demonstrate read and write.")); Serial.print(F("Using key (for A and B):")); dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE); Serial.println(); Serial.println(F("BEWARE: Data will be written to the PICC, in sector #1")); } void loop() { // Ждем новую карту if (! mfrc522.PICC_IsNewCardPresent()) return; // Выбираем одну из карт if (! mfrc522.PICC_ReadCardSerial()) return; // Показываем подробности карты Serial.print(F("Card UID:")); dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size); Serial.println(); Serial.print(F("PICC type: ")); byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); Serial.println(mfrc522.PICC_GetTypeName(piccType)); // Проверяем совместимость if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI && piccType != MFRC522::PICC_TYPE_MIFARE_1K && piccType != MFRC522::PICC_TYPE_MIFARE_4K) { Serial.println(F("This sample only works with MIFARE Classic cards.")); return; } // В этом примере мы используем первый сектор данных карты, блок 4 byte sector = 1; byte blockAddr = 4; byte dataBlock = { // Данные, которые мы запишем на карту 0x01, 0x02, 0x03, 0x04, // 1, 2, 3, 4, 0x05, 0x06, 0x07, 0x08, // 5, 6, 7, 8, 0x08, 0x09, 0xff, 0x0b, // 9, 10, 255, 12, 0x0c, 0x0d, 0x0e, 0x0f // 13, 14, 15, 16 }; byte trailerBlock = 7; byte status; byte buffer; byte size = sizeof(buffer); // Аутентификация Serial.println(F("Authenticating using key A...")); status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } // Показываем текущие данные сектора Serial.println(F("Current data in sector:")); mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector); Serial.println(); // Читаем данные из блока Serial.print(F("Reading data from block ")); Serial.print(blockAddr); Serial.println(F(" ...")); status = mfrc522.MIFARE_Read(blockAddr, buffer, &size); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Read() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); } Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":")); dump_byte_array(buffer, 16); Serial.println(); Serial.println(); // Аутентификация Serial.println(F("Authenticating again using key B...")); status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } // Записываем данные в блок Serial.print(F("Writing data into block ")); Serial.print(blockAddr); Serial.println(F(" ...")); dump_byte_array(dataBlock, 16); Serial.println(); status = mfrc522.MIFARE_Write(blockAddr, dataBlock, 16); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Write() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); } Serial.println(); // Читаем данные снова, чтобы проверить, что запись прошла успешно Serial.print(F("Reading data from block ")); Serial.print(blockAddr); Serial.println(F(" ...")); status = mfrc522.MIFARE_Read(blockAddr, buffer, &size); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Read() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); } Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":")); dump_byte_array(buffer, 16); Serial.println(); Serial.println(F("Checking result...")); byte count = 0; for (byte i = 0; i < 16; i++) { if (buffer[i] == dataBlock[i]) count++; } Serial.print(F("Number of bytes that match = ")); Serial.println(count); if (count == 16) { Serial.println(F("Success:-)")); } else { Serial.println(F("Failure, no match:-(")); Serial.println(F(" perhaps the write didn"t work properly...")); } Serial.println(); // Выводим данные Serial.println(F("Current data in sector:")); mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector); Serial.println(); mfrc522.PICC_HaltA(); mfrc522.PCD_StopCrypto1(); } void dump_byte_array(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer[i] < 0x10 ? " 0" : " "); Serial.print(buffer[i], HEX); } }

En als resultaat krijgen we een kaart met een aangepast datablok:


Nu u blokken met kaartgegevens heeft leren lezen en schrijven, kunt u experimenteren met de tags die u waarschijnlijk heeft: passen, reiskaarten openbaar vervoer. Probeer gegevens van deze kaarten te lezen en te schrijven, een paar dubbele passen kunnen nooit kwaad, toch?)

Dat is alles, abonneer u en volg de publicaties. De volgende keer zal ik het je vertellen en laten zien hoe je een standaard gebruikt karakterweergave 1602 voegt aangepaste tekens toe, waardoor in wezen afbeeldingen aan het scherm worden toegevoegd.

  • Programmeren van microcontrollers
  • Zoals u weet, gebruiken veel toegangssystemen RFID-kaarten van de EM-Marin-standaard met een frequentie van 125 KHz. De intercom bij mij thuis was geen uitzondering. Eén probleem: het zou leuk zijn om te leren hoe je dergelijke kaarten kunt kopiëren, omdat de prijskaartjes voor het kopiëren ervan niet bemoedigend zijn. Er zijn natuurlijk nogal wat kopieerprogramma's online (en de Chinezen verkopen hun kopieermachines voor centen - ze zetten echter vaak hun wachtwoord op de schijven tijdens het kopiëren), maar waarom zou je niet je eigen kopieerapparaat bouwen? Daar gaat onderstaand artikel over.

    Het is de moeite waard om met de ontwikkeling van een kopieerapparaat te beginnen door uit te zoeken waarheen dergelijke markeringen kunnen worden gekopieerd? Na het lezen van de forums kun je ontdekken dat de meest voorkomende blanco's voor kopiëren T5577, T5557, EM4305 zijn.

    Nu hebben we een diagram nodig. Laten we het analoge deel van zo'n kopieerapparaat van RECTO nemen en aansluiten op de atmega8-microcontroller. Laten we een niveau-omzetter toevoegen voor aansluiting op een COM-poort op basis van max232 (degenen die dat willen kunnen ST232 of iets anders gebruiken om verbinding te maken via USB, maar ik heb een COM-poort op mijn computer, evenals een USB-COM-adapter, dus dat is mijn taak hield geen stand).

    Je krijgt dit diagram:

    Hoe is ze? Dubbele emittervolger, oscillerend circuit, detector en RC-filters. Vanwege het feit dat RC-filters verschillende tijdconstanten hebben, is het door het vergelijken van de spanningsniveaus tussen trappen mogelijk om de verandering in het RFID-tagsignaal te isoleren. Deze taak wordt afgehandeld door de comparator die in atmega8 is ingebouwd. Het genereren van een 125 KHz-signaal wordt verzorgd door de PWM-controller die in atmega8 is ingebouwd.

    De combinatie van een RFID-tag en een lezer vormt een transformator, waarbij de tag de secundaire wikkeling is. Informatie wordt door de tag verzonden door de belasting van de secundaire wikkeling te veranderen. Als gevolg hiervan verandert de stroom in de leesspoel (primaire wikkeling). Het bovenstaande analoge deel van het circuit is verantwoordelijk voor het isoleren van deze stroompulsen. Oscillerend circuit hoeft te worden geconfigureerd maximale spanning V controlepunt bijvoorbeeld het opwinden/opwinden van de windingen van een spoel. Het is waar dat ze zeggen dat het beter is om een ​​spanning te hebben die iets lager is dan het maximum - het werkt stabieler. Ik heb ongeveer 40 V op mijn testpunt.

    Het gekopieerde merk maakt gebruik van Manchester-codering. Om te decoderen deze code, volstaat het om driekwart van de bitslotperiode over te slaan voor elke verandering in de signaalflank en, op basis van de signaaldaling die daarop volgt, de bitwaarde vast te leggen die overeenkomt met de signaalwaarde na de signaaldaling. Bij het decoderen is het de moeite waard een venster in te stellen waarbinnen de signaaldaling moet optreden - niet meer dan de helft van de periode van het bitslot.

    Decoderingsmethode Manchester-codering en ik heb de code hiervoor van Shads overgenomen. Het was natuurlijk mogelijk om er zelf een te schrijven, maar ik had haast met het lanceren van het kopieerapparaat - ik wilde er zeker van zijn dat het circuit werkte en dat tags werden geaccepteerd. Dit fragment bleef dus in de kopieercode zitten. Het bleek ook dat mijn comparator omgekeerd is geconfigureerd dan de decoderingscode nodig heeft. Heb het veranderd in de code. We hebben dus reeksen nullen en enen. Hoe kan ik de kaartcode van hen krijgen?

    En het is heel eenvoudig. Laten we aannemen dat het kaartnummer volgens knabbels de vorm heeft ABCDEFGHIJ. De kaart laat dit zien:

    1) Negen eenheden aan het begin;
    2) Knabbel A;
    3) Nibble-pariteit A (1 bit);
    4) Knabbel B;
    5) Nibble-pariteit B (1 bit);

    16) Knabbel I;
    17) Nibble-pariteit I (1 bit);
    18) Knabbel J;
    19) Nibble-pariteit J (1 bit);
    20) Kolompariteitsnibble voor nibbles A B C D E F G H I J;
    21) Beetje 0.

    We lezen alle 64 bits, decoderen en krijgen 40 bits van de kaartcode. Het is logisch dat als we zelf zo'n code uitgeven en de spoel van de kaart die aan de lezer is bevestigd, sluiten, we een kaartemulator krijgen. Maar nu zijn we niet in hem geïnteresseerd.

    We hebben geleerd een kaart te lezen, maar hoe kunnen we gegevens naar de kaart overbrengen? Om dit te doen, hoeft u alleen maar de 125 KHz-frequentie in of uit te schakelen in overeenstemming met het communicatieprotocol met de kaart. Tijdens de “stilte” van de lezer wordt de kaart gevoed door opgeslagen energie.

    De T5557/T5577 blanco's zijn volledig compatibel met elkaar wat betreft opnameprotocollen, maar ze hebben enigszins verschillende minimum- en maximale tijden pulsen (gelukkig overlappen de tijden van T5557 met T5577). De EM4305 heeft een ander opnameprotocol.

    Om T5557 op te nemen, heb ik de code BolshoyK gebruikt. De onderstaande tabel toont de signaalparameters voor de T5557-sleutelhanger.

    De opname begint met het StartGape-signaal. U moet het 125 KHz-signaal gedurende ongeveer 300 µs uitschakelen. Dit is een signaal naar de kaart dat er nu gegevens naar de kaart worden overgedragen. Vervolgens moet u de informatie naar de blanco overbrengen. De codering van de verzonden gegevens is hetzelfde Manchester.

    De T5557/T5577 en EM4305 blanco's zijn multifunctioneel en kunnen verschillende soorten modulaties, ondersteuningswachtwoorden en nog veel meer. Elke schijf aan boord heeft een set 32-bits blokken. Het doel van deze blokken is anders. In sommige gevallen wordt de sleutelcode uitgegeven (dit duurt twee blokken). In andere - configuratie. Ten derde de identificatie van de fabrikant. We zullen beperkte functionaliteit gebruiken, dus degenen die willen begrijpen wat al deze stukjes betekenen, kunnen de documentatie voor de lege plekken bekijken (ik heb deze aan het archief toegevoegd).

    De blokken zijn verzameld in twee pagina's (0 en 1).

    Op de nulpagina bevindt zich een configuratieblok met index 0. Dit is wat we zullen instellen. Voor T5557/T5577 hebben we de volgende configuratiebytes: 0x00.0x14.0x80.0x40 in overeenstemming met de tabel uit de documentatie (ik heb de modi geselecteerd in rood gemarkeerd met één bit):

    We hebben dus geselecteerd: RF/64 datatransmissiefrequentie (125 KHz/64), Manchester-type codering, waarbij blokken tot op de seconde worden uitgegeven (in blokken 1 en 2 krijgen we de code die door de kaart wordt uitgegeven). Voordat er wordt geschreven, moeten de bewerkingscode (2 opcodebits) en één grendelbit (lockbit) worden verzonden. Opcodes 10b en 11b gaan vooraf aan het schrijven van gegevens voor pagina's 0 en 1 (de minst significante bit specificeert het paginanummer, de meest significante bit specificeert de paginaschrijfcode). We geven 10b uit voor de opcode (al het werk wordt gedaan met een nulpagina) en 0b voor de grendelbit. Na het overbrengen van al deze gegevens is het noodzakelijk om het drie-bits adres van de te schrijven pagina over te dragen. Alle gegevensoverdrachten voor de T5557/T5577 worden uitgevoerd van het meest significante bit tot het minst significante bit.

    Door de kaartcode in blok 1 en 2 en de configuratie in blok 0 in te stellen, kunt u een dubbele RFID-tag verkrijgen. Zoals je kunt zien, is alles eenvoudig.

    Het volgende type blanco's is EM4305. Ik moest dus zelf de opname van deze blanco verzorgen. Het bestaat ook uit blokken van 32 bits, maar hun doel is anders.

    Het coderen van gegevens die naar de kaart worden verzonden, is gebaseerd op verschillen over een tijdsinterval. Als er tijdens het tijdsinterval een verschil was, dan is het nul, en als dat niet het geval was, is het één. Het configuratiewoord is opgeslagen in byte 4 en voor mezelf heb ik het als volgt gedefinieerd: 0x5F,0x80,0x01,0x00 (Manchester-codering, RF/64, uitgangswoord 6). In de woorden 5 en 6 schrijf ik de kaartcode (dezelfde 64 bits die de kaart produceert). EM4305 vereist dat de transmissie wordt uitgevoerd van het minst significante bit naar het meest significante bit. De kaart begrijpt dat een uitwisseling ermee begint nadat hij een combinatie van impulsen heeft gekregen:

    1. We schakelen het veld uit op 48 µs.
    2. We zetten het veld gedurende 96 μs aan.
    3. Schakel het veld uit op 320 µs.
    4. We zetten het veld aan met 136 μs.
    5. Schakel het veld uit tot de volgende opdracht.
    Het commando om een ​​blok naar de kaart te schrijven wordt als volgt verzonden:
    1. We sturen de bovenstaande reeks impulsen.
    2. Wij sturen 0b.
    3. We verzenden CC0-CC1 en hun pariteit P. (0101b voor opname, zie onderstaande tabellen).
    4. We verzenden het blokadres (zie tabel), twee volgnullen en de pariteit van het adres.
    5. Wij verzenden blokgegevens (32 bits).

    Commandoformaat


    Commandocodes

    Blokadresformaat

    Hiermee wordt de configuratie van de EM4305 blanco en zijn code ingesteld.

    Meer heeft een eenvoudig kopieerapparaat eigenlijk niet nodig.

    Ik heb verschillende versies van het kopieerapparaat gemaakt met verschillende displays. Hier is bijvoorbeeld een kopieerapparaat met een 1602-display:

    En hier is een video van het kopieerapparaat dat werkt op het LPH9157-02-display.