Përmbajtje:

RC522 dhe PN532 RFID Bazat: 10 hapa
RC522 dhe PN532 RFID Bazat: 10 hapa

Video: RC522 dhe PN532 RFID Bazat: 10 hapa

Video: RC522 dhe PN532 RFID Bazat: 10 hapa
Video: Code Typhon Studio / Обзор / Преимущества, особенности / Установка, удаление / Object Pascal IDE 2024, Korrik
Anonim
RC522 dhe PN532 Bazat RFID
RC522 dhe PN532 Bazat RFID

SH NOTNIM: Tani kam Instructables që ofrojnë kodin Arduino për RC522 dhe PN532.

Disa kohë më parë bleva tre module të ndryshme RFID për eksperimentim. Në një projekt të mëparshëm kam detajuar se si të përdor një modul të thjeshtë 125-kHz për të bërë një funksion themelor të sigurisë. Modulet si ai përdorin etiketa vetëm për lexim kështu që procesi skanohet për ID, ruhet nëse dëshironi dhe krahasohet me ID-të e ruajtura. Modulet e tjerë që bleva funksionojnë në 13.56-MHz dhe përdorin etiketa që mund të lexohen dhe shkruhen, kështu që është një lloj humbjeje thjesht t'i përdorësh ato për sigurinë themelore. Dy modulet e zakonshme përdorin ose çipin RC522 ose çipin PN532 - të dy të prodhuar nga NXP.

Nëse keni lexuar ndonjë nga projektet e mia të tjera, e dini që më pëlqen të përdor mikrokontrollues dhe program të lirë PIC në gjuhën e asamblesë. Pra, ajo që po kërkoja ishte një sekuencë hapash të kërkuar për të folur me modulet dhe etiketat RFID. Ndërsa ka shumë programe shembullore në internet për modulet, shumica e tyre janë të shkruara në softuerin ‘C’ për Arduino dhe përdorin ndërfaqen SPI. Gjithashtu, manualët për patate të skuqura dhe etiketat Mifare kërkojnë pak deshifrim. Ky postim ka të bëjë kryesisht me informacionin që do të doja të kisha kur fillova projektin. Unë gjithashtu përfshij programe softuerike të asamblesë PIC për kryerjen e komandave bazë të kërkuara nga secili modul. Edhe nëse nuk përdorni një gjuhë PIC dhe/ose asambleje, kodi burimor duhet të paktën t'ju japë një ide të mirë të komandave specifike të kërkuara për të kryer çdo hap.

Hapi 1: Ndërfaqet serike

Ndërfaqet serike
Ndërfaqet serike
Ndërfaqet serike
Ndërfaqet serike
Ndërfaqet serike
Ndërfaqet serike
Ndërfaqet serike
Ndërfaqet serike

Të dy çipat e përdorur në këto module janë të aftë të ndërlidhen përmes SPI, I2C ose UART (HSSP). Moduli PN532 ka një çelës DIP që përdoret për të zgjedhur ndërfaqen e dëshiruar, por moduli MFRC522 është i lidhur për ndërfaqen SPI. Unë preferoj të përdor UART-in e integruar të PIC, kështu që gjuaj në internet për të parë nëse kishte një mënyrë për të futur modulin MFRC522 në modalitetin UART. Ajo që gjeta ishte se prerja e një gjurme në tabelë do të bënte mashtrimin. Prerja heq në mënyrë efektive 3.3 volt nga kunja EA e çipit. Teknikisht kunja EA duhet të lidhet me tokën, por jo shumë njerëz mund ta heqin atë vepër bashkimi duke pasur parasysh densitetin e kunjit të çipit. Sidoqoftë, mos u shqetësoni, sepse kunja EA nuk ka një tërheqje të brendshme dhe nuk "noton" siç bëjnë hyrjet e vjetra logjike TTL. Referojuni diagramit të çipave dhe figurës së seksionit të tabelës për vendin e prerë. Sigurohuni që të keni prerë vetëm gjurmën e shkurtër duke shkuar direkt në kunjin EA.

Hapi 2: Pajisje kompjuterike

Hardware
Hardware

Lidhjet harduerike për komunikimet UART tregohen në diagramin e mësipërm. Lidhjet UART për MFRC522 nuk janë shënuar në tabelë, por, siç tregohet në skemë, kunja SDA merr të dhëna UART dhe kunja MISO transmeton të dhëna UART. Moduli PN532 ka shënimet UART në anën e poshtme të tabelës.

Të dy modulet funksionojnë në 3.3 volt dhe niveli logjik 5 volt nga kunja PIC TX gjithashtu duhet të jetë i kufizuar. Lidhja LCD është konfigurimi standard 4-bit që është përdorur në një numër të projekteve të mia të mëparshme. Formati i paracaktuar për të gjithë mesazhet është vendosur për LCD -në standard 1602 (16 karaktere me 2 rreshta). Unë gjithashtu kam një LCD me 40 karaktere nga 2 rreshta që e përdor për hedhjen e të dhënave të papërpunuara gjatë korrigjimit, kështu që përfshiva një definicion në softuer që më lejon të përfitoj nga hapësira shtesë e ekranit.

Hapi 3: Blloqet e të dhënave

Etiketat Mifare Classic 1k të përdorura për këtë projekt janë konfiguruar si 16 sektorë, katër blloqe të dhënash për sektor, 16 byte për bllok të dhënash. Nga 64 blloqet e të dhënave, vetëm 47 janë në të vërtetë të përdorshme. Blloku i të dhënave 0 përmban të dhënat e prodhuesit dhe blloqet 3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59 dhe 63 quhen blloqe rimorkio. Blloqet Rimorkio janë të fundit në secilin sektor dhe ato përmbajnë dy çelësa dhe bit të aksesit në bllok. Çelësat dhe blloqet e aksesit të bllokut zbatohen vetëm për blloqet e të dhënave në atë sektor, kështu që ju mund të keni çelësa të ndryshëm dhe rregulla aksesi për secilin sektor. Çelësat e paracaktuar vendosen në "FF FF FF FF FFh". Për këtë projekt bazë unë përdor vetëm një bllok të dhënash dhe mbaj çelësat e paracaktuar dhe bitët e aksesit. Ka shumë dokumente që lidhen me këto karta, kështu që thjesht bëni një kërkim në internet për "Mifare" ose vizitoni faqen e internetit të NXP nëse doni t'i eksploroni ato në mënyrë më të thellë.

Hapi 4: Operacioni i Përgjithshëm

Ndërsa të dy modulet janë unikë në mënyrën se si arrihen dhe mënyrën se si hyjnë në etiketat, ekziston një proces i përgjithshëm që kërkohet për të përfunduar punën. Për këtë projekt ne supozojmë se etiketat janë të tipit Mifare Classic 1k dhe se ne po lejojmë vetëm një etiketë në të njëjtën kohë në fushën e antenës. Hapat bazë përcaktohen më poshtë.

· Fillimi i modulit: Në përgjithësi kjo kërkon gjëra të tilla si shkrimi i vlerave në regjistrat në çip, dërgimi i komandave "zgjimi" dhe ndezja e energjisë në antenë. Në një aplikacion të operuar me bateri, do të donit të ishit në gjendje të ndizni dhe fikni antenën për të kursyer baterinë, por për këtë aplikim të thjeshtë e ndezim një herë dhe më pas e lëmë të ndezur.

· Pastroni flamurin kripto (vetëm 522): Kur një etiketë vërtetohet, një flamur vendoset për t'i bërë të ditur përdoruesit se komunikimet me etiketën do të kodohen. Ky flamur duhet të pastrohet nga përdoruesi para skanimit tjetër, edhe nëse etiketa që skanohet është e njëjta.

· Skanoni për një etiketë: Moduli në thelb pyet "A ka dikush atje?" dhe etiketa përgjigjet "Unë jam këtu". Nëse moduli nuk merr një përgjigje të shpejtë, ai pushon së dëgjuari. Kjo do të thotë që ne duhet të dërgojmë në mënyrë të përsëritur komandat e skanimit në modul derisa të gjejë një etiketë.

· Merrni numrin e identifikimit të përdoruesit të etiketës (UID): Etiketa do t'i përgjigjet kërkesës së skanimit me disa informacione të kufizuara, siç është lloji i etiketës që është. Kjo do të thotë që mund të na duhet të dërgojmë një komandë tjetër për të marrë UID -in e tij. UID është katër bajt për etiketat Mifare Classic 1k. Nëse mund të jetë më e gjatë për etiketat e tjera, por ky projekt nuk i adreson ato.

· Zgjidhni etiketën (vetëm 522): UID përdoret për të zgjedhur etiketën që përdoruesi dëshiron të vërtetojë për lexime dhe shkrime. Kjo bazohet në mundësinë që mund të ketë më shumë se një etiketë në fushën e antenës. Ky nuk është rasti për aplikimin tonë të thjeshtë, por gjithsesi duhet të zgjedhim etiketën.

· Vërtetoni etiketën: Ky hap kërkohet nëse duam të bëjmë ndonjë lexim ose shkrim të etiketës. Nëse gjithçka që duam të bëjmë është të bëjmë dallimin midis etiketave për një aplikacion të thjeshtë sigurie, atëherë UID -i është i mjaftueshëm. Vërtetimi kërkon që ne të njohim UID -in dhe të dimë çelësin kripto për sektorin e të dhënave të etiketës në të cilën duam të kemi qasje. Për këtë projekt ne qëndrojmë me çelësat e paracaktuar, por projekti im vijues ndryshon çelësat në mënyrë që etiketa të përdoret si një portofol elektronik.

· Lexoni ose shkruani etiketën: Leximet kthejnë gjithmonë të 16 bajtët e bllokut të të dhënave të kërkuar. Shkrimet kërkojnë që të 16 bajtët të shkruhen në të njëjtën kohë. Nëse dëshironi të lexoni ose shkruani një bllok tjetër në të njëjtin sektor të të dhënave, etiketa nuk ka nevojë të vërtetohet përsëri. Nëse dëshironi të lexoni ose shkruani një bllok në një sektor të ndryshëm të të dhënave, atëherë etiketa duhet të vërtetohet përsëri duke përdorur çelësin për atë sektor.

Hapi 5: Sekuenca e Qasjes në Modulin MFRC522

Rutina e fillimit përfshin këto hapa themelorë që gjenden në shumicën e aplikacioneve që shikova:

· Dërgo bajt të dhënash fals (shiko paragrafin tjetër)

· Rivendosje e butë

· Vendosni përfitimin e marrësit RF (nëse dëshironi diçka tjetër nga ajo e paracaktuar)

· Vendosni përqindjen e modulimit ASK në 100%

· Vendosni vlerën e farës për llogaritjet e KDF -së

· Ndizni antenën

· Merrni versionin e firmuerit (nuk kërkohet)

Për disa arsye të pashpjegueshme moduli im fuqizohet dhe mendon se ka marrë një komandë shkrimi pa bajt të të dhënave. Unë nuk e di nëse kjo është vetëm një çështje me modulin tim, por nuk kam parë ndonjë referencë për të diku tjetër. Kam eksperimentuar me rivendosjen e harduerit dhe softuerit dhe asnjëri nuk e ka rregulluar problemin. Zgjidhja ime ishte të shtoja një thirrje të lexuar për të regjistruar "0" (e pacaktuar) në fillim të rutinës së fillimit të modulit. Nëse moduli e sheh këtë si të dhëna për komandën e panjohur të shkrimit, nuk duket të ketë ndonjë efekt të keq. Nëse e sheh atë si një komandë leximi, atëherë asgjë e dobishme nuk ndodh. Më shqetëson që nuk mund ta përcaktoj plotësisht çështjen, veçanërisht duke pasur parasysh që një rivendosje e harduerit vetëm e modulit nuk e rregullon problemin.

Çipi RC522 përbëhet nga një numër regjistrash, shumica e të cilëve lexohen dhe shkruhen. Për të kryer një shkrim, numri i regjistrit dërgohet në modul i ndjekur nga vlera për të shkruar. Për të kryer një lexim, numri i regjistrit i shtohet 0x80 dhe i dërgohet modulit. Përgjigja ndaj një komande shkrimi është një jehonë e regjistrit të aksesuar. Përgjigja ndaj një komande leximi është përmbajtja e regjistrit. Softueri përfiton nga ato njohuri për të verifikuar që komanda është ekzekutuar siç duhet.

Hapi 6: Sekuenca e Qasjes në Modulin PN532

Rutina e fillimit përfshin këto hapa të kërkuar:

· Dërgoni një varg fillestar: Kjo është specifike për ndërfaqen UART. Manuali thotë se ndërfaqja UART do të zgjohet në skajin e pestë në rritje të zbuluar në ndërfaqen. Rekomandon dërgimin 0x55, 0x55, 0x00, 0x00, 0x00, 0x00. Për pjesën më të madhe, thjesht duhet të ketë një numër të mjaftueshëm karakteresh me skajet në rritje dhe ato nuk duhet të duken si një parathënie komande (00 00 FF).

· Zgjohuni modulin: I varrosur në manualin e përdoruesit tregon se moduli inicializohet në një lloj gjendjeje gjumi të quajtur "LowVbat". Për të dalë nga kjo gjendje ne duhet të dërgojmë një komandë "SAMConfiguration".

PN532 pret që komandat të dërgohen në një format mesazhi të përcaktuar që përfshin një parathënie, mesazh dhe një postamble. Mesazhet e përgjigjes ndjekin të njëjtin format. Mesazhet e komandës dhe përgjigjes të dyja përfshijnë një TFI (Identifikuesi i Kornizës) dhe një version komande. Komanda përdor një TFI prej 0xD4 dhe përgjigja përdor 0xD5. Versionet e komandës ndryshojnë, por përgjigja gjithmonë do të rrisë versionin e komandës dhe do ta kthejë atë në bajt pas TFI. Kjo qëndrueshmëri lejon që mesazhet e përgjigjes të skanohen lehtësisht për informacionin përkatës.

Çdo mesazh komandues (pas parathënies) përbëhet nga gjatësia e mesazhit, komplementi i 2 i gjatësisë së mesazhit, TFI, komanda, të dhëna, grumbull kontrolli dhe postamble. Softueri ndërton komandat individuale dhe më pas thërret një rutinë që llogarit shumën e kontrollit dhe shton postamblenë.

Formati i mesazhit për përgjigjen është i ngjashëm me atë të komandës. Një përgjigje tipike do të përfshijë një ACK (00 00 FF 00 FF 00) e ndjekur nga përgjigja specifike ndaj komandës. Çdo përgjigje komande fillon me një parathënie prej 00 00 FF. Përgjigja gjithashtu duhet të ketë një byte TFI të D5 e ndjekur nga numri i komandës i shtuar me 1. Për komandën tonë "SAMConfiguration" (14) që do të ishte 15. Komanda "SAMConfiguration" merr këtë përgjigje: 00 00 FF 00 FF 00 00 00 FF 02 FE D5 15 16 00.

Ka komanda të tjera specifike për modulin që mund të dërgohen, por ato nuk janë të nevojshme për këtë aplikacion. Sidoqoftë, unë përfshiva një rutinë që mund të thirret për të marrë numrin e versionit të firmuerit. Një përgjigje tipike (pas ACK dhe parathënies) do të ishte: 06 FA D5 03 32 01 06 07 E8 00. "01 06 07" tregon numrin e versionit të firmuerit 1.6.7.

Hapi 7: Sekuenca e Qasjes së Etiketave

Pasi moduli të bëhet gati, ne mund të dërgojmë komanda specifike për etiketat. Për të lexuar ose shkruar të dhënat e etiketave duhet të kemi numrin e tij identifikues (UID). UID dhe çelësi do të përdoren më pas për të autorizuar një sektor specifik të të dhënave për leximin/shkrimin. Leximi/shkrimi i të dhënave të etiketave bëhet gjithmonë në të 16 bajtët në një bllok të caktuar të dhënash. Kjo do të thotë që aplikacioni tipik do të lexojë bllokun e të dhënave, do të modifikojë të dhënat sipas dëshirës dhe më pas do t'i shkruajë të dhënat e reja në etiketë.

Hapi 8: Softueri

Softueri i mbajtësit të ndërprerjeve thirret sa herë që PIC UART merr një bajt të të dhënave. Në disa nga projektet e mia të mëparshme UART unë kam qenë në gjendje të anketoj vetëm flamurin e ndërprerjes RX në vend që të përdor një mbajtës ndërprerjeje. Ky nuk është rasti për këtë softuer, veçanërisht për PN532 i cili komunikon me një normë baud shumë më të lartë sesa RC522. Ndërfaqja UART e RC522 është e kufizuar në 9600 baud ndërsa parazgjedhja për PN532 është 115k dhe mund të vendoset deri në 1.288M baud. Bajtët e marrë ruhen në një zonë tampon dhe pjesa kryesore e softuerit i merr ato sipas nevojës.

Flamuri New_Msg tregon që bajtët janë marrë dhe Byte_Count tregon sa. Unë kam përfshirë një rutinë "Disp_Buff" në softuer që mund të thirret për të shfaqur përmbajtjen e tamponit të marrjes gjatë korrigjimit. Disa nga mesazhet e kthimit do të tejkalojnë një ekran tipik 1602, por unë kam një LCD me 40 karaktere me 2 rreshta që gjeta në një sit elektronik të tepërt në internet. Përkufizimi "Max_Line" mund të vendoset për madhësinë e LCD tuaj. Nëse arrihet "Max_Line", rutina "Disp_Buff" vazhdon duke shkruar në rreshtin e dytë. Ju mund të shtoni një kod të vogël në atë rutinë për të vazhduar në rreshtat tre dhe katër nëse keni një LCD me 4 rreshta. Për PN532 ekziston një flamur që mund të vendoset në mënyrë që rutina ose të hedhë të gjithë bajtët e marrë ose të hedhë 16 bajtët e të dhënave nga një përgjigje e lexuar.

Nuk ka nevojë të pastroni tamponin e marrjes ose Byte_Count sepse pastrimi i flamurit New_Msg do të bëjë që Byte_Count të pastrohet nga mbajtësi i ndërprerjes dhe kjo është ajo që përdoret si indeks në tampon. New_Msg zakonisht pastrohet para çdo hapi komandues në mënyrë që rezultatet specifike për atë komandë të gjenden dhe verifikohen lehtësisht. Në RC522 kjo do të thotë që tamponi i marrjes zakonisht ka vetëm 1 deri në 4 bajt. Në disa raste, të tilla si leximi i bllokut të të dhënave, komanda Read_FIFO duhet të lëshohet shumë herë në mënyrë që të lëvizin bajtët nga FIFO në tamponin e marrjes. Të gjitha rezultatet e komandës për PN532 përfundojnë në tamponin e marrjes, kështu që kryhet një procedurë skanimi për të gjetur bajtët specifikë të nevojshëm.

Laku kryesor në softuer skanon për një etiketë dhe më pas vërteton etiketën për lexim/shkrim. Për programin testues të përfshirë këtu ndryshorja Junk_Num modifikohet çdo herë përmes lakut kryesor dhe përdoret gjatë shkrimit në etiketë. Vlerat e shkruara alternojnë midis vlerës së Junk_Num dhe komplementit 1 të Junk_Num. Së fundi, 16 vlerat e shkruara lexohen dhe shfaqen. Ka mesazhe të ekranit për secilin hap me vonesa të thirrjeve rutinë për të lejuar kohë për të lexuar secilin mesazh. Mesazhet e gabimit jepen gjithashtu, por normalisht duhet të ndodhin vetëm nëse etiketa hiqet gjatë një operacioni.

Pjesë e inicializimit të softuerit është një pjesë e kodit që ekzekutohet vetëm kur ndizet dhe anashkalohet nëse zbulohet një rivendosje e softuerit. Mesazhet e gabimit përgjithësisht përfundojnë me një rivendosje të softuerit si një mënyrë për të dalë nga laku kryesor. Rivendosja ndodh në rutinën "Tilt", e cila thjesht mundëson Kohëmatësin e Mbikqyrjes dhe më pas kalon në një lak të pafund duke pritur pritjen.

Hapi 9: Softuer Unik MFRC522

Çipi RC522 kërkon më shumë udhëzime të nivelit të ulët sesa çipi PN532 për të kryer komunikime me etiketa. Kindshtë njëlloj si programimi në gjuhën e asamblesë kundrejt programimit në "C". Një tjetër ndryshim domethënës është se RC522 kërkon që komunikimet me etiketën të kalojnë përmes një tamponi FIFO. Rutinat "Write_FIFO" dhe "Read_FIFO" i trajtojnë ato detyra. Softueri MFRC522 përfshin një seksion për shumë nga komandat e nivelit më të ulët nga të cilat janë ndërtuar funksionet kryesore.

Llogaritja e komandës kontrolluese të etiketës për RC522 është shumë e ndryshme sesa për PN532. Pasi të jetë ndërtuar komanda e etiketës në FIFO, një komandë moduli dërgohet për të llogaritur shumën e kontrollit. Rezultati 16-bit nuk shtohet automatikisht në komandën tag, por është i disponueshëm për lexim nga dy regjistra 8-bit. Llogaritja e grumbullit të kontrollit fshin të dhënat në FIFO kështu që sekuenca e kërkuar është si më poshtë:

· Ndërtoni komandën në FIFO

· Komandoni një llogaritje të kontrollit

· Ndërtoni përsëri komandën në FIFO

· Lexoni regjistrat e CRC dhe shkruani bajtët e checksum në FIFO

· Dërgoni ose një komandë Transceive ose Authenticate

Komanda Transceive do të transmetojë tampon FIFO dhe pastaj do të kalojë automatikisht në modalitetin e marrjes për të pritur përgjigjen nga etiketa. Komanda Transceive duhet të ndiqet nga vendosja e bitit StartSend në BitFramingRegister në mënyrë që të transmetojë në të vërtetë të dhënat. Komanda Autentifikimi nuk e ka atë kërkesë.

Në përgjithësi, aplikacionet e kodit Arduino "C" të disponueshëm në internet përdorin regjistrat e flamurit të ndërprerë dhe regjistrin e kohës për të siguruar që përgjigja e saktë të merret në kohën e duhur. Sipas mendimit tim, kjo është e tepërt për këtë aplikim jo-kritik. Në vend të kësaj, unë përdor afatet e shkurtra të softuerit për të pritur përgjigjen dhe pastaj të verifikoj që është i saktë. Manuali për etiketat Mifare detajon kohën për transaksionet e ndryshme dhe koha lejohet gjithashtu për numrin e pritur të bajtëve që do të merren. Këto vonesa kohore janë ndërtuar në shumicën e nënrutinave të komandës të nivelit të ulët.

Hapi 10: Softuer Unik PN532

Pas fillimit të modulit, hapat e nevojshëm për të gjetur dhe vërtetuar etiketën realizohen duke shkruar komandën e duhur të ndjekur nga të dhënat e nevojshme. Komanda e skanimit kthen UID e cila më pas përdoret për vërtetimin. Pas kësaj, lexon dhe shkruan etiketën dërgoni ose ktheni 16-bajtët për bllokun e të dhënave të adresuara.

Sekuenca e fillimit u detajua më herët dhe e njëjta rutinë e softuerit gjithashtu dërgon komandën SAMConfiguration për të nxjerrë modulin nga gjendja "LowVbat". Pjesa tjetër e komandave themelore, të tilla si Skanimi, Autentifikimi, Leximi/Shkrimi i etiketës, janë ndërtuar vetëm rradhazi në rutinat e zbatueshme. Shuma e kontrollit llogaritet duke shtuar vetëm bajtët e komandës, duke bërë një komplement dhe më pas duke shtuar 1 për ta bërë atë një komplement 2. Rezultati 8-bit i bashkëngjitet vargut të komandës pak para postamble.

Nuk ka FIFO si në RC522 kështu që mesazhet e plota të përgjigjes merren automatikisht. Rutina "Find_Response" skanon tamponin e të dhënave të marrjes për TFI (0xD5). Rutina përfiton nga njohja e mesazheve të pritshme dhe injoron përgjigjet e thjeshta ACK që nuk përfshijnë të dhëna. Pasi të gjendet TFI, përgjigjet e dëshiruara janë një kompensim i njohur prej tij. Bojat e komandës jehonë dhe statusit të komandës ruhen nga rutina "Read_Buff" për verifikim të mëvonshëm.

Kjo është ajo për këtë postim. Shikoni projektet e mia të tjera elektronike në: www.boomerrules.wordpress.com

Recommended: