RFID ușor. Implementarea propriului transponder și cititor RFID. Cititor de carduri RFID RC522 în gospodărie

Beneficiile încuietorilor electronice nu pot fi subestimate, ca exemplu în acest sens, utilizarea încuietorilor electronice ne permite să ne eliberăm de o grămadă de chei grele.

Cel mai important lucru pentru utilizatorul mediu este ușurința în utilizare și fiabilitatea. încuietoare electronică. Aceste cerințe sunt îndeplinite de dispozitivele bazate pe RFID (din limba engleză Radio Frequency IDentification - identificarea în radiofrecvență) - identificarea în radiofrecvență fără contact.

Un astfel de sistem de identificare constă dintr-un receptor staționar și un transmițător purtabil (transponder).

Prezentat în acest articol Blocare RFID funcționează într-un mod similar. Identificarea se bazează pe citirea unui 40 de biți număr de serie Carduri unice. Conditii de lucru semnalizat printr-un semnal sonor. Lacătul poate funcționa în două moduri principale: citirea și înregistrarea cardurilor unice în memoria microcontrolerului. Un total de 4 carduri pot fi stocate în memorie.

Scurte caracteristici Blocare RFID;

Descrierea operațiunii de blocare RFID

Întregul circuit poate fi împărțit în două părți: digital și analog. Circuit digital constă dintr-un microcontroler care controlează întregul dispozitiv. Circuitul folosește un microcontroler PIC12F683 într-un pachet DIP8.

Generatorul RC intern al microcontrolerului vă permite să obțineți o frecvență de ceas cu un interval de frecvență programabil de 37 kHz ... 8 MHz.

Pentru generare este folosit un generator hardware de semnal PWM conținut în controler impulsuri dreptunghiulare cu o puritate de 125 kHz, care, după amplificare, sunt trimise către antena cititorului.

Timer TMR2 este utilizat pentru generare, care este resetat automat folosind un comparator digital după numărarea numărului corespunzător de impulsuri. În plus, starea ieșirii GP2 este inversată automat.

Astfel, putem genera impulsuri de orice frecvență de umplere. Nu participă la acest proces CPU, datorită căruia poate efectua și alte operațiuni.

Forma de undă obținută în acest fel este trimisă la intrarea unui amplificator format din tranzistori VT1 și VT2, iar apoi către bobina antenei cititorului, care este utilizată pentru alimentarea fără contact a circuitului situat în cardul Unique.

Pentru cardurile Unique utilizate, rata de transfer de date este de aproximativ 2 kbit/s (125000/64=1953bps). Codul unic al fiecărei carduri autorizate este stocat într-un spațiu nevolatil memorie EEPROM microcontroler.

Starea de funcționare a încuietorii este semnalată cu ajutorul unui buzzer conectat la pinul GP4. Releul este controlat de la ieșirea GP5 prin tranzistorul VT3.

Două jumperi sunt utilizate pentru a seta modul de funcționare al microcontrolerului. Jumper JP2 pune controlerul în modul de programare pentru carduri noi, iar JP1 schimbă modul în care releul este controlat între modul de comutare și activarea temporară.

Partea analogică a circuitului servește la amplificarea semnalului indus în bobină și pentru a-l converti în formă digitală. Elementul principal aici este amplificatorul operațional dual LM358. Bobina este conectată la conectorul CON1.

Semnalul indus în acesta merge către anodul diodei VD1. Pe lângă semnalul util, există și o undă purtătoare (125 kHz) și semnale aleatorii interferență, așa că a fost adăugat la circuit filtru trece banda, care limitează lățimea de bandă la o frecvență de aproximativ 2 kHz.

După toată procesarea, semnalul digital corespunzător este trimis la intrarea GP3 a microcontrolerului.

Antena este formată din 40 de spire de sârmă de bobinare emailată cu diametrul de 0,1...0,3 m
m, înfăşurat pe un dorn provizoriu cu diametrul de 40...60 mm. După aceasta, bobina ar trebui să fie înfășurată cu bandă izolatoare pentru protecție.

Pentru alimentarea întregului circuit, se folosește un stabilizator de tip. Dioda VD4 protejează stabilizatorul împotriva deteriorării dacă alimentarea este conectată cu polaritatea greșită.

Tensiunea de alimentare este furnizată pinului CON2. Valoarea sa ar trebui să fie în intervalul 9…12 V. Mai mult decât tensiune înaltă nu va deteriora stabilizatorul, dar acest lucru îl poate face să se încălzească semnificativ.

Dreapta circuit asamblat gata de utilizare imediată și puteți începe procedura de înregistrare a cardurilor autorizate.

Pentru a înregistra cardurile, trebuie să închideți jumperul JP2 cu alimentarea oprită și să porniți alimentarea. Microcontrolerul va confirma modul de programare cu un bip de două secunde și va aștepta ca patru carduri RFID să fie abordate succesiv.

Un număr de serie corect decodat al cardului este semnalat printr-un bip dublu, după care este stocat în memoria controlerului. După programarea ultimului card, procedura de programare se termină, se aude un bip lung, iar microcontrolerul intră în modul normal de funcționare.

Jumperul trebuie deschis astfel încât, dacă alimentarea este oprită, procesorul să nu fie repus în modul de programare. Dacă numărul de carduri autorizate este mai mic de patru, atunci un card trebuie aplicat de mai multe ori (în total, ar trebui să fie 4 înregistrări).

În timpul funcționării, apropierea cardului de antenă este semnalată printr-un semnal sonor dublu și pornirea releului. Dacă jumperul JP1 nu este instalat, atunci fiecare apropiere a cardului va face ca starea releului să se schimbe în invers. Dacă este instalat, releul se va porni timp de 10 secunde, după care va reveni la starea inițială.

(62,6 Kb, descărcări: 1.051)

La un moment dat m-am plictisit iar și mi s-a părut că am venit motiv bun pentru a cumpăra un cititor de carduri. Conceptul a fost acesta: lipim cardul de fundul laptopului și punem cititorul în locul unde se încarcă de obicei computerul.

Rezultat: când punem laptopul pe „încărcare”, priza de la acesta se aprinde automat încărcător. Și în restul timpului, priza este, desigur, oprită. Ca să nu spun că este deosebit de util, dar este divertisment.

Dar, ca de obicei, ceva a mers prost. Adică, în loc de muncă asiduă în domeniul prizelor, din anumite motive am învățat în primul rând să aflu câte călătorii au rămas pe biletul meu local de metrou.

Pentru a înțelege: acest cititor nu este un dispozitiv complet, ci un periferic pentru un controler sau computer. Din acest motiv, va fi nevoie de un efort de utilizare. Se pare că nu există rețete gata făcute „din cutie”, dar totul depinde de imaginație și abilități.

Ce fac ei de obicei? Cel mai adesea - încuietori cu deschidere a cardului, urmărirea timpului de lucru, sisteme de control al accesului pentru animale de companie (acces la alimente, de exemplu).

Pentru experimente, am ales un cititor ieftin și mai mult sau mai puțin universal. RFID în numele acestui lucru reprezintă tehnologia de identificare radio, deci nu înseamnă nimic în special. Dar din specificații rezultă că hardware-ul este compatibil cu cardurile RFID obișnuite cu protocolul MIFARE.

Cel mai probabil, ați întâlnit astfel de cărți de multe ori. Cel mai adesea - sub forma unui permis de birou. Un alt exemplu izbitor sunt biletele contactless pentru metrou.

Principiul de bază al funcționării este destul de simplu de înțeles. Există antene în card și în cititor, iar semnalul de la cititor (în esență un câmp electromagnetic) servește simultan ca sursă de alimentare pentru card. Acestea. atat in ceea ce priveste energia cat si in ceea ce priveste transmisia de date, aceasta este foarte asemanatoare cu incarcarea wireless care a devenit extrem de populara.

Cardurile în sine, în funcție de modificare, pot transporta de la câteva zeci de octeți la câțiva kiloocteți de date (inclusiv un număr de serie unic). De asemenea, in functie de modificare, cardul poate fi echipat protecţie criptografică informație.

În kit erau doi piepteni, dar scuze, deja am lipit unul (cel de colț). Prin urmare, nu există nici un tip de scândură fără piepteni

Acest kit include un cititor, un pieptene pentru prototipare simplă și chiar montare pe „placa de bază” și doi identificatori: o cartelă MIFARE 1K și un breloc cu capacități similare. Adică destul pentru experimente.

.

.

.

Placa de citire, după cum puteți vedea, arată foarte îngrijită. Și, în mod convenabil, după instalarea pieptenului de colț, dimensiunile dispozitivului nu cresc, deoarece pieptene se potrivește de fapt cu înălțimea celui mai înalt element de pe placă.

Cu baterie AAA

Acestea. Nu trebuie să vă chinuiți cu un compromis între comoditate și versatilitate (pieptene) și economisirea spațiului la construcție (lipirea directă a firelor).

Printre altele, placa are și un LED roșu, care, din păcate, este complet neinformativ. Ideea este că se aprinde chiar și atunci când alimentarea este deconectată - evident, există suficiente niveluri pe interfața SPI. Și nu reacționează deloc la cărți.

Într-un cuvânt, se aprinde când cititorul este cumva conectat la Arduino, ceea ce nu garantează funcționalitatea acestuia.

În ceea ce privește intervalul de răspuns, pragul este situat subiectiv la o distanță de 2 cm de suprafața plăcii. În 2 - 2,5 cm este zona de funcționare incertă.

Caracteristici (de la vânzător):

Tensiune: 3,3 V

Consum de curent în stare activă: 13-26 mA

Consum de curent în standby: 10-13 mA

Curent de repaus: mai puțin de 80uA

Consum de vârf: mai puțin de 30 mA

Frecventa de operare: 13,56 MHz

Tipuri de carduri acceptate: MIFARE S50, MIFARE S70, MIFARE UltraLight, MIFARE Pro, MIFARE DESfire

Interfață: SPI

Dimensiuni: 40x60 mm

Din cele de mai sus este clar că m-am remarcat de două ori. În primul rând, nu m-am uitat la tensiunea de alimentare. Și 3.3V, apropo, înseamnă că este cel mai ușor să folosești această placă Arduino Uno, Mega și alte plăci (sau plăci similare) echipate cu regulatoare de tensiune și o ieșire de 3,3V. Din fericire, consumul maxim de curent nu depășește capacitățile platformei.

ÎN in caz contrar trebuie să utilizați fie o singură sursă de alimentare de 3,3 V, fie un regulator/stabilizator/convertor suplimentar de tensiune.

În al doilea rând, Interfață SPI Necesită 5 (!) fire pentru a se conecta. Acestea. În total, un cablu de 7 conductori se conectează la cititor, iar acest lucru este destul de irositor. Pentru a economisi bani, era logic să ne concentrăm pe I2C, dar unde sunt și unde este acest sens?!

Conexiune
Aș dori să împart conexiunea în soft și hard, dar totul este atât de strâns împletit - și a dus la o problemă nu foarte interesantă.

Într-un cuvânt, toată lumea știe pentru RC522. Dar dintr-un motiv oarecare, nimeni nu întreabă de ce readme-ul atașat bibliotecii și placa dintr-unul dintre exemplele sale au „pinouts” complet diferite pentru conectarea cititorului.

Bănuiesc că acesta este unul dintre motive probleme eterne cu această bibliotecă. Al doilea motiv este că conexiunea pentru Arduino Uno și Mega este făcută la ace diferiți. Acest lucru se datorează naturii platformelor.

În cele din urmă, al treilea motiv este că doi pini (SS și RST) permit conexiunea arbitrară și sunt configurați în cod. În același timp, implicit, exemplul de cod conține configurația pentru Arduino Uno, iar dacă ai Mega și te-ai conectat conform propagandei din readme sau semnul de la începutul exemplului, atunci, bineînțeles, vei domnisoara.

Dar trucul este că al treilea motiv este destul de evident și l-am ocolit mai mult sau mai puțin punându-mi imediat ace, pentru că aveam la îndemână Placa Arduino Mega. De aceea, apropo, am fost scutit de a doua nenorocire.

Dar primul - conectarea pinilor SPI m-a chinuit după pofta inimii. Nici nu mi-am putut imagina că o persoană care a făcut o bibliotecă de succes ar putea face o asemenea mizerie în conexiunea banală a trei fire.

Cu alte cuvinte, conectarea folosind nici prima, nici a doua opțiune specificată în descrierea bibliotecii nu a ajutat. La început am crezut că am o „planșă moartă”. Prin urmare, în ciuda orei târzii, m-am strâns și am lipit pieptene pentru al doilea (sunt economisitor și am cumpărat trei deodată). Rezultatul s-a dovedit a fi similar, în ciuda faptului că am verificat în mod repetat conexiunea folosind pinout-urile pe care le aveam la îndemână.

Nici măcar să nu mă întrebați de ce nu m-am dus la Arduino.cc să văd cum este direcționat SPI-ul Mega. După părerea mea, a existat un fel de tulburare.

Dar am căutat pe google și, care pe scurt (nu ca mine) a descris achiziția și legătura ei cu biblioteca, după cum am înțeles, de la camarazi chinezi. Mâinile mele deja renunțau și nu puteam dormi în această stare, așa că mi-am permis un alt experiment cu pinout-ul și biblioteca nou găsite.

Și ambele table au funcționat.

Pentru a-mi curăța conștiința, am descărcat un exemplu cu o bibliotecă „problematică” și s-a dovedit a funcționa și el.

Acestea sunt cărțile cu care am chinuit cititorul. De la stânga la dreapta: card din set, card cu litera N, bilet de metrou MIFARE UltraLight, card Căilor Ferate Ruse

Și așa arată o descărcare de conținut și recunoașterea cardului în general cu biblioteca RFID și exemplul său DumpInfo

Rezumatul chinului: pinout-ul de la prietenul menționat coincide cu și, în mod surprinzător, coincide cu pinout-ul din readme-ul bibliotecii RFID. Având în vedere acestea din urmă, pot presupune că fie am amestecat ace noaptea și de acolo au început toate nenorocirile mele, fie biblioteca nativă chineză inițializează cumva cu viclenie cititorul, după care începe să funcționeze.

În concluzie, pinout-ul corect pentru biblioteca chineză și Mega, la care m-am conectat:

Mega RC522
3,3 V VCC
GND GND
RESET RST

50 MISO
51 MOSI
52 SCK
53 NSS

Și pentru Uno (nu l-am testat):

Uno RC522
3,3 V VCC
GND GND
5 RST

12 MISO
11 MOSI
13 SCK
10 NSS

Împreună cu sora mai mare

.

.

În urma unor teste simple, pe care în cele din urmă le-am finalizat, s-a mai dovedit că cititorul scrie în mod normal (este un joc de cuvinte) cărți MIFARE 1K din cele care au venit cu el.

A doua caracteristică este că acest lucru reacționează adecvat dacă îi sunt aduse mai multe cărți în același timp. Am prezentat două cărți, din nou, din cele care au fost incluse în set. În acest caz, exemplul DumpInfo din biblioteca RFID afișează în ordine conținutul ambelor carduri. Acestea. primul - conținutul unui card, iar după acesta - al doilea.

Și dame, și du-te
Așadar, l-am conectat și am admirat descărcarea conținutului de memorie al cardurilor MIFARE 1K. Ce urmeaza? Și apoi mi-a fost un pic prea leneș să mă chinuiesc cu priza și mi-am amintit că cardurile de metrou par să funcționeze după același protocol.

M-am dus, l-am luat pe al meu, l-am aplicat și i-am admirat conținutul. Așa cum am promis: MIFARE UltraLight, 64 de octeți de memorie și nu este foarte clar unde sunt călătoriile, unde este perioada de valabilitate și, în general, nu este foarte clar.

Caută pe Google pe subiect folosind Arduino Nu am primit nimic deosebit de util cu aceste carduri. Cel mai adesea, cardurile de metrou, după cum sa dovedit, sunt folosite ca etichete NFC ultra-ieftine (adică gratuite) în tot felul de sisteme de casă, cum ar fi încuietori, execuție de script și alte lucruri, unde este suficient să cunoașteți numărul de serie al card pentru identificare. Dar din anumite motive nu am găsit biblioteci și soluții gata făcute pentru afișarea informațiilor despre călătorii: fie am vrut doar să dorm, fie chiar nu există (vezi sindromul „Elusive Joe”).

Dar am găsit un text minunat și foarte romantic de Alexander „Dark Simpson” Simonov sub titlul „”, publicat, se pare, într-unul din numerele Hacker. În ciuda caracterului curios al textului, există multe Informatii utile despre structura stocării datelor, inclusiv pe biletele care mă interesează.

Partea semnificativă a biletului - numărul - este verificabilă vizual

Așa că a doua zi am încercat să-mi înving aversiunea față de HEX și am mers să aflu. Acesta este depozitul de bilete pe care l-am primit folosind biblioteca RFID:

UID card: 04 6F 25 62 04 33 82
Tip PICC: MIFARE Ultralight sau Ultralight C

Pagina 0 1 2 3
0 04 6F 25 C6
1 62 04 33 82
2 D7 48 F0 00
3 00 07 FF FC
4 45 DA 21 06
5 D0 E5 3D 00
6 1F E8 00 00
7 1F E8 00 00
8 1F 8F 5A 00
9 40 19 2E D2
10 19 91 59 7C
11 1F AB 91 C8
12 1F 8F 5A 00
13 40 19 2E D2
14 19 91 59 7C
15 1F AB 91 C8

Aici Card UID este un identificator unic de card (în esență un număr de serie), iar restul este de 16 pagini de memorie, fiecare dintre ele conține 4 octeți. Împreună - 64 de octeți.

Din cititul textului despre biletele de metrou, am remarcat cele mai utile puncte:

1) Numărul biletului (care este imprimat pe el) este codificat pe 32 de biți, începând de la 21 de biți la pagina 4: 10 6D 0E 53;

2) Data emiterii biletului în zile de la 01/01/1992 - primii doi octeți ai paginii 8: 1F 8F;

3) Perioada de valabilitate în zile - al treilea octet la pagina 8: 5A.

4) În cele din urmă, numărul de călătorii rămase este al doilea octet de la pagina 9: 19.

Era deja posibil să lucrăm cu asta.

Am săpat puțin mai adânc în exemplul DumpInfo din biblioteca RFID, în codul acesteia, pentru a înțelege ce funcții sunt responsabile pentru ce și cum pot fi utile, în forumurile Arduino pentru a vedea implementarea calculului datei (în general, puteți priviți-l în orice limbă, dar mi-a fost mai ușor să caut mai aproape de platforma țintă).

Drept urmare, s-a născut un monstru. Adică schița este tăiată din resturi, pe alocuri rezultatul este ajustat la răspuns, dar în general totul corespunde mai mult sau mai puțin realității. Prin urmare, nu are rost să tragi într-un pianist care cântă cât de bine poate. Acolo, apropo, chiar prelucrare de bază există erori: schița va avertiza despre un card nesuportat sau imposibilitatea citirii.

#include #include #define SS_PIN 53 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); // MFRC522 obiect unsigned long uidDec, uidDecTemp; // pentru a afișa numărul cardului în format zecimal octet bCounter, readBit; Număr bilet lung nesemnat; void setup() ( Serial.begin(9600); SPI.begin(); // Inițializare SPI mfrc522.PCD_Init(); // Inițializare MFRC522 Serial.println("Se așteaptă cardul..."); ) void loop( ) ( // Căutați un card nou dacă (! mfrc522.PICC_IsNewCardPresent()) ( return; ) // Selectați un card dacă (! mfrc522.PICC_ReadCardSerial()) ( return; ) uidDec = 0; // Emiterea numărului de serie a cardului Serial.print ("Card UID: " pentru (octetul i = 0; i< mfrc522.uid.size; i++) { // Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); // Serial.print(mfrc522.uid.uidByte[i], HEX); uidDecTemp=mfrc522.uid.uidByte[i]; uidDec=uidDec*256+uidDecTemp; } Serial.println(uidDec); Serial.println(); // Выдача типа карты byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); // запрос типа Serial.print("Card type: "); Serial.println(mfrc522.PICC_GetTypeName(piccType)); // трансляция типа в vedere lizibilă if (piccType != MFRC522::PICC_TYPE_MIFARE_UL) ( // dacă nu este un card de bilet Serial.print("Nu este un card valid: "); // deci spunem Serial.println(piccType); // Opriți PICC mfrc522.PICC_HaltA ( ); // oprirea returnării cipului ) // vom veni aici dacă cip-ul este corect; byte byteCount; buffer de octeți; // lungimea matricei (16 bytes + 2 bytes checksum) byte pages=(4, 8); // pagini cu octeți de date pageByte; // contor de octeți de pagină byteCount = sizeof(buffer); octet bCount=0; pentru (octetul i=0; i<2; i++) { // начинаем читать страницы status = mfrc522.MIFARE_Read(pages[i], buffer, &byteCount); if (status != MFRC522::STATUS_OK) { Serial.print("Read error: "); Serial.println(mfrc522.GetStatusCodeName(status));} else { if (pages[i] == 4) { bCounter = 0; // 32-битный счетчик для номера // биты 0-3 for (bCount=0; bCount<4; bCount++) { readBit = bitRead(buffer, (bCount+4)); setBitsForGood(readBit); } // биты 4 - 27 for (pageByte=5; pageByte >2; pageByte--) (pentru (bCount=0; bCount<8; bCount++) { readBit = bitRead(buffer, bCount); setBitsForGood(readBit); } } // биты 28-31 for (bCount=0; bCount<4; bCount++) { readBit = bitRead(buffer, bCount); setBitsForGood(readBit); } Serial.print("Ticket number: "); Serial.println(ticketNumber, DEC); } if (pages[i] == 8) { // читаем дату выдачи Serial.print("Issued: "); unsigned int issueDate = buffer * 256 + buffer; // количество дней с 01.01.1992 в десятичном формате, 256 - сдвиг на 8 бит printIssueDate(issueDate); Serial.print("Good for (days): "); // срок действия Serial.print(buffer, DEC); Serial.println(); Serial.print("Trip reminder: "); // количество оставшихся поездок Serial.print(buffer, DEC); Serial.println(); } } } // Halt PICC mfrc522.PICC_HaltA(); } void printIssueDate(unsigned int incoming) { boolean isLeap = true; // признак високосного года int days={0,31,59,90,120,151,181,212,243,273,304,334}; // последний по порядку день месяца для обычного года byte dayOfMonth, monthCounter; unsigned int yearCount; incoming = incoming+1; // подогнал под ответ, но возможно это как раз необходимая коррекция, потому что начало отсчета - 01.01.1992, а не 00.01.1992 for (yearCount = 1992; incoming >366; yearCount++) ( // numără anul și numărul de zile care au trecut de la emiterea biletului dacă ((yearCount % 4 == 0 && yearCount % 100 != 0) || yearCount % 400 == 0) ( incoming = incoming - 366; isLeap = true ) else ( incoming = incoming - 365; isLeap = false; ) ) pentru (monthCounter = 0; incoming > days; monthCounter++) ( // află numărul lunii ) // numără ziua luna dacă (isLeap == adevărat) ( ​​/ / dacă este un an bisect dacă (zile> 31) ( // dacă nu prima lună, apoi adăugați la ultima zi unități lunare dayOfMonth = incoming - (zile+ 1); ) else ( dayOfMonth = incoming - (zile); // dacă este prima, nu adăugăm nimic, pentru că tura începe în februarie ) ) else ( dayOfMonth = incoming - (zile); // dacă nu este un an bisect ) Serial.print(dayOfMonth ); Serial.print("."); Serial.print(monthCounter); Serial.print("."); Serial.print(yearCount); Serial.println(); ) void setBitsForGood(byte daBeat) ( dacă (daBeat == 1) ( bitSet(număr bilet, bCounter); bCounter=bCounter+1; ) else ( bitClear(ticketNumber, bCounter); bCounter=bCounter+1; ) )

Ce îmi oferă această schiță? Ei bine, în primul rând, un mic antrenament al capului - a trebuit, știi, să te gândești când descoperi cititorul și codul. În al doilea rând, pot afla oricând câte călătorii au mai rămas și când se epuizează cardul. Având în vedere că nu am NFC pe smartphone, acest lucru se dovedește a fi destul de convenabil.

Rezultatul muncii monstrului

Desigur, în acest caz nici măcar nu vorbim despre realizarea unei „copii” a biletului. Acest lucru este excepțional funcția de informare, dublând terminalul din holul metroului.

În general, după un asemenea succes, a fost posibilă preluarea celei de-a doua sarcini propuse, care, teoretic, ar fi trebuit să fie prima datorită simplității sale de implementare.

Deci, o priză care se aprinde atunci când este nevoie. Aici cardul (orice card suportat de cititor și potrivit pentru plasarea în dispozitivul țintă) este folosit exclusiv ca trecere, adică doar numărul său de serie interesează.

Logica este simplă: dacă cititorul vede o carte cu număr specific, apoi pornește priza. Dacă nu îl vede, îl oprește.

MONSTRU DE RACHETE

#include #include #define SS_PIN 53 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); // Creați instanța MFRC522. nesemnat lung uidDec, uidDecTemp; #include RCSwitch mySwitch = RCSwitch(); switchOn boolean = fals; boolean cardRead = fals; void setup() ( Serial.begin(9600); // Inițializează comunicațiile seriale cu PC-ul SPI.begin(); // Inițiază magistrala SPI mfrc522.PCD_Init(); // Inițiază cardul MFRC522 mySwitch.enableTransmit(8); Serial .println("Se așteaptă cardul..."); void loop() ( starea byte; byte Count; byte buffer; // lungimea matricei (16 bytes + 2 bytes checksum) byteCount = sizeof(buffer); uidDec = 0; status = mfrc522.PICC_RequestA(buffer, &byteCount if (mfrc522.PICC_ReadCardSerial()) (pentru (byte i = 0; i);< mfrc522.uid.size; i++) { uidDecTemp=mfrc522.uid.uidByte[i]; uidDec=uidDec*256+uidDecTemp; } if ((uidDec==2218415941) && (switchOn == false)) { mySwitch.sendTriState("00110000F000"); switchOn = true; // Serial.println("Switched On"); } mfrc522.PICC_ReadCardSerial(); } else { if (switchOn == true) { mySwitch.sendTriState("001100000000"); // Serial.println("Switched Off"); switchOn = false; } } }

În mod similar, folosind cardul ca declanșator, puteți executa diverse scenarii de automatizare a locuinței. De exemplu, puneți un card e-carte, și așezați cititorul pe noptieră.

Când punem cartea pe dulap, casa crede că am decis să mergem în regatul lui Morpheus și stinge luminile. Și dacă luăm o carte din dulap, atunci se presupune că vrem să citim și apoi, dimpotrivă, lumina de fundal se aprinde astfel încât cerneală electronică era vizibil fără să-ți rupi ochii.

Așa funcționează monstrul priză

Pentru a rezuma: ieftin, simplu, destul de convenabil și stimulează imaginația.

Ps. Sunt sigur că te poți descurca mai bine și că nu înțeleg nimic despre Arduino și programare.

Tot felul de link-uri
Mi-a placut recenzia +67 +173

Circuitul emulator de transponder RFID conform standardului EM-Marine (EM4100).
Cardurile contactless din standardul Em-Marine sunt de departe cel mai popular mijloc de identificare la noi in tara si sunt folosite pentru identificarea utilizatorilor in sistemele de control si management al accesului (ACS).
A doua, nu mai puțin populară, domeniu de aplicare a cardurilor Em-Marine este utilizarea acestora în sistemele de acces logic atunci când se autorizează utilizatorii prin numărul ID cardului în sistem de operare aplicații de calculator și de lucru etc.

Cărți și brelocuri Em-Marine.
În consecință, astfel de sisteme de identificare sunt foarte comune și pot fi de interes pentru implementare. sisteme proprii identificare si automatizare. Deoarece protocolul de schimb și hardware-ul unor astfel de sisteme de joasă frecvență sunt mai ușor pentru implementarea independentă a propriilor dispozitive, majoritatea modelelor de radio amatori pe subiecte RFID sunt dedicate sistemelor de joasă frecvență.

Frecvența de funcționare a cardurilor Em-Marine este de 125 KHz. Pentru a le citi, se folosesc cititoare de carduri specializate fără contact (cititoare RFID). Interacțiunea identificatorului cu un astfel de cititor se realizează de la distanță.
Există un număr imens de opțiuni pentru designul extern al acestor identificatori: permisele Em-Marine sunt realizate sub formă de carduri subțiri și groase, brățări pentru parcuri acvatice, diverse brelocuri, etichete radio pentru integrarea în produsele RFID.
Pentru standardul de transponder EM4100, cardul conține 64 de biți de date, iar cardurile nu sunt, în general, reinscriptibile. Pentru ușurința înregistrării cardului, codul scris pe card este duplicat cu un sigiliu pe o parte a cardului. Codificarea datelor transmise de transponder este codarea Manchester. În acest caz, perioadele semnalului transmis de transponder sunt multipli de 125 kHz - frecvența semnalului cititorului transponderului. Transponderele în sine sunt implementate fără alimentare externă(etichetă pasivă), puterea este furnizată de circuitul LC (bobină și condensator) atunci când eticheta intră în raza câmpului cititorului de carduri. Transponderul este, de asemenea, tactat de semnalul cititorului - 125 kHz. Prin urmare, parametrii semnalului rezultat în codificarea Manchester sunt multipli ai semnalului de 125 KHz.

Schema de interacțiune între transponder și cititorul RFID.
Pentru o înțelegere mai completă, luați în considerare structura pachetului de transponder RFID din formatul EMMarine EM4100. Este oferită o descriere (în engleză, luată din adnotări) a formatului pachetului de transponder.
„…….Transponderele RFID compatibile EM4100 transportă 64 de biți de memorie Read Only. Aceasta înseamnă că informațiile pot fi citite de pe etichetă, dar nu pot fi modificate date sau date noi scrise pe card odată ce cardul a fost programat cu datele inițiale. Formatul datelor este cel prezentat aici.
1 1 1 1 1 1 1 1 1 Biți antet de 9 biți, toți de 1"
Număr versiune pe 8 biți D00 D01 D02 D03 P0
sau ID de client.
D04 D05 D06 D07 P1
D08 D09 D10 D11 P2 Fiecare grup de 4 biți
D12 D13 D14 D15 P3 este urmat de 32 de biți de date pari
D16 D17 D18 D19 P4 bit de paritate
D20 D21 D22 D23 P5
D24 D25 D26 D27 P6
D28 D29 D30 D31 P7
D32 D33 D34 D35 P8
D36 D37 D38 D39 P9
4 coloane Biți de paritate PC0 PC1 PC2 PC3 S0 1 bit de oprire (0)
Primii 9 biți sunt 1 logic.
În consecință, avem 9 biți de pornire ai pachetului (întotdeauna 1 logic), 11 grupuri de 4 biți de date cu 1 bit de paritate pe rând, 4 biți de paritate pe coloană la sfârșitul pachetului, bit de sfârșit (întotdeauna 0).
De exemplu, să luăm un transponder cu numărul de date 06001259E3.
1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 1 1 0 1 0 0 1 1 0 0 1 0 00
0 6 0 0 1 2 5 9 E 3

Octetul de date 0x06 este considerat numărul versiunii. Pe cardurile EM-Marine pe care le-am întâlnit sunt ștampilate valorile zecimale corespunzătoare ultimilor 3 octeți ai pachetului. În orice caz, pentru implementare va trebui să reproducem toți cei 64 de biți ai pachetului conform acestei descrieri.
Acum să aruncăm o privire mai atentă la descrierea modulării datelor transponderului. Date preluate din adnotarea AN680. În figură am făcut semne roșii cu privire la diagramele care ne interesează.

Acum vom descrie mai detaliat diagramele de care avem nevoie. Semnalul ceasului CLK este semnalul cititorului RFID, așa cum am menționat mai devreme. Datele codificate NRZ ar trebui să fie pregătite de transponder conform pachetelor de date înregistrate (64 de biți). Se poate observa că implementarea codificării NRZ folosind un pachet transponder este elementară și necesită resurse minime. De fapt, analizăm pachetul într-un flux de biți și schimbăm valorile logice ale semnalului cu 0 și 1 în date și atât. Pentru a obține semnalul rezultat, facem XOR programatic starea curenta semnal în format NRZ și CLK al semnalului de ceas al cititorului. Ca rezultat, obținem codarea Manchester a semnalului rezultat. Nu voi descrie mai detaliat codarea Manchester - datele pot fi găsite în adnotări separate. Pentru mai mult descriere detaliata Metodele de modulare pot fi găsite în „Metode de modulare H.R. Walker Data Systems 05/01/04(revizuit 4/18/10)”, am studiat exact aceste exemple. Principalul lucru este că cu costuri minime resurse, putem astfel implementa un transponder în formatul EM-Marine. De exemplu, puteți lua Controler AVR seria tiny45 (se poate face și pe tiny13). L-am testat pe controlerul tiny45, deoarece acesta era cel disponibil pentru experimente.
Acum să ne imaginăm diagrama functionala transponder bazat pe modelul Proteus pentru controlerul tiny45.

Schema funcțională a transponderului în Proteus.

Așa arată semnalul generat de transponder. Începutul pachetului este marcat cu roșu.
Diagrama arată că pinul controlerului T0 (PORTB.2) este folosit pentru a furniza un semnal de ceas pentru temporizatorul de 8 biți TIMER0. Programul implementează o întrerupere coincidență pe cronometrul TIMER0 (TIM0_COMPA). Ceasul este setat de la un semnal extern pentru acest cronometru. Pentru noi, semnalul de ceas este de 125KHz de la cititorul de carduri. În diagramă, totul este legat de alimentarea cu energie a controlerului și a circuitelor de ceas de la cititor. Într-un circuit real, controlerul în sine este tactat de la un cuarț de 4 MHz instalat între picioarele 2 și 3 ale controlerului. Puteți adăuga, de asemenea, condensatori de blocare de 22 pF pentru cuarț pe aceste picioare de controler.
Setările de simulare Proteus pentru controler sunt specificate după cum urmează:

Când programăm controlerul tiny45, setăm siguranțele (biții de configurare) în același mod ca în figura 2. Controlerul este tactat folosind cuarț de 4 MHz.
Referitor la implementare circuit extern Să ne uităm la legăturile controlerului această întrebare mai multe detalii. De exemplu, am luat materialele din Manualul RFID (E2E_chapter03-rfid-handbook), care descrie principiile fundamentale ale construirii sistemelor RFID. Documentul în sine este atașat articolului. Să ne uităm la un exemplu de circuit de transponder pasiv (parte a circuitului de la pagina 46). Pentru înțelegere, am făcut notițe pe diagramă cu roșu.
Se poate observa că avem un circuit de recepție pe L1C1, care servește la alimentarea circuitului transponder și la ceasul acestuia. Totul despre contra-divizor IC1(4024), elemente logice Putem arunca în siguranță IC3 (7400) - nu vom avea nevoie de el. Divizorul pentru temporizator este implementat folosind setări de temporizator fără divizor extern - contoare, de asemenea, partea logică este implementată în software. in orice caz acest exemplu vă permite să înțelegeți mai pe deplin funcționarea circuitului transponder pasiv. Distanța maximă de citire pentru un transponder de acest format este de 200 cm. În realitate, majoritatea schemelor funcționează la distanțe de 2-10 cm. Parametrii circuitului de capacitate și inductanță LC sunt selectați cât mai precis posibil pentru frecvența de rezonanță 125KHz. De exemplu, am folosit un circuit cu o capacitate de 1nF și o bobină de 60 de spire pe un dorn cu un diametru de 50 mm folosind fir PEV 0,2. Puteți calcula conturul dorit în program special(puteți calcula conturul pentru o bobină dreptunghiulară, bobină imprimată etc.). Principalul lucru este să alegeți valorile exacte pentru frecvența de 125 KHz, altfel distanța de citire și sensibilitatea circuitului se vor deteriora semnificativ. Cu circuite prost configurate, va funcționa numai atunci când bobina transponderului este adusă aproape de cititor. Dispozitivul funcționează pe principiul Full Duplex (FDX) - generând date de transponder în mod continuu atunci când circuitul este alimentat. Circuitul este tactat de la cititor și datele sunt transmise continuu. Unele circuite cu transponder utilizează schema de operare HDX (Half Duplex) - cititorul emite în modul de impuls, transponderul transmite date în intervalele acestor impulsuri de încărcare de la cititor. Acest lucru se aplică, de exemplu, transponderelor TIRIS de la Texas Instruments.

Circuitul transponder pasiv bazat pe circuitul din manualul RFID.


Ținând cont de acea parte a circuitului de care nu avem nevoie pe baza circuitului original, obținem schema electrică a controlerului în această formă.



Ce parere aveti de acest articol?

Cititor RFID- carduri și brelocuri
pe microcontrolerul ATtiny13

Sursă: www.serasidis.gr
Vassilis Serasidis

Traducere: Vadim comandat de RadioLotsman

Recent, diverse proiecte bazate pe chei RFID, utilizate în sistemele de securitate, securitate și control acces, au câștigat o mare popularitate. La unele întreprinderi și organizații, astfel de sisteme, completate de specializate software, sunt folosite pentru înregistrarea orelor de lucru, înregistrarea bunurilor materiale etc.

Orice sistem de identificare prin radiofrecvență (RFID) constă dintr-un dispozitiv de citire (cititor, cititor sau interogator) și un transponder (cunoscut și sub denumirea de etichetă RFID, uneori se folosește și termenul de etichetă RFID). În acest articol ne vom uita la un dispozitiv simplu pentru citirea cheilor RFID care acceptă protocolul EM4100 și funcționează la o frecvență de 125 kHz. Acest tip de cheie RFID poate fi sub forma unui breloc sau Card de credit(Figura de mai jos).

Componenta principală a cititorului este microcontrolerul Atmel AVR ATtiny13 , care citește numărul unic de identificare din 10 cifre al cheii și îl transmite către Codificare ASCII De Interfață serială(UART) la 2400 bps la dispozitivul gazdă. Cu alte cuvinte, cititorul este modul separat, conectat la procesorul sau microcontrolerul principal al sistemului (Figura 2).

Diagrama schematică a cititorului RFID este prezentată în figura de mai jos:

Să luăm în considerare principalele caracteristici ale circuitului. Microcontrolerul folosește un modulator PWM încorporat pentru a genera impulsuri dreptunghiulare la ieșirea PB0 cu o frecvență de 125 kHz. Dacă ieşirea PB0 este log. 0 (marginea de cădere a impulsului), tranzistorul T1 este în stare închisă și o tensiune de alimentare de +5 V este aplicată bobinei L1 prin rezistorul R1. Marginea ascendentă la ieșirea PB0 (log 1) deschide tranzistorul T1, iar borna superioară a bobinei este conectată la masă. În acest moment, bobina este conectată în paralel cu condensatorul C2, formând un generator LC (circuit oscilator). Tranzistorul comută de 125.000 de ori pe secundă (125 kHz). Ca rezultat, bobina generează un semnal sinusoidal cu o frecvență de 125 kHz

Modulul cititor generează un câmp electromagnetic, a cărui energie este folosită pentru alimentarea cheii RFID. Transferul de energie între cheia RFID și cititor se bazează pe principiul de funcționare al unui transformator convențional: înfășurarea primară a transformatorului creează o fem indusă în toate celelalte înfășurări. Pentru cazul nostru înfăşurare primară este bobina cititorului, iar secundara este bobina cheii RFID. Elementele D1, C3 și R5 formează un demodulator de semnal cu modulație de amplitudine.

Schimb de date între cheie și cititor

Procesul de schimb de date între cheia RFID și cititor este foarte simplu, dar gândit până la cel mai mic detaliu. Dacă cheia RFID trebuie să transmită un jurnal. 0, apoi conectează o anumită „sarcină” la sursa sa de alimentare, ceea ce necesită mai multă energie transmisă de cititor. Acest lucru va provoca o scădere ușoară de tensiune pe partea cititorului; Acest nivel este perceput de cititor ca un jurnal. 0

O cheie RFID transmite în general 64 de biți de date în următoarea secvență (Figura 6):

  1. Primii 9 biți (întotdeauna log. 1) sunt biți de pornire, indicând începutul schimbului de date.
  2. 4 biți - biți cei mai puțin semnificativi de utilizator numar de identificare(D00 - D03).
  3. 1 bit (P0) - bit de paritate al celor 4 biți anteriori.
  4. 4 biți sunt cei mai importanți biți ai numărului de identificare a utilizatorului (D04 - D07).
  5. 1 bit (P1) - bit de paritate al celor 4 biți anteriori.
  6. 4 biți - prima parte a numărului de serie al cheii RFID pe 32 de biți (D08 - D11).
  7. 1 bit (P2) - bit de paritate al celor 4 biți anteriori.
  8. În continuare, sunt transmise următoarele grupuri de 4 biți din numărul de serie al cheii, fiecare cu un bit de paritate.
  9. Apoi cei 4 biți de paritate sunt transmisi coloană cu coloană. De exemplu, bitul de paritate PC0 pentru biții D00, D04, D08, D12, D16, D20, D24, D28, D32 și D36.
  10. 1 bit de oprire.

Date (secvență de 64 de biți) transmise prin cheia RFID.

Integritatea datelor este verificată de microcontroler prin calcularea biților de paritate pentru fiecare rând și coloană și comparându-i cu datele primite de la cheia RFID.

Design bobine.

Inductorul fără cadru din cititor cu diametrul de 120 mm este înfășurat cu un fir cu diametrul de 0,5 mm și are 58 de spire, dar autorul recomandă să adăugați încă 2 - 3 spire la bobinare. Pentru a îmbunătăți eficiența bobinei și a crește distanța de citire a datelor cheii RFID, este necesară calibrarea circuitului oscilant. Dacă, având conectat un osciloscop la punctul de conectare dintre R1 și L1, vedeți vârfuri distorsionate pe ecranul dispozitivului (Figura 7), atunci acest lucru indică necesitatea de a calibra bobina L1.

Distorsiunea semnalului generat de bobina L1 indică necesitatea calibrării.

Calibrarea poate fi efectuată în două moduri după alimentarea cu tensiune a modulului.

  1. Conectați sondele osciloscopului la punctul de conectare dintre R1 și L1 și, prin creșterea sau scăderea numărului de spire ale bobinei L1, eliminați distorsiunea semnalului.
  2. Dacă nu aveți un osciloscop, mutați încet cheia RFID pe bobină până când cheia este recunoscută, așa cum este indicat de un bip. Dacă cheia este detectată de la o distanță de 2 cm, atunci este necesar să adăugați/înlăturați mai multe ture și apoi să verificați din nou distanța de la care cheia poate fi citită cu încredere. Utilizând calibrarea, autorul schemei a realizat o citire fiabilă a cheii RFID de la 3 cm.

Când programați microcontrolerul, este necesar să setați următoarea configurație a biților de siguranță: octet mic 0x7A și octet mare 0x1F (microcontrolerul funcționează de la un generator de ceas de 9,6 MHz încorporat, divizor frecvența ceasului dezactivat la 8). Codul programului ocupă 1024 de octeți în memoria microcontrolerului - este utilizată întreaga capacitate de memorie disponibilă a microcontrolerului ATtiny13. Prin urmare, în viitor, atunci când extindeți funcționalitatea cititorului, este mai bine să utilizați un alt 8-pini Microcontroler AVR, de exemplu ATtiny85.

Descărcări:

Codul sursă al programului microcontrolerului (AVRStudio 6), firmware (.hex) și schema circuitului -

Astăzi voi vorbi despre modulul RFID RC522, bazat pe cipul MFRC522. Alimentare 3,3 V, raza de detectare pana la 6 cm. Proiectat pentru citirea și scrierea etichetelor RFID cu o frecvență de 13,56 MHz. Frecvența în acest caz este foarte importantă, deoarece etichetele RFID există în trei intervale de frecvență:


  • Marcaje ale intervalului LF (125-134 kHz)

  • Etichete de bandă HF (13,56 MHz)

  • Etichete de bandă UHF (860-960 MHz)

Acest modul particular funcționează cu etichete de bandă HF, în special cu protocolul MIFARE.

Pentru a lucra cu modulul, puteți utiliza bibliotecă standard RFID este inclusă în Arduino IDE, dar există o altă bibliotecă scrisă special pentru acest modul - MFRC522 (1 MB). Ambele biblioteci sunt destul de convenabile, dar MFRC522 are mai multe funcții speciale, permițând reducerea cât mai mult posibil a codului final al programului.

Conexiune

Unii oameni vor întâmpina o problemă - este posibil ca numele pinilor din majoritatea tutorialelor și ghidurilor să nu se potrivească cu pinout-ul de pe modulul dvs. Dacă schițele indică pinul SS, dar modulul tău nu îl are, atunci cel mai probabil este marcat ca SDA. Mai jos voi furniza un tabel de conectare a modulelor pentru cele mai comune plăci.

MFRC522 Arduino Uno Arduino Mega Arduino Nano v3

Arduino Leonardo/Micro

Arduino Pro Micro
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,3 V 3,3 V 3,3 V Stabilizator 3.3V Stabilizator 3.3V Stabilizator 3.3V
GND GND GND GND GND GND

Pinii de control SS(SDA) și RST sunt specificați în schiță, așa că dacă placa dvs. este diferită de cea pe care o voi folosi în exemplele mele și folosesc UNO R3, indicați pinii din tabel de la începutul schiței :


#define SS_PIN 10 #define RST_PIN 9

Exemplul nr. 1: Citirea numărului cardului

Să ne uităm la un exemplu din biblioteca RFID - cardRead. Nu afișează date de pe card, ci doar numărul acestuia, care este de obicei suficient pentru multe sarcini.


#include #include #define SS_PIN 10 #define RST_PIN 9 RFID rfid(SS_PIN, RST_PIN); // Datele despre numărul cardului sunt stocate în 5 variabile, le vom aminti pentru a verifica dacă am citit deja un astfel de card 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()) ( // Comparați numărul cardului cu numărul cardului precedent dacă (rfid.serNum != serNum0 && rfid.serNum != serNum1 && rfid.serNum != serNum2 && rfid.serNum != serNum3 && rfid.serNum != serNum4) ( / * Dacă cardul este nou, citiți */ Serial.println("Card găsită" = rfid.serNum; "); .print(rfid.serNum,DEC); Serial.print(", "); Serial.print(rfid.serNum,DEC); Serial.print(rfid.serNum,DEC); Serial.print(", "); Serial.print(rfid.serNum,DEC); Serial.print("Hex: "); .print(", "); Serial.print(rfid.serNum,HEX); Serial.print(rfid.serNum,HEX); Serial.print(", "); Serial.print(rfid.serNum,HEX); Serial.print(", "); Serial.print(rfid.serNum,HEX); Serial.println(" "); ) else ( /* Dacă acesta este deja un card citit, imprimați doar punctul */ Serial.print("."); ) ) ) rfid.halt(); )

Schița este încărcată, LED-ul de alimentare de pe modul se aprinde, dar modulul nu răspunde la card? Nu este nevoie să intrați în panică sau să alergați pentru a căuta exemplele „corecte” de lucru. Cel mai probabil, pur și simplu nu există niciun contact pe unul dintre pini - găurile de pe placă sunt puțin mai mari decât grosimea jumperului, așa că merită să încercați să le rearanjați. LED-ul de pe placă nu este aprins? Încercați să schimbați jumperul care duce la 3,3 V și asigurați-vă că este conectat la 3,3 V de pe placă.

Să spunem că totul funcționează pentru tine. Apoi, citiți etichetele RFID de pe monitor port serial vom vedea următoarele:


Aici am citit 3 etichete diferite și, după cum puteți vedea, le-a citit cu succes pe toate.

Exemplul #2: Citirea datelor de pe un card

Să luăm în considerare o opțiune mai sofisticată - va citi nu numai numărul cardului, ci și toate datele disponibile pentru citire. De data aceasta, să luăm un exemplu din biblioteca MFRC522 - DumpInfo.


#include #include #define RST_PIN 9 // #define SS_PIN 10 // MFRC522 mfrc522(SS_PIN, RST_PIN); // Creați instanța MFRC522 void setup() ( Serial.begin(9600); // Inițializați monitorul portului serial în timp ce (!Serial); // Nu faceți nimic până când este deschis (pentru Arduino pe cipul ATMEGA32U4) SPI.begin( ) ; // Inițializați busul SPI mfrc522.PCD_Init(); ..." )); ) void loop() ( // Se caută un card nou dacă (! mfrc522.PICC_IsNewCardPresent()) ( return; ) // Se selectează una dintre cărți dacă (! mfrc522.PICC_ReadCardSerial()) ( return; ) // Ieșirea datelor de pe card mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); void ShowReaderDetails() ( // Obține byte numărul versiunii modulului v = mfrc522.PCD_ReadRegister(mfrc522.VersionReg); F("MFRC522 Versiune de software: 0x ")); ) Serial.print(F(" = v2.0")); else Serial.print(F(" (necunoscut)")); // Când primim 0x00 sau 0xFF, transmisia datelor este întreruptă dacă ((v == 0x00) || (v == 0xFF)) ( Serial.println(F("ATENȚIE: Eroare de comunicare, MFRC522 este conectat corect?" )) ;))

Dacă exemplul anterior a funcționat fără erori, atunci nici aceasta nu ar trebui să fie o problemă. Deși, abonamentul de metrou, care a dat fără probleme numărul cardului în exemplul anterior, s-a dovedit a avea un tip de date nedetectabil în acesta, iar modulul nu putea citi altceva decât numărul cardului.

Ca urmare, după ce citim datele de pe card, obținem tipul, identificatorul și datele din 16 sectoare de memorie. Trebuie remarcat faptul că cardurile standard MIFARE 1K constau din 16 sectoare, fiecare sector este format din 4 blocuri și fiecare bloc conține 16 octeți de date.


Exemplul nr. 3: Scrierea unui nou identificator pe card

În acest exemplu, ne vom uita la schimbarea identificatorului cardului (UID). Este important de știut că nu toate cardurile acceptă schimbarea ID-ului. Cardul poate fi reinscriptibil, dar asta înseamnă doar că datele sunt reinscriptibile. Din păcate, cardurile pe care le aveam în mână nu acceptau rescrierea UID, dar voi furniza aici codul de schiță pentru orice eventualitate.


#include #include /* Setați un nou UID aici */ #define NEW_UID (0xDE, 0xAD, 0xBE, 0xEF) #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); MFRC522::MIFARE_Key cheie; void setup() ( Serial.begin(9600); while (!Serial); SPI.begin(); mfrc522.PCD_Init(); Serial.println(F("Avertisment: acest exemplu suprascrie UID-ul cardului dumneavoastră UID-ul modificabil, folosiți cu grijă!")); pentru (octetul 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); }

Exemplul nr. 4: Scrierea datelor pe un card

Iată în sfârșit la ce am ajuns atât de mult timp - înregistrarea datelor pe card. Cea mai „dulce” parte a lucrului cu modulul este abilitatea de a face o copie a unui card existent, de a adăuga sau de a schimba ceva, acest lucru este mult mai interesant decât simpla citire a acestuia.

Să schimbăm unul dintre blocurile de date de pe hartă:


#include #include #define RST_PIN 9 #define SS_PIN 10 MFRC522 mfrc522(SS_PIN, RST_PIN); MFRC522::MIFARE_Key cheie; void setup() ( Serial.begin(9600); while (!Serial); SPI.begin(); mfrc522.PCD_Init(); // Pregătește cheia // folosește cheia FFFFFFFFFFFFh care este standardul pentru carduri goale pentru (octetul 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); } }

Și, ca rezultat, obținem un card cu un bloc de date modificat:


Acum, după ce ați învățat să citiți și să scrieți blocuri de date de card, puteți experimenta cu etichetele pe care cel mai probabil le aveți - permise, permise de transport public. Încercați să citiți și să scrieți date de pe aceste carduri, câteva treceri duplicat nu strica niciodată, nu?)

Atât, abonați-vă și urmăriți publicațiile. Data viitoare vă voi explica și vă voi arăta cum să adăugați caractere personalizate la un afișaj standard de 1602 caractere, adăugând în esență elemente grafice pe afișaj.

  • Serghei Savenkov

    un fel de recenzie „scurtă”... de parcă s-ar grăbi undeva