Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • Fier
  • O privire în interior: RFID și alte etichete. Realizarea unei blocări RFID folosind Arduino

O privire în interior: RFID și alte etichete. Realizarea unei blocări RFID folosind Arduino

Cititor RFID - carduri și brelocuri
pe microcontrolerul ATtiny13

Sursă: www.serasidis.gr
Vassilis Serasidis

Traducere: Vadim comandat de RadioLotsman

ÎN În ultima vreme Diverse proiecte bazate pe chei RFID, utilizate în sistemele de securitate, securitate și control acces, au câștigat o mare popularitate. În unele întreprinderi și organizații, astfel de sisteme, completate cu software specializat, sunt utilizate 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 Cheile RFID pot fi sub forma unui breloc sau a unui 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 trimite la 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).

Diagramă schematică Cititor RFID prezentat in poza de mai jos:

Să luăm în considerare principalele caracteristici ale circuitului. Microcontrolerul folosește un modulator PWM încorporat pentru a genera ieșire PB0 impulsuri dreptunghiulare 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ășurarea primară este bobina cititorului, iar înfășurarea secundară 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

Cheia RFID introdusă caz general transmite 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 - cel mai puțin semnificativ 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 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 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 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 semnal sonor. 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). Cod program 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 -

  • Programarea microcontrolerelor
  • După cum știți, multe sisteme de acces folosesc carduri RFID din standardul EM-Marin cu o frecvență de 125 KHz. Interfonul de la mine acasă nu a făcut excepție. O problemă - ar fi bine să învățați cum să copiați astfel de carduri, deoarece etichetele de preț pentru copierea lor nu sunt încurajatoare. Există, desigur, destul de multe scheme de copiator online (și chinezii își vând copiatoarele cu bănuți - totuși, adesea își pun parola pe discuri atunci când copiază), dar de ce să nu-ți construiești propriul copiator? Despre asta este articolul de mai jos.

    Merită să începeți dezvoltarea unui copiator, aflați pe ce pot fi copiate astfel de mărci? După ce ați citit forumurile, puteți afla că cele mai comune spații libere pentru copiere sunt T5577, T5557, EM4305.

    Acum avem nevoie de o diagramă. Să luăm partea analogică a unui astfel de copiator de la RECTO și să o conectăm la microcontrolerul atmega8. Să adăugăm un convertor de nivel pentru conectarea la un port COM bazat pe max232 (cei care doresc pot folosi ST232 sau altceva pentru a se conecta prin USB, dar am un port COM pe computer, precum și un adaptor USB-COM, așa că asta este sarcina mea nu a rezistat).

    Veți obține această diagramă:

    Cum este ea? Emițător dublu urmăritor, circuit oscilant, detector și filtre RC. Datorită faptului că filtrele RC au constante de timp diferite, prin compararea nivelurilor de tensiune între etape, este posibilă izolarea modificării semnalului etichetei RFID. Această sarcină va fi gestionată de comparatorul încorporat în atmega8. Generarea unui semnal de 125 KHz va fi asigurată de controlerul PWM integrat în atmega8.

    Combinația dintre o etichetă RFID și un cititor formează un transformator, unde eticheta este înfășurarea secundară. Informațiile sunt transmise de etichetă prin modificarea sarcinii înfășurării secundare. Ca urmare, curentul din bobina cititorului (înfășurarea primară) se modifică. Partea analogică de mai sus a circuitului este responsabilă pentru izolarea acestor impulsuri de curent. Circuit oscilator trebuie configurat pentru tensiune maxima V punct de control, de exemplu, înfăşurarea/înfăşurarea spirelor unei bobine. Adevărat, ei spun că este mai bine să aveți o tensiune puțin mai mică decât cea maximă - funcționează mai stabil. Am aproximativ 40 V la punctul meu de testare.

    Marca copiată folosește codificarea Manchester. Pentru a decripta acest cod, este suficient să săriți trei sferturi din intervalul de biți pentru orice modificare a marginii semnalului și, pe baza căderii semnalului care urmează, să stabiliți valoarea biților care va corespunde valorii semnalului după cădere. La decodare, merită să specificați o fereastră în care ar trebui să apară căderea semnalului - nu mai mult de jumătate din perioada slotului de biți.

    Am luat metoda de decodare a codificării Manchester și codul pentru aceasta de la Shads. Ai putea, desigur, să-l scrii pe al tău, dar mă grăbeam să lansez copiatorul - voiam să mă asigur că circuitul funcționează și că etichetele sunt acceptate. Deci acest fragment a rămas în codul copiatorului. De asemenea, s-a dovedit că comparatorul meu este configurat invers decât ceea ce are nevoie codul de decodare. Am schimbat-o în cod. Deci, avem șiruri de zerouri și unu. Cum pot obține codul cardului de la ei?

    Și este foarte simplu. Să presupunem că numărul cardului în funcție de nibbles are forma AB CD EF GH IJ. Harta arată asta:

    1) Nouă unități la început;
    2) Rontul A;
    3) Nibble parity A (1 bit);
    4) Rontul B;
    5) Nibble parity B (1 bit);

    16) Rontul I;
    17) Nibble parity I (1 bit);
    18) Nibble J;
    19) Nibble parity J (1 bit);
    20) Nibble de paritate de coloană pentru nibbles A B C D E F G H I J;
    21) Bit 0.

    Citim toți cei 64 de biți, decriptăm și obținem 40 de biți din codul cardului. Este logic ca dacă emitem singuri un astfel de cod, închizând bobina cardului atașat la cititor, vom obține un emulator de card. Dar acum nu ne interesează el.

    Am învățat să citim o hartă, dar cum putem transfera date pe hartă? Pentru a face acest lucru, trebuie pur și simplu să porniți sau să opriți frecvența de 125 KHz în conformitate cu protocolul de comunicare cu cardul. În timpul „tăcerii” cititorului, cardul este alimentat de energia stocată.

    Blank-urile T5557/T5577 sunt pe deplin compatibile între ele în ceea ce privește protocoalele de înregistrare, totuși, au un minim și un nivel ușor diferit. ori maxim impulsuri (din fericire, timpii lui T5557 se suprapun cu T5577). EM4305 are un alt protocol de înregistrare.

    Pentru a înregistra T5557 am folosit codul BolshoyK. Tabelul de mai jos prezintă parametrii de semnal pentru telecomanda T5557.

    Înregistrarea începe cu semnalul StartGape - trebuie să opriți semnalul de 125 KHz pentru aproximativ 300 µs. Acesta este un semnal pentru card că datele vor începe acum să fie transferate către acesta. Apoi, ar trebui să transferați informațiile în spațiul liber. Codificarea datelor transmise este aceeași Manchester.

    Blank-urile T5557/T5577 și EM4305 sunt multifuncționale și pot tipuri diferite modulații, parole de suport și multe altele. Fiecare disc de la bord are un set de blocuri de 32 de biți. Scopul acestor blocuri este diferit. Unele au un cod de cheie emis (este nevoie de două blocuri). În altele - configurație. În al treilea rând, identificatorul producătorului. Vom folosi o funcționalitate limitată, astfel încât cei care vor să înțeleagă ce înseamnă toți acești biți se pot uita la documentația pentru spații libere (am atașat-o la arhivă).

    Blocurile sunt adunate în două pagini (0 și 1).

    În pagina zero există un bloc de configurare cu indice 0. Acesta este ceea ce vom seta. Pentru T5557/T5577 vom avea următorii octeți de configurare: 0x00.0x14.0x80.0x40 conform tabelului din documentație (am marcat cu roșu modurile selectate cu un biți):

    Astfel, am selectat: frecventa de transmisie a datelor RF/64 (125 KHz/64), codificare tip Manchester, emiterea blocurilor pana la secunda (in blocurile 1 si 2 vom avea codul emis de card). Înainte de a scrie, trebuie trimis un cod operațional (2 biți de cod operațional) și un bit de blocare (bit de blocare). Opcodes 10b și 11b preced scrierea datelor pentru paginile 0 și 1 (bitul cel mai puțin semnificativ specifică numărul paginii, bitul cel mai semnificativ specifică codul de scriere a paginii). Emitem 10b pentru codul operațional (toate lucrările se fac cu o pagină zero) și 0b pentru bitul de blocare. După transferul tuturor acestor date, este necesar să transferați adresa de trei biți a paginii de scris. Toate transferurile de date pentru T5557/T5577 sunt efectuate de la bitul cel mai semnificativ la cel mai puțin semnificativ.

    Setând codul cardului în blocurile 1 și 2 și configurația în blocul 0, puteți obține o etichetă RFID duplicată. După cum puteți vedea, totul este simplu.

    Următorul tip de semifabricate este EM4305. Așa că a trebuit să mă ocup eu de înregistrarea acestui gol. De asemenea, constă din blocuri de 32 de biți, dar scopul lor este diferit.

    Codificarea datelor transmise pe card se bazează pe diferențele pe un interval de timp. Dacă a existat o diferență în timpul intervalului de timp, atunci aceasta este zero, iar dacă nu a fost, este una. Cuvântul de configurare este stocat în octetul 4 și pentru mine l-am definit astfel: 0x5F,0x80,0x01,0x00 (codare Manchester, RF/64, cuvânt de ieșire 6). În cuvintele 5 și 6 scriu codul cardului (aceași 64 de biți pe care îi produce cardul). EM4305 necesită ca transmisia să fie efectuată de la bitul cel mai puțin semnificativ la cel mai semnificativ. Cardul înțelege că un schimb începe cu el după ce îi dă o combinație de impulsuri:

    1. Oprim câmpul la 48 µs.
    2. Pornim câmpul timp de 96 μs.
    3. Opriți câmpul la 320 µs.
    4. Pornim câmpul la 136 μs.
    5. Dezactivează câmpul până la următoarea comandă.
    Comanda de a scrie un bloc pe hartă este transmisă după cum urmează:
    1. Trimitem succesiunea de impulsuri de mai sus.
    2. Trimitem 0b.
    3. Transmitem CC0-CC1 și paritatea lor P. (0101b pentru înregistrare, vezi tabelele de mai jos).
    4. Transmitem adresa blocului (vezi tabel), două zerouri finale și paritatea adresei.
    5. Transmitem date bloc (32 de biți).

    Format de comandă


    Codurile de comandă

    Blocați formatul adresei

    Aceasta setează configurația golului EM4305 și codul acestuia.

    De fapt, un simplu copiator nu are nevoie de nimic mai mult.

    Am realizat mai multe versiuni ale copiatorului cu diferite afișaje. De exemplu, iată un copiator cu afișaj 1602:

    Și iată un videoclip cu copiatorul care lucrează pe afișajul LPH9157-02.

    Eticheta EM4100 stochează 64 de biți de date, ceea ce înseamnă că designul trebuie să conțină un registru de deplasare de 64 de biți format din opt registre 74HC165 de 8 biți. Registrul este resetat după fiecare 64 de schimburi pentru a reseta datele și a începe de la capăt. Datele de la intrările registrului sunt următoarele:
    • Model de sincronizare: nouă unități
    • ID-ul producătorului/versiunii: 2 blocuri de 5 biți, dintre care 4 biți sunt date și al cincilea este paritate
    • Identificator unic: 8 blocuri de 5 biți, dintre care 4 biți sunt date și al cincilea este paritate
    • Sumă de verificare: 4 biți de paritate, numărați pe coloană
    • Bit de oprire: „0”

    Chiar și etichetele criptate sunt vulnerabile la o varietate de atacuri. În plus, devine din ce în ce mai ușor să emulați etichetele pe smartphone-urile compatibile cu NFC (care funcționează de obicei la 13,56 MHz). Doar scrieți corect o aplicație de modulare a câmpului și puteți face ce doriți.

    Ca o scuză standard, permiteți-mi să vă reamintesc că autorul (Și un traducător! - Notă traducere) nu își asumă nicio responsabilitate pentru consecințele utilizării informațiilor din acest articol. Cititorul trebuie să fie responsabil pentru toate acțiunile sale.

    Cadru

    Uneori Foarte norocos. O carcasă frumoasă ar fi la îndemână chiar acum, când prototipul este terminat și placa de circuit imprimat a fost comandată. Și tocmai în acest moment Fleming a terminat de asamblat și a lansat mașina de tăiat cu laser OSAA PhotonSaw. După un an de lucru la proiect, laserul este gata să taie primele părți. Flemming și Roon fac ultimele ajustări și înlocuiesc capacul de aluminiu al dulapului laser. Vă puteți imagina cât de încântați am fost toți să vedem lucrul acesta funcționând.

    Cu mașina în funcțiune, am putut testa proiectul nostru viata reala. Carcasa pentru eticheta noastră RFID a fost realizată din plexiglas de 2 mm. Acest corp este primul obiect realizat pe PhotonSaw, da!

    S-a născut ideea de a plasa bobina pe exteriorul corpului. La început s-a decis să se folosească jumătate din înălțimea corpului, dar acest lucru nu a funcționat în practică (găurile suplimentare din laturile lungi nu sunt, prin urmare, folosite). Bobina se potrivește perfect în jurul perimetrului întregului corp, deși aveam îndoieli dacă înfășurarea dreptunghiulară (105x55 mm) ar fi prea mare pentru comunicarea electromagnetică normală.

    Bobina de testare a fost înfăşurată, fără calcule, cu sârmă de 0,4 mm în 66 de spire. Și, evident, am avut din nou noroc, pentru că bobina a ieșit exact așa cum trebuia, cu o inductanță de 645 μH, cu un tag conectat care dă o frecvență de rezonanță de 125,2 kHz. Testarea pe un cititor de ușă a arătat că prototipul funcționează foarte bine cu această bobină.

    Cu o bobină în afara carcasei, grosimea acesteia din urmă poate fi redusă. Grosimea internă depinde acum doar de înălțimea pieselor de pe placă, iar ținând cont de grosimea plăcii ar trebui să fie de aproximativ 6 mm. De asemenea, ar fi bine să adăugați niște gravură. Flemming a propus rotunjirea părților laterale ale corpului din motive estetice și ergonomice. Un corp curbat va proteja mai bine părțile laterale ale bobinei, deoarece acolo unde nu există multă tensiune, bobinele de sârmă tind să iasă în afară.

    Mașina PhotonSaw nu este încă în stare perfectă: gravare pe coperta s-a deplasat semnificativ în jos. Trebuie finalizat înainte de producție. versiunea finala carcase. Traseele curbe au fost, de asemenea, supuse unei erori de calcul în software, deoarece fasciculul nu a revenit la pozitia de pornire după ce a trecut o traiectorie închisă. Dar oricum, curbele arată foarte netede.

    Ansamblu PCB

    Tabloul comandat a sosit:

    Asamblarea nu a fost foarte dificilă. Pasta de lipit a fost șablonată pe placă, toate piesele au fost așezate și apoi lipite într-un cuptor de casă.

    Prin capacitatea de izolare (47 pF are o rezistență de aproximativ 27 kOhm la o frecvență de 125 kHz) și diodele de protecție, curentul este furnizat șinelor de alimentare. Energia care vine de la bobină este suficientă pentru a menține tensiunea de alimentare de aproximativ 1 V. Curentul poate ajunge la 250-500 μA. În mod surprinzător, cipurile 74HC par să funcționeze cu această sursă. Din păcate, sub acest tip de tensiune, se întâmplă niște lucruri destul de ciudate. Cipurile 74HC au un circuit intern de resetare și trebuie să vă asigurați că funcționează. Vă rugăm să rețineți că dezactivarea diodelor de protecție nu ajută. Există diode de protecție interne la intrările microcircuitelor, care în acest caz se deschid și efectuează aceeași muncă.

    O resetare a alimentării se declanșează numai dacă tensiunea de alimentare scade sub un anumit nivel pentru o anumită perioadă de timp. Dacă tensiunea rămâne prea mare, atunci logica internă poate deveni confuză, deoarece unele părți ale acesteia pot fi într-o stare nedefinită, în timp ce altele funcționează corect. Este necesară o resetare internă pentru a seta toate cipurile la o stare consecventă. Astfel, circuitul va funcționa instabil la tensiuni de alimentare foarte scăzute.

    Au fost observate următoarele simptome: eticheta funcționează de ceva timp, în timp ce trimite date corecte. Dacă bobina este scoasă din cititor și apoi returnată înapoi, puteți paria dacă eticheta se va opri. Uneori funcționează, alteori nu. Dezactivarea PLL-ului agravează situația. Consumul redus de energie înseamnă că cititorul va primi ocazional date de la o etichetă care este oprită. Acesta este ceea ce înseamnă „sistem eficient din punct de vedere energetic”.

    Există două soluții: 1) reduceți condensatorul din circuitul de recuperare semnal de ceas până la 15 pF și 2) conectați un rezistor de 22-100 kOhm între sursa de alimentare și masă pentru a elimina excesul de energie. A doua metodă determină creșterea scurgerilor în timpul funcționării și nu este cu adevărat necesară atunci când se reduce capacitatea condensatorului. Cu toate acestea, este oferit ca opțiune și este încă mai bun decât starea nedeterminată a jeturilor.

    Modularea curentului sau a tensiunii

    Modulatorul a adus o doză nouă de durere de cap. Modulația a dispărut complet când bobina a fost plasată la o anumită distanță de cititor. Acest lucru se poate întâmpla și atunci când mutați bobina către sau departe de cititor.

    Motivul s-a dovedit a fi în circuitul modulatorului. MOSFET-urile scurtează bobina la un rezistor cu o anumită rezistență. Cu toate acestea, dacă consumul de energie din circuit este mare, rezistența modulatorului este mult mai mare decât rezistența circuitelor de putere. Aceasta duce la faptul că adâncimea de modulație depinde de curentul consumat, ceea ce nu este foarte bun. Situația a fost înrăutățită de alegerea unei diode zener limitatoare cu mai mult Voltaj scazut decât în ​​prototip.

    S-a decis comutarea modulatorului din modul de modulare a tensiunii în modul de modulare a curentului. Pentru primul mod, rezistorul a fost în circuitul de scurgere, iar acum este conectat între sursă și masă. Tensiunea sursă-portă va scădea peste acest rezistor până când o valoare rămâne chiar peste pragul de deschidere a tranzistorului (0,9-1,1 V), ceea ce va transforma tranzistorul în modul liniar. Acum curentul prin tranzistor va fi stabil, indiferent de tensiunea de scurgere.

    Testarea pe un prototip a arătat că modularea curentă funcționează foarte bine. Cititorul ieftin fără nume nu se mai prăbușește (bine, poate o dată la o sută și ceva). Putem presupune că această schimbare va funcționa de minune pentru alți cititori, iar eticheta va putea acum să funcționeze pe majoritatea dintre ei.

    Versiunea finală 1

    Puteți vedea modificările făcute pe placă de circuit imprimat. Nu aveam un condensator SMD de 15 pF, a trebuit să lipim unul obișnuit cu picioare. Modulatorul a dobândit rezistențe suplimentare la sursele tranzistoarelor. Per total acceptabil pentru prima versiune.

    (imaginile se pot face clic)





    Demonstrație video

    Concluzie

    S-ar putea să credeți că acest proiect, construit pe logica 7400, poate fi clasificat ca design de circuit retro, dar acest lucru nu este în întregime adevărat. În primul rând, familia modernă 74HC nu este atât de veche. În al doilea rând, circuitele de putere redusă sunt întotdeauna relevante. În al treilea rând, jetoane simple elemente logice(cum ar fi declanșatorul Schmitt folosit) sunt adesea folosite în evoluții moderne. Se uită adesea că dezvoltarea tehnologiei nu se oprește pentru familiile mai vechi de cipuri. Pur și simplu au devenit mai puțin vizibile pe fondul diversității generale.

    Partea analogică s-a dovedit a fi mai dificil de dezvoltat decât partea digitală. Parțial din cauza lipsei de specificații, dar în principal din cauza numeroaselor compromisuri necesare pentru îndeplinirea parametrilor și a efectelor secundare neprevăzute. Modelele digitale au relativ puține opțiuni, în timp ce cele analogice necesită de obicei un echilibru între criterii diferite (și adesea opuse).

    Trebuie să recunosc că cipurile 74HC sunt foarte, foarte bine făcute. Dezvoltatorii știau ce fac și au obținut un consum de energie foarte scăzut. La început am avut câteva îndoieli dacă eticheta ar putea funcționa de la putere pasivă, dar după ce am citit specificațiile a fost doar o chestiune de proiectare corectă a circuitului. Deși mai este loc de optimizare diverse părți Etichete.

    Acum să vedem cum va funcționa acest proiect la competiția 7400 din 2012. Înscrierile pentru concurs se încheie pe 31 noiembrie. Dorim mult succes autorului! - Notă traducere

    Etichete:

    • RFID
    • 7400 Concurs
    • suprainginerie
    • logică
    • greble peste tot
    Adaugă etichete

    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 î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 inclus 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, 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 lecțiilor și ghidurilor să nu se potrivească cu pinout-ul de pe modulul dvs. Dacă schițele indică pinul SS, dar modulul dvs. 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, atunci citiți */ Serial.println(" "); Serial.println("Card găsit"); serNum0 = rfid.serNum; serNum1 = rfid.serNum; serNum2 = rfid.serNum; serNum3 = rfid .serNum; serNum4 = rfid.serNum; //Afișează 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.print(", "); 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ă; furnizarea de energie de 5 V vă poate ucide cu ușurință placa.

    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țializează magistrala SPI mfrc522.PCD_Init(); // Inițializează modulul RFID ShowReaderDetails(); // Afișează date despre modulul MFRC522 Serial.println(F("Scanează 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 if (! mfrc522.PICC_ReadCardSerial()) ( return; ) // Ieșiți date 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); if (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 primim 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, 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("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 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 un modul este capacitatea de a face deja o copie harta existenta, pentru a adăuga sau 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::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, 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 duplicat nu strica niciodată, nu?)

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

    Lecția 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 (English Radio Frequency IDentification, identificarea prin radiofrecvență) este o metodă de identificare automată a obiectelor în care datele stocate în așa-numitele transpondere, sau etichete RFID, sunt citite sau scrise folosind semnale radio. Orice sistem 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).

    Acest tutorial va folosi o etichetă RFID cu 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 mesajul „Unlocked” pe display. Dacă ID-ul unic nu este egal cu o valoare predefinită, mesajul „Deblocat” nu va apărea - vezi fotografia de mai jos.

    Castelul este închis

    Lacătul este deschis

    Piese 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

    În fiecare Etichetă RFID Există un cip mic (carton alb în fotografie). Dacă aprindeți o lanternă pe acest card RFID, puteți vedea cip mic și bobina 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 bobina 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 mie 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. Costul cititorului RFID și al acestor două carduri RFID este de aproximativ 4 USD.

    Pasul 3: Afișaj OLED

    Lecția 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 lecție, poate afișa două culori: galben și albastru. Top parte ecranul poate fi doar galben și Partea de jos- albastru.

    Acest ecran 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: Conectarea tuturor pieselor

    Cele mai bune articole pe această temă