Sisällysluettelo:

RC522- ja PN532 -RFID -perusteet: 10 vaihetta
RC522- ja PN532 -RFID -perusteet: 10 vaihetta

Video: RC522- ja PN532 -RFID -perusteet: 10 vaihetta

Video: RC522- ja PN532 -RFID -perusteet: 10 vaihetta
Video: RC522 based RFID Reader For Home Assistant, using ESPHome | Sponsored By PCBWAY.COM 2024, Joulukuu
Anonim
RC522 ja PN532 RFID -perusteet
RC522 ja PN532 RFID -perusteet

HUOMAUTUS: Minulla on nyt Instructables, joka tarjoaa Arduino -koodin RC522: lle ja PN532: lle.

Jokin aika sitten ostin kolme erilaista RFID -moduulia kokeilua varten. Aiemmassa projektissa kerroin, kuinka yksinkertaisen 125 kHz: n moduulin avulla voidaan suorittaa perustoiminto. Tällaiset moduulit käyttävät vain luku -tageja, joten prosessi skannaa tunnuksen, tallentaa haluttaessa ja vertaa tallennettuihin tunnuksiin. Muut ostamani moduulit toimivat 13,56 MHz: n taajuudella ja käyttävät sekä luettavia että kirjoitettavia tunnisteita, joten on yksinkertaisesti turhaa käyttää niitä yksinkertaisesti perusturvallisuuden vuoksi. Kaksi yleistä moduulia käyttävät joko RC522 -sirua tai PN532 -sirua - molemmat NXP: n valmistamia.

Jos olet lukenut muita projektejani, tiedät, että pidän halvoista PIC -mikrokontrollereista ja ohjelmista kokoonpanokielellä. Joten mitä etsin, oli vaiheiden sarja, joka vaadittiin puhumaan moduuleille ja RFID -tunnisteille. Vaikka moduuleille on verkossa paljon esimerkkiohjelmia, suurin osa niistä on kirjoitettu Arduinon C -ohjelmistolla ja käyttävät SPI -käyttöliittymää. Myös pelimerkkien ja Mifare -tunnisteiden käyttöoppaat vaativat hieman tulkintaa. Tämä viesti käsittelee ensisijaisesti niitä tietoja, jotka toivoisin saaneeni, kun aloitin projektin. Sisällytän myös PIC -kokoonpano -ohjelmistot kunkin moduulin edellyttämien peruskomentojen suorittamiseen. Vaikka et käytä PIC- ja/tai kokoonpanokieltä, lähdekoodin pitäisi ainakin antaa sinulle hyvä käsitys kunkin vaiheen suorittamiseen tarvittavista komennoista.

Vaihe 1: Sarjaliitännät

Sarjaliitännät
Sarjaliitännät
Sarjaliitännät
Sarjaliitännät
Sarjaliitännät
Sarjaliitännät
Sarjaliitännät
Sarjaliitännät

Molemmat näissä moduuleissa käytetyt sirut kykenevät liittymään SPI: n, I2C: n tai UART: n (HSSP) kautta. PN532 -moduulissa on DIP -kytkin, jota käytetään halutun liitännän valitsemiseen, mutta MFRC522 -moduuli on kiinteästi kytketty SPI -liitäntää varten. Käytän mieluummin PIC: n sisäänrakennettua UARTia, joten metsästin verkossa nähdäkseni, oliko olemassa tapa saada MFRC522-moduuli UART-tilaan. Huomasin, että yhden jäljen leikkaaminen taululle tekisi tempun. Leikkaus poistaa tehokkaasti 3,3 volttia sirun EA -tapista. Teknisesti EA -tappi on sitten kytkettävä maahan, mutta monet ihmiset eivät voi vetää tätä juotoskappaletta, kun otetaan huomioon sirun tapin tiheys. Ei kuitenkaan hätää, koska EA-tapissa ei ole sisäistä vetoa eikä se "kellu" kuten vanhat TTL-logiikkatulot. Katso leikattava paikka sirukaaviosta ja piirilevykuvasta. Varmista, että katkaiset vain lyhyen jäljen, joka menee suoraan EA -tappiin.

Vaihe 2: Laitteisto

Laitteisto
Laitteisto

UART -viestinnän laitteistoyhteydet on esitetty yllä olevassa kaaviossa. MFRC522: n UART -yhteyksiä ei ole merkitty taululle, mutta kaavion mukaisesti SDA -nasta vastaanottaa UART -tietoja ja MISO -nasta lähettää UART -tietoja. PN532 -moduulissa on UART -merkinnät levyn alapuolella.

Molemmat moduulit toimivat 3,3 voltilla ja myös PIC TX -nastan 5 voltin logiikkatasoa on rajoitettava. LCD-yhteys on vakio 4-bittinen asennus, jota on käytetty useissa aiemmissa projekteissani. Kaikkien viestien oletusmuoto on vakio 1602 LCD (16 merkkiä 2 rivillä). Minulla on myös 40 merkin kaksirivinen nestekidenäyttö, jota käytän raakadatan kaatamiseen virheenkorjauksen aikana, joten lisäsin ohjelmistoon määritelmän, jonka avulla voin hyödyntää ylimääräistä näyttötilaa.

Vaihe 3: Tietolohkot

Tässä projektissa käytetyt Mifare Classic 1k -tunnisteet on määritetty 16 sektoriksi, neljä tietolohkoa sektoria kohden, 16 tavua tietolohkoa kohti. 64 datalohkosta vain 47 on todella käyttökelpoinen. Tietolohko 0 sisältää valmistajan tiedot ja lohkoja 3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59 ja 63 kutsutaan perävaunulohkoiksi. Trailer -lohkot ovat viimeiset kussakin sektorissa ja ne sisältävät kaksi avainta ja lohkon pääsybitit. Avaimet ja lohkon käyttöbitit koskevat vain kyseisen sektorin datalohkoja, joten sinulla voi olla eri avaimet ja pääsysäännöt kullekin sektorille. Oletusnäppäimet ovat “FF FF FF FF FFh”. Tässä perusprojektissa käytän vain yhtä datalohkoa ja säilytän oletusavaimet ja käyttöbitit. Näihin kortteihin liittyy paljon asiakirjoja, joten hae verkosta "Mifare" tai käy NXP: n verkkosivustolla, jos haluat tutustua niihin tarkemmin.

Vaihe 4: Yleinen käyttö

Vaikka molemmat moduulit ovat ainutlaatuisia siinä, miten niitä käytetään ja miten he käyttävät tunnisteita, työn suorittamiseen tarvitaan yleinen prosessi. Tässä projektissa oletamme, että tunnisteet ovat Mifare Classic 1k -tyyppisiä ja että sallimme vain yhden tunnisteen kerrallaan antennikentässä. Perusvaiheet on määritelty alla.

· Alusta moduuli: Yleensä tämä edellyttää esimerkiksi arvojen kirjoittamista sirun rekistereihin, herätyskomentojen lähettämistä ja virran kytkemistä antenniin. Paristokäyttöisessä sovelluksessa haluat kytkeä antennin virran päälle ja pois päältä säästääksesi akkua, mutta tässä yksinkertaisessa sovelluksessa kytket sen päälle kerran ja jätämme sen sitten päälle.

· Tyhjennä salauslippu (vain 522): Kun tunniste on todennettu, lippu asetetaan ilmoittamaan käyttäjälle, että viestit tagin kanssa salataan. Käyttäjän on poistettava tämä lippu ennen seuraavaa skannausta, vaikka skannattava tunniste olisi sama.

· Tunnisteen etsiminen: Moduuli kysyy pohjimmiltaan "Onko siellä ketään?" ja tunniste vastaa "Olen täällä". Jos moduuli ei saa nopeaa vastausta, se lakkaa kuuntelemasta. Tämä tarkoittaa, että meidän on toistuvasti lähetettävä skannauskomentoja moduulille, kunnes se löytää tunnisteen.

· Hanki tunniste Käyttäjätunnus (UID): Tunniste vastaa skannauspyyntöön ja sisältää joitakin rajoitettuja tietoja, kuten tunnisteen tyyppiä. Tämä tarkoittaa, että meidän on ehkä lähetettävä toinen komento saadaksemme sen UID: n. UID on neljä tavua Mifare Classic 1k -tunnisteille. If voi olla pidempi muille tunnisteille, mutta tämä projekti ei käsittele niitä.

· Valitse tunniste (vain 522): UID -tunnusta käytetään tunnisteen valitsemiseen, jonka käyttäjä haluaa todentaa luku- ja kirjoituskäyttöön. Tämä perustuu siihen mahdollisuuteen, että antennikentässä voi olla useita tunnisteita. Näin ei ole yksinkertaisessa sovelluksessamme, mutta meidän on kuitenkin valittava tagi.

· Tunnisteen tunnistaminen: Tämä vaihe on pakollinen, jos haluamme lukea tai kirjoittaa tunnistetta. Jos haluamme vain erottaa tunnisteet yksinkertaisesta suojaussovelluksesta, UID riittää. Todentaminen edellyttää, että tunnemme UID: n ja että tunnemme salausavaimen sen tunnisteen datasektorille, jota haluamme käyttää. Tässä projektissa pysymme oletusavaimissa, mutta jatkoprojektini muuttaa avaimet niin, että tunnistetta voidaan käyttää sähköisenä lompakkona.

· Lue tai kirjoita tunniste: Lukemat palauttavat aina pyydetyn datalohkon kaikki 16 tavua. Kirjoitukset edellyttävät, että kaikki 16 tavua kirjoitetaan samanaikaisesti. Jos haluat lukea tai kirjoittaa toisen lohkon samalla datasektorilla, tunnistetta ei tarvitse todentaa uudelleen. Jos haluat lukea tai kirjoittaa lohkon eri datasektorilla, tunniste on todennettava uudelleen käyttämällä kyseisen sektorin avainta.

Vaihe 5: MFRC522 -moduulin käyttöjärjestys

Käynnistysrutiini sisältää nämä perusvaiheet, jotka löytyvät useimmista sovelluksista, joita katselin:

· Lähetä nuketietotavu (katso seuraava kappale)

· Pehmeä nollaus

· Aseta RF -vastaanottimen vahvistus (jos halutaan jotain muuta kuin oletusarvo)

· Aseta ASK -modulaatioprosentiksi 100%

· Aseta siemenarvo CRC -laskelmille

· Kytke antenni päälle

· Hanki laiteohjelmistoversio (ei pakollinen)

Jostain selittämättömästä syystä moduulini käynnistyy ja luulee saaneensa kirjoituskomennon ilman datatavua. En tiedä onko tämä vain ongelma moduulissani, mutta en ole nähnyt viittauksia siihen muualla. Kokeilin sekä laitteiston että ohjelmiston nollauksia, eikä kumpikaan korjannut ongelmaa. Ratkaisuni oli lisätä dummy read call rekisteröidäksesi "0" (määrittelemätön) moduulin alustusrutiinin alussa. Jos moduuli näkee tämän tuntemattoman kirjoituskomennon datana, haittavaikutuksia ei näytä olevan. Jos se pitää sitä lukukomennona, mitään hyödyllistä ei tapahdu. Minua häiritsee se, että en voi täysin määritellä ongelmaa, varsinkin kun otetaan huomioon, että vain moduulin laitteiston nollaus ei korjaa ongelmaa.

RC522 -siru koostuu useista rekistereistä, joista suurin osa on sekä luku- että kirjoitusrekistereitä. Kirjoituksen suorittamiseksi rekisterinumero lähetetään moduulille ja sen jälkeen kirjoitettava arvo. Lukemisen suorittamiseksi rekisterinumeroon on lisätty 0x80 ja se lähetetään moduulille. Kirjoituskomennon vastaus on käytetyn rekisterin kaiku. Vastaus lukukomentoon on rekisterin sisältö. Ohjelmisto hyödyntää tätä tietoa varmistaakseen, että komento on suoritettu oikein.

Vaihe 6: PN532 -moduulin käyttöjärjestys

Käynnistysrutiini sisältää seuraavat pakolliset vaiheet:

· Lähetä alustusmerkkijono: Tämä koskee vain UART -käyttöliittymää. Käsikirjassa todetaan, että UART-liitäntä herää rajapinnassa havaitulla viidennellä nousevalla reunalla. Se suosittelee lähetystä 0x55, 0x55, 0x00, 0x00, 0x00, 0x00. Suurimmassa osassa on vain oltava riittävä määrä merkkejä, joiden reunat nousevat, eivätkä ne saa näyttää komentoesitteeltä (00 00 FF).

· Herätä moduuli: Käyttäjän käsikirjan mukaan se osoittaa, että moduuli alustaa eräänlaiseen lepotilaan nimeltä “LowVbat”. Poistuaksesi tästä tilasta meidän on lähetettävä SAMConfiguration -komento.

PN532 odottaa komentojen lähettämistä määritellyssä sanomamuodossa, joka sisältää johdannon, sanoman ja jälkiviestin. Vastausviestit noudattavat samaa muotoa. Sekä komento- että vastaussanomat sisältävät TFI: n (Frame Identifier) ja komentoversion. Komento käyttää TFI -arvoa 0xD4 ja vastaus 0xD5. Komentoversiot vaihtelevat, mutta vastaus lisää aina komentoversiota ja palauttaa sen tavussa TFI: n jälkeen. Tämän johdonmukaisuuden ansiosta vastausviestit voidaan helposti skannata tarvittavien tietojen saamiseksi.

Jokainen komentosanoma (johdanto -osan jälkeen) koostuu sanoman pituudesta, sanoman pituuden 2 -täydennyksestä, TFI: stä, komennosta, datasta, tarkistussummasta ja jälkivaiheesta. Ohjelmisto rakentaa yksittäiset komennot ja kutsuu sitten rutiinin, joka laskee tarkistussumman ja liittää postimbleen.

Vastauksen sanomamuoto on samanlainen kuin komennon. Tyypillinen vastaus sisältää ACK (00 00 FF 00 FF 00), jota seuraa erityinen vastaus komentoon. Jokainen komentovaste alkaa johdannolla 00 00 FF. Vastauksessa tulee myös olla TFI -tavu D5, jota seuraa komennon numero, jota on lisätty yhdellä. SAMConfiguration -komennollemme (14) se olisi 15. SAMConfiguration -komento saa seuraavan vastauksen: 00 00 FF 00 FF 00 00 00 FF 02 FE D5 15 16 00.

On myös muita moduulikohtaisia komentoja, jotka voidaan lähettää, mutta niitä ei tarvita tässä sovelluksessa. Tein kuitenkin rutiinin, joka voidaan kutsua hakemaan laiteohjelmiston versionumero. Tyypillinen vastaus (ACK: n ja johdannon jälkeen) olisi: 06 FA D5 03 32 01 06 07 E8 00.”01 06 07” osoittaa laiteohjelmiston versionumeron 1.6.7.

Vaihe 7: Tunnisteiden käyttöjärjestys

Kun moduuli on valmis, voimme lähettää tunnisteita koskevia komentoja. Jotta voimme lukea tai kirjoittaa tunnisteita, meillä on oltava sen tunnistenumero (UID). UID: tä ja avainta käytetään sitten tietyn tunnistetietosektorin valtuuttamiseen lukemiseen/kirjoittamiseen. Tunnistetietojen lukeminen/kirjoittaminen tapahtuu aina kaikilla 16 tavulla tietyssä lohkossa. Tämä tarkoittaa, että tyypillinen sovellus lukee datalohkon, muokkaa tietoja halutulla tavalla ja kirjoittaa sitten uudet tiedot takaisin tunnisteeseen.

Vaihe 8: Ohjelmisto

Keskeytyksenkäsittelyohjelmistoa kutsutaan aina, kun PIC UART vastaanottaa tavun dataa. Joissakin aiemmissa UART -projekteissani pystyin vain pollaamaan RX -keskeytyslipun sen sijaan, että tarvitsisin keskeytyksenkäsittelijää. Näin ei ole tämän ohjelmiston, varsinkin PN532: n, joka kommunikoi paljon korkeammalla tiedonsiirtonopeudella kuin RC522. RC522: n UART -rajapinta on rajoitettu 9600 baudiin, kun taas PN532: n oletusarvo on 115 k ja se voidaan asettaa jopa 1,288 Mt baudiksi. Vastaanotetut tavut tallennetaan puskurialueelle ja suurin osa ohjelmistosta hakee ne tarvittaessa.

New_Msg -lippu osoittaa, että tavuja on vastaanotettu, ja tavumäärä kertoo, kuinka monta. Olen sisällyttänyt ohjelmistoon Disp_Buff -rutiinin, jota voidaan kutsua näyttämään vastaanottopuskurin sisältö virheenkorjauksen aikana. Jotkut palautusviestit täyttävät tyypillisen 1602 -näytön, mutta minulla on 40 merkin kaksirivinen nestekidenäyttö, jonka löysin online -ylijäämäelektroniikka -sivustolta. "Max_Line" -määritys voidaan asettaa nestekidenäytön kokoon. Jos "Max_Line" saavutetaan, "Disp_Buff" -rutiini jatkuu kirjoittamalla toiselle riville. Voit lisätä tähän koodiin pienen koodin jatkaaksesi riveille kolme ja neljä, jos sinulla on 4-rivinen nestekidenäyttö. PN532: lle on lippu, joka voidaan asettaa siten, että rutiini joko tyhjentää kaikki vastaanotetut tavut tai vain tyhjentää 16 datatavua lukuvastauksesta.

Vastaanottopuskuria tai Byte_Countia ei tarvitse tyhjentää, koska New_Msg -lipun poistaminen saa keskeytyksen käsittelijän tyhjentämään Byte_Countin, ja sitä käytetään puskurin indeksinä. New_Msg poistetaan yleensä ennen jokaista komentovaihetta, jotta kyseiseen komentoon liittyvät tulokset voidaan helposti löytää ja tarkistaa. RC522: ssa tämä tarkoittaa, että vastaanottopuskurissa on yleensä vain 1 - 4 tavua. Joissakin tapauksissa, kuten datalohkon lukemisessa, Read_FIFO -komento on annettava useita kertoja, jotta tavut voidaan siirtää FIFO: sta vastaanottopuskuriin. Kaikki PN532 -komennon tulokset päätyvät vastaanottopuskuriin, joten tarkistus suoritetaan tarvittavien tavujen paikantamiseksi.

Ohjelmiston pääsilmukka etsii tunnistetta ja todentaa sen sitten lukemista/kirjoittamista varten. Tässä mukana olevassa testiohjelmistossa muuttuja Junk_Num muuttuu joka kerta pääsilmukan kautta ja sitä käytetään tagille kirjoittamisen aikana. Kirjatut arvot vaihtelevat Junk_Num -arvon ja Junk_Num 1 -komplementin välillä. Lopuksi 16 kirjoitettua arvoa luetaan ja näytetään. Jokaisessa vaiheessa on näyttöviestejä, joissa on viivästettyjä rutiinipuheluita, jotta jokainen viesti voidaan lukea. Virheilmoituksia annetaan myös, mutta niiden pitäisi yleensä ilmetä vain, jos tagi poistetaan toiminnon aikana.

Osa ohjelmiston alustuksesta on koodiosa, joka suoritetaan vain käynnistyksen yhteydessä ja ohitetaan, jos havaitaan ohjelmiston nollaus. Virheilmoitukset päättyvät yleensä ohjelmiston nollaamiseen keinona poistua pääsilmukasta. Nollaus tapahtuu "Kallistus" -rutiinissa, joka yksinkertaisesti ottaa käyttöön Watchdog -ajastimen ja menee sitten äärettömään silmukkaan odottamaan aikakatkaisua.

Vaihe 9: Ainutlaatuinen ohjelmisto MFRC522

RC522-siru vaatii enemmän matalan tason ohjeita kuin PN532-siru kommunikoidakseen tunnisteilla. Se on kuin ohjelmointi kokoonpanokielellä verrattuna ohjelmointiin "C". Toinen merkittävä ero on se, että RC522 edellyttää, että kommunikointi tunnisteen kanssa ohjataan FIFO -puskurin kautta. Rutiinit "Write_FIFO" ja "Read_FIFO" hoitavat nämä tehtävät. MFRC522-ohjelmisto sisältää osan monista alemman tason komennoista, joista päätoiminnot on rakennettu.

Tunnistekomennon tarkistussumman laskenta RC522: lle on hyvin erilainen kuin PN532: lle. Kun tagikomento on rakennettu FIFO -järjestelmään, moduulikomento lähetetään tarkistussumman laskemiseksi. 16-bittistä tulosta ei liitetä automaattisesti tag-komentoon, mutta se on luettavissa kahdesta 8-bittisestä rekisteristä. Tarkistussumman laskeminen pyyhkii FIFOn tiedot, joten vaadittu järjestys on seuraava:

· Luo komento FIFOon

· Ohjaa tarkistussumman laskeminen

· Luo komento uudelleen FIFOon

· Lue CRC -rekisterit ja kirjoita tarkistussummat tavua FIFOlle

· Lähetä joko Vastaanota tai Todenna -komento

Siirrä -komento lähettää FIFO -puskurin ja siirtyy sitten automaattisesti vastaanottotilaan odottamaan tunnisteen vastausta. Siirrä -komentoa on seurattava StartSend -bitin asetuksella BitFramingRegisterissa, jotta tiedot todella lähetetään. Authenticate -komennolla ei ole tätä vaatimusta.

Yleensä verkossa saatavilla olevat Arduinon C -koodisovellukset käyttävät keskeytyslippurekistereitä ja aikakatkaisurekisteriä varmistaakseen, että oikea vastaus vastaanotetaan ajoissa. Mielestäni tämä on liikaa tähän ei-kriittiseen sovellukseen. Sen sijaan odotan vastausta lyhyillä ohjelmiston aikakatkaisuilla ja varmistan sitten, että se on oikein. Mifare -tunnisteiden käsikirjassa kuvataan yksityiskohtaisesti eri tapahtumien ajoitus ja aika on myös sallittu odotetun tavumäärän vastaanottamiseksi. Nämä aikaviiveet on sisällytetty useimpiin matalan tason komentoaliohjelmiin.

Vaihe 10: Ainutlaatuinen PN532 -ohjelmisto

Kun moduuli on alustettu, tagin etsimiseen ja todentamiseen tarvittavat vaiheet suoritetaan kirjoittamalla sopiva komento ja tarvittavat tiedot. Skannauskomento palauttaa UID: n, jota käytetään sitten todennukseen. Tämän jälkeen tagin lukeminen ja kirjoittaminen lähettää tai palauttaa osoitetulle datalohkolle 16 tavua.

Alustusjärjestys oli yksityiskohtainen aiemmin ja sama ohjelmistorutiini lähettää myös SAMConfiguration -komennon saadakseen moduulin pois LowVbat -tilasta. Loput peruskomennot, kuten skannaus, todennus, luku/kirjoitusmerkki, on rakennettu peräkkäin sovellettaviin rutiineihin. Tarkistussumma lasketaan vain lisäämällä komento tavut, tekemällä täydennys ja lisäämällä sitten 1, jotta siitä tulee 2: n täydennys. 8-bittinen tulos liitetään komentojonoon juuri ennen postamblea.

RC522: ssa ei ole FIFO: ta, joten kaikki vastausviestit vastaanotetaan automaattisesti. "Find_Response" -rutiini skannaa TFI: n vastaanottodatapuskurin (0xD5). Rutiini hyödyntää tietää, mitä odotettujen viestien pitäisi olla, ja jättää huomiotta yksinkertaiset ACK -vastaukset, jotka eivät sisällä tietoja. Kun TFI on löydetty, halutut vastaukset ovat sen tiedossa. "Read_Buff" -rutiini tallentaa komentokaiku- ja komentotilan tavut myöhempää vahvistusta varten.

Siinä tämä postaus. Tutustu muihin elektroniikkaprojekteihini osoitteessa: www.boomerrules.wordpress.com

Suositeltava: