Cum se configurează smartphone-uri și PC-uri. Portal informativ

Cititor RFID UHF buget și dezvoltarea acestuia. Cititor RFID: vorbim despre tehnologie

Orice sistem de identificare prin radiofrecvență (RFID) constă dintr-un cititor (cititor, cititor sau interogator) și un transponder (alias etichetă RFID, uneori se folosește și termenul etichetă RFID). În articol, vom lua în considerare 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 lua forma unui breloc sau a unui card de credit (Figura 1).

Componenta principală a cititorului este Microcontroler AVR, care citește numărul unic de identificare al cheii din 10 cifre și îl transmite către Codificare ASCII pe 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 3.

Figura 3

Luați în considerare principalele caracteristici ale schemei. Microcontrolerul folosește un modulator PWM încorporat pentru a genera ieșire PB0 impulsuri dreptunghiulare cu o frecvență de 125 kHz. Dacă jurnalul de ieșire PB0. 0 (marginea descendentă a impulsului), tranzistorul T1 este în stare închisă, iar tensiunea de alimentare de +5 V este aplicată bobinei L1 prin rezistorul R1. Marginea ascendentă la ieșirea PB0 (log. 1) deschide tranzistorul T1, iar ieșirea superioară a bobinei conform circuitului 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 (Figura 4).

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ă un EMF de inducție în toate celelalte înfășurări. În cazul nostru, înfășurarea primară este bobina cititorului, iar înfășurarea secundară este bobina cheii RFID. Elementele D1, C3 și R5 formează un demodulator de semnal modulat în 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 ar trebui să trimită 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 (Figura 5).

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

  1. Primii 9 biți (întotdeauna logic 1) sunt biți de pornire care indică începutul schimbului de date.
  2. 4 biți - scăzut biți semnificativi personalizat 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 unui 32 de biți număr de serie Cheie RFID (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 4 biți de biți de paritate sunt transmiși pe coloane. 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.

Verificarea integrității datelor este efectuată de microcontroler prin calcularea biților de paritate pentru fiecare rând și coloană și comparând 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 circuit oscilator. Dacă, prin conectarea osciloscopului la punctul de conectare al lui R1 și L1, vedeți vârfuri distorsionate pe ecranul dispozitivului (Figura 7), atunci aceasta indică necesitatea de a calibra bobina L1.

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

  1. Conectați sondele osciloscopului la punctul de conectare al lui R1 și L1 și, prin creșterea sau scăderea numărului de spire ale bobinei L1, obțineți eliminarea distorsiunii semnalului.
  2. Dacă nu aveți un osciloscop, aduceți încet cheia RFID în bobină până când cheia este recunoscută, așa cum este evidențiat de un bip. Dacă cheia este determinată de la o distanță de 2 cm, atunci este necesar să adăugați / îndepărtați câteva ture și apoi să verificați din nou distanța de la care cheia poate fi citită cu încredere. Folosind calibrarea, autorul schemei a realizat o citire sigură a cheii RFID de la 3 cm.

Când programați microcontrolerul, este necesar să setați următoarea configurație Fuse-bit: octet mic 0x7A și octet mare 0x1F (microcontrolerul este alimentat de un generator de ceas încorporat 9,6 MHz, frecvența ceasului 8 cu handicap). Codul programului ocupă 1024 de octeți în memoria microcontrolerului - este utilizată întreaga 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 microcontroler AVR cu 8 pini, de exemplu.

Descărcări:

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

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


  • Marcaje benzii LF (125-134 kHz)

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

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

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

Pentru a lucra cu modulul, puteți utiliza bibliotecă standard RFID de intrare Arduino IDE, cu toate acestea, 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 de program rezultat.

Conexiune

Unii se vor confrunta cu o problemă - este posibil ca numele pinilor din majoritatea tutorialelor și tutorialelor să nu se potrivească cu pinout-ul de pe modulul dvs. Dacă pinul SS este indicat în schițe, dar modulul dvs. nu îl are, atunci cel mai probabil este marcat ca SDA. Mai jos voi oferi 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, specificați pinii din tabel de la începutul schiței:


#define SS_PIN 10 #define RST_PIN 9

Exemplul #1: citirea numărului cardului

Luați în considerare un exemplu din biblioteca RFID - cardRead. Nu furnizează 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; inserNum2; 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 precedent dacă (rfid.serNum != serNum0 && rfid.serNum != serNum1 && rfid.serNum != serNum2 && rfid.serNum != serNum3 && rfid.serNum != serNum4) ( /* Dacă cardul este - nou, apoi citit*/ Serial.println(" "); Serial.println("Card găsit"); serNum0 = rfid.serNum; serNum1 = rfid.serNum; serNum2 = rfid.serNum; serNum3 = rfid. serNum; serNum4 = rfid.serNum; //Tipărește 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); 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ă este deja un card citit, imprimați doar punctul */ Serial.print("."); ) ) ) rfid.halt(); )

Schița a fost încărcată, LED-ul de alimentare de pe modul aprins, dar modulul nu răspunde la card? Nu intrați în panică sau fugiți să căutați exemplele 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ă 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ă, furnizarea de energie la 5 V vă poate ucide cu ușurință placa.

Să spunem că totul a funcționat pentru tine. Apoi, citiți etichetele de către modulul RFID, în monitor port serial vom vedea următoarele:


Aici am citit 3 semne 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 dezvoltată - va citi nu numai numărul cardului, ci și toate datele disponibile pentru citire. De data aceasta vom lua 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țializează magistrala SPI mfrc522.PCD_Init(); // Inițializează Modul RFID ShowReaderDetails(); // Tipăriți date despre modulul MFRC522 Serial. println(F("Scanați PICC pentru a vedea UID, tip și blocuri de date...")); ) void loop() ( // Caut hartă nouă if (! mfrc522.PICC_IsNewCardPresent()) ( return; ) // Selectați unul dintre carduri dacă (! mfrc522.PICC_ReadCardSerial()) ( return; ) // Descarcă datele de pe card mfrc522.PICC_DumpToSerial(&(mfrc522.uid) ); ) void ShowReaderDetails() ( // Obține octetul numărului versiunii modulului v = mfrc522.PCD_ReadRegister(mfrc522.VersionReg); Serial.print(F("MFRC522 Software Version: 0x")); Serial.print(v, HEX); dacă (v == 0x91) Serial.print(F(" = v1.0")); else if (v == 0x92) Serial.print(F(" = v2.0")); else Serial.print(F ("(necunoscut)")); Serial.println(""); // Când obținem 0x00 sau 0xFF, transmisia datelor 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, biletul de metrou, care a eliberat fără probleme numărul cardului în exemplul anterior, s-a dovedit a fi cu un tip de date nedefinit în acesta, iar modulul nu putea citi altceva decât numărul cardului.

Drept urmare, după citirea datelor 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 ID pe card

În acest exemplu, vom lua în considerare schimbarea identificatorului cardului (UID). Este important de știut că nu toate cardurile acceptă schimbarea ID-ului. Cardul poate fi inscriptibil, dar asta înseamnă doar că datele sunt inscriptibile. Din păcate, cardurile pe care le aveam în mâini nu suportau 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::MIFARE_Key; void setup() ( Serial.begin(9600); while (!Serial); SPI.begin(); mfrc522.PCD_Init(); Serial.println(F("Atenție: acest exemplu suprascrie UID-ul cardului dvs. UID-ul modificabil, utilizaț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 am ajuns atât de mult timp - să scriem date pe card. Cea mai dulce parte a lucrului cu un modul este capacitatea de a face deja o copie harta existenta, ceva de adăugat sau schimbat, este mult mai interesant decât o simplă lectură.

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; 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 o hartă cu un bloc de date modificat:


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

Asta e tot, abonează-te și urmărește publicațiile. Data viitoare voi spune și voi arăta cum să standardez afișarea caracterelor 1602 adaugă caractere personalizate, adăugând efectiv grafică pe afișaj.

Tutorialul de astăzi este despre cum să utilizați un cititor RFID cu Arduino pentru a crea un sistem simplu de blocare, în cuvinte simple- Blocare RFID.

RFID (ing. Identificare radiofrecvență, RFID) este o metodă de identificare automată a obiectelor în care datele stocate în așa-numitele transpondere, sau etichete RFID, sunt citite sau scrise cu ajutorul semnalelor radio. Orice sistem RFID constă dintr-un cititor (cititor, cititor sau interogator) și un transponder (alias etichetă RFID, uneori se folosește și termenul etichetă RFID).

Tutorialul va folosi o etichetă RFID cu un Arduino. Dispozitivul citește identificatorul unic (UID) al fiecărei etichete RFID pe care o plasăm lângă cititor și îl afișează pe afișajul OLED. Dacă UID-ul etichetei este valoare predefinită, care este stocat în memoria Arduino, apoi vom vedea pe display mesajul „Unlocked” (engleză, deblocat). Dacă identificatorul unic nu este egal cu valoarea predefinită, mesajul „Deblocat” nu va apărea - vezi fotografia de mai jos.

Castelul este închis

Castelul este deschis

Detalii necesare pentru a crea acest proiect:

  • Cititor RFID RC522
  • Afișaj OLED
  • Tabla de paine
  • fire

Detalii suplimentare:

  • Baterie (powerbank)

Costul total al componentelor proiectului a fost de aproximativ 15 USD.

Pasul 2: Cititor RFID RC522

Fiecare etichetă RFID are un mic cip (cartel alb în fotografie). Dacă îndreptați o lanternă spre acest card RFID, puteți vedea un mic cip și o bobină care îl înconjoară. Acest cip nu are o baterie pentru a genera energie. Acesta primește putere de la cititor fără fir folosind acest lucru colac mare. Este posibil să citiți un card RFID ca acesta de la o distanță de până la 20 mm.

Același cip există și în etichetele RFID pentru chei.

Fiecare etichetă RFID are un număr unic care o identifică. Acesta este UID-ul care este afișat pe afișajul OLED. Cu excepția acestui UID, fiecare etichetă poate stoca date. Acest tip de card poate stoca până la 1.000 de date. Impresionant, nu-i așa? Această funcție nu va fi utilizată astăzi. Astăzi, tot ceea ce interesează este identificarea unui anumit card prin UID-ul său. Cititorul RFID și aceste două carduri RFID costă aproximativ 4 USD.

Pasul 3 Display OLED

Tutorialul folosește un monitor OLED 128x64 I2C de 0,96 inchi.

Aceasta este foarte display bun pentru utilizare cu Arduino. Acest Afișaj OLEDși asta înseamnă că are consum redus de putere. Consumul de energie al acestui display este de aproximativ 10-20mA și depinde de numărul de pixeli.

Display-ul are o rezoluție de 128 pe 64 de pixeli și are dimensiuni mici. Există două opțiuni de afișare. Unul dintre ele este monocrom, iar celălalt, ca cel folosit în tutorial, poate afișa două culori: galben și albastru. Partea de sus a ecranului poate fi doar galbenă și Partea de jos- albastru.

Acest afișaj OLED este foarte luminos și are o bibliotecă grozavă și foarte frumoasă pe care Adafruit a dezvoltat-o ​​pentru acest afișaj. În plus, afișajul folosește o interfață I2C, astfel încât conectarea la Arduino este incredibil de ușoară.

Trebuie doar să conectați două fire, cu excepția Vcc și GND. Dacă sunteți nou în Arduino și doriți să utilizați un afișaj ieftin și simplu în proiectul dvs., începeți de aici.

Pasul 4: Adunarea tuturor pieselor împreună

Specificații:
Frecvența notch: 125KHz
Alimentare: +5 VDC
Date de ieșire: serial, 2400 bps 8N1. Se emite un număr de serie din 10 cifre al etichetei.

Poza 1:Figura 2:

Introducere

Acest cititor RFID funcționează cu etichete de 125 kHz în carduri de dimensiunea unui card de credit și brelocuri de 125 kHz (Figura 1). Acesta utilizează protocolul EM4100. Când aduceți eticheta RFID aproape (4-5 cm) de bobina cititorului (L1), cititorul citește ID-ul unic al etichetei din 10 cifre și îl transmite ca caractere ASCII prin ieșire serială la 2400 biți pe secundă.

Circuitul include un dispozitiv de semnalizare care emite intermitent semnale sonore când eticheta este citită cu succes.

Descriere

Voi încerca să explic în câteva cuvinte cum funcționează un cititor RFID. Controlerul ATtiny13 folosește funcția PWM pentru a genera un semnal de undă pătrată de 125 kHz. Acest semnal este scos de la pinul PB0. Pe marginea de fugă a impulsului la pinul PB0 (zero logic „0”), tranzistorul T1 este închis. Astfel, bobina L1 este excitată prin rezistorul R1 (nominal 100 ohmi) de la tensiunea +5V. Când pulsul de pe pinul PB0 crește (logic „1”), tranzistorul T1 se pornește și unul dintre bornele bobinei L1 este conectat la GND. Condensatorul C2 este conectat în paralel la bobina L1, creând un oscilator LC. Datele de comutare ale bobinei L1 de la unu logic la zero logic au loc de 125.000 de ori pe secundă (125 kHz).

Figura 3: Oscilații ale unui semnal cu o frecvență de 125 kHz, care sunt transmise de la bobina L1 și condensatorul C2.

Cititorul RFID transmite energie către transponder (etichetă) prin crearea unui câmp electromagnetic. Transferul de energie între cititorul RFID și etichetă are loc pe același principiu ca și lucrul transformatoare , care convertesc tensiunea de 220 V AC în 12 V AC, datorită câmpului magnetic pe care îl creează înfășurarea primară. În cazul nostru, înfășurarea primară este cititorul RFID, iar înfășurarea secundară este eticheta RFID. Singura diferență este că în circuitul cititorului RFID nu există un circuit magnetic din oțel între cele două bobine (o bobină este situată pe partea laterală a cititorului, iar cealaltă bobină este în eticheta RFID). Componentele D1, C3 și R5 alcătuiesc demodulatorul semnal AM (AM = modulație de amplitudine).

Transfer de date între etichete și cititor.

Cum transmit etichetele date către cititor? Foarte simplu! Când o etichetă dorește să transmită un zero logic „0” cititorului, aplică o „încărcare” liniei sale de alimentare pentru a extrage mai multă putere de la cititor. Acest lucru cauzează o mică cădere de tensiune pe partea laterală a cititorului RFID. Acest nivel de tensiune este zero logic „0” (vezi figura 4). Simultan cu cititorul care transmite un semnal cu o frecventa de 125 kHz, citeste tensiunea semnal transmis prin filtrele D1, C3 și R5, C1. Când eticheta scade tensiunea, așa cum sa menționat mai devreme, cititorul citește această cădere de tensiune ca un zero logic „0”. Dacă eticheta nu necesită putere suplimentară, nu provoacă o cădere de tensiune. Aceasta corespunde unității logice „1” (Figura 3). Lungimea „unui” sau „zerourilor” depinde de rata de date seriale. De exemplu, pentru o frecvență purtătoare de 125 kHz, nu obținem o rată de date de 125.000 de biți pe secundă! Transferul de date de la etichetă la cititor variază de la 500 la 8.000 de biți pe secundă.

Figura 4:Captură de ecran cu transmiterea datelor... 10101...Figura 5


  • Eticheta RFID de 125 kHz transmite 64 de biți.
    1. Primii 9 biți sunt biții de început ai transmisiei (întotdeauna „1”).
    2. Următorii 4 biți sunt biții inferiori ai ID-ului utilizatorului (D00,..., D03).
    3. Următorul 1 bit (P0) este bitul de paritate al celor 4 biți anteriori.
    4. Următorii 4 biți sunt cei mai importanți biți ai ID-ului utilizatorului (D04,..., D07).
    5. Următorul 1 bit (P1) este bitul de paritate al celor 4 biți anteriori.
    6. Următorii 4 biți sunt prima parte a numărului de serie etichetei de 32 de biți (D08,..., D11).
    7. Bitul PC0 este bitul de paritate al biților D00, D04, D08, D12, D16, D20, D24, D28, D32 și D36 (biții sunt în aceeași coloană).
    8. Biții PC1, PC2, PC3 sunt biții de paritate ai următoarelor trei coloane.

Verificarea datelor este efectuată de controlerul ATtiny13 prin calcularea bitului de paritate al fiecărui rând și al fiecărei coloane cu biții de paritate care sunt primiți în datele transmise de etichetă RFID.

Fabricarea bobinei

Bobina are un diametru de 120 mm și 58 de spire. Pentru orice eventualitate, lasă câteva sârmă de cupru pentru încă 2-3 ture (în total 60-61 ture). Pentru realizare distanta maximaÎntre eticheta RFID și cititor (între etichetă și bobina antenă a cititorului), trebuie să calibrați bobina. Dacă conectați un osciloscop la punctul comun de conectare al lui R1 și L1, veți vedea locul marcat cu un cerc roșu în figura din stânga. Aceasta înseamnă că bobina L1 trebuie calibrată.

Cum se calibrează bobina L1?

Activați cititorul RFID:

1. După conectarea sondei osciloscopului la punctul comun R1, L1, încercați să îndepărtați încet sau să adăugați puțin sârmă de cupru(creșteți sau micșorați numărul de spire) bobinei până la eliminarea zgomotului.

2. Dacă nu aveți un osciloscop, încercați să mutați eticheta RFID aproape de bobina L1 până când eticheta este recunoscută de cititor. Dacă marca dvs. este detectată la o distanță de 2 cm de bobina L1, atunci încercați să adăugați câteva spire de sârmă de cupru pentru bobina L1 pentru a vă asigura că semnul este detectat la o distanță mai mare (de exemplu, 3 cm).

Încercați aceiași pași prin îndepărtarea spirelor firului de cupru din bobina L1. În acest fel, veți obține distanța maximă dintre semne și bobina L1.

Am făcut o bobină L1 de 120 mm cu 58 de spire, dar ulterior am vrut să o fac mai mică. Așa că am pliat bobina în jumătate, astfel încât să arate ca un „număr opt” (în formă de cifra opt) și am recalibrat. Astfel, bobina L1 din figuri are de fapt un diametru mai mic de 120 mm.

Bobina L1 din figură are un diametru de 60 mm și aproape 116 spire.

ProgramareATtiny13

Set de biți de configurare ATtiny13 (siguranțe): Siguranță mare: 0x1F și siguranță scăzută: 0x7A. Acest set ATtiny13 funcționează cu un oscilator intern de 9,6 MHz. Funcția de împărțire la 8 a ceasului de sistem este dezactivată.

Versiunea de firmware v1.00 are 1024 de octeți și ocupă 100% din memoria flash ATtiny13. Ar putea fi o idee bună să treceți la orice alt AVR cu 8 pini, cum ar fi ATtiny85, dacă doriți să adăugați unele funcționalități la codul sursă.

Proiectul este conceput de: Vassilis Serasidis ( Vassilis Serasidis) 18 august 2012
Limbaj de programare: Cu
Mediu de dezvoltare:
Microcontroler:ATtiny13 (oscilator intern de 9,6 MHz)

Lista elementelor radio

Desemnare Tip de Denumire Cantitate NotăMagazinBlocnotesul meu
IC1 MK AVR pe 8 biți

ATtiny13

1 La blocnotes
IC2 Amplificator operațional

LM358

1 La blocnotes
IC3 Regulator liniar

LM78L05

1 La blocnotes
T1 tranzistor MOSFET

BS170

1 La blocnotes
T2 tranzistor bipolar

BC547B

1 La blocnotes
D1 dioda redresoare

1N4148

1 La blocnotes
C1 Condensator12 nF1 La blocnotes
C2 Condensator1,5 nF1 La blocnotes
C3 Condensator4,7 nF1 La blocnotes
C4, C5 condensator electrolitic100uF2 La blocnotes
C6 Condensator100 nF1 La blocnotes
R1 Rezistor

100 ohmi

1 La blocnotes
R2 Rezistor

1 kOhm

1 La blocnotes
R3 Rezistor

390 kOhm

1 La blocnotes
R4, R8 Rezistor

33 kOhm

2 La blocnotes
R5 Rezistor

270 kOhm

1 La blocnotes
R6 Rezistor

După câțiva ani de muncă pe subiecte RFID și dezvoltarea diferitelor cititoare pentru modele de transponder de standarde populare precum Mifare, EMMARINE, TIRIS... Am început adesea să fiu nedumerit de o astfel de întrebare - literalmente în Anul trecut a câștigat o mare popularitate alt fel emulatori pentru etichete de protocol populare și o varietate de copiatoare de chei/trinket.

Având în vedere numărul mare de microcircuite speciale ale protocoalelor RFID populare și cititoare ieftine disponibile pentru vânzare, utilizarea pe scară largă a echipamentelor precum osciloscoape digitale, sniffer și analizoare de spectru, această problemă a devenit mai relevantă pentru mulți dezvoltatori. Atunci am decis să fac un protocol de schimb pentru unul dintre proiecte care diferă de standardele descrise mai sus.

Desigur, această idee nu se rezolvă probleme globale securitatea noului sistem și poate fi analizată de alți dezvoltatori cu disponibilitatea echipamentelor, dar ideea este că toate acestea nu coincid cu standardele existente și tot hardware-ul copiator nu vă va permite să copiați și să recreați rapid un astfel de algoritm. Desigur sistem similar nu sunt prezentate aici solutie completa probleme de securitate, dar cum experiența adaptării RFID sub sistem închis. un plus bun pe problema securității, printre altele similare sisteme wireless este tehnologia RFID de joasă frecvență în sine - nu vă permite să citiți etichetele distanta lunga.

Etichetele pasive au o putere destul de scăzută și au nevoie de un generator de cititor suficient de puternic pentru alimentarea lor, caracteristicile de propagare a undelor radio la aceste frecvențe limitează, de asemenea, limitele acestui sistem. Intervalul real de citire al transponderelor rareori depășește 20 cm pentru standardele de 125 KHz precum EmMarine, să zicem standardul EM4001, pentru alte protocoale precum Mifare (13,56 MHz) poate fi mai lung (1,5 metri pentru iso15693). Poate fi realizat distanta mai mare citire pentru cititoarele de joasă frecvență dacă creșteți dimensiunea bobinei și respectiv tensiunea de alimentare și puterea cititorului. Cu toate acestea, astfel de sisteme sunt voluminoase și, în general, greu de făcut portabile. De regulă, astfel de sisteme sunt implementate numai staționare - de exemplu, pentru mașini.

Deci, acum, de fapt, despre arhitectura sistemului nostru RFID. Pentru experimente s-a ales controlerul atmel atmega8. În scopul fabricării transponderului, aceasta pare a fi o exagerare incontestabilă. Cu toate acestea, în acest caz, sarcina principală de a dezvolta o nouă interfață pe o placă de depanare c atmega gata făcută a fost rezolvată, urmată de portarea acestui cod la controlere de tip tiny13 mai ieftine. Pentru transponder, algoritmul de operare a fost construit pe baza modului de generare PWM folosind temporizatorul T1 în modul CTC cu întrerupere și resetare prin coincidență cu OCR1. Datele de transmisie ale transponderului sunt citite din EEPROM atunci când controlerul este pornit. În total, transponderul transmite 10 octeți. Conținutul EEPROM-ului transponderului poate fi văzut pe figura 1. Primul octet 0xE7 este un antet de pachet obligatoriu, deoarece prezența acestuia este verificată mai întâi atunci când pachetul este analizat de către cititor.

Primii 8 octeți sunt conținutul pachetului de transponder, ultimii 2 octeți conțin suma de control CRC16 a primilor opt octeți ai pachetului. De exemplu, în transponderul nostru, au fost înregistrate următoarele date - un pachet 0xE7, 0x05, 0xE8, 0x93, 0x43, 0x7F, 0x20, 0xFF și, în consecință, suma de control 0xF5 0xA8. Pentru a vă crea propriul transponder unic, pe lângă primul octet 0xE7, trebuie să scrieți următorii șapte octeți în EEPROM și apoi să calculați suma de control pentru primii opt octeți. După aceea, scrieți doi octeți CRC16 pe EEPROM la sfârșitul pachetului. Primul octet este lăsat neschimbat - 0xE7. Când transponderul este pornit, datele acestor octeți sunt împărțite în biți și codificate cu lungimea impulsului corespunzătoare, în conformitate cu valoarea registrului OCR. Pentru transmisie se folosesc 2 frecvențe 2KHz și 5KHz pentru transmiterea logicii „0” și „1”. În plus, datele sunt separate prin impulsuri de sincronizare - semne de început de pachet.

Fig.1 Conținutul pachetului cu transponder.


Fig.2 Transponderul de descărcare a transmisiei pe ecranul osciloscopului virtual.

Diagrama transponderului poate fi văzută pe figura 3. Frecvența oscilatorului principal este de 8 MHz. Alimentare controler +5V. Puteți utiliza controlerul mega8 marcat cu „L”, apoi poate fi alimentată de la baterie cu litiu 3v (parametri pentru un astfel de cip + 2,7 .... + 3,5). În loc de acest tranzistor, puteți folosi orice alt de putere redusă tranzistor NPN. Bobina transponder a fost înfășurată pe un dorn cu diametrul de 50 mm cu un fir de 0,22 mm și are 50 de spire. În momentul în care transponderul este activat - cu alimentare externă. În următoarea etapă, se plănuiește să se realizeze o versiune pasivă a transponderului, care este destul de simplă - faceți o decuplare pentru putere de la această bobină, adăugați diode de punte redresoare și un stabilizator.


Fig.3 Schema transponderului.

Acum să vorbim despre circuitul cititorului pentru acest transponder. Schema a fost adaptată pe baza cititorului de carduri EMMARINE utilizat anterior. O parte a circuitului cu un generator pe 74hc4060 poate fi ștearsă în siguranță în această etapă, deoarece deocamdată folosim o etichetă activă. Cu toate acestea, vom avea nevoie de această parte a circuitului în viitor, când vom face o etichetă pasivă și trebuie să obținem putere de la cititor. În caz contrar, circuitul nu diferă semnificativ de circuitul cititor pentru EMMARINE: detector de vârf pasiv - filtru - amplificator - comparator. Circuitul este cât se poate de simplu și vă permite să citiți datele transponderului la o distanță de 10-12 cm cu contururi bine reglate.

Puteți simplifica și mai mult circuitul, lăsând doar detectorul și filtrul, puneți la ieșire un tranzistor care va juca rolul unui comparator, dar nu am făcut asta. La ieșire obținem semnal binar formă dreptunghiulară în conformitate cu duratele codificate ale impulsurilor transmise de transponder. Abaterile permise ale valorilor elementului la care circuitul este operabil este de 5-10%. Alimentare pentru controler și opamp + 5V. Frecvența oscilatorului principal al controlerului este de 12 MHz. Ieșirea comparatorului de pe LM358 este conectată la pinul de întrerupere extern al controlerului INT0. Programul controlerului este configurat să apeleze o întrerupere pe un front ascendent pe pinul de întrerupere extern INT0. În manipulatorul de întreruperi, acesta verifică impulsurile de ceas și apoi verifică antetul pachetului și scrie conținutul în buffer-ul controlerului. Datele pachetelor citite sunt transmise prin interfața RS232 către computer. Pentru a configura terminalul, specificați următorii parametri: viteză 57,6 Kb/s, 8 biți de date, 1 bit de oprire, fără paritate.

La primirea unui pachet, controlerul calculează suma de control a octeților primiți și trimite datele către terminal (pachet și CRC). În caz de meci sume de control calculat de controler și primit în pachet, un semnal este transmis către pinul PORTB.0 (14) al controlerului (LED1 în diagramă). Poate fi conectat la punct dat un tweeter cu generator incorporat sau un LED printr-o rezistenta. Când citește cheia corectă, controlerul dezactivează întreruperile externe și efectuează o întârziere de 1 s înainte de următoarea citire. Există, de asemenea, un mod de funcționare al acestui cititor ca bază a unei încuietori RFID. Pentru a face acest lucru, este necesar să scrieți octeții completi ai transponderului în EEPROM-ul controlerului cititorului - 10 octeți. Datele sunt scrise în EEPROM-ul cititorului în același mod ca în EEPROM-ul transponderului. În acest caz, la citirea următorului transponder și potrivirea acestuia cu cel înregistrat în EEPROM-ul cititorului, un semnal este transmis către pinul PORTB.1 (15) al controlerului (LED2 din diagramă). În acest moment, puteți conecta LED-ul prin rezistența sau cheia de ieșire (tranzistor) de pe releul actuatorului. Acum avem o încuietoare RFID pentru o anumită cheie și un cititor obișnuit într-un singur pachet.


Fig.4 Schema unui cititor de etichete RFID. (măriți diagrama)

Deci, să rezumam rezultatele intermediare. Fabricat propriul cititorși un transponder pentru acest cititor. Ne-am protejat echipamentul de dispozitive străine lucrează cu protocoale RFID populare. urmatorul pas va exista o producere a unei etichete pasive pentru cititorul nostru, așa cum o fac ei producători cunoscuți transpondere industriale și codul echipamentelor de portare la modele de controlere mai ieftine. În arhivă, atașez articolului firmware pentru transponder și cititor.

Descărcați firmware:
Nu aveți acces pentru a descărca fișiere de pe serverul nostru

Top articole similare