Pembaca RFID: bercakap tentang teknologi. RFID dipermudahkan. Pelaksanaan transponder dan pembaca RFID anda sendiri

RFID (Radio Frequency Identification) menggunakan medan elektromagnet untuk mengenal pasti dan menjejaki tag yang dilampirkan pada objek secara automatik. Tag mengandungi maklumat yang disimpan secara elektronik. Tag pasif mengumpul tenaga daripada isyarat radio daripada pembaca RFID berdekatan. Teg aktif mempunyai sumber kuasa tempatan (seperti bateri) dan boleh beroperasi ratusan meter dari pembaca. Tidak seperti kod bar, teg tidak perlu berada dalam pandangan peranti, jadi ia boleh dibenamkan dalam objek yang dijejaki. RFID adalah salah satu kaedah untuk pengenalan automatik dan pengumpulan data.

Permohonan

Tag RFID digunakan dalam banyak industri. Sebagai contoh, pembaca RFID yang dipasang pada kenderaan semasa pengeluaran boleh digunakan untuk menjejak kemajuan di sepanjang baris pemasangan. Farmaseutikal berlabel boleh dikesan melalui gudang. Menanam cip mikro RFID ke dalam ternakan membolehkan haiwan dikenal pasti.

Oleh kerana tag RFID boleh dilekatkan pada wang, pakaian dan harta benda, atau ditanam pada haiwan dan manusia, keupayaan untuk membaca maklumat peribadi panggilan tanpa kebenaran pengguna masalah serius privasi. Risiko ini telah membawa kepada pembangunan spesifikasi standard yang menangani isu keselamatan data peribadi. Teg juga boleh digunakan di kedai untuk mempercepatkan pembayaran dan mengelakkan kecurian.

cerita

Pada tahun 1945, Leon Theremin mencipta peranti mendengar untuk Kesatuan Soviet, yang memancarkan semula gelombang radio dengan maklumat audio tambahan. Getaran bunyi semasa getaran mempengaruhi diafragma, yang mengubah sedikit bentuk resonator, memodulasi frekuensi radio yang dipantulkan. Walaupun peranti ini ialah peranti mencuri dengar secara rahsia dan bukannya tag ID, ia dianggap sebagai pelopor kepada pembaca RFID USB kerana ia telah diaktifkan oleh gelombang audio daripada sumber luar. Transponder masih digunakan oleh kebanyakan pesawat yang beroperasi. Sebelum ini, teknologi serupa, seperti pembaca tag RFID, kerap digunakan oleh pihak Berikat dan Jerman dalam Perang Dunia II untuk mengenal pasti pesawat.

Peranti Mario Cardullo, yang dipatenkan pada 23 Januari 1973, adalah pendahulu sebenar pertama RFID moden, kerana ia adalah penerima radio pasif dengan memori. Peranti asal adalah pasif, dikuasakan oleh isyarat pengundian. Ia telah ditunjukkan pada tahun 1971 kepada pentadbiran New York City dan lain-lain pengguna berpotensi dan terdiri daripada transponder dengan memori 16-bit untuk digunakan sebagai peranti berbayar. Paten teras Cardullo meliputi penggunaan frekuensi radio, bunyi dan cahaya sebagai media penghantaran.

Kawasan kegunaan

Pelan perniagaan asal yang dibentangkan kepada pelabur pada tahun 1969 menunjukkan aplikasi berikut untuk pembaca RFID:

  • penggunaan dalam pengangkutan (pengenalan kenderaan, sistem pembayaran automatik, plat lesen elektronik, manifes elektronik, penghalaan kenderaan, pemantauan kecekapan kenderaan);
  • perbankan (buku cek elektronik, elektronik kad kredit);
  • kakitangan, pintu pagar automatik, pengawasan); industri perubatan (pengenalan, sejarah pesakit).

Demonstrasi awal kuasa pantulan (penyebaran belakang termodulat) tag RFID, kedua-dua pasif dan separa pasif, telah dilakukan oleh Stephen Depp, Alfred Koelle dan Robert Fryman di Makmal Kebangsaan Los Alamos pada tahun 1973. Sistem mudah alih berjalan pada 915 MHz dan menggunakan tag 12-bit. Kaedah ini digunakan oleh kebanyakan pembaca UHFID dan gelombang mikro RFID moden. Dalam kehidupan moden, peranti sedemikian sangat diperlukan.

Spesifikasi

RFID menggunakan tag yang dilampirkan pada objek yang boleh dikenal pasti. Apabila membuat pembaca RFID anda sendiri, perlu diingat bahawa penerima pemancar radio dua hala, dipanggil penyiasat atau pembaca, menghantar isyarat kepada teg dan membaca responsnya. Tag RFID boleh menjadi pasif, aktif atau pasif. Teg aktif mempunyai bateri terbina dalam dan menghantar isyarat IDnya secara berkala. Bateri pasif (BAP) mempunyai bateri kecil di atas kapal dan diaktifkan dengan kehadiran pembaca RFID. Tag pasif adalah lebih murah dan lebih kecil kerana ia tidak mempunyai bateri. Sebaliknya, tag menggunakan gelombang radio yang dihantar oleh pembaca. Walau bagaimanapun, untuk tag pasif beroperasi, ia mesti diterangi pada tahap kuasa kira-kira seribu kali lebih kuat daripada menghantar isyarat. Ini menjejaskan gangguan dan penyinaran.

Projek ini dibuat atas permintaan rakan untuk dipasang pada pintu ke bilik simpanan. Selepas itu, beberapa lagi dibuat atas permintaan rakan dan kenalan. Reka bentuknya ternyata mudah dan boleh dipercayai. Berfungsi peranti ini seperti ini: ia membenarkan hanya kad RFID yang sebelum ini disimpan dalam memori peranti.

Ciri-ciri utama pengawal akses:

Kad RFID format EMmarin 125kHz

Mikropengawal ATtiny13

Bilangan kad/fob kunci - 10.
Butang "BUKA" biasanya terbuka dan dilindungi daripada melekat.
Keluaran kawalan kunci, arus tinggi transistor kesan medan, mod pengendalian selak (dihidupkan buat sementara waktu).

Kuasa - 12v.
Penggunaan dalam mod siap sedia ialah 35 mA.
Bilangan kad akses/fob - 10 pcs.
Panjang komunikasi dengan butang "BUKA" ialah 10 meter.
Jenis keluaran kawalan kunci - longkang terbuka (transistor kesan medan berkuasa, arus sehingga 2A).

Gambarajah skematik pengawal sekatan akses pada kad RFID 125KHz (Em-Marin) untuk 10 kad (pada mikropengawal ATtiny13):

Jika anda perlu mengawal kunci elektromagnet, anda perlu memasang geganti output dengan kumpulan kenalan yang diperlukan.

Kemunculan pengesah RFID yang dipasang:

Menetapkan bit Fius dalam PonyProg:

Pengendalian peranti, muat turun video yang dirakam oleh pengarang.
Salah seorang pembaca juga menerbitkan video peranti yang dipasang dalam tindakan:

Arahan pengaturcaraan

Mod pengendalian - apabila 12V dibekalkan kepada pengawal, LED berkelip 1Hz.
Mod pengaturcaraan - LED berkelip 2Hz.
Apabila anda menekan butang "BUKA", satu siri bunyi bip pendek akan berlaku semasa kunci dibuka.

Isyarat bunyi

1 isyarat pendek - kad atau fob kunci ditulis pada memori pengawal.
2 bip pendek - kad atau fob kunci sudah disimpan dalam ingatan pengawal.
5 bip pendek - keluar dari mod pengaturcaraan.
1 bip panjang- memori kad kunci dipadamkan daripada pengawal.
Berterusan isyarat pendek- memori kad/kunci penuh, maksimum 10 pcs. (memerlukan mematikan kuasa kepada pengawal).

Merakam MASTER CARD dan masa buka kunci

1 - Matikan kuasa pengawal.
2 - Tekan butang "OPEN".
3 - Sambil memegang butang, sambungkan kuasa kepada pengawal, selepas 5 saat. pengawal "BEEPS", LED akan berkelip pada frekuensi 2 Hz.
4 - Lepaskan butang.
5 - Bawa kad atau fob kunci ke dalam kawasan bacaan, satu bunyi akan berbunyi isyarat bunyi, Kad induk atau fob kunci direkodkan, dan masa buka kunci selama 1 saat akan direkodkan.

6 - Pegang kad atau fob kunci di kawasan bacaan dan kira isyarat bunyi. Kuantiti menentukan masa yang diperlukan untuk membuka kunci, kenaikan 1 saat, tetapi tidak melebihi 32 saat.
7 - Matikan kuasa kepada pengawal atau jeda selama 30 saat.

Memadam semua memori kad fob kunci

1 - Mod pengendalian.
2 - Tekan butang "OPEN" dan tahan, bawa kad MASTER atau key fob ke pembaca dan tahan, selepas 5 saat bunyi bip yang panjang akan berbunyi - memori kad/fob kunci dipadamkan.
3 - Lepaskan butang dan keluarkan kad atau fob kunci.

Selepas beberapa tahun bekerja pada topik RFID dan membangunkan pelbagai pembaca untuk model transponder standard popular seperti Mifare, EMMARINE, TIRIS... Saya sering mula hairan dengan soalan ini - secara literal Tahun lepas Pelbagai jenis emulator di bawah tag protokol popular dan pelbagai penyalin fob kunci/kunci telah mendapat populariti yang meluas.

Memandangkan sejumlah besar cip khas yang tersedia secara komersial untuk protokol RFID popular dan pembaca murah, penggunaan meluas peralatan seperti osiloskop digital, penghidu dan penganalisis spektrum, soalan ini telah menjadi lebih relevan untuk banyak pembangun. Kemudian saya memutuskan untuk mencipta protokol pertukaran untuk salah satu projek yang berbeza daripada piawaian yang diterangkan di atas.

Tidak dinafikan idea ini tidak menyelesaikan masalah global keselamatan sistem baru dan boleh dianalisis oleh pemaju lain jika mereka mempunyai peralatan, tetapi perkara ini adalah bahawa semua ini tidak sama dengan piawaian sedia ada dan semua perkakasan mesin penyalin tidak akan membenarkan anda menyalin dan mencipta semula algoritma sedemikian dengan cepat. Sudah tentu sistem yang serupa tidak dibentangkan di sini penyelesaian yang lengkap masalah keselamatan, tetapi bagaimana untuk menyesuaikan RFID kepada sistem tertutup. Tambahan yang baik mengenai isu keselamatan antara lain yang serupa sistem tanpa wayar ialah teknologi RFID frekuensi rendah itu sendiri - ia tidak membenarkan tag dibaca dalam jarak yang jauh.

Tag pasif mempunyai kuasa yang agak rendah dan memerlukan penjana pembaca yang cukup berkuasa untuk menjanakannya; keistimewaan perambatan gelombang radio pada frekuensi ini juga mengehadkan had operasi sistem ini. Julat bacaan sebenar transponder jarang melebihi 20 cm untuk standard 125 KHz seperti EmMarine, katakan standard EM4001; untuk protokol lain seperti Mifare (13.56 MHz) ia boleh lebih panjang (1.5 meter untuk iso15693). Anda boleh mencapai jarak bacaan yang lebih besar untuk pembaca frekuensi rendah dengan meningkatkan saiz gegelung dan voltan bekalan, masing-masing, dan kuasa pembaca. Walau bagaimanapun, sistem sedemikian adalah besar dan biasanya sukar untuk dibuat mudah alih. Sebagai peraturan, sistem sedemikian hanya dilaksanakan secara kekal - sebagai contoh, untuk kereta.

Jadi, sekarang mengenai seni bina sebenar sistem RFID kami. Pengawal atmel atmega8 telah dipilih untuk eksperimen. Untuk tujuan pembuatan transponder, ini kelihatan seperti berlebihan. Walau bagaimanapun, dalam dalam kes ini Tugas utama membangunkan antara muka baharu pada papan pembangunan siap pakai dengan atmega telah diselesaikan, diikuti dengan mengalihkan kod ini kepada pengawal yang lebih murah seperti tiny13. Untuk transponder, algoritma operasi dibina berdasarkan mod penjanaan PWM menggunakan pemasa T1 dalam mod CTC dengan gangguan dan set semula secara kebetulan dengan OCR1. Data penghantaran transponder dibaca daripada EEPROM apabila pengawal dihidupkan. Secara keseluruhan, transponder menghantar 10 bait. Kandungan transponder EEPROM boleh dilihat pada Rajah 1. Bait pertama 0xE7 ialah pengepala paket yang diperlukan, kerana kehadirannya disemak dahulu apabila pembaca menghuraikan paket.

8 bait pertama ialah kandungan paket transponder, 2 bait terakhir mengandungi jumlah semak CRC16 daripada lapan bait pertama paket. Sebagai contoh, data berikut telah direkodkan dalam transponder kami: paket 0xE7, 0x05, 0xE8, 0x93, 0x43, 0x7F, 0x20, 0xFF dan, oleh itu, checksum 0xF5 0xA8. Untuk membuat transponder unik anda sendiri, sebagai tambahan kepada bait pertama 0xE7, anda perlu menulis tujuh bait seterusnya ke dalam EEPROM, dan kemudian mengira jumlah semak untuk lapan bait pertama. Selepas ini, tulis dua bait CRC16 di hujung paket ke EEPROM. Kami membiarkan bait pertama tidak berubah - 0xE7. Apabila transponder dihidupkan, data bait ini dipecahkan kepada bit dan dikodkan dengan panjang nadi yang sesuai mengikut nilai daftar OCR. Untuk penghantaran, 2 frekuensi 2KHz dan 5KHz digunakan untuk menghantar logik "0" dan "1". Di samping itu, data dipisahkan oleh denyutan penyegerakan - tanda permulaan paket.

Rajah 1 Kandungan paket transponder.


Rajah.2 Lambakan penghantaran transponder pada skrin osiloskop maya.

Gambar rajah transponder boleh dilihat di Rajah 3. Kekerapan pengayun induk ialah 8 MHz. Bekalan kuasa pengawal +5V. Anda boleh menggunakan pengawal mega8 bertanda "L", kemudian kuasa boleh dibekalkan daripada bateri litium 3V (parameter untuk cip sedemikian ialah +2.7.... +3.5). Daripada transistor ini, anda boleh menggunakan mana-mana transistor NPN berkuasa rendah yang lain. Gegelung transponder dililit pada mandrel dengan diameter 50 mm dengan wayar 0.22 mm dan mempunyai 50 lilitan. hidup masa ini transponder dibuat aktif - dengan bekalan kuasa luaran. Pada peringkat seterusnya, ia dirancang untuk membuat versi pasif transponder, yang agak mudah - membuat pengasingan untuk kuasa dari gegelung ini, menambah diod jambatan penerus dan penstabil.


Rajah.3 Litar transponder.

Sekarang mari kita bercakap tentang litar pembaca untuk transponder ini. Litar telah disesuaikan berdasarkan pembaca kad EMMARINE yang digunakan sebelum ini. Sebahagian daripada litar dengan penjana 74hc4060 boleh didapati di di fasa ini jangan ragu untuk memadam, kerana buat masa ini kami menggunakan label aktif. Walau bagaimanapun, kita akan memerlukan bahagian litar ini kemudian, apabila kita membuat tag pasif dan kita perlu menerima kuasa daripada pembaca. Jika tidak, litar tidak berbeza dengan ketara daripada litar pembaca untuk EMMARINE: pengesan puncak pasif - penapis - penguat - pembanding. Litar ini mempunyai kesederhanaan yang paling besar dan membolehkan anda membaca data transponder pada jarak 10-12 cm dengan litar yang ditala dengan baik.

Anda boleh memudahkan litar dengan lebih jauh, hanya meninggalkan pengesan dan penapis, dan meletakkan satu transistor pada output yang akan memainkan peranan sebagai pembanding, tetapi saya tidak melakukannya. Pada output kami menerima isyarat segi empat tepat binari mengikut tempoh nadi yang dikodkan yang dihantar oleh transponder. Penyimpangan yang dibenarkan bagi nilai elemen di mana litar beroperasi ialah 5-10%. Bekalan kuasa untuk pengawal dan opamp +5V. Kekerapan kuarza pengayun induk pengawal ialah 12 MHz. Output pembanding pada LM358 disambungkan ke pin gangguan luaran pengawal INT0. Atur cara pengawal dikonfigurasikan untuk memanggil sampukan pada tepi yang meningkat pada pin sampukan luaran INT0. Pengendali sampukan memeriksa denyutan jam dan kemudian menyemak pengepala paket dan menulis kandungan ke penimbal pengawal. Data paket yang dibaca dihantar melalui antara muka RS232 ke PC. Untuk mengkonfigurasi terminal, nyatakan parameter berikut: kelajuan 57.6Kb/s, 8 bit data, 1 bit hentian, tiada pariti.

Apabila menerima paket, pengawal mengira jumlah semak bait yang diterima dan menghantar data ke terminal (paket dan CRC). Jika ada perlawanan jumlah semak dikira oleh pengawal dan diterima dalam pakej, isyarat dikeluarkan ke PORTB.0 (14) pin pengawal (LED1 dalam rajah). Boleh disambungkan ke titik ini tweeter dengan penjana terbina dalam atau LED melalui rintangan. Apabila membaca kekunci yang betul, pengawal melumpuhkan gangguan luaran dan membuat kelewatan 1s sebelum bacaan seterusnya. Terdapat juga mod operasi untuk pembaca ini sebagai Asas RFID istana Untuk melakukan ini, adalah perlu untuk menulis keseluruhan bait dump transponder ke dalam EEPROM pengawal pembaca - 10 bait. Data ditulis kepada EEPROM pembaca dengan cara yang sama seperti EEPROM transponder. Dalam kes ini, apabila transponder seterusnya dibaca dan ia sepadan dengan apa yang ditulis dalam EEPROM pembaca, isyarat dikeluarkan kepada pin PORTB.1 (15) pengawal (LED2 dalam rajah). Anda boleh menyambungkan LED ke titik ini melalui rintangan atau suis keluaran (transistor) pada geganti penggerak. Kini kami mempunyai kunci RFID untuk kunci tertentu dan pembaca biasa dalam satu botol.


Rajah.4 Gambar rajah pembaca tag RFID. (besarkan gambar rajah)

Jadi, mari kita rumuskan hasil perantaraan. Kami membuat pembaca dan transponder kami sendiri untuk pembaca ini. Kami telah melindungi peralatan kami daripada peranti asing bekerja dengan protokol RFID yang popular. Langkah seterusnya ialah membuat tag pasif untuk pembaca kami, seperti yang mereka lakukan pengeluar terkenal transponder industri dan mengalihkan kod peralatan ke model pengawal yang lebih murah. Dalam arkib saya melampirkan firmware untuk transponder dan pembaca pada artikel itu.

Muat turun perisian tegar:
Anda tidak mempunyai akses untuk memuat turun fail dari pelayan kami

Hari ini saya akan bercakap mengenai modul RFID RC522, berdasarkan cip MFRC522. Bekalan kuasa 3.3V, julat pengesanan sehingga 6cm. Direka untuk membaca dan rekod RFID tag dengan frekuensi 13.56 MHz. Kekerapan dalam kes ini adalah sangat penting, kerana tag RFID wujud dalam tiga julat frekuensi:


  • Tanda julat LF (125-134 kHz)

  • Tag jalur HF (13.56 MHz)

  • Tag jalur UHF (860-960 MHz)

Modul khusus ini berfungsi dengan tag jalur HF, khususnya dengan protokol MIFARE.

Untuk bekerja dengan modul yang anda boleh gunakan perpustakaan standard RFID disertakan Arduino IDE, bagaimanapun, terdapat perpustakaan lain yang ditulis khusus untuk modul ini - MFRC522 (1 MB). Kedua-dua perpustakaan agak mudah, tetapi MFRC522 mempunyai lebih banyak lagi fungsi khas, membolehkan untuk mengurangkan kod program akhir sebanyak mungkin.

Sambungan

Sesetengah orang akan menghadapi masalah - nama pin dalam kebanyakan pelajaran dan panduan mungkin tidak sepadan dengan pinout pada modul anda. Jika lakaran menunjukkan pin SS, tetapi modul anda tidak memilikinya, kemungkinan besar ia ditandakan sebagai SDA. Di bawah saya akan menyediakan jadual sambungan modul untuk papan yang paling biasa.

MFRC522 Arduino Uno Arduino Mega Arduino Nano v3

Arduino Leonardo/Mikro

Arduino Pro Micro
RST 9 5 D9 TETAP SEMULA/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.3V 3.3V 3.3V Penstabil 3.3V Penstabil 3.3V Penstabil 3.3V
GND GND GND GND GND GND

Pin kawalan SS(SDA) dan RST dinyatakan dalam lakaran, jadi jika papan anda berbeza daripada yang saya akan gunakan dalam contoh saya, dan saya menggunakan UNO R3, nyatakan pin dari jadual pada permulaan lakaran :


#define SS_PIN 10 #define RST_PIN 9

Contoh No 1: Membaca nombor kad

Mari lihat contoh dari perpustakaan RFID - cardRead. Ia tidak memaparkan data dari kad, tetapi hanya nombornya, yang biasanya mencukupi untuk banyak tugas.


#include #include #define SS_PIN 10 #define RST_PIN 9 RFID rfid(SS_PIN, RST_PIN); // Data tentang nombor kad disimpan dalam 5 pembolehubah, kami akan mengingati mereka untuk menyemak sama ada kami telah membaca kad tersebut int serNum0; int serNum1; int serNum2; int serNum3; int serNum4; persediaan void() ( Serial.begin(9600); SPI.begin(); rfid.init(); ) void loop() ( if (rfid.isCard()) ( if (rfid.readCardSerial()) ( // Bandingkan nombor kad dengan nombor kad sebelumnya jika (rfid.serNum != serNum0 && rfid.serNum != serNum1 && rfid.serNum != serNum2 && rfid.serNum != serNum3 && rfid.serNum != serNum4) ( / * Jika kad itu baharu, baca */ Serial.println(" "); Serial.println("Kad ditemui"); serNum0 = rfid.serNum; serNum1 = rfid.serNum; serNum2 = rfid.serNum; serNum3 = rfid .serNum; serNum4 = rfid.serNum; //Keluarkan nombor kad Serial.println("Nombor Kad:"); Serial.print("Dis: "); 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 ( /* Jika ini sudah menjadi kad baca, cuma cetak titik */ Serial.print("."); ) ) ) rfid.halt(); )

Lakaran dimuat naik, LED kuasa pada modul menyala, tetapi modul tidak bertindak balas kepada kad? Tidak perlu panik atau berlari untuk mencari contoh kerja yang "betul". Kemungkinan besar, tiada sentuhan pada salah satu pin - lubang pada papan lebih besar sedikit daripada ketebalan pelompat, jadi ia patut cuba menyusunnya semula. Adakah LED pada papan tidak menyala? Cuba tukar pelompat menuju ke 3.3V, dan pastikan ia disambungkan kepada 3.3V pada papan; membekalkan kuasa 5V boleh mematikan papan anda dengan mudah.

Katakan semuanya berfungsi untuk anda. Kemudian, membaca tag RFID dalam monitor port bersiri kita akan melihat perkara berikut:


Di sini saya membaca 3 tag yang berbeza, dan seperti yang anda lihat, dia berjaya membaca kesemua 3 tag tersebut.

Contoh #2: Membaca data daripada kad

Mari kita pertimbangkan pilihan yang lebih canggih - ia akan membaca bukan sahaja nombor kad, tetapi juga semua data yang tersedia untuk dibaca. Kali ini mari kita ambil contoh daripada perpustakaan MFRC522 - DumpInfo.


#include #include #define RST_PIN 9 // #define SS_PIN 10 // MFRC522 mfrc522(SS_PIN, RST_PIN); // Cipta MFRC522 instance void setup() ( Serial.begin(9600); // Mulakan monitor port bersiri semasa (!Serial); // Lakukan apa-apa sehingga ia terbuka (untuk Arduino pada cip ATMEGA32U4) SPI.begin( ); // Mulakan bas SPI mfrc522.PCD_Init(); // Mulakan modul RFID ShowReaderDetails(); // Cetak data mengenai modul MFRC522 Serial.println(F("Imbas PICC untuk melihat UID, jenis dan blok data...")); ) void loop() ( // Mencari peta baharu if (! mfrc522.PICC_IsNewCardPresent()) ( return; ) // Pilih salah satu kad jika (! mfrc522.PICC_ReadCardSerial()) ( return; ) // Output data daripada kad mfrc522.PICC_DumpToSerial(&(mfrc522.uid) ); ) void ShowReaderDetails() ( // Dapatkan nombor versi modul byte v = mfrc522.PCD_ReadRegister(mfrc522.VersionReg); Serial.print(F("MFRC522 Software Version: 0x")); Serial.print(v, HEX); jika (v == 0x91) Serial.print(F("= v1.0")); else if (v == 0x92) Serial.print(F("= v2.0")); else Serial.print( F (" (tidak diketahui)")); Serial.println(""); // Apabila kita menerima 0x00 atau 0xFF, penghantaran data rosak jika ((v == 0x00) || (v == 0xFF)) ( Bersiri .println( F("AMARAN: Kegagalan komunikasi, adakah MFRC522 disambungkan dengan betul?")); ) )

Jika contoh sebelumnya berfungsi tanpa ralat, maka ini juga tidak sepatutnya menjadi masalah. Walaupun, pas metro, yang memberikan nombor kad tanpa sebarang masalah dalam contoh sebelumnya, ternyata mempunyai jenis data yang tidak dapat dikesan dalam yang ini, dan modul itu tidak dapat membaca apa-apa selain nombor kad.

Akibatnya, setelah membaca data daripada kad, kami mendapat jenis, pengecam dan datanya daripada 16 sektor memori. Perlu diingatkan bahawa kad standard MIFARE 1K terdiri daripada 16 sektor, setiap sektor terdiri daripada 4 blok, dan setiap blok mengandungi 16 bait data.


Contoh No. 3: Menulis pengecam baharu pada kad

Dalam contoh ini, kita akan melihat menukar pengecam kad (UID). Adalah penting untuk mengetahui bahawa tidak semua kad menyokong penukaran ID. Kad mungkin boleh ditulis semula, tetapi itu hanya bermakna data boleh ditulis semula. Malangnya, kad yang saya ada di tangan saya tidak menyokong penulisan semula UID, tetapi saya akan memberikan kod lakaran di sini untuk berjaga-jaga.


#include #include /* Tetapkan UID baharu di sini */ #define NEW_UID (0xDE, 0xAD, 0xBE, 0xEF) #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); MFRC522::MIFARE_Kekunci; void setup() ( Serial.begin(9600); while (!Serial); SPI.begin(); mfrc522.PCD_Init(); Serial.println(F("Amaran: contoh ini menimpa UID kad boleh tukar UID anda, gunakan dengan berhati-hati!")); untuk (bait 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); }

Contoh No. 4: Menulis data pada kad

Inilah akhirnya perkara yang telah kami capai untuk sekian lama - merekodkan data pada kad. Bahagian "paling manis" bekerja dengan modul ialah keupayaan untuk membuat salinan kad sedia ada, menambah atau menukar sesuatu, ini lebih menarik daripada sekadar membacanya.

Mari tukar salah satu blok data pada peta:


#include #include #define RST_PIN 9 #define SS_PIN 10 MFRC522 mfrc522(SS_PIN, RST_PIN); MFRC522::MIFARE_Kekunci; void setup() ( Serial.begin(9600); while (!Serial); SPI.begin(); mfrc522.PCD_Init(); // Sediakan kunci // gunakan kekunci FFFFFFFFFFFFh yang merupakan standard untuk kad kosong untuk (bait 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); } }

Dan akibatnya, kami mendapat kad dengan blok data yang diubah suai:


Kini, setelah belajar membaca dan menulis blok data kad, anda boleh mencuba teg yang kemungkinan besar anda ada - pas, kad perjalanan Pengangkutan awam. Cuba baca dan tulis data daripada kad ini, beberapa pas pendua tidak menyakitkan, bukan?)

Itu sahaja, langgan dan ikuti penerbitan. Lain kali saya akan memberitahu anda dan menunjukkan kepada anda cara menggunakan standard paparan watak 1602 menambah aksara tersuai, pada asasnya menambah grafik pada paparan.

  • Pengaturcaraan mikropengawal
  • Seperti yang anda ketahui, banyak sistem capaian menggunakan kad RFID standard EM-Marin dengan frekuensi 125 KHz. Interkom di rumah saya tidak terkecuali. Satu masalah - adalah baik untuk belajar cara menyalin kad sedemikian, kerana tanda harga untuk menyalinnya tidak menggalakkan. Sudah tentu, terdapat beberapa skim penyalin dalam talian (dan orang Cina menjual mesin penyalin mereka untuk beberapa sen - namun, mereka sering meletakkan kata laluan mereka pada cakera semasa menyalin), tetapi mengapa tidak membina mesin fotokopi anda sendiri? Itulah artikel di bawah.

    Anda patut memulakan pembangunan mesin penyalin dengan mengetahui tanda seperti itu boleh disalin? Selepas membaca forum, anda boleh mengetahui bahawa kosong yang paling biasa untuk menyalin ialah T5577, T5557, EM4305.

    Sekarang kita memerlukan gambar rajah. Mari kita ambil bahagian analog mesin penyalin sedemikian dari RECTO dan sambungkannya ke mikropengawal atmega8. Mari tambahkan penukar tahap untuk menyambung ke port COM berdasarkan max232 (mereka yang ingin boleh menggunakan ST232 atau sesuatu yang lain untuk menyambung melalui USB, tetapi saya mempunyai port COM pada komputer saya, serta penyesuai USB-COM, jadi itu tugas saya tidak berjaya).

    Anda akan mendapat gambar rajah ini:

    Apa yang dia suka? Pengikut pemancar dwi, ​​litar berayun, pengesan dan penapis RC. Disebabkan fakta bahawa penapis RC mempunyai pemalar masa yang berbeza, dengan membandingkan tahap voltan antara peringkat, adalah mungkin untuk mengasingkan perubahan dalam isyarat tag RFID. Tugasan ini akan dikendalikan oleh komparator yang terbina dalam atmega8. Penjanaan isyarat 125 KHz akan disediakan oleh pengawal PWM yang dibina ke dalam atmega8.

    Gabungan tag RFID dan pembaca membentuk pengubah, di mana tag adalah penggulungan sekunder. Maklumat dihantar oleh tag dengan menukar beban belitan sekunder. Akibatnya, arus dalam gegelung pembaca (belitan utama) berubah. Bahagian analog di atas litar bertanggungjawab untuk mengasingkan denyutan semasa ini. Litar berayun perlu dikonfigurasikan untuk voltan maksimum V titik kawalan, sebagai contoh, menggulung/menggulung lilitan gegelung. Benar, mereka mengatakan bahawa lebih baik mempunyai voltan kurang sedikit daripada maksimum - ia berfungsi lebih stabil. Saya mempunyai kira-kira 40 V pada titik ujian saya.

    Tanda yang disalin menggunakan pengekodan Manchester. Untuk menyahsulit kod ini, sudah cukup untuk melangkau tiga perempat daripada tempoh slot bit untuk sebarang perubahan pada tepi isyarat dan, berdasarkan penurunan isyarat yang mengikutinya, untuk menetapkan nilai bit yang sepadan dengan nilai isyarat selepas penurunan. Apabila penyahkodan, adalah bernilai menentukan tetingkap di mana penurunan isyarat harus berlaku - tidak lebih daripada separuh tempoh slot bit.

    Kaedah penyahsulitan Pengekodan Manchester dan saya mengambil kod untuk ini daripada Shads. Anda boleh, sudah tentu, menulis sendiri, tetapi saya tergesa-gesa untuk melancarkan mesin penyalin - saya ingin memastikan bahawa litar berfungsi dan tag telah diterima. Jadi serpihan ini kekal dalam kod penyalin. Ia juga ternyata bahawa pembanding saya dikonfigurasikan secara songsang daripada apa yang diperlukan oleh kod penyahkodan. Mengubahnya dalam kod. Jadi, kami mendapat urutan sifar dan satu. Bagaimanakah saya boleh mendapatkan kod kad daripada mereka?

    Dan ia sangat mudah. Mari kita anggap bahawa nombor kad mengikut nibbles mempunyai bentuk AB CD EF GH IJ. Peta menunjukkan ini:

    1) Sembilan unit pada permulaan;
    2) Menggigit A;
    3) Pariti gigit A (1 bit);
    4) Menggigit B;
    5) Pariti gigit B (1 bit);

    16) Menggigit I;
    17) Pariti gigit I (1 bit);
    18) Menggigit J;
    19) Pariti gigit J (1 bit);
    20) Gigit pariti lajur untuk gigitan A B C D E F G H I J;
    21) Bit 0.

    Kami membaca semua 64 bit, menyahsulit dan mendapatkan 40 bit kod kad. Adalah logik bahawa jika kita mengeluarkan kod sedemikian sendiri, menutup gegelung kad yang dilampirkan pada pembaca, kita akan mendapat emulator kad. Tetapi sekarang kami tidak berminat dengannya.

    Kami telah belajar membaca peta, tetapi bagaimana kami boleh memindahkan data ke peta? Untuk melakukan ini, anda hanya perlu menghidupkan atau mematikan frekuensi 125 KHz mengikut protokol komunikasi dengan kad. Semasa "senyap" pembaca, kad dikuasakan oleh tenaga yang disimpan.

    Kosong T5557/T5577 serasi sepenuhnya antara satu sama lain dari segi protokol rakaman, namun, ia mempunyai minimum dan sedikit berbeza. masa maksimum denyutan (nasib baik, masa T5557 bertindih dengan T5577). EM4305 mempunyai protokol rakaman yang berbeza.

    Untuk merakam T5557 saya menggunakan kod BolshoyK. Jadual di bawah menunjukkan parameter isyarat untuk fob kunci T5557.

    Rakaman bermula dengan isyarat StartGape - anda perlu mematikan isyarat 125 KHz selama lebih kurang 300 µs. Ini adalah isyarat kepada kad bahawa data kini akan mula dipindahkan kepadanya. Seterusnya, anda harus memindahkan maklumat ke tempat kosong. Pengekodan data yang dihantar adalah Manchester yang sama.

    Kosong T5557/T5577 dan EM4305 adalah pelbagai fungsi dan boleh jenis yang berbeza modulasi, kata laluan sokongan dan banyak lagi. Setiap cakera pada papan mempunyai satu set blok 32-bit. Tujuan blok ini berbeza. Sesetengahnya mempunyai kod kunci yang dikeluarkan (ia memerlukan dua blok). Dalam yang lain - konfigurasi. Ketiga, pengecam pengeluar. Kami akan menggunakan fungsi terhad, jadi mereka yang ingin memahami maksud semua bit ini boleh melihat dokumentasi untuk tempat kosong (saya telah melampirkannya pada arkib).

    Blok dikumpulkan dalam dua muka surat (0 dan 1).

    Dalam halaman sifar terdapat blok konfigurasi dengan indeks 0. Inilah yang akan kami tetapkan. Untuk T5557/T5577 kami akan mempunyai bait konfigurasi berikut: 0x00.0x14.0x80.0x40 mengikut jadual dari dokumentasi (saya menandai dengan merah mod yang dipilih oleh satu bit):

    Oleh itu, kami telah memilih: frekuensi penghantaran data RF/64 (125 KHz/64), pengekodan jenis Manchester, mengeluarkan blok sehingga yang kedua (dalam blok 1 dan 2 kami akan mempunyai kod yang dikeluarkan oleh kad). Sebelum menulis, opcode (2 opcode bit) dan satu selak bit (lockbit) mesti dihantar. Opcode 10b dan 11b mendahului penulisan data untuk halaman 0 dan 1 (bit paling tidak ketara menentukan nombor halaman, bit paling ketara menentukan kod tulis halaman). Kami mengeluarkan 10b untuk opcode (semua kerja dilakukan dengan halaman sifar) dan 0b untuk bit selak. Selepas memindahkan semua data ini, adalah perlu untuk memindahkan alamat tiga-bit halaman yang akan ditulis. Semua pemindahan data untuk T5557/T5577 dijalankan daripada bit yang paling ketara kepada yang paling tidak ketara.

    Dengan menetapkan kod kad dalam blok 1 dan 2 dan konfigurasi dalam blok 0, anda boleh mendapatkan tag RFID pendua. Seperti yang anda lihat, semuanya mudah.

    Jenis kosong seterusnya ialah EM4305. Jadi saya terpaksa berurusan dengan rakaman kosong ini sendiri. Ia juga terdiri daripada blok 32 bit, tetapi tujuannya berbeza.

    Pengekodan data yang dihantar ke kad adalah berdasarkan perbezaan dalam selang masa. Jika terdapat perbezaan semasa selang masa, maka ia adalah sifar, dan jika tidak ada, ia adalah satu. Perkataan konfigurasi disimpan dalam bait 4 dan untuk diri saya sendiri saya mentakrifkannya seperti berikut: 0x5F,0x80,0x01,0x00 (Pengekodan Manchester, RF/64, perkataan keluaran 6). Dalam perkataan 5 dan 6 saya menulis kod kad (64 bit yang sama yang dihasilkan oleh kad). EM4305 menghendaki penghantaran dilakukan daripada bit yang paling kecil kepada yang paling ketara. Kad itu memahami bahawa pertukaran bermula dengannya selepas memberikannya gabungan impuls:

    1. Kami mematikan medan pada 48 µs.
    2. Kami menghidupkan medan selama 96 μs.
    3. Matikan medan pada 320 µs.
    4. Kami menghidupkan medan pada 136 μs.
    5. Lumpuhkan medan sehingga arahan seterusnya.
    Perintah untuk menulis blok pada peta dihantar seperti berikut:
    1. Kami menghantar urutan impuls di atas.
    2. Kami menghantar 0b.
    3. Kami menghantar CC0-CC1 dan pariti P. (0101b untuk rakaman, lihat jadual di bawah).
    4. Kami menghantar alamat blok (lihat jadual), dua sifar di belakang dan pariti alamat.
    5. Kami menghantar data blok (32 bit).

    Format Perintah


    Kod arahan

    Format Alamat Blok

    Ini menetapkan konfigurasi EM4305 kosong dan kodnya.

    Sebenarnya, mesin penyalin mudah tidak memerlukan apa-apa lagi.

    Saya membuat beberapa versi mesin penyalin dengan paparan yang berbeza. Sebagai contoh, berikut ialah mesin penyalin dengan paparan 1602:

    Dan berikut ialah video mesin penyalin yang bekerja pada paparan LPH9157-02.