Mündəricat:

RC522 və PN532 RFID əsasları: 10 addım
RC522 və PN532 RFID əsasları: 10 addım

Video: RC522 və PN532 RFID əsasları: 10 addım

Video: RC522 və PN532 RFID əsasları: 10 addım
Video: Электронный замок с RFID на Arduino 2024, Iyul
Anonim
RC522 və PN532 RFID əsasları
RC522 və PN532 RFID əsasları

Qeyd: İndi RC522 və PN532 üçün Arduino kodu təklif edən Təlimatlarım var.

Bir müddət əvvəl sınaq üçün üç fərqli RFID modulu aldım. Əvvəlki bir layihədə əsas təhlükəsizlik funksiyasını yerinə yetirmək üçün 125 kHz-lik sadə bir moduldan necə istifadə edəcəyimi izah etmişəm. Bu kimi modullar yalnız oxumaq üçün etiketlərdən istifadə edir, buna görə də proses ID-ni axtarır, istəsəniz saxlayır və saxlanılan ID-lərlə müqayisə edir. Aldığım digər modullar 13.56-MHz tezliyində işləyir və həm oxunan, həm də yazılan etiketlərdən istifadə edir, buna görə də onları əsas təhlükəsizlik üçün istifadə etmək bir növ tullantıdır. İki ümumi modulda ya RC522 çipi, ya da NXP tərəfindən hazırlanan PN532 çipi istifadə olunur.

Digər layihələrimdən birini oxumusunuzsa, bilirsiniz ki, ucuz PIC mikrokontrolörlərindən və montaj dilində bir proqramdan istifadə etməyi sevirəm. Aradığım şey, modullarla və RFID etiketləri ilə danışmaq üçün lazım olan bir sıra ardıcıllıq idi. Modullar üçün onlayn nümunə proqramlar çox olsa da, əksəriyyəti Arduino üçün 'C' proqramında yazılıb və SPI interfeysindən istifadə edir. Ayrıca, çiplər və Mifare etiketləri üçün təlimatlar bir az deşifr olunur. Bu yazı, ilk növbədə, layihəyə başlayanda əldə etmək istədiyim məlumatlarla bağlıdır. Hər modulun tələb etdiyi əsas əmrləri yerinə yetirmək üçün PIC montaj proqram proqramlarını da daxil edirəm. Bir PIC və/və ya montaj dili istifadə etməsəniz belə, mənbə kodu ən azı hər bir addımı yerinə yetirmək üçün lazım olan xüsusi əmrlər haqqında sizə yaxşı fikir verməlidir.

Addım 1: Serial İnterfeyslər

Serial İnterfeyslər
Serial İnterfeyslər
Serial İnterfeyslər
Serial İnterfeyslər
Serial İnterfeyslər
Serial İnterfeyslər
Serial İnterfeyslər
Serial İnterfeyslər

Bu modullarda istifadə olunan hər iki çip SPI, I2C və ya UART (HSSP) vasitəsi ilə əlaqə qura bilir. PN532 modulunda istədiyiniz interfeysi seçmək üçün istifadə olunan bir DIP açarı var, lakin MFRC522 modulu SPI interfeysi üçün bərk bağlanmışdır. PIC-in quraşdırılmış UART-dan istifadə etməyi üstün tuturam, buna görə də MFRC522 modulunu UART rejiminə keçirməyin bir yolunun olub olmadığını öyrənmək üçün onlayn olaraq ovladım. Tapdığım şey, lövhədə bir izin kəsilməsinin hiylə işlədəcəyi idi. Kəsmə, çipin EA pinindən 3.3 volt effektiv şəkildə çıxarır. Texniki olaraq EA pimi daha sonra yerə bağlanmalıdır, lakin çip pin sıxlığı nəzərə alınmaqla çox adam bu lehimləmə qabiliyyətini çəkə bilməz. Narahat olmayın, çünki EA pinində daxili bir çəkmə yoxdur və köhnə TTL məntiq girişləri kimi "üzmür". Kəsiləcək yer üçün çip diaqramına və lövhə bölmə şəklinə baxın. Yalnız EA pininə gedən qısa izi kəsdiyinizə əmin olun.

Addım 2: Avadanlıq

Avadanlıq
Avadanlıq

UART kommunikasiyalarının aparat əlaqələri yuxarıdakı diaqramda göstərilmişdir. MFRC522 üçün UART əlaqələri lövhədə qeyd edilmir, lakin sxematikada göstərildiyi kimi SDA pin UART məlumatlarını alır və MISO pin UART məlumatlarını ötürür. PN532 modulu, lövhənin alt tərəfində UART işarələrinə malikdir.

Hər iki modul 3.3 voltda işləyir və PIC TX pinindən 5 volt məntiq səviyyəsi də məhdudlaşdırılmalıdır. LCD bağlantısı, bir çox əvvəlki layihələrimdə istifadə olunan standart 4 bitlik bir quruluşdur. Bütün mesajlar üçün standart format 1602 LCD (2 sətirdən 16 simvol) üçün təyin olunur. Hata ayıklama zamanı xam məlumat tullantıları üçün istifadə etdiyim 2 sətirli LCD ilə 40 xarakterim var, buna görə əlavə ekran sahəsindən istifadə etməyimə imkan verən bir proqram daxil etdim.

Addım 3: Məlumat Blokları

Bu layihə üçün istifadə olunan Mifare Classic 1k etiketləri 16 sektor, hər sektor üçün dörd məlumat bloku, hər bir məlumat bloku üçün 16 bayt olaraq konfiqurasiya edilmişdir. 64 məlumat blokundan yalnız 47 -si həqiqətən istifadə edilə bilər. 0 məlumat bloku istehsalçı məlumatlarını ehtiva edir və 3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59 və 63 bloklarına Treyler blokları deyilir. Treyler blokları hər sektorda sonuncusudur və iki açar və blok giriş bitlərindən ibarətdir. Açarlar və blok giriş bitləri yalnız o sektordakı məlumat bloklarına aiddir, beləliklə hər sektor üçün fərqli açarlara və giriş qaydalarına sahib ola bilərsiniz. Varsayılan düymələr "FF FF FF FF FFh" olaraq təyin olunur. Bu əsas layihə üçün yalnız bir məlumat blokundan istifadə edirəm və standart düymələri və giriş bitlərini saxlayıram. Bu kartlarla əlaqəli bir çox sənəd var, buna görə "Mifare" üçün onlayn axtarış edin və ya daha dərindən araşdırmaq istəyirsinizsə NXP veb saytına daxil olun.

Addım 4: Ümumi Əməliyyat

Hər iki modul, giriş yolları və etiketlərə daxil olma üsulları ilə bənzərsiz olsa da, işi yerinə yetirmək üçün tələb olunan ümumi bir proses var. Bu layihə üçün etiketlərin Mifare Classic 1k tipli olduğunu və anten sahəsində bir anda yalnız bir etiketə icazə verdiyimizi güman edirik. Əsas addımlar aşağıda müəyyən edilmişdir.

· Modulu işə salın: Ümumiyyətlə, bunun üçün çipdəki qeydlərə dəyərlərin yazılması, "oyanma" əmrlərinin göndərilməsi və antenin gücünün açılması kimi şeylər lazımdır. Batareya ilə işləyən bir tətbiqdə, batareyanı saxlamaq üçün antenin gücünü açıb söndürmək istəyərdiniz, ancaq bu sadə tətbiq üçün bir dəfə yandırıb sonra da buraxırıq.

· Kripto bayrağını silin (yalnız 522): Bir etiket təsdiq edildikdə istifadəçiyə etiketlə əlaqələrin şifrələnəcəyini bildirmək üçün bir bayraq qurulur. Bu bayrağın, taranmış etiket eyni olsa belə, növbəti taramadan əvvəl istifadəçi tərəfindən silinməsi lazımdır.

· Bir etiket axtarın: Modul əsasən "Orada kimsə varmı?" və etiket "Mən burdayam" cavabını verir. Modul tez cavab almazsa, dinləməyi dayandırır. Bu o deməkdir ki, etiket tapana qədər modula təkrar -təkrar tarama əmrləri göndərməliyik.

· İstifadəçi identifikasiya nömrəsini (UID) etiketi alın: Etiket, tarama sorğusuna, etiketin növü kimi bəzi məhdud məlumatlarla cavab verəcəkdir. Bu, UID -ni əldə etmək üçün başqa bir əmr göndərməyimiz lazım ola biləcəyi deməkdir. UID, Mifare Classic 1k etiketləri üçün dörd baytdır. Digər etiketlər üçün daha uzun ola bilər, ancaq bu layihə onlara aid deyil.

· Etiketi seçin (yalnız 522): UID istifadəçinin oxumaq və yazmaq üçün doğrulamaq istədiyi etiketi seçmək üçün istifadə olunur. Bu, anten sahəsində birdən çox etiketin olması ehtimalına əsaslanır. Sadə tətbiqimiz üçün belə deyil, amma hər halda etiketi seçməliyik.

· Etiketi Doğrulayın: Etiketi oxumaq və ya yazmaq istəsək bu addım lazımdır. Etmək istədiyimiz sadə bir təhlükəsizlik tətbiqi üçün etiketləri fərqləndirməkdirsə, UID kifayətdir. Doğrulama UID -ni bilməyimizi və daxil olmaq istədiyimiz etiketin məlumat sektoru üçün kripto açarını bilməyimizi tələb edir. Bu layihə üçün standart açarlardan yapışırıq, amma izlədiyim layihə etiketləri elektron cüzdan kimi istifadə etmək üçün düymələri dəyişdirir.

· Etiketi oxuyun və ya yazın: Oxunanlar həmişə tələb olunan Məlumat Blokunun bütün 16 baytını qaytarır. Yazılar 16 baytın hamısının eyni vaxtda yazılmasını tələb edir. Eyni məlumat sektorunda başqa bir blok oxumaq və ya yazmaq istəyirsinizsə, etiketin yenidən təsdiqlənməsinə ehtiyac yoxdur. Fərqli bir məlumat sektorunda bir blok oxumaq və ya yazmaq istəyirsinizsə, etiketin həmin sektorun açarı ilə yenidən təsdiqlənməsi lazımdır.

Addım 5: MFRC522 Modul Giriş Sırası

Başlanğıc rutini, baxdığım tətbiqlərin çoxunda bu əsas addımları ehtiva edir:

· Kukla məlumat baytı göndərin (növbəti paraqrafa baxın)

· Yumşaq sıfırlama

· RF alıcısının qazancını təyin edin (standartdan başqa bir şey istənirsə)

· ASK modulyasiya faizini 100% olaraq təyin edin

· CRC hesablamaları üçün toxum dəyərini təyin edin

· Antenanı yandırın

· Firmware versiyasını əldə edin (tələb olunmur)

Bəzi səbəblərə görə modul güclənir və məlumat baytı olmadan yazma əmri aldığını düşünür. Bunun modulumla bağlı bir problem olub -olmadığını bilmirəm, amma başqa yerdə heç bir istinad görmədim. Həm hardware, həm də proqram sıfırlamalarını sınadım və heç biri problemi həll etmədi. Mənim həllim, modulun başlanğıc prosedurunun əvvəlində "0" (təyin olunmamış) qeydiyyatdan keçmək üçün kukla oxumaq çağırışı əlavə etmək idi. Modul bunu naməlum yazma əmri üçün məlumat kimi görürsə, heç bir pis təsiri görünmür. Bunu oxumaq əmri olaraq görürsə, faydalı heç nə olmaz. Məsələni tam olaraq təyin edə bilməməyim məni narahat edir, xüsusən də yalnız modulun bir hardware sıfırlaması problemi həll etmir.

RC522 çipi, əksəriyyəti həm oxunan, həm də yazılan bir sıra qeydlərdən ibarətdir. Yazmaq üçün qeyd nömrəsi modula göndərilir və ardınca yazılacaq dəyər yazılır. Oxumaq üçün qeyd nömrəsinə 0x80 əlavə olunur və bu modula göndərilir. Yazma əmrinə verilən cavab, daxil olan reyestrin əksidir. Oxu əmrinə verilən cavab reyestrin məzmunudur. Proqram, əmrin düzgün yerinə yetirildiyini yoxlamaq üçün bu biliklərdən istifadə edir.

Addım 6: PN532 Moduluna Giriş Sırası

Başlanğıc proseduru bu tələb olunan addımları ehtiva edir:

· Başlatma sətri göndərin: Bu UART interfeysinə xasdır. Təlimat, UART interfeysinin interfeysdə aşkar edilən beşinci yüksələn kənarda oyanacağını bildirir. 0x55, 0x55, 0x00, 0x00, 0x00, 0x00 göndərilməsini tövsiyə edir. Əksər hallarda, kənarları yüksələn kifayət qədər sayda simvol olmalıdır və onlar əmr müqəddiməsinə bənzəməməlidir (00 00 FF).

· Modulu oyandır: İstifadəçi təlimatında dəfn edildikdə, modulun "LowVbat" adlı bir növ yuxu vəziyyətinə başladığını göstərir. Bu vəziyyətdən çıxmaq üçün "SAMConfiguration" əmrini göndərməliyik.

PN532, əmrlərin giriş, mesaj və postamble daxil olan müəyyən bir mesaj formatında göndərilməsini gözləyir. Cavab mesajları eyni formatı izləyir. Komanda və cavab mesajlarına həm TFI (Frame Identifier), həm də komanda versiyası daxildir. Komanda 0xD4 TFI və cavab 0xD5 istifadə edir. Komanda versiyaları dəyişir, amma cavab həmişə komanda versiyasını artıracaq və TFI -dən sonra baytda qaytaracaq. Bu uyğunluq, cavab mesajlarının müvafiq məlumat üçün asanlıqla taranmasına imkan verir.

Hər bir əmr mesajı (ön sözdən sonra) mesaj uzunluğundan, 2 -nin mesaj uzunluğunun tamamlayıcısından, TFI -dən, əmrdən, məlumatlardan, cəmi toplamasından və poçtdan ibarətdir. Proqram fərdi əmrləri qurur və sonra checksum hesablayan və postamble əlavə edən bir rutin çağırır.

Cavab üçün mesaj formatı əmrə bənzəyir. Tipik bir cavab ACK (00 00 FF 00 FF 00) və sonra əmrə xüsusi cavab daxil olacaq. Hər bir əmr cavabı 00 00 FF müqəddiməsi ilə başlayır. Cavabda eyni zamanda D5 TFI baytı olmalıdır və 1 ilə artan komanda nömrəsi olmalıdır. "SAMConfiguration" əmrimiz üçün (14) 15 olardı. "SAMConfiguration" əmri bu cavabı alır: 00 00 FF 00 FF 00 00 00 FF 02 FE D5 15 16 00.

Göndərilə bilən digər modula xas əmrlər var, lakin bu tətbiq üçün lazım deyil. Bununla birlikdə, firmware versiyasının nömrəsini almaq üçün çağırıla bilən bir rutin daxil etdim. Tipik bir cavab (ACK və müqəddimədən sonra) belə olacaq: 06 FA D5 03 32 01 06 07 E8 00. "01 06 07" firmware versiyası 1.6.7 versiyasını göstərir.

Addım 7: Etiket Giriş Sırası

Modul hazır olduqdan sonra etiketlərə xüsusi əmrlər göndərə bilərik. Etiket məlumatlarını oxumaq və ya yazmaq üçün onun eyniləşdirmə nömrəsinə (UID) sahib olmalıyıq. UID və açar, müəyyən bir etiket məlumat sektoruna oxumaq/yazmaq üçün icazə vermək üçün istifadə ediləcəkdir. Etiket məlumatlarının oxunması/yazılması həmişə müəyyən bir məlumat blokundakı bütün 16 baytda aparılır. Bu o deməkdir ki, tipik proqram məlumat blokunu oxuyacaq, məlumatları istədiyi kimi dəyişdirəcək və sonra yeni məlumatı yenidən etiketə yazacaq.

Addım 8: Proqram təminatı

PIC UART bir bayt məlumat aldıqda kəsmə işçisi proqramı çağırılır. Əvvəlki UART layihələrimin bəzilərində kəsmə işləyicisi istifadə etmək əvəzinə RX kəsmə bayrağını yoxlaya bildim. Bu proqram üçün, xüsusən RC522 -dən daha yüksək bir ötürmə sürətində ünsiyyət quran PN532 üçün belə deyil. RC522 -nin UART interfeysi 9600 baud ilə məhdudlaşır, PN532 üçün standart 115k və 1.288M baud qədər yüksək olaraq təyin edilə bilər. Alınan baytlar bir tampon sahədə saxlanılır və proqramın əsas hissəsi lazım olduqda onları alır.

New_Msg bayrağı baytların alındığını, Byte_Count isə neçə olduğunu göstərir. Hata ayıklama zamanı qəbul buferinin məzmununu göstərmək üçün çağırıla biləcək bir "Disp_Buff" rutinini proqrama daxil etdim. Qayıdış mesajlarının bəziləri tipik bir 1602 displeyini aşacaq, ancaq onlayn bir artıq elektronika saytında tapdığım 2 sətirli LCD ilə 40 xarakterə sahibəm. "Max_Line" tərifi LCD ölçünüz üçün təyin edilə bilər. "Max_Line" ə çatılırsa, "Disp_Buff" qaydası ikinci sətrə yazaraq davam edir. 4 sətirli bir LCD varsa, üç və dördüncü sətirlərə davam etmək üçün bu işə bir az kod əlavə edə bilərsiniz. PN532 üçün, rutin ya alınan bütün baytları atacaq və ya oxunan cavabdan 16 məlumat baytını atacaq şəkildə qurula bilən bir bayraq var.

Qəbul buferini və ya Byte_Count'u silməyə ehtiyac yoxdur, çünki New_Msg bayrağını silmək Byte_Count -un kəsmə işləyicisi tərəfindən təmizlənməsinə səbəb olacaq və buferdə indeks kimi istifadə olunur. New_Msg, adətən hər bir əmrdən əvvəl silinir ki, bu əmrə xas olan nəticələr asanlıqla tapılaraq yoxlanılsın. RC522 -də, bufer tamponunun ümumiyyətlə yalnız 1 ilə 4 bayt arasında olması deməkdir. Məlumat blokunun oxunması kimi bəzi hallarda, baytları FIFO -dan qəbul buferinə daşımaq üçün Read_FIFO əmri bir neçə dəfə verilməlidir. PN532 üçün bütün əmr nəticələri qəbul tamponunda bitir, buna görə lazım olan xüsusi baytı tapmaq üçün bir tarama proseduru aparılır.

Proqramdakı əsas döngə bir etiket axtarır və sonra etiketi oxumaq/yazmaq üçün təsdiq edir. Buraya daxil olan test proqramı üçün Junk_Num dəyişəni hər dəfə əsas döngə vasitəsilə dəyişdirilir və etiketə yazılarkən istifadə olunur. Yazılan dəyərlər, Junk_Num dəyəri ilə Junk_Num 1 -in tamamlayıcısı arasında dəyişir. Nəhayət, 16 yazılmış dəyər oxunur və göstərilir. Hər bir mesajı oxumaq üçün vaxt vermək üçün gecikmə rutin zəngləri olan hər bir addım üçün ekran mesajları var. Hata mesajları da verilir, lakin normal olaraq yalnız etiket əməliyyat zamanı silinirsə baş verməlidir.

Proqram təminatının bir hissəsi yalnız açıldıqda yerinə yetirilən və bir proqram sıfırlaması aşkar edildikdə atlanılan bir kod hissəsidir. Səhv mesajları ümumiyyətlə əsas döngədən çıxmaq üçün bir proqram sıfırlaması ilə sona çatır. Sıfırlama, "Gözətçi Taymeri" ni işə salan və sonra fasilə gözləyən sonsuz bir döngəyə girən "Tilt" rejimində baş verir.

Addım 9: MFRC522 Unikal Proqramı

RC522 çipi, etiketlərlə ünsiyyət qurmaq üçün PN532 çipindən daha aşağı səviyyəli təlimat tələb edir. "C" dəki proqramlaşdırma ilə montaj dilində proqramlaşdırmaya bənzəyir. Başqa bir əhəmiyyətli fərq, RC522 -nin etiketlə əlaqələrin FIFO tamponundan keçməsini tələb etməsidir. "Write_FIFO" və "Read_FIFO" rutinləri bu vəzifələri həll edir. MFRC522 proqramı, əsas funksiyaların qurulduğu bir çox aşağı səviyyəli əmrlər üçün bir bölmə ehtiva edir.

RC522 üçün tag əmrinin checksum hesablaması PN532 -dən çox fərqlidir. FIFO -da etiket əmri qurulduqdan sonra, checksumun hesablanması üçün bir modul əmri göndərilir. 16 bitlik nəticə avtomatik olaraq etiket əmrinə əlavə edilmir, lakin iki 8 bitlik qeyddən oxumaq üçün əlçatandır. Nəzarət məbləğinin hesablanması FIFO -dakı məlumatları silir, buna görə tələb olunan ardıcıllıq aşağıdakı kimidir:

· FIFO -da əmr yaradın

Bir checksum hesablanması əmr

· Yenidən FIFO -da əmr yaradın

· CRC reyestrlərini oxuyun və chefum baytlarını FIFO -ya yazın

· Ya Alma, ya da Doğrulama əmrini göndərin

Transceive əmri FIFO tamponunu ötürəcək və sonra etiketdən cavabı gözləmək üçün avtomatik olaraq qəbul rejiminə keçəcək. Məlumatların ötürülməsi üçün BitFramingRegister -də StartSend bitinin qəbul edilməsi Transceive əmrindən sonra aparılmalıdır. Doğrulama əmrində bu tələb yoxdur.

Ümumiyyətlə, onlayn olaraq mövcud olan Arduino "C" kod tətbiqləri, düzgün cavabın vaxtında alınmasını təmin etmək üçün kəsmə bayraq qeydlərindən və zaman aşımı qeydindən istifadə edir. Fikrimcə, bu qeyri-zamanlı kritik bir tətbiq üçün həddindən artıqdır. Bunun əvəzinə cavabı gözləmək və sonra doğru olduğunu yoxlamaq üçün qısa proqram fasilələrindən istifadə edirəm. Mifare etiketləri üçün təlimat, müxtəlif əməliyyatların vaxtını və təfərrüatlı baytların alınmasına icazə verilir. Bu gecikmələr aşağı səviyyəli komanda alt proqramlarının əksəriyyətinə daxil edilir.

Addım 10: PN532 Unikal Proqramı

Modul işə salındıqdan sonra, etiketin tapılması və təsdiqlənməsi üçün lazım olan addımlar müvafiq əmri yazaraq lazımi məlumatları izləməklə həyata keçirilir. Tarama əmri, identifikasiya üçün istifadə olunan UID -i qaytarır. Bundan sonra, etiketi oxuyur və yazır, ünvanlı məlumat bloku üçün 16 bayt göndərir və ya qaytarır.

Başlanğıc ardıcıllığı əvvəllər ətraflı təsvir edilmişdir və eyni proqram qaydası, modulu "LowVbat" vəziyyətindən çıxarmaq üçün SAMConfiguration əmrini də göndərir. Qalan əsas əmrlər, məsələn, Tarama, Doğrulama, Etiketi Oxu/Yaz, tətbiq olunan rutinlərdə ardıcıl olaraq qurulur. Checksum, əmr baytlarını əlavə etmək, tamamlamaq və sonra 2 -ni tamamlamaq üçün 1 əlavə etməklə hesablanır. 8 bitlik nəticə postambledan dərhal əvvəl əmr sətirinə əlavə olunur.

RC522 -də olduğu kimi heç bir FIFO olmadığı üçün tam cavab mesajları avtomatik olaraq alınır. "Find_Response" rutini, TFI (0xD5) üçün alınan məlumat buferini tarar. Rutin, gözlənilən mesajların nə olduğunu bilməkdən faydalanır və məlumat daxil olmayan sadə ACK cavablarına məhəl qoymur. TFI tapıldıqdan sonra, istədiyiniz cavablar ondan bilinən bir fərqdir. Komanda echo və əmr statusu baytları daha sonra yoxlanılması üçün "Read_Buff" qaydası ilə saxlanılır.

Bu yazı üçün budur. Digər elektronika layihələrimə baxın: www.boomerrules.wordpress.com

Tövsiyə: