İçindekiler:

RC522 ve PN532 RFID Temelleri: 10 Adım
RC522 ve PN532 RFID Temelleri: 10 Adım

Video: RC522 ve PN532 RFID Temelleri: 10 Adım

Video: RC522 ve PN532 RFID Temelleri: 10 Adım
Video: Электронный замок с RFID на Arduino 2024, Kasım
Anonim
RC522 ve PN532 RFID Temelleri
RC522 ve PN532 RFID Temelleri

NOT: Artık RC522 ve PN532 için Arduino kodu sunan Talimatlara sahibim.

Bir süre önce deneme için üç farklı RFID modülü satın aldım. Önceki bir projede, temel bir güvenlik işlevi yapmak için basit bir 125 kHz modülünün nasıl kullanılacağını ayrıntılı olarak anlattım. Bunun gibi modüller salt okunur etiketler kullanır, böylece işlem kimlik için taranır, istenirse saklanır ve depolanan kimliklerle karşılaştırılır. Satın aldığım diğer modüller 13.56-MHz'de çalışıyor ve hem okunabilen hem de yazılabilen etiketler kullanıyor, bu yüzden onları temel güvenlik için kullanmak biraz israf oluyor. İki ortak modül, her ikisi de NXP tarafından yapılan RC522 yongasını veya PN532 yongasını kullanır.

Diğer projelerimden herhangi birini okuduysanız, ucuz PIC mikrodenetleyicileri ve montaj dilinde program kullanmayı sevdiğimi biliyorsunuzdur. Aradığım şey, modüllerle ve RFID etiketleriyle konuşmak için gereken bir dizi adımdı. Modüller için çevrimiçi çok sayıda örnek program varken, çoğu Arduino için 'C' yazılımında yazılmıştır ve SPI arayüzünü kullanır. Ayrıca, çiplerin ve Mifare etiketlerinin kılavuzları biraz deşifre ediyor. Bu yazı öncelikle projeye başladığımda sahip olmayı dilediğim bilgilerle ilgili. Her modülün gerektirdiği temel komutları gerçekleştirmek için PIC montaj yazılım programlarını da dahil ediyorum. Bir PIC ve/veya montaj dili kullanmasanız bile, kaynak kodun en azından size her adımı gerçekleştirmek için gereken belirli komutlar hakkında iyi bir fikir vermesi gerekir.

Adım 1: Seri Arayüzler

Seri Arayüzler
Seri Arayüzler
Seri Arayüzler
Seri Arayüzler
Seri Arayüzler
Seri Arayüzler
Seri Arayüzler
Seri Arayüzler

Bu modüllerde kullanılan çiplerin her ikisi de SPI, I2C veya UART (HSSP) aracılığıyla arayüz oluşturma yeteneğine sahiptir. PN532 modülü, istenen arabirimi seçmek için kullanılan bir DIP anahtarına sahiptir, ancak MFRC522 modülü, SPI arabirimi için kabloludur. PIC'nin yerleşik UART'ını kullanmayı tercih ediyorum, bu yüzden MFRC522 modülünü UART moduna almanın bir yolu olup olmadığını görmek için çevrimiçi arama yaptım. Bulduğum şey, tahtada bir iz kesmenin işe yarayacağıydı. Kesim, çipin EA pininden 3,3 voltu etkili bir şekilde çıkarır. Teknik olarak EA pimi daha sonra toprağa bağlanmalıdır, ancak çip pimi yoğunluğu göz önüne alındığında pek çok kişi bu lehimleme becerisini çekemez. Endişelenmeyin, çünkü EA pininde dahili bir pull-up yoktur ve eski TTL mantık girişlerinin yaptığı gibi "yüzmez". Kesilecek nokta için çip şemasına ve pano bölümü resmine bakın. Yalnızca doğrudan EA pinine giden kısa izi kestiğinizden emin olun.

2. Adım: Donanım

Donanım
Donanım

UART iletişimi için donanım bağlantıları yukarıdaki şemada gösterilmiştir. MFRC522 için UART bağlantıları kartta işaretlenmemiştir ancak şemada gösterildiği gibi SDA pini UART verilerini alır ve MISO pini UART verilerini iletir. PN532 modülü, kartın alt tarafında UART işaretlerine sahiptir.

Her iki modül de 3,3 voltta çalışır ve PIC TX pininden gelen 5 volt mantık seviyesinin de sınırlandırılması gerekir. LCD bağlantısı, önceki projelerimin bir kısmında kullanılmış olan standart 4 bitlik kurulumdur. Tüm mesajlar için varsayılan format, standart 1602 LCD (16 karakter, 2 satır) için ayarlanmıştır. Ayrıca hata ayıklama sırasında ham veri dökümleri için kullandığım 2 satıra 40 karakterlik bir LCD'ye sahibim, bu yüzden yazılıma ekstra görüntüleme alanından yararlanmamı sağlayan bir tanım ekledim.

Adım 3: Veri Blokları

Bu proje için kullanılan Mifare Classic 1k etiketleri, sektör başına dört veri bloğu, veri bloğu başına 16 bayt olmak üzere 16 sektör olarak yapılandırılmıştır. 64 veri bloğundan sadece 47'si gerçekten kullanılabilir. Veri bloğu 0, üretici verilerini içerir ve 3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59 ve 63 numaralı bloklara Treyler blokları denir. Treyler blokları her sektördeki son bloktur ve iki anahtar ve blok erişim bitlerini içerirler. Anahtarlar ve blok erişim bitleri, yalnızca o sektördeki veri bloklarına uygulanır, böylece her sektör için farklı anahtarlara ve erişim kurallarına sahip olabilirsiniz. Varsayılan tuşlar “FF FF FF FF FFh” olarak ayarlanmıştır. Bu temel proje için sadece bir veri bloğu kullanıyorum ve varsayılan anahtarları ve erişim bitlerini koruyorum. Bu kartlarla ilgili çok sayıda belge var, bu yüzden çevrimiçi olarak “Mifare” araması yapın veya daha derinlemesine keşfetmek istiyorsanız NXP web sitesini ziyaret edin.

Adım 4: Genel Çalıştırma

Her iki modül de erişim ve etiketlere erişim açısından benzersiz olsa da, işin yapılması için gereken genel bir süreç vardır. Bu proje için etiketlerin Mifare Classic 1k tipi olduğunu ve anten alanında bir seferde yalnızca bir etikete izin verdiğimizi varsayıyoruz. Temel adımlar aşağıda tanımlanmıştır.

· Modülü başlatın: Genel olarak bu, çipteki kayıtlara değer yazmak, “uyandırma” komutları göndermek ve anteni açmak gibi şeyleri gerektirir. Pille çalışan bir uygulamada, pilden tasarruf etmek için anteni açıp kapatabilmek istersiniz, ancak bu basit uygulama için onu bir kez açıp sonra açık bırakıyoruz.

· Kripto bayrağını temizle (yalnızca 522): Bir etiketin kimliği doğrulandığında, kullanıcının etiketle iletişimin şifreleneceğini bilmesini sağlamak için bir bayrak ayarlanır. Taranan etiket aynı olsa bile, bir sonraki taramadan önce bu bayrağın kullanıcı tarafından temizlenmesi gerekir.

· Bir etiketi tara: Modül temel olarak “Orada kimse var mı?” diye sorar. ve etiket “buradayım” yanıtını verir. Modül hızlı yanıt alamazsa dinlemeyi bırakır. Bu, bir etiket bulana kadar modüle tekrar tekrar tarama komutları göndermemiz gerektiği anlamına gelir.

· Etiketin Kullanıcı Kimlik numarasını (UID) alın: Etiket, tarama isteğine, etiket türü gibi bazı sınırlı bilgilerle yanıt verecektir. Bu, UID'sini almak için başka bir komut göndermemiz gerekebileceği anlamına gelir. UID, Mifare Classic 1k etiketleri için dört bayttır. Diğer etiketler için daha uzun olabilir, ancak bu proje onları ele almıyor.

· Etiketi seçin (yalnızca 522): UID, kullanıcının okuma ve yazma işlemleri için doğrulamak istediği etiketi seçmek için kullanılır. Bu, anten alanında birden fazla etiket olma olasılığına dayanmaktadır. Bizim basit uygulamamız için durum böyle değil ama yine de etiketi seçmemiz gerekiyor.

· Etiketi doğrulayın: Etiketi okumak veya yazmak istiyorsak bu adım gereklidir. Tek yapmak istediğimiz basit bir güvenlik uygulaması için etiketler arasında ayrım yapmaksa, UID yeterlidir. Kimlik doğrulama, UID'yi bilmemizi ve erişmek istediğimiz etiketin veri sektörü için kripto anahtarını bilmemizi gerektirir. Bu proje için varsayılan anahtarlara bağlı kaldık, ancak sonraki projem anahtarları değiştirerek etiketin elektronik cüzdan olarak kullanılabilmesini sağladı.

· Etiketi okuyun veya yazın: Okumalar her zaman istenen Veri Bloğunun tüm 16 baytını döndürür. Yazma işlemleri, 16 baytın tümünün aynı anda yazılmasını gerektirir. Aynı veri sektöründe başka bir blok okumak veya yazmak istiyorsanız, etiketin yeniden doğrulanmasına gerek yoktur. Farklı bir veri sektöründe bir blok okumak veya yazmak istiyorsanız, o sektör için anahtar kullanılarak etiketin yeniden doğrulanması gerekir.

Adım 5: MFRC522 Modül Erişim Sırası

Başlatma rutini, baktığım uygulamaların çoğunda bulunan şu temel adımları içerir:

· Sahte veri baytı gönder (sonraki paragrafa bakın)

· Yumuşak sıfırlama

· RF alıcı kazancını ayarlayın (varsayılandan farklı bir şey isteniyorsa)

· ASK modülasyon yüzdesini %100 olarak ayarlayın

· CRC hesaplamaları için tohum değerini ayarlayın

· Anteni açın

· Donanım yazılımı sürümünü edinin (gerekli değil)

Açıklanamayan bir nedenden dolayı modülüm açılıyor ve veri baytı olmadan bir yazma komutu aldığını düşünüyor. Bunun sadece modülümle ilgili bir sorun olup olmadığını bilmiyorum ama başka bir yerde buna referans görmedim. Hem donanım hem de yazılım sıfırlamalarını denedim ve ikisi de sorunu çözmedi. Benim çözümüm, modül başlatma rutininin başlangıcında “0” (tanımsız) kaydetmek için sahte bir okuma çağrısı eklemekti. Modül bunu bilinmeyen yazma komutu için veri olarak görürse, herhangi bir kötü etki görünmüyor. Bunu bir okuma komutu olarak görürse, yararlı bir şey olmaz. Özellikle sadece modülün donanım sıfırlamasının sorunu çözmediği göz önüne alındığında, sorunu tam olarak tanımlayamamak beni rahatsız ediyor.

RC522 yongası, çoğu hem okunan hem de yazılan bir dizi kayıttan oluşur. Yazma gerçekleştirmek için modüle kayıt numarası ve ardından yazılacak değer gönderilir. Bir okuma gerçekleştirmek için kayıt numarasına 0x80 eklenir ve bu modüle gönderilir. Bir yazma komutuna verilen yanıt, erişilen kaydın bir yankısıdır. Bir okuma komutuna verilen yanıt, kaydın içeriğidir. Yazılım, komutun doğru şekilde yürütüldüğünü doğrulamak için bu bilgiden yararlanır.

Adım 6: PN532 Modül Erişim Sırası

Başlatma rutini şu gerekli adımları içerir:

· Bir başlatma dizisi gönder: Bu, UART arayüzüne özgüdür. Kılavuz, UART arayüzünün, arayüzde tespit edilen beşinci yükselen kenarda uyanacağını belirtir. 0x55, 0x55, 0x00, 0x00, 0x00, 0x00 gönderilmesini önerir. Çoğunlukla, yalnızca kenarları yükselen yeterli sayıda karakter olması gerekir ve bunlar bir komut girişine (00 00 FF) benzememelidir.

· Modülü uyandırın: Kullanım kılavuzunda gömülü olarak, modülün “LowVbat” adı verilen bir tür uyku durumuna başladığını gösterir. Bu durumdan çıkmak için bir “SAMConfiguration” komutu göndermemiz gerekiyor.

PN532, komutların bir giriş, mesaj ve bir posta eki içeren tanımlı bir mesaj biçiminde gönderilmesini bekler. Yanıt iletileri aynı biçimi izler. Komut ve yanıt mesajlarının her ikisi de bir TFI (Çerçeve Tanımlayıcı) ve bir komut sürümü içerir. Komut, 0xD4'lük bir TFI kullanır ve yanıt 0xD5'i kullanır. Komut sürümleri değişir, ancak yanıt her zaman komut sürümünü artırır ve TFI'yi izleyen bayt olarak döndürür. Bu tutarlılık, yanıt mesajlarının ilgili bilgiler için kolayca taranmasını sağlar.

Her komut mesajı (girişten sonra) mesaj uzunluğundan, mesaj uzunluğunun 2'nin tümleyeninden, TFI'den, komuttan, veriden, sağlama toplamından ve posta harfinden oluşur. Yazılım bireysel komutları oluşturur ve ardından sağlama toplamını hesaplayan ve posta harfini ekleyen bir rutini çağırır.

Yanıtın mesaj formatı, komutunkine benzer. Tipik bir yanıt, bir ACK (00 00 FF 00 FF 00) ve ardından komuta verilen özel yanıtı içerecektir. Her komut yanıtı 00 00 FF önsözüyle başlar. Yanıt ayrıca TFI bayt D5'e ve ardından 1 artan komut numarasına sahip olmalıdır. “SAMConfiguration” komutumuz (14) için bu 15 olacaktır. “SAMConfiguration” komutu şu yanıtı alır: 00 00 FF 00 FF 00 00 00 FF 02 FE D5 15 16 00.

Gönderilebilecek modüle özgü başka komutlar da vardır, ancak bunlar bu uygulama için gerekli değildir. Bununla birlikte, bellenim sürüm numarasını almak için çağrılabilecek bir rutin ekledim. Tipik bir yanıt (ACK ve girişten sonra) şöyle olacaktır: 06 FA D5 03 32 01 06 07 E8 00. "01 06 07", 1.6.7 donanım yazılımı sürüm numarasını gösterir.

7. Adım: Erişim Sırasını Etiketleyin

Modül hazır olduktan sonra etiketlere özel komutlar gönderebiliriz. Etiket verilerini okumak veya yazmak için kimlik numarasına (UID) sahip olmamız gerekir. UID ve anahtar daha sonra okuma/yazma için belirli bir etiket veri sektörünü yetkilendirmek için kullanılacaktır. Etiket veri okuma/yazma işlemleri her zaman belirli bir veri bloğundaki 16 baytın tamamında yapılır. Bu, tipik uygulamanın veri bloğunu okuyacağı, verileri istendiği gibi değiştireceği ve ardından yeni verileri etikete geri yazacağı anlamına gelir.

Adım 8: Yazılım

Kesinti işleyici yazılımı, PIC UART bir bayt veri aldığında çağrılır. Önceki UART projelerimin bazılarında, bir kesme işleyicisi kullanmak yerine RX kesme bayrağını yoklayabildim. Bu yazılım için, özellikle RC522'den çok daha yüksek bir baud hızında iletişim kuran PN532 için durum böyle değildir. PN532 için varsayılan değer 115k iken RC522'nin UART arayüzü 9600 baud ile sınırlıdır ve 1.288M baud'a kadar ayarlanabilir. Alınan baytlar bir arabellek alanında saklanır ve yazılımın ana kısmı gerektiğinde bunları alır.

New_Msg bayrağı baytların alındığını ve Byte_Count kaç tane olduğunu belirtir. Hata ayıklama sırasında alma arabelleğinin içeriğini görüntülemek için çağrılabilecek yazılıma bir “Disp_Buff” rutini ekledim. Geri dönüş mesajlarından bazıları tipik bir 1602 ekranı taşacak, ancak çevrimiçi bir fazlalık elektronik sitesinde bulduğum 2 satırlı 40 karakterlik bir LCD'm var. “Max_Line” tanımı LCD boyutunuz için ayarlanabilir. “Max_Line”a ulaşılırsa “Disp_Buff” rutini ikinci satıra yazılarak devam eder. 4 satırlı bir LCD'niz varsa, üçüncü ve dördüncü satırlara devam etmek için bu rutine küçük bir kod ekleyebilirsiniz. PN532 için, rutinin alınan tüm baytları veya sadece 16 veri baytını bir okuma yanıtından boşaltacağı şekilde ayarlanabilen bir bayrak vardır.

Alma arabelleğini veya Byte_Count'u temizlemeye gerek yoktur, çünkü New_Msg bayrağının temizlenmesi, Byte_Count'un kesme işleyicisi tarafından temizlenmesine neden olur ve arabellekte dizin olarak kullanılan budur. New_Msg genellikle her komut adımından önce temizlenir, böylece o komuta özgü sonuçlar kolayca bulunabilir ve doğrulanabilir. RC522'de bu, alma arabelleğinin genellikle yalnızca 1 ila 4 bayta sahip olduğu anlamına gelir. Veri bloğu okumaları gibi bazı durumlarda, baytları FIFO'dan alma arabelleğine taşımak için Read_FIFO komutunun birden çok kez verilmesi gerekir. PN532 için tüm komut sonuçları alma arabelleğinde sona erer, böylece gereken belirli baytları bulmak için bir tarama prosedürü gerçekleştirilir.

Yazılımdaki ana döngü bir etiketi tarar ve ardından okuma/yazma için etiketin kimliğini doğrular. Buraya dahil edilen test yazılımı için, Junk_Num değişkeni ana döngü boyunca her seferinde değiştirilir ve etikete yazma sırasında kullanılır. Yazılan değerler, Junk_Num'un değeri ile Junk_Num'un 1'in tümleyeni arasında değişir. Son olarak, 16 yazılı değer okunur ve görüntülenir. Her mesajın okunmasına zaman tanımak için gecikmeli rutin çağrılar içeren her adım için ekran mesajları vardır. Hata mesajları da sağlanır, ancak normalde yalnızca etiket bir işlem sırasında kaldırılırsa ortaya çıkar.

Yazılım başlatmanın bir kısmı, yalnızca açılışta yürütülen ve bir yazılım sıfırlaması algılandığında atlanan bir kod bölümüdür. Hata mesajları genellikle ana döngüden çıkmanın bir yolu olarak bir yazılım sıfırlamasıyla sona erer. Sıfırlama, Watchdog Timer'ı etkinleştiren ve ardından zaman aşımını bekleyen sonsuz bir döngüye giren “Tilt” rutininde gerçekleşir.

Adım 9: MFRC522 Benzersiz Yazılım

RC522 yongası, etiketlerle iletişimi gerçekleştirmek için PN532 yongasından daha düşük seviyeli talimatlar gerektirir. Assembly dilinde programlamaya karşı “C”de programlamaya benzer. Bir diğer önemli fark, RC522'nin etiketle iletişimin bir FIFO arabelleği aracılığıyla yönlendirilmesini gerektirmesidir. “Write_FIFO” ve “Read_FIFO” rutinleri bu görevleri yerine getirir. MFRC522 yazılımı, ana işlevlerin oluşturulduğu alt düzey komutların çoğu için bir bölüm içerir.

RC522 için etiket komutu sağlama toplamı hesaplaması, PN532'den çok farklıdır. FIFO'da etiket komutu oluşturulduktan sonra, sağlama toplamını hesaplamak için bir modül komutu gönderilir. 16 bitlik sonuç, etiket komutuna otomatik olarak eklenmez, ancak iki adet 8 bitlik kayıttan okunabilir. Sağlama toplamı hesaplaması, FIFO'daki verileri siler, böylece gerekli sıra aşağıdaki gibidir:

· Komutu FIFO'da oluşturun

· Bir sağlama toplamı hesaplaması komutu verin

· Komutu tekrar FIFO'da oluşturun

· CRC kayıtlarını okuyun ve sağlama toplamı baytlarını FIFO'ya yazın

· Bir Alma veya Kimlik Doğrulama komutu gönderin

Transceive komutu, FIFO arabelleğini iletecek ve ardından etiketten yanıtı beklemek için otomatik olarak alma moduna geçecektir. Verileri gerçekten iletmek için, Transceive komutunun ardından BitFramingRegister'daki StartSend bitinin ayarlanması gerekir. Authenticate komutunun bu gereksinimi yoktur.

Genel olarak, çevrimiçi olarak kullanılabilen Arduino “C” kod uygulamaları, doğru yanıtın zamanında alınmasını sağlamak için kesme bayrak kayıtlarını ve zaman aşımı kaydını kullanır. Bence bu, zaman açısından kritik olmayan bu uygulama için çok fazla. Bunun yerine, yanıtı beklemek ve ardından doğru olduğunu doğrulamak için kısa yazılım zaman aşımları kullanıyorum. Mifare etiketlerinin kılavuzu, çeşitli işlemlerin zamanlamasını ayrıntılandırır ve alınması beklenen bayt sayısı için zamana da izin verilir. Bu zaman gecikmeleri, düşük seviyeli komut alt programlarının çoğunda yerleşiktir.

Adım 10: PN532 Benzersiz Yazılım

Modül başlatıldıktan sonra, etiketi bulmak ve doğrulamak için gereken adımlar, uygun komut ve ardından gerekli veriler yazılarak gerçekleştirilir. Tarama komutu, daha sonra kimlik doğrulama için kullanılan UID'yi döndürür. Bundan sonra, etiketin okuma ve yazma işlemleri, adreslenen veri bloğu için 16 bayt gönderir veya döndürür.

Başlatma sırası daha önce detaylandırılmıştır ve aynı yazılım rutini, modülü “LowVbat” durumundan çıkarmak için SAMConfiguration komutunu da gönderir. Scan, Authenticate, Read/Write Tag gibi temel komutların geri kalanı, uygulanabilir rutinlerde sırayla oluşturulur. Sağlama toplamı, yalnızca komut baytlarını toplayarak, bir tamamlayıcı yaparak ve ardından 2'nin tamamlayıcısı yapmak için 1 ekleyerek hesaplanır. 8 bitlik sonuç, posta kodundan hemen önce komut dizisine eklenir.

RC522'deki gibi bir FIFO yoktur, bu nedenle tam yanıt mesajları otomatik olarak alınır. “Find_Response” rutini, TFI (0xD5) için alma veri arabelleğini tarar. Rutin, beklenen mesajların ne olması gerektiğini bilmenin avantajını kullanır ve veri içermeyen basit ACK yanıtlarını yok sayar. TFI bulunduğunda, istenen tepkiler ondan bilinen bir sapmadır. Komut yankısı ve komut durumu baytları, daha sonra doğrulama için “Read_Buff” rutini tarafından kaydedilir.

Bu yazı için bu kadar. Diğer elektronik projelerime göz atın: www.boomerrules.wordpress.com

Önerilen: