Citirea și scrierea etichetelor RFID. Modul RC522 pentru Arduino. Cititor RFID UHF buget și dezvoltarea acestuia

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

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 o etichetă RFID aproape (4-5 cm) de bobina cititorului (L1), cititorul citește ID-ul unic de 10 cifre al etichetei și îl transmite ca caractere ASCII prin ieșirea serială la 2.400 de biți pe secundă.

Circuitul include un dispozitiv de semnalizare care emite bipuri intermitente atunci 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 crea un semnal de undă pătrată de 125 kHz. Acest semnal vine de la pinul PB0. La marginea descendentă a impulsului la pinul PB0 (zero logic „0”), tranzistorul T1 este închis. Astfel, bobina L1 este excitată prin rezistorul R1 (100 Ohm nominal) de la o tensiune de +5V. Când pulsul la pinul PB0 crește (unitatea logică „1”), tranzistorul T1 se deschide ș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 de 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 operarea transformatoare , transformând tensiunea de 220 V AC în 12 V AC, datorită câmpului magnetic creat de î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 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ă trimită un zero logic „0” către cititor, 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 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 semnalului transmis prin filtrele D1, C3 si 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ă energie suplimentară, nu provoacă o cădere de tensiune. Aceasta corespunde unui logic „1” (Figura 3). Lungimea „unui” sau „zerourilor” depinde de rata de transfer de date în serie. 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ă! Transmiterea datelor de la etichetă la cititor variază de la 500 la 8.000 de biți pe secundă.

Figura 4:Captură de ecran a datelor transmise...10101...Figura 5


  • O etichetă 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 cei mai puțin semnificativi biți 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 pe 32 de biți al etichetei (D08,..., D11).
    7. Bit 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 se realizează folosind 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 etichetei RFID transmise.

Realizarea unei bobine

Bobina are un diametru de 120 mm și 58 de spire. Pentru orice eventualitate, lăsați niște sârmă de cupru pentru încă 2-3 spire (60-61 de spire în total). Pentru a obține distanța maximă dintre eticheta RFID și cititor (între etichetă și bobina antenei cititorului), trebuie să calibrați bobina. Dacă conectați osciloscopul la punctul de conectare comun dintre 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?

Porniț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 fir de cupru (creșteți sau micșorați numărul de spire) bobinei până când zgomotul este eliminat.

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 la 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 bobinelor de sârmă de cupru din bobina L1. În acest fel, veți obține intervalul maxim de distanță dintre semne și bobina L1.

Am făcut o bobină L1 cu diametrul de 120 mm cu 58 de spire, dar ulterior am vrut să o fac cu o dimensiune mai mică. Așa că am îndoit bobina în jumătate până arăta ca o „cifră opt” (formă ca o cifră opt) și am recalibrat. Astfel, bobina L1 din imagini 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 (siguranțe) pentru ATtiny13: High Fuse: 0x1F și Low Fuse: 0x7A. Acest set de setări ATtiny13 funcționează cu un oscilator intern cu o frecvență 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 a controlerului ATtiny13. Poate că trecerea la orice alt AVR cu 8 pini, cum ar fi ATtiny85, ar fi o idee bună dacă doriți să adăugați câteva caracteristici la codul sursă.

Proiectul a fost 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 radioelementelor

Desemnare Tip Denumirea 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 electrolitic100 µF2 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

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

Rezultat: când punem laptopul pe „încărcare”, priza cu încărcătorul său se pornește automat. Și în restul timpului, priza este, desigur, oprită. Ca să nu spun că este deosebit de util, dar este divertisment.

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

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

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

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

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

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

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

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

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

.

.

.

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

Cu baterie AAA

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

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

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

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

Caracteristici (de la vânzător):

Tensiune: 3,3 V

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

Consum de curent în standby: 10-13 mA

Curent de repaus: mai puțin de 80uA

Consum maxim: mai mic de 30 mA

Frecventa de operare: 13,56 MHz

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

Interfață: SPI

Dimensiuni: 40x60 mm

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

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

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

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

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

Cred că acesta este tocmai unul dintre motivele eternelor probleme cu această bibliotecă. Al doilea motiv este că conexiunea pentru Arduino Uno și Mega se face la pini diferiți. Acest lucru se datorează naturii platformelor.

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

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

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

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

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

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

Și ambele table au funcționat.

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

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

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

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

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

Mega RC522
3,3 V VCC
GND GND
RESET RST

50 MISO
51 MOSI
52 SCK
53 NSS

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

Uno RC522
3,3 V VCC
GND GND
5 RST

12 MISO
11 MOSI
13 SCK
10 NSS

Împreună cu sora mai mare

.

.

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

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

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

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

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

Dar am găsit un text minunat și foarte romantic al lui Alexander „Dark Simpson” Simonov sub titlul „”, publicat, se pare, într-unul din numerele Hacker. În ciuda caracterului curios al textului, acesta conține o mulțime de informații utile despre structura stocării datelor, inclusiv asupra biletelor care mă interesează.

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

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

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

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

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

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

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

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

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

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

Era deja posibil să lucrăm cu asta.

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

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

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

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

Rezultatul muncii monstrului

Desigur, în acest caz nici măcar nu vorbim despre realizarea unei „copii” a biletului. Aceasta este o funcție pur informațională, dublând terminalul din holul metroului.

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

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

Logica este simplă: dacă cititorul vede o cartelă cu un anumit număr, pornește priza. Dacă nu îl vede, îl oprește.

MONSTRU DE RACHETE

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

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

Când punem cartea pe dulap, casa crede că am decis să mergem în regatul lui Morpheus și stinge luminile. Și dacă luăm o carte din dulap, se presupune că vrem să citim, iar apoi, dimpotrivă, se aprinde lumina de fundal pentru ca cerneala electronică să fie văzută și pentru a nu ne răni ochii.

Așa funcționează monstrul priză

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

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

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

Din seria preferată a tuturor (cel puțin sper cu adevărat) „A View from the Inside” - mai mult de șase luni. Nu este că nu ar fi fost nimic de scris sau de vorbit, ci doar că am fost copleșit de lucruri care vor deveni subiectul unuia din următoarele articole despre Habré (sper să nu fie casat, deoarece nu va fi dedicat în întregime subiectelor IT). Între timp, avem un minut liber, să ne dăm seama ce este RFID (Identificarea prin radiofrecvență) - li se vor alătura etichete mai simple - sau cum un mic pas în tehnologie a schimbat dramatic viața a milioane și chiar a miliarde de oameni in jurul lumii.

Prefaţă

As dori sa fac o rezervare imediat.

Înainte de a începe lucrul la acest articol, am sperat cu adevărat că din microfotografii, și mai ales din optică, informații găsite pe Internet și unele cunoștințe din publicațiile anterioare, să fie posibil să se stabilească unde și ce elemente ale microcircuitului se află. Cel puțin la nivel „de zi cu zi”: se spune, aceasta este memoria, acesta este circuitul de alimentare și aici are loc procesarea informațiilor. Într-adevăr, s-ar părea că RFID este cel mai simplu dispozitiv, cel mai simplu „computer” la care te poți gândi...

Cu toate acestea, viața și-a făcut propriile ajustări și tot ceea ce am reușit să găsesc: o diagramă generală a dispozitivului unei noi generații de etichete, fotografii cu cum ar trebui să arate, de exemplu, o memorie - nici nu știu de ce am făcut-o. Nu acordați atenție acestui lucru (poate că va exista o oportunitate de îmbunătățire?! ), și scandaluri, intrigi, dezvăluiri ale procesoarelor A5 de la fabricile de cipuri.

Partea teoretică

Prin tradiție, să începem cu o parte introductivă.
RFID
Istoria tehnologiei de recunoaștere a frecvenței radio - poate așa pot fi numite toate variantele imaginabile și de neconceput ale RFID (identificarea prin radiofrecvență) - datează din anii 40 ai secolului XX, când dezvoltarea tuturor tipurilor de echipamente electronice a fost activă. efectuate în URSS, Europa și SUA.

La acea vreme, orice produs alimentat cu energie electrică era încă o noutate, așa că oamenii de știință se confruntau cu un câmp nearat: oriunde ai înțepa, ca în Regiunea Pământului Negru, un mâner de lopată - un copac creștea. Judecă-te singur: Maxwell și-a propus legile cu doar o jumătate de secol în urmă (în 1884). Iar teorii bazate pe aceste ecuații au început să apară 2-3 decenii mai târziu (între 1900 și 1914), inclusiv teoria undelor radio (de la descoperirea lor, până la modelele de modulație a semnalului etc.). În plus, pregătirea și desfășurarea celui de-al Doilea Război Mondial și-a pus amprenta în acest domeniu.

Ca urmare, până la sfârșitul anilor 40, au fost dezvoltate sisteme de recunoaștere „prieten sau dușman”, care erau ceva mai mari decât cele descrise, dar funcționau practic pe același principiu ca etichetele RFID moderne.

Prima demonstrație a RFID aproape de modern a fost efectuată în 1973 la Laboratorul de Cercetare Los Alamos, iar unul dintre primele brevete pentru acest tip de sistem de identificare a fost primit un deceniu mai târziu - în 1983. Mai multe detalii despre istoria RFID pot fi găsite pe Wiki și pe alte site-uri ( și ).

Datorită bateriei încorporate, etichetele active au o rază de funcționare semnificativ mai mare, dimensiuni, „umplere” mai complexă (puteți adăuga un termometru, higrometru sau chiar un întreg cip de poziționare GPS pe etichetă) și un preț adecvat.

Etichetele pot fi clasificate în diferite moduri: după frecvența de funcționare (LF – joasă frecvență ~130KHz, HF – înaltă frecvență ~14MHz și UHF – ultra-high-frequency ~900MHz), după tipul de memorie din interiorul etichetei (citește- numai, scrieți-o dată și scrieți-o dată). Apropo, NFC, atât de îndrăgit și promovat de toți producătorii, se referă la gama HF, care are o serie de probleme binecunoscute.

Alte etichete
Din păcate, costul etichetelor RFID în comparație cu alte tipuri de identificare este destul de mare, așa că, de exemplu, încă cumpărăm alimente și alte bunuri „tradiționale” folosind coduri de bare (sau coduri de bare), uneori coduri QR și protecție așa-numita anti- Etichetele de furt (sau EAS - supraveghere electronică a articolelor) oferă protecție împotriva furtului.

Cele mai comune trei tipuri (toate fotografiile luate de pe Wiki):

Ne așteaptă multe descoperiri minunate, uneori complet neașteptate și, desigur, hard geek porn în format HD!

Dacă teoria nu este suficientă pentru cineva, bine ați venit pe acest site în limba engleză.

Partea practică

Deci, ce semne au fost găsite în lumea din jurul nostru:


Coloana din stânga de sus în jos: card de metrou Moscova, abonament Aeroexpress, card de plastic pentru acces în clădire, etichetă RFID prezentată de compania Perekrestok la expoziția RosNanoForum-2011. Coloana din dreapta de sus în jos: etichetă EAS cu frecvență radio, etichetă EAS acustomagnetică, bilet bonus pentru transportul public din Moscova cu bandă magnetică, cardul de vizitator RFID al RosNanoForum conține chiar și două etichete.

Primul care va fi anunțat este cardul de metrou din Moscova - să începem.

În primul cerc. Bilet de metrou Moscova
În primul rând, înmuiați cardul în apă plată pentru a îndepărta straturile de hârtie care ascund însăși inima acestui „semn”.


Harta dezbrăcată a metroului din Moscova

Acum să-l privim cu atenție la mărire scăzută folosind un microscop optic:


Microfotografii ale unui cip de card pentru acces la metroul din Moscova

Cipul este fixat destul de ferm și aș dori să subliniez că toate cele 4 „picioare” sunt atașate de antenă - acest lucru ne va fi util mai târziu pentru a compara cu o altă etichetă RFID. Pliand baza de plastic in jumatate in locul in care se afla cipul si scuturand-o usor dintr-o parte in alta, se elibereaza usor. Ca rezultat, avem un cip de dimensiunea unui ochi de ac:


Micrografii optice ale cipului imediat după separarea de antenă

Ei bine, hai să ne jucăm cu trucul:


Schimbarea poziției de focalizare din stratul de jos în stratul superior

Acum pentru o mică intriga.

Există zvonuri că Mikron dezvoltă și produce cipuri pentru metroul din Moscova în interior, folosind o tehnologie similară Mifare (cel puțin atașarea la antenă este diferită - picioarele au o formă diferită). Pe 22 august, fără a declara război și a trimis cu trădare un apel către Mikron pentru lămuriri dacă acest cip putea fi văzut în principiu undeva, până la 3.11 nu a existat niciun răspuns. Unul dintre jurnaliștii (și anume, Alexander Erlikh) de pe forumul IXBT urma să clarifice această informație și cu reprezentanții Mikron, dar momentan lucrurile sunt încă acolo, adică reprezentanții oficiali Mikron evită să răspundă la întrebarea pusă direct.

Biletul discutat mai sus a fost aparent fabricat (sau doar montat pe antenă?) la întreprinderea Mikron (Zelenograd) - vezi link-urile de mai jos - folosind tehnologia de la NXP, o companie binecunoscută în cercurile RFID, care este în mod clar sugerată de 3 uriașe litere și anul lansării tehnologiei (și poate anul producției) pe stratul de metalizare superior al cipului. Dacă presupunem că 2009 se referă la anul în care a fost lansată tehnologia, iar abrevierea CUL1V2 este descifrată ca Circuit ULtralite 1 Versiunea 2 (această ipoteză este confirmată și de această știre), atunci pe site-ul NXP puteți găsi o descriere detaliată a acestora. jetoane (ultimele două rânduri din listă)

Apropo, anul trecut a fost organizată o excursie la uzina Micron (reportaje foto și video) pentru participanții la Olimpiada de Internet pe Nanotehnologie, așa că nu are sens să spunem că echipamentul de acolo este inactiv, dar și declarația „tip într-o haină albă” că produc etichete după standardele de 70 nm, aș pune la îndoială...

Conform statisticilor colectate în urma analizării jeturilor a 109 bilete de metrou (un eșantion destul de reprezentativ), conform distribuției normale, șansele de a găsi un bilet „neobișnuit” sunt de ~109^1/2 sau aproximativ 10%, dar se topesc cu fiecare bilet deschis...

Un ochi atent a observat deja principala diferență dintre cele două cipuri Mifare - inscripția Philips2001. De fapt, în 1998, Philips a cumpărat producătorul american de microelectronice Mikron (a nu fi confundat cu Zelenograd Mikron). Și în 2006, NXP s-a desprins de la Philips.

De asemenea, este ușor de observat marca CLU1V1C, care, pe baza celor de mai sus, înseamnă Circuit ULTralite 1 Version 1C. Adică, această etichetă este predecesorul lui Mifare, folosit de metroul din Moscova și, prin urmare, este compatibil cu acesta în principalii săi parametri. Totuși, ca și în cazul precedent, 2001 este un indiciu al anului dezvoltării și implementării tehnologiei sau al producției. Este ciudat că Aeroexpress folosește etichete învechite...

În al treilea cerc. Un card de plastic
Într-o zi, am decis să arăt unuia dintre prietenii mei articole și fotografii despre Habrahabr. Apoi a întrebat dacă avea vreun card inutil pentru următorul articol despre RFID. Până atunci, tocmai se mutase să studieze la EPFL și mi-a dat un card care permite accesul la una dintre clădirile Universității de Stat din Moscova. Cardul, în consecință, nu are niciun marcaj și nici măcar nu sunt sigur că este scris ceva pe ea, cu excepția cheii obișnuite pentru a intra în clădire.
Cardul este complet din plastic, așa că îl punem imediat în acetonă pentru literalmente câteva zeci de minute:


Faceți băi cu acetonă

Totul în interior este destul de standard - o antenă și un cip, totuși, s-au dovedit a fi pe o mică bucată de PCB. Din păcate, fără niciun semn de identificare - un nonname tipic chinezesc. Singurul lucru pe care îl puteți ști despre acest cip și card este că sunt fabricate/aparțin unui standard TK41. Există o mulțime de astfel de cărți la vânzări precum ali-baba și dealextreme.

În al patrulea cerc. Răscruce de drumuri
În continuare, vreau să mă uit la două etichete prezentate la expoziția RosNanoForum 2011. Prima dintre ele a fost prezentată cu mare patos, spunând că a fost aproape un panaceu pentru hoți și furturi. Și, în general, această etichetă va permite magazinelor să treacă complet la autoservire. Din păcate, managerul eficient s-a dovedit a fi puțin mai mult decât complet incompetent în problemele de fizică școlară. Și după propunerea de a testa eficacitatea acesteia și a etichetei folosind un magnet puternic atașat etichetei, a tăcut rapid subiectul...

După câteva achiziții de la SmartShop, mi-au rămas câteva etichete la dispoziție. După ce am îndepărtat unul dintre ele de lipici și stratul protector alb, vedem următoarele:


Etichetă nouă pentru lanțul de magazine Perekrestok

Facem la fel ca Mifare, îl deconectam cu grijă de la baza polimerică și de la antenă și îl punem pe masa microscopului optic:


Microfotografii optice ale unei etichete destinate utilizării în SmartShop

Printr-o coincidență norocoasă (fie lipiciul ne-a lăsat jos, fie acest lucru a fost intenționat), semnul a fost smuls rapid de la bază, iar suprafața sa a rămas fără urme de lipici. Aș dori să vă atrag atenția că dacă Mifare are toate cele 4 contacte atașate la antenă (2 contacte la fiecare capăt), aici vedem că două contacte sunt conectate la două pad-uri mici care nu sunt în contact cu antena.

Să ne jucăm puțin cu concentrarea în diferite părți ale etichetei:


Se schimbă focalizarea...


Mărirea maximă a unui microscop optic

Ultima fotografie din stânga sus arată aparent un modul de memorie EEPROM, deoarece ocupă aproximativ o treime din suprafața cipului și are o structură „regulată”.

După câțiva ani de lucru pe subiecte RFID și de dezvoltare a diverșilor cititori pentru modele de transponder de standarde populare precum Mifare, EMMARINE, TIRIS... Am început adesea să fiu nedumerit de această întrebare - literalmente în ultimul an, diferite tipuri de emulatori sub etichetele protocoalelor populare și diferitele copiatoare pentru chei/chei au devenit foarte populare.

Având în vedere numărul mare de cipuri speciale disponibile comercial pentru protocoalele RFID populare și cititoarele ieftine, utilizarea pe scară largă a echipamentelor precum osciloscoapele digitale, snifferele și analizatoarele de spectru, această problemă a devenit mai presantă pentru mulți dezvoltatori. Apoi am decis să creez un protocol de schimb pentru unul dintre proiectele care diferă de standardele descrise mai sus.

Desigur, această idee nu rezolvă problemele globale de securitate ale noului sistem și poate fi analizată de alți dezvoltatori dacă au echipament, dar ideea este că toate acestea nu coincid cu standardele existente și tot hardware-ul copiatorului nu va permite să copiați și să recreați rapid un astfel de algoritm. Desigur, un astfel de sistem nu este prezentat aici ca o soluție completă la problemele de securitate, ci ca o experiență în adaptarea RFID la un sistem închis. Un avantaj bun în ceea ce privește securitatea printre alte sisteme wireless similare este tehnologia RFID de joasă frecvență în sine - nu permite citirea etichetelor pe o distanță lungă.

Etichetele pasive au o putere destul de scăzută și necesită un generator de cititor destul de puternic pentru a le alimenta particularitățile de propagare a undelor radio la aceste frecvențe limitează, de asemenea, limitele de funcționare ale acestui sistem. Intervalul de citire real al transponderelor rareori depășește 20 cm pentru standardele de 125 KHz precum EmMarine, să spunem standardul EM4001 pentru alte protocoale precum Mifare (13,56 MHz) poate fi mai lung (1,5 metri pentru iso15693); Puteți obține o distanță de citire mai mare pentru cititoarele de joasă frecvență prin creșterea dimensiunii bobinei și respectiv a tensiunii de alimentare și a puterii cititorului. Cu toate acestea, astfel de sisteme sunt voluminoase și, de obicei, greu de făcut portabile. De regulă, astfel de sisteme sunt implementate numai permanent – ​​de exemplu, pentru mașini.

Deci, acum despre arhitectura actuală a sistemului nostru RFID. Controlerul atmel atmega8 a fost ales pentru experimente. În scopul producției de transponder, acest lucru pare exagerat. Cu toate acestea, în acest caz, sarcina principală de a dezvolta o nouă interfață pe o placă de dezvoltare gata făcută cu atmega a fost rezolvată, urmată de portarea acestui cod la controlere mai ieftine precum tiny13. Pentru transponder, algoritmul de operare a fost construit pe baza modului de generare PWM folosind temporizatorul T1 în modul CTC cu întrerupere și resetare în coincidență cu OCR1. Datele pentru transmisia cu transponder 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 necesar, deoarece prezența acestuia este verificată mai întâi atunci când cititorul analizează pachetul.

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: pachetul 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ă aceasta, scrieți doi octeți CRC16 la sfârșitul pachetului în EEPROM. Lăsăm primul octet 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, 2 frecvențe de 2KHz și 5KHz sunt folosite pentru a transmite „0” și „1” logic. În plus, datele sunt separate prin impulsuri de sincronizare - semne de început de pachet.

Fig.1 Conținutul pachetului cu transponder.


Fig.2 Dump de transmisie a transponderului pe ecranul osciloscopului virtual.

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


Fig.3 Circuitul transponder.

Acum să vorbim despre circuitul cititorului pentru acest transponder. Circuitul a fost adaptat pe baza cititorului de carduri EMMARINE utilizat anterior. Partea circuitului cu generatorul de 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 mai târziu, când facem o etichetă pasivă și trebuie să primim 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 are cea mai mare simplitate posibilă și vă permite să citiți datele transponderului la o distanță de 10-12 cm cu circuite bine reglate.

Puteți simplifica și mai mult circuitul, lăsând doar un detector și un filtru și să puneți la ieșire un tranzistor care va juca rolul unui comparator, dar nu am făcut asta. La ieșire primim un semnal binar dreptunghiular în conformitate cu duratele codificate ale impulsurilor transmise de transponder. Abaterile admise ale valorilor elementului la care circuitul funcționează este de 5-10%. Alimentare pentru controler și opamp +5V. Frecvența de cuarț a oscilatorului master 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. Managerul de întrerupere 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 configurarea terminalului, specificam urmatorii parametri: viteza 57.6Kb/s, 8 biti de date, 1 bit de oprire, fara paritate.

La primirea unui pachet, controlerul calculează suma de control a octeților primiți și transmite datele către terminal (pachet și CRC). Dacă sumele de control calculate de controler și cele primite în pachet se potrivesc, un semnal este transmis către pinul PORTB.0 (14) al controlerului (LED1 în diagramă). Puteți conecta un tweeter cu un generator încorporat sau un LED printr-un rezistor până în acest punct. Când citește cheia corectă, controlerul dezactivează întreruperile externe și face o întârziere de 1 s înainte de următoarea citire. De asemenea, este furnizat modul de funcționare al acestui cititor ca bază pentru blocarea RFID. Pentru a face acest lucru, este necesar să scrieți toți octeții de descărcare a 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, când următorul transponder este citit și se potrivește cu ceea ce este scris în EEPROM-ul cititorului, un semnal este transmis către pinul PORTB.1 (15) al controlerului (LED2 în diagramă). Puteți conecta un LED în acest punct printr-un rezistor sau un comutator de ieșire (tranzistor) de pe releul actuatorului. Acum avem o încuietoare RFID pentru o anumită cheie și un cititor obișnuit într-o sticlă.


Fig.4 Diagrama cititorului de etichete RFID. (măriți diagrama)

Deci, să rezumam rezultatele intermediare. Ne-am creat propriul cititor și transponder pentru acest cititor. Ne-am protejat echipamentele de dispozitivele terțe care lucrează cu protocoale RFID populare. Următorul pas va fi fabricarea unei etichete pasive pentru cititorul nostru, așa cum fac producătorii cunoscuți de transpondere industriale, și portarea codului echipamentului la modele de controler mai ieftine. In arhiva atasez articolului firmware-ul pentru transponder si cititor.

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

  • 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. Circuitul oscilator trebuie reglat la tensiunea maximă la punctul de control, de exemplu, prin înfăşurarea/înfăşurarea spirelor bobinei. 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 descifra 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ă înregistrați valoarea biților care va corespunde valorii semnalului. după picătură. 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, sa 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?

    E 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 timpi de puls minim și maxim ușor diferiți (din fericire, timpii 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 către card că datele vor începe acum să fie transferate către acesta. În continuare, trebuie 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 suporta diferite tipuri de modulații, acceptă parole și multe altele. Fiecare disc de la bord are un set de blocuri de 32 de biți. Scopul acestor blocuri este diferit. În unele, codul cheii este 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 scriere, trebuie trimis un cod de operare (2 biți opcode) și un bit latch (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. Porniți câmpul pentru 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.