Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • Siguranță
  • Citirea și scrierea etichetelor RFID. Modul RC522 pentru Arduino

Citirea și scrierea etichetelor RFID. Modul RC522 pentru Arduino

Acest proiect a fost realizat la solicitarea unui prieten pentru montaj pe o usa catre un depozit. Pe viitor, mai multe au fost făcute la cererea prietenilor și cunoscuților. Designul s-a dovedit a fi simplu și de încredere. Acest dispozitiv funcționează astfel: lasă să treacă doar acele carduri RFID care au fost introduse anterior în memoria dispozitivului.

Caracteristicile cheie ale controlerului de acces:

Format card RFID EMmarin 125kHz

Microcontroler ATtiny13

Numărul de carduri / brelocuri este 10.
Butonul „OPEN” este în mod normal deschis, protejat de lipire.
Ieșire de control blocare, tranzistor cu efect de câmp de curent ridicat, mod blocare (pornit pentru o perioadă).

Mâncare - 12c.
Consum în modul standby - 35 mA.
Număr carduri de acces / brelocuri - 10 buc.
Lungimea comunicării cu butonul „DESCHIS” este de 10 metri.
Tip ieșire de control blocare - scurgere deschisă (tranzistor puternic cu efect de câmp, curent de până la 2A).

Schema schematică a unui controler de restricție de acces pe carduri RFID de 125KHz (Em-Marin) pentru 10 carduri (pe un microcontroler ATtiny13):

Dacă este necesară acționarea unei încuietori electromagnetice, este necesară instalarea unui releu de ieșire cu grupul de contacte necesar.

Aspectul validatorului RFID asamblat:

Setarea biților de siguranță în PonyProg:

Funcționarea dispozitivului, descărcați videoclipul înregistrat de autor.
De asemenea, unul dintre cititori a publicat un videoclip cu dispozitivul asamblat:

Instructiuni de programare

Mod de funcționare - când controlerului este furnizat 12 V, LED-ul clipește 1 Hz.
Modul de programare - LED-ul clipește 2Hz.
La apăsarea butonului „DESCHIS”, o serie de bipuri scurte în timpul deschiderii încuietorii.

Semnale sonore

1 semnal scurt - cardul sau telecomanda este salvată în memoria controlerului.
2 bipuri scurte - cardul sau telecomanda este deja stocată în memoria controlerului.
5 semnale scurte - ieșire din modul de programare.
1 bip lung - memoria cardului cheie a fost ștearsă din controler.
Bipuri scurte continue - memoria cardului/cheii este plină, max.10 buc. (necesită oprirea controlerului).

Înregistrarea MASTER CARD și ora deschiderii încuietorului

1 - Opriți sursa de alimentare a controlerului.
2 - Apăsați butonul „OPEN”.
3 - În timp ce țineți apăsat butonul, conectați alimentarea la controler, după 5 sec. controler „PISKNET”, LED-ul va clipi la o frecvență de 2 Hz.
4 - Eliberați butonul.
5 - Aduceți cardul sau cheia în zona de citire, se va auzi un singur semnal sonor, cardul Master sau cheia este ÎNREGISTRAT, iar timpul de deschidere a broaștei 1 sec va fi înregistrat.

6 - Ținând cardul sau cheia în zona de citire - citim semnalele sonore. Cantitatea determină timpul necesar pentru deschiderea încuietorului, increment de 1 sec., Dar nu mai mult de 32 sec.
7 - Opriți alimentarea controlerului sau faceți o pauză timp de 30 de secunde.

Stergerea tuturor memoriei brelocului

1 - Mod de lucru.
2 - Apăsați butonul „OPEN” și ținându-l apăsat, aduceți cardul MASTER sau brelocul la cititor și țineți-l apăsat, după 5 secunde se va auzi un bip lung - memoria cardurilor / brelocurilor a fost ștearsă.
3 - Eliberați butonul și luați cardul sau telecomanda.

Astăzi vă voi povesti despre modulul RFID RC522, bazat pe cipul MFRC522. Sursa de alimentare de 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 este foarte importantă în acest caz, deoarece etichetele RFID există în trei intervale de frecvență:


  • Etichete de bandă LF (125-134 kHz)

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

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

Mai exact, acest modul funcționează cu etichete din gama HF, în special cu protocolul MIFARE.

Pentru a lucra cu modulul, puteți utiliza biblioteca standard RFID 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 care vă permit să minimizați codul final al programului cât mai mult posibil.

Conexiune

Unii oameni se confruntă cu o problemă - este posibil ca numele pinilor din majoritatea tutorialelor și tutorialelor să nu corespundă pinout-ului de pe modulul dvs. Dacă pinul SS este indicat în schițe, dar nu este pe modulul dvs., atunci cel mai probabil este marcat ca SDA. Mai jos voi da un tabel pentru conectarea modulului 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 setaț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, specificați pinii din tabel de la începutul schiței:


#define SS_PIN 10 #define RST_PIN 9

Exemplul # 1: citirea numărului cardului

Să ne uităm la un exemplu din biblioteca RFID - cardRead. Nu emite 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 () (dacă (rfid.isCard ()) (dacă (rfid.readCardSerial ()) (// Comparați numărul cardului cu numărul precedent dacă (rfid.serNum! = SerNum0 && rfid.serNum! = SerNum1 && rfid.serNum! = SerNum2 && rfid.serNum! = SerNum3 && rfid.serNum! = SerNum4) (/ * Dacă cardul este nou, apoi citiți * / Serial.println (""); Serial.println ("Cartel găsit"); serNum0 = rfid.serNum; serNum1 = rfid.serNum; serNum2 = rfid.serNum; serNum3 = rfid.serNum; ; serNum4 = rfid.serNum; // Tipăriți numărul cardului Serial.println ("Număr card:"); Serial.print ("Dec:"); Serial.print (rfid.serNum, DEC); Serial.print (", "); Serial.print (rfid.serNum, DEC); Serial.print (","); Serial.print (rfid.serNum, DEC); Serial.print (","); Serial.print (rfid.serNum, DEC); , DEC); Serial.print (","); Serial.print (rfid.serNum, DEC); Serial.println (""); Serial.print ("Hex:"); Serial.print (rfid.serNum, HEX); Serial.print (","); Serial.print (rfid.serNum, HEX); Serial.pr int (","); 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 un punct * / Serial.print (".");))) rfid.halt (); )

Schița este completată, LED-ul de alimentare de pe modul este aprins, dar modulul nu răspunde la card? Nu intrați în panică sau fugiți să căutați exemple de lucru „corecte”. 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ă ar trebui să încercați să le rearanjați. LED-ul de pe placă este stins? Încercați să rearanjați jumperul de 3,3 V și asigurați-vă că este conectat la 3,3 V de pe placă, furnizarea de energie de 5 V vă poate ucide cu ușurință placa.

Să spunem că totul funcționează pentru tine. Apoi, citind etichetele de către modulul RFID, vom vedea următoarele în monitorul portului serial:


Aici am citit 3 etichete diferite, iar după cum puteți vedea toate cele 3 le-a numărat cu succes.

Exemplul # 2: Citirea datelor de pe un card

Să luăm în considerare o opțiune mai elaborată - va citi nu numai numărul cardului, ci 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 o instanță 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 chipul ATMEGA32U4) SPI.begin () ; // Inițializați magistrala SPI mfrc522.PCD_Init (); // Inițializați modulul RFID ShowReaderDetails (); // Imprimați datele despre modulul MFRC522 Serial.println (F ("Scanați PICC pentru a vedea UID, tip și blocuri de date . .." ));) void loop () (// Se caută un card nou if (! mfrc522.PICC_IsNewCardPresent ()) (întoarce;) // Selectează unul dintre carduri dacă (! mfrc522.PICC_ReadCardSerial ()) (întoarce) ;) // Afișează datele de pe card mfrc522.PICC_DumpToSerial (& (mfrc522.uid));) void ShowReaderDetails () (// Obține numărul versiunii octetului modulului v = mfrc522.PCD_ReadRegister (mfrc522.VersionReg); Serial. RC5 (F ("MF Versiunea 0 ")); Serial.print (v, HEX); dacă (v == 0x91) Serial.print (F (" = v1.0 ")); altfel dacă (v == 0x92 ) Serial.print (F (" = v2.0 ")); altfel Serial.print (F (" (necunoscut) ")); Serial.println (""); // Când primim 0x00 sau 0xFF, transferul de date este întrerupt dacă ((v == 0x00) || (v == 0xFF)) (Serial.println (F ("AVERTISMENT: 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 fi cu un tip de date nedetectabil în acesta, iar modulul nu putea citi nimic în afară de 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 MIFARE 1K constau din 16 sectoare, fiecare sector este format din 4 blocuri și fiecare bloc conține 16 octeți de date.


Exemplul # 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 identificatorului. Cardul poate fi reinscriptibil, dar asta înseamnă doar date reinscriptibile. Din păcate, cardurile pe care le aveam în mâini nu acceptau rescrierea UID, dar voi da 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 :: Cheie MIFARE_Key; void setup () (Serial.begin (9600); while (! Serial); SPI.begin (); mfrc522.PCD_Init (); Serial.println (F ("Avertisment: acest exemplu suprascrie UID-ul cardului dvs. modificabil UID, 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 # 4: Scrierea datelor pe un card

Și, în sfârșit, la ce ne-a luat atât de mult să ajungem - să scriem date pe card. Cea mai dulce parte a lucrului cu modulul este capacitatea 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.

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 :: Cheie MIFARE_Key; void setup () (Serial.begin (9600); while (! Serial); SPI.begin (); mfrc522.PCD_Init (); // Pregătiți cheia // folosiți cheia FFFFFFFFFFFFh care este standardul pentru cardurile goale pentru ( octet 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 o hartă cu un bloc de date modificat:


Acum că știți 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 în comun. Î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 de caractere, adăugând în mod eficient elemente grafice pe afișaj.

RFID (Radio Frequency Identification) folosește câmpuri electromagnetice pentru a identifica și urmări automat etichetele atașate la obiecte. Etichetele conțin informații stocate electronic. Etichetele pasive colectează energie din semnalele radio de la un cititor RFID din apropiere. Etichetele active au o sursă de energie locală (cum ar fi o baterie) și pot funcționa la sute de metri de cititor. Spre deosebire de un cod de bare, eticheta nu trebuie să fie în vizorul instrumentului, astfel încât poate fi încorporată în obiectul urmărit. RFID este una dintre metodele de identificare automată și de colectare a datelor.

Aplicație

Etichetele RFID sunt folosite în multe industrii. De exemplu, un cititor RFID atașat la un vehicul în timpul producției poate fi utilizat pentru a urmări progresul de-a lungul unei linii de transport. Produsele farmaceutice etichetate pot fi urmărite prin depozite. Implantarea de microcipuri RFID în animale permite identificarea animalelor.

Deoarece etichetele RFID pot fi atașate banilor, îmbrăcămintei și proprietății sau implantate în animale și oameni, capacitatea de a citi informații personale fără consimțământul utilizatorului reprezintă o problemă serioasă de confidențialitate. Aceste riscuri au condus la dezvoltarea unor specificații standard privind securitatea datelor cu caracter personal. Etichetele pot fi, de asemenea, folosite în magazine pentru a accelera procesul de comandă și pentru a preveni furtul.

Poveste

În 1945, Leon Theremin a inventat un dispozitiv de ascultare pentru Uniunea Sovietică care retransmitea unde radio cu informații audio adăugate. Vibrațiile sonore în timpul vibrației au afectat diafragma, care a schimbat ușor forma rezonatorului, care a modulat frecvența radio reflectată. Deși acest dispozitiv era un dispozitiv de ascultare ascuns și nu o etichetă de identificare, este considerat predecesorul cititorului USB RFID, deoarece a fost activat de undele audio de la o sursă externă. Transponderele sunt încă folosite de majoritatea aeronavelor aflate în funcțiune. Anterior, tehnologie similară, cum ar fi un cititor de etichete RFID, a fost folosită în mod regulat de Aliați și Germania în cel de-al Doilea Război Mondial pentru a identifica aeronave.

Dispozitivul lui Mario Cardullo, brevetat pe 23 ianuarie 1973, a fost primul precursor adevărat al RFID modern, deoarece era un radio cu memorie pasivă. Dispozitivul original era pasiv, alimentat de un semnal de sondare. Acesta a fost demonstrat în 1971 administrației orașului New York și altor potențiali utilizatori și a constat într-un transponder de memorie pe 16 biți pentru utilizare ca dispozitiv de plată. Principalul brevet Cardullo acoperă utilizarea frecvențelor radio, a sunetului și a luminii ca medii de transmisie.

Domeniul de utilizare

Planul de afaceri inițial prezentat investitorilor în 1969 a arătat următoarele aplicații de citire RFID:

  • utilizare în transport (identificare vehicul, sistem automat de plată, plăcuță electronică de înmatriculare, manifest electronic, traseu vehicul, monitorizare performanță vehicul);
  • bancar (carte de cecuri electronică, card de credit electronic);
  • personal, porti automate, supraveghere); industria medicală (identificare, istoricul pacientului).

O demonstrație timpurie a puterii reflectate (backscatter modulată) a etichetelor RFID, atât pasive, cât și semi-pasive, a fost realizată de Stephen Depp, Alfred Coelle și Robert Fraiman la Laboratorul Național Los Alamos în 1973. Sistemul portabil rula la 915 MHz și folosea etichete pe 12 biți. Această metodă este utilizată de majoritatea cititoarelor moderne UHFID și RFID cu microunde. În viața modernă, astfel de dispozitive sunt la mare căutare.

Specificație

Un sistem RFID folosește etichete atașate la obiecte identificabile. Atunci când realizați un cititor RFID cu propriile mâini, trebuie avut în vedere faptul că emițătoarele-receptoare radio bidirecționale, numite interogatori sau cititoare, trimit un semnal etichetei și citesc răspunsul acesteia. Etichetele RFID pot fi pasive, active sau pasive. Eticheta activă are o baterie încorporată și își transmite periodic semnalul de identificare. Bateria pasivă (BAP) are o baterie mică la bord și este activată atunci când este prezent un cititor RFID. Eticheta pasivă este mai ieftină și mai mică pentru că nu are baterie. În schimb, eticheta folosește unda radio transmisă de cititor. Cu toate acestea, pentru ca o etichetă pasivă să funcționeze, trebuie să fie iluminată cu un nivel de putere de aproximativ o mie de ori mai puternic decât pentru transmisia semnalului. Acest lucru afectează interferența și expunerea la radiații.

19 septembrie 2013 la 18:32

Cititor RFID UHF buget și dezvoltarea acestuia

  • Tehnologia wireless

Bună ziua, onorabili doamnelor și domnilor.
Cel mai ieftin cititor RFID UHF sau cititor EPC Gen2 costă cu amănuntul nu mai puțin de 200 USD.

Mai jos este descris cum puteți face un cititor RFID UHF funcțional din piese pentru 10 USD și cum puteți beneficia de el.

Majoritatea cititoarelor RFID EPC Gen2 moderne folosesc cipuri specializate. Sunt produse de Impinj, AMS și Phychips. Cele mai ieftine microcircuite costă aproximativ 20 USD în loturi de 1000 de bucăți. Cititoarele RFID sunt grozave - puternice, agile și cu rază lungă de acțiune - dar scumpe.
În primăvara acestui an, pe internet a apărut un articol „Simple Low Cost UHF RFID Reader” despre cum să asamblați un cititor RFID funcțional din componente radio obișnuite, în valoare de aproximativ 5 USD la vânzare. Ideea pare a fi simplă, dar abia recent s-a ajuns la implementare. Premisa dezvoltării se bazează pe faptul că foarte des, lângă antenă, trebuie să citiți încet câteva trei etichete și nu este nevoie să plătiți mulți bani pentru un cititor cu o rată de foc de 200. -500 de etichete pe secundă. Schema bloc a cititorului este prezentată în imagine.


Frumusețea sa este în simplitate. Baza este un microcontroler convențional, care generează semnale EPC Gen2 pe piciorul GPIO, care sunt necesare pentru sondarea etichetei. Semnalele sunt transmise către microcircuitul transmițător Melexis TH72035, apoi către antenă prin cuplatorul Johanson 0910CF15B0100. Receptorul este asamblat pe un comparator MAX931 conform diagramei următoare.


Semnalele logice de la receptor ajung la alt pin GPIO al microprocesorului. Primim un cititor RFID UHF software simplu. Desigur, scrierea unui cititor RFID EPC Gen2 bazat pe software nu este o jumătate de kilogram de stafide. Dar dacă vă definiți clar obiectivele și utilizați doar subsetul dorit al protocolului EPC Gen2, atunci sarcina este mult simplificată.
Autorii proiectului descris consideră plasarea tuturor componentelor cititorului RFID pe o singură placă ca unul dintre obiectivele dezvoltării sale ulterioare. Dar nu ar fi mai interesant să mergi în direcția opusă? Adică, să împarți cititorul în module funcționale separate fizic și apoi să construiești un cititor RFID cu caracteristicile necesare din diferite module. Totul de mai jos este doar o idee, fără un studiu detaliat.

Este clar că modulul principal este bazat pe microprocesor. Probabil, trebuie făcut pe Cortex-M0, adus la conectorii UART și USB pentru a controla cititorul. Pentru a conecta modulul transceiver, utilizați conectorul cu 6 pini: Rx, Tx, 2 pentru a alimenta transceiver-ul, 2 GPIO. Astfel de conectori se pot realiza 2-4, în măsura în care ieșirile microprocesorului sunt suficiente.
Modulul transceiver va fi conectat la modulul microprocesorului direct sau printr-un cablu scurt. Poate că este necesar să se realizeze mai multe variante de module transceiver cu putere și preț diferit, dar același conector. Al 5-lea pin al conectorului poate fi folosit pentru a porni transceiver-ul, iar al 6-lea pin poate fi folosit pentru un fel de senzor, dacă este necesar. Este logic să faceți o placă de circuit imprimat a transceiver-ului cu semigăuri de capăt metalizate. Apoi poate fi lipit la PCB-uri cu diferite antene sau PCB-uri cu un conector SMA coaxial.
Deci, conectând modulul microprocesorului și modulul transceiver, obținem un cititor RFID. Dar doar de dragul acestui lucru, nu merită să îngrădiți o grădină. Să mergem mai departe. Să conectăm o placă cu un driver RS422 și o mufă RJ45 în conectorul cu 6 pini al modulului microprocesorului în loc de transceiver (perechea 1 - primire, perechea 2 - transmitere, 3 - alimentare, 4 - GPIO). Să-l punem pe același în transceiver. Este clar că acum puteți conecta modulul microprocesorului și transceiver-ul folosind orice cordon de corecție sau utilizați un SCS de birou pentru conectare. În general, antena poate fi amplasată foarte departe de modulul microprocesorului. Și fără coaxial.
Și asta nu este tot :) RS422 este un autobuz. Transceiver-ul poate găzdui un cip D-flip-flop. Conectați modulele transceiver în serie cu cabluri de corelare. Adevărat, aveți nevoie de un al doilea conector RJ45 sau de un T-splitter, dacă puneți un contor sincron în loc de un D-trigger. Folosind două GPIO-uri în a patra pereche UTP, puteți selecta transceiver-ul dorit. Se dovedește un cititor RFID distribuit, ca în imagine.


De ce aveți nevoie de USB: dar pentru a putea conecta cititorul la o tabletă Android.

Soluția este aplicabilă acolo unde nu este necesară o viteză mare de citire a etichetelor și un interval.
1. Nu este potrivit pentru magazine alimentare. Acestea sunt magazinele RFID ale viitorului. Iar magazinele RFID din prezent sunt magazine universale (încălțăminte și haine). Acolo, cititoarele RFID sunt deja folosite în cabinele de probă (împreună într-un afișaj interactiv), la casele și rafturile inteligente cu mărfuri.
2. Depozite cu europaleți (lanț de module transceiver unde se află colțurile din stânga paleților).
3. Sistem de acces pentru diverse evenimente publice.
4. Cu siguranță în altă parte.

Schema unui emulator de transponder RFID conform standardului EM-Marine (EM4100).
Cartelele de proximitate ale standardului 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 acces (ACS).
Al doilea, nu mai puțin popular, domeniu de aplicare al cardurilor Em-Marine este utilizarea acestora în sistemele de acces logic la autorizarea utilizatorilor prin numărul ID cardului în sistemul de operare al computerului și aplicațiile 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 implementarea propriilor sisteme de identificare și automatizare. Deoarece protocolul de schimb și hardware-ul unor astfel de sisteme de joasă frecvență este mai ușor pentru implementarea independentă a propriilor dispozitive, majoritatea modelelor de radioamatori pe teme 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 specializate de carduri contactless (cititoare RFID). Interacțiunea identificatorului cu un astfel de cititor se realizează de la distanță.
Există un număr mare 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 de obicei reinscriptibile. Pentru confortul înregistrării cardurilor, codul scris în card este duplicat prin imprimare pe una dintre fețele cardului. Codificarea datelor transmise de transponder este codarea Manchester. În acest caz, perioadele semnalului transmis de transponder sunt multipli ai frecvenței 125KHz - frecvența semnalului de la cititorul transponder. 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 câmpul cititorului de carduri. Transponderul este tactat și de semnalul cititorului - 125KHz. Prin urmare, parametrii semnalului rezultat în codarea Manchester sunt multipli ai semnalului de 125KHz.

Schema de interacțiune între un transponder și un cititor RFID.
Pentru o înțelegere mai completă, să luăm în considerare structura pachetului de transponder RFID în formatul EMMarine EM4100. Este dată descrierea (î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 început ai pachetului (întotdeauna 1 logic), 11 grupuri de 4 biți de date cu 1 bit de paritate de rând, 4 biți de paritate de coloană la sfârșitul pachetului și un bit de terminare (î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 valori 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ă trecem cu atenție la descrierea modulării datelor transponder. Date preluate din adnotarea AN680. În figură, am făcut semnele cu roșu în raport cu diagramele care ne interesează.

Acum să descriem 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 trebuie pregătite pentru transponder în conformitate cu pachetele de date înregistrate (64 de biți). Se poate observa că implementarea codării NRZ pe baza pachetului de 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, XOR programatic starea curentă a semnalului în format NRZ și CLK a semnalului de ceas al cititorului. Ca rezultat, obținem codificarea Manchester a semnalului rezultat. Nu voi descrie mai detaliat despre codarea Manchester - datele pot fi găsite în anunturi separate. Pentru o descriere mai detaliată a metodelor de modulare, consultați datele din „Modulation Methods H.R. Walker Data Systems 05/01/04 (revizuit 4/18/10)”, am studiat aceste exemple. Principalul lucru este că, cu o cheltuială minimă de resurse, putem astfel implementa un transponder în formatul EM-Marine. De exemplu, puteți lua controlerul AVR din seria tiny45 (o puteți face pe tiny13). Testat pe tiny45 deoarece acesta era disponibil pentru experimentare.
Acum vom prezenta o diagramă funcțională a unui transponder bazată pe modelul din 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.
După cum puteți vedea din diagramă, pinul controlerului T0 (PORTB.2) este utilizat pentru a furniza semnalul de ceas pentru temporizatorul de 8 biți TIMER0. Programul implementează o întrerupere coincidență pe cronometrul TIMER0 (TIM0_COMPA). Cronometrul 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 cristal de cuarț de 4 MHz instalat între cele 2 și 3 picioare ale controlerului. Puteți adăuga, de asemenea, condensatoare de bypass de cuarț de 22 pF pe acești pini de controler.
Setările de simulare Proteus pentru controler sunt specificate după cum urmează:

Când programați controlerul tiny45, setați siguranțele (biții de configurare) în același mod ca în figură. Pentru a tasta controlerul, se folosește cuarț de 4 MHz.
În ceea ce privește implementarea schemei de conducte ale controlerului extern, vom lua în considerare această problemă mai detaliat. De exemplu, au fost luate materiale RFID Handbook (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 diagramă cu transponder pasiv (parte a diagramei 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 a ceasului. Putem arunca în siguranță tot ceea ce privește contra-divizorul IC1 (4024), elementele logice IC3 (7400) - nu vom avea nevoie de el. Divizorul pentru cronometru este implementat de setările temporizatorului fără divizoare externe - contoare, partea logică este implementată și în software. Cu toate acestea, acest exemplu permite o înțelegere mai completă a funcționării circuitului transponder pasiv. Distanța maximă de citire pentru un transponder de acest format este de 200 cm. În realitate, majoritatea circuitelor funcționează la distanțe de 2-10 cm. Parametrii circuitului de capacitate și inductanță ale LC sunt selectați cât mai precis posibil la frecvența de rezonanță de 125KHz. Ca exemplu, am folosit un circuit cu o capacitate de 1nF și o bobină de 60 de spire pe un dorn cu diametrul de 50 mm folosind un fir de 0,2 PEV. Puteți calcula conturul dorit într-un program special (puteți calcula conturul pentru o bobină dreptunghiulară, imprimată etc.). Principalul lucru este să alegeți evaluările exacte pentru frecvența de 125 KHz, altfel distanța de citire și sensibilitatea circuitului se vor deteriora semnificativ. Cu circuite prost reglate, 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. Temporizarea circuitului de la cititor și transferul de date se efectuează continuu. Unele scheme de transponder folosesc schema de funcționare 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.

Un circuit de transponder pasiv bazat pe un circuit din manualul RFID.


Ținând cont de partea din circuit de care nu avem nevoie pe baza circuitului original, obținem conducta controlerului în această formă.



Cum vă place acest articol?

Top articole similare