
Jos olet joskus käynyt supermarketin itsepalvelukassalla ja nähnyt, kuinka kaikki tuotteet ilmestyvät automaattisesti näytölle , kun asetat ne tarjottimelle , olet jo nähnyt RFID:n toiminnassa. Se ei ole taikuutta tai teknologista telepatiaa: se on radiotaajuuspohjainen järjestelmä, jonka avulla voit tunnistaa esineitä ilman suoraa kosketusta, ja voit kopioida sen kotona yksinkertaisella Arduinolla ja edullisella lukijalla, kuten RC522:lla.
Tässä oppaassa opit askel askeleelta, kuinka käyttää Arduinoa ja RC522 RFID-lukijaa tunnisteiden lukemiseen ja kirjoittamiseen, ymmärrät tarkalleen, mitä RFID on, millaisia järjestelmiä on olemassa, miten passiiviset kortit saavat virtansa, miten MIFARE Classic 1K -kortin muisti on järjestetty ja miten rakentaa reaalimaailman projekteja, kuten kulunvalvontajärjestelmä tai ladattava matkakortti. Asetu mukavasti, sillä aiomme perehtyä aiheeseen perusteellisesti, mutta selkeästi ja helposti lähestyttävästi.
Mitä on RFID-teknologia ja miten se toimii?
Radiotaajuustunnistus eli RFID on järjestelmä, jonka avulla esineet voidaan tunnistaa radioteitse lähetetyn yksilöllisen tunnisteen avulla. Tätä tunnistetta kutsutaan yleensä UID:ksi (Unique ID), ja sitä voidaan pitää tunnisteen tunnuksena. Koko järjestelmä koostuu kahdesta pääelementistä: RFID-tunnisteesta (tai transponderista) ja RFID-lukijasta (lähetin-vastaanottimesta).
RFID-tunnisteita on saatavilla monissa eri muodoissa: luottokortin kaltaisissa muovikorteissa, avaimenperässä, tuotteisiin varkauksien estämiseksi kiinnittyvissä tarroissa ja jopa eläinten ihon alle istutettavissa tunnistamista varten tarkoitetuissa siruissa. Sisäisesti niillä kaikilla on samat komponentit: antenni ja pieni siru, joka tallentaa tietoa ja kommunikoi lukijan kanssa.
Saatavilla on vain luku -tunnisteita, joiden UID on tehtaalla ohjelmoitu eikä sitä voi muokata, ja luku-/kirjoitustunnisteita, joihin sopiva lukija, kuten RC522-moduuli, voi sekä lukea että kirjoittaa tietoja . Tämä mahdollistaa sovellukset, kuten ladattavat matkakortit, prepaid-saldoilla varustetut kulunvalvontajärjestelmät, työajanseurantajärjestelmät ja paljon muuta.
Toisaalta meillä on RFID-lukija tai lähetin-vastaanotin. Tämä laite ei ainoastaan vastaanota dataa, vaan myös lähettää radiotaajuisen sähkömagneettisen kentän . Tämä kenttä on avainasemassa sen ymmärtämisessä, miten passiiviset tunnisteet saavat virtansa ja miten tietoa vaihdetaan kortin ja lukijan välillä.
RFID-tunnisteiden virtalähde ja toimintaperiaate
Hyvin yleinen kysymys kuuluu: jos supermarkettien tuotteiden tai kulkukorttien RFID-tarroissa ei ole paristoja, mistä ne saavat energiansa toimiakseen? Olennaista on, että monet näistä tunnisteista ovat passiivisia ja saavat virtansa lukijan synnyttämän sähkömagneettisen induktion avulla.
Kun tuot passiivisen tunnisteen lähelle lukijaa, sen antenni joutuu moduulin tuottamaan sähkömagneettiseen kenttään (esimerkiksi RC522:n tapauksessa 13,56 MHz:n taajuudella). Tämä kenttä indusoi tunnisteen antenniin virran, jota käytetään sisäisen sirun hetkelliseen virransyöttöön . "Herätessään" siru moduloi lukijalle lähettämäänsä signaalia (tätä kutsutaan takaisinhajonnaksi) koodaamalla UID:n ja tarvittaessa muita muistiin tallennettuja tietoja.
Toisin kuin infrapunateknologiassa, tunnisteen ja lukijan välillä ei tarvita suoraa näköyhteyttä : radiotaajuus voi läpäistä tiettyjä materiaaleja, vaikka sen käyttäytyminen riippuukin taajuudesta, metallin, veden jne. läsnäolosta. Lukija tallentaa takaisin siroavan signaalin, tulkitsee sen ja lähettää sitten tiedot mikrokontrollerille (kuten Arduino, ESP8266 tai ESP32) tai tietokoneelle.
RFID-järjestelmien tyypit taajuuden mukaan
Radiotaajuusspektri on hyvin laaja, eivätkä radioaallot käyttäydy samalla tavalla kaikilla taajuuksilla . Siksi RFID:ssä käytetään eri taajuuksia sovelluksesta riippuen. Lukijan ja tunnisteen on oltava suunniteltu toimimaan samalla taajuudella, aivan kuten radion on virittäydyttävä oikealle asemalle.
Yleisesti ottaen RFID-järjestelmät voidaan ryhmitellä kolmeen pääluokkaan niiden käyttämän taajuusalueen mukaan:
- Matala taajuus (LF)noin 125–134 kHz.
- Korkea taajuus (HF)noin 13,56 MHz, johon sisältyvät sellaiset teknologiat kuin MIFARE ja NFC.
- Erittäin korkea taajuus (UHF)noin 433 MHz:n ja 860–960 MHz:n välillä.
Matalataajuiset (LF) RFID-järjestelmät
Matalataajuisilla RFID-järjestelmillä on suhteellisen pitkä aallonpituus, minkä ansiosta ne tunkeutuvat paremmin ohuisiin materiaaleihin ja runsaasti vettä sisältäviin esineisiin , kuten hedelmiin tai juomiin. Ne toimivat myös kohtuullisen hyvin ohuiden metallien lähellä.
Tällä edulla on kuitenkin merkittäviä rajoituksia: tyypillinen kantama on vain muutama senttimetri ja tiedonsiirtonopeus on alhainen, mikä johtaa pienempään muistikapasiteettiin ja korkeampiin tunnistekustannuksiin . Näitä järjestelmiä käytetään yleisesti yksinkertaiseen kulunvalvontaan, vanhempiin läheisyysavaimiin ja eläinten merkitsemiseen.
Korkeataajuiset (HF) RFID- ja NFC-järjestelmät
Korkeataajuuskaista, 13,56 MHz, on luultavasti suosituin "valmistajien" ja tee-se-itse-projektien tasolla, koska siellä käytetään MIFARE-kortteja ja NFC-teknologiaa (Near-Field Communication) , joita monet matkapuhelimet käyttävät lähimaksuihin.
HF-järjestelmät toimivat hyvin metallin lähellä ja kohtalaisessa tai korkeassa vedenkorkeudessa, ja niiden kantama on yleensä muutamasta senttimetristä noin metriin ihanteellisissa olosuhteissa. Tiedonsiirtonopeudet ovat edelleen vaatimattomia, mutta riittävät tunnistamiseen, pääsyyn ja pieniin tiedonsiirtosovelluksiin. Monet maailmanlaajuiset standardit perustuvat HF-teknologiaan, mikä helpottaa laitteiden ja korttien yhteentoimivuutta.
Erittäin korkeataajuiset (UHF) RFID-järjestelmät
Spektrin toisessa ääripäässä ovat UHF-järjestelmät, jotka pystyvät ulottumaan muutamasta senttimetristä yli 20 metriin. Ne sopivat erinomaisesti tilanteisiin, joissa useita tunnisteita on luettava nopeasti ja etäältä , esimerkiksi varastonhallintaan varastoissa, ihmisten laskemiseen tapahtumissa tai urheilijoiden ajanottoon heidän ylittäessään maaliviivan kilpailuissa.
Haittapuolena on, että lyhyemmän aallonpituuden vuoksi signaali vaimenee enemmän ja tunkeutuu metalliin ja veteen heikommin . Silti niitä käytetään laajalti tietullijärjestelmissä, pysäköinnin kulunvalvonnassa ja laajamittaisen logistiikan seurannassa.
RC522 RFID-moduuli: ominaisuudet ja nastat
Arduino-projekteissa yksi suosituimmista lukijoista on NXP MFRC522 -piiriin perustuva RC522. Se on erittäin edullinen ja laajalti käytetty moduuli, joka toimii korkealla taajuudella (13,56 MHz) MIFARE-korttien kanssa ja mahdollistaa sekä yhteensopivien tunnisteiden lukemisen että niihin kirjoittamisen.
Se myydään yleensä pakettina, joka sisältää itse lukijan, luottokortin ja RFID-avaimenperän. Nämä kortit ovat tyypillisesti 1K tai 4K MIFARE Classic -kortteja, jotka ovat erittäin suosittu standardi liikenteessä, kulunvalvonnassa ja edullisissa ratkaisuissa. RC522 tuottaa HF-sähkömagneettisen kentän, ja käytännössä sen käyttökelpoinen kantama on noin 3–5 cm, vaikka teoriassa se voi ulottua jonkin verran pidemmälle.
Mikrokontrollerin kanssa kommunikoinnin osalta RC522 on ensisijaisesti integroitu SPI:n (Serial Peripheral Interface) kautta ja tukee jopa 10 Mbps:n nopeuksia. Se tukee myös I2C:tä ja UART:ia, vaikka useimmissa Arduino-projekteissa käytetään SPI:tä sen suuremman nopeuden ja yksinkertaisuuden vuoksi tässä yhteydessä.
Sähköisesti moduuli toimii 2,5 V:n ja 3,3 V:n syöttöjännitteellä. Levyllä on yleensä selvästi merkitty VCC-nasta 3,3 V:n liitäntää varten. Älä syötä siihen suoraan 5 V:n virtaa , sillä se voi vaurioitua. Positiivista on, että logiikkatasot yleensä sietävät 5 V:n jännitteen, joten se voidaan kytkeä Arduino UNO:n digitaalinastoihin ilman tasomuuntimia perustestausta varten, vaikka ammattimaisessa suunnittelussa tasojen sovittaminen on suositeltavaa.
RC522-moduulin kiinnittäminen
Tyypillisessä RC522:ssa on kahdeksan liitäntänastaa mikrokontrolleriin:
- VCCvirtalähde, 2,5 V ja 3,3 V välillä.
- RST: nollausnasta; mahdollistaa moduulin sammuttamisen ja uudelleenkäynnistyksen asettamalla tasoksi MATALA/KORKEA.
- GND: maan massa tai viite.
- IRQ: keskeytyspinni, joka voi hälyttää mikrokontrolleria, kun tunniste saapuu lukijakenttään.
- MISO / SCL / TXmonitoiminasta; kuten MISO SPI:ssä, kuten SCL I2C:ssä tai kuten TX UART:ssa.
- VITKASTELLA: lähtödatalinja master-laitteesta orja-laitteeseen SPI:n kautta.
- SCKSPI-liitännän kello.
- SS / SDA / RX: orjan valintanasta SPI:ssä, SDA I2C:ssä tai RX UART:ssa.
Arduino UNO:ssa ja muissa ATmega328P-pohjaisissa piirilevyissä SPI-nastat on jo määritelty laitteistolla, joten tyypillinen kytkentäkaavio SPI:n käyttämiseksi on:
- VCC → 3,3 V Arduinosta.
- GND → Arduinon maadoitus.
- SCK → UNO/Nanon nasta 13.
- VITKASTELLA → UNO/Nanon nasta 11.
- Miso → UNO/Nanon nasta 12.
- SS (SDA) → pinni 10 (tai se, jonka valitset SS:ksi, mutta sinun on määriteltävä se koodissa).
- RST → esimerkiksi Arduinon pinni 9.
- IRQ → Valinnainen, voidaan jättää kytkemättä, jos keskeytystä ei käytetä.
Arduino Megan, Leonardon tai Micron kaltaisilla piirilevyillä SPI-linjat voivat olla eri nastojen päällä tai ICSP-liittimessä, joten on tärkeää tarkistaa virallisen dokumentaation vastaavuustaulukko ennen minkään kytkemistä.
MFRC522-kirjaston asentaminen ja perustunnisteiden lukeminen
Vaikka MFRC522 voidaan ohjelmoida alusta alkaen, sen sisäinen kommunikaatio on melko monimutkaista, joten on yleistä käytäntöä käyttää Miguel Balboan kehittämää kirjastoa , joka on saatavilla GitHubissa ja Arduino IDE:n kirjastonhallinnassa. Tämä kirjasto sisältää kaikki tarvittavat toiminnot lukijan alustamiseen, korttien havaitsemiseen, sektorien todentamiseen sekä lohkojen lukemiseen tai kirjoittamiseen.
Asentaaksesi sen Arduino IDE:stä, avaa vain Kirjaston hallinta, etsi "MFRC522" ja valitse yhteisön ylläpitämä versio (GitHub Community) . Sinun on myös sisällytettävä SPI-kirjasto, joka on jo mukana IDE:ssä.
Asennuksen jälkeen tyypillinen työnkulku yksinkertaisessa luonnoksessa etiketin UID:n lukemiseksi on:
- Sisällytä kirjakaupat SPI.hy MFRC522.h.
- Määrittele lukijan käyttämät RST- ja SS-nastat.
- Luo MFRC522-objekti välittämällä sille nuo nastat.
- Setup()-kohdassa alusta sarjaportti, SPI ja lukija seuraavasti: PCD_Init().
- Käytä silmukassa() PICC_IsNewCardPresent() selvittääkseen, onko lähellä korttia ja PICC_LueKortinSarja() lukemaan perustietojasi.
- Käytä UID:tä käyttämällä mfrc522.uid.uidByte ja kokoon mfrc522.uid.size-tiedostolla.
- Lopeta viestintä etiketin kanssa soittamalla PICC_HaltA().
Tämän tyyppinen luonnos sopii täydellisesti useiden korttien tai avaimenperien UID-tunnisteiden hankkimiseen ja nopeiden testien suorittamiseen esimerkiksi yksinkertaisessa pääsynvalvonnassa, jossa vain luettua UID-tunnistetta verrataan valtuutettujen UID-tunnisteiden luetteloon.
MIFARE Classic 1K -korttien muistirakenne
RC522:n mukana yleensä tulevat kortit ovat MIFARE Classic 1K -muistikortteja. Näissä korteissa on 1 kilotavu muistia, joka on järjestetty hierarkkisesti sektoreihin ja lohkoihin, ja niissä on melko erikoinen avain- ja käyttöoikeusjärjestelmä, joka tulisi ymmärtää ennen minkään kirjoittamista.
Kokonaismuisti on jaettu 16 sektoriin, jotka on numeroitu 0:sta 15:een. Jokainen sektori sisältää neljä lohkoa, jotka on merkitty sektorin sisällä numeroilla 0–3. Jokainen lohko tallentaa 16 tavua dataa eli 16 paikkaa, jotka on numeroitu 0:sta 15:een, joten jokainen sektori tarjoaa 64 tavua.
Näistä neljästä sektoria kohden olevasta lohkosta vain kolme on tarkoitettu käyttäjätietojen tallentamiseen: kunkin sektorin lohkot 0, 1 ja 2 (lukuun ottamatta sektoria 0, jolla on erityisominaisuuksia). Kunkin sektorin viimeinen lohko, lohko 3, tunnetaan trailer-lohkona . Se tallentaa salausavaimet ja käyttöbitit, jotka ohjaavat kyseisessä sektorissa sallittuja toimintoja.
Trailerissa 16 tavua on jaettu seuraavasti:
- Avain A: 6 tavua.
- Käyttöehdot3 tavua, jotka määrittävät luku-/kirjoitusoikeudet, todennuksen ja avaimen näkyvyyden.
- Käyttämätön tavu (U): 1 tavu, jota ei käytetä.
- Näppäin B: 6 tavua.
Tehtaalta moduulien mukana tulevissa korteissa avain A ja avain B on yleensä alustettu muotoon FF FF FF FF FF FF , mikä on erittäin epävarmaa, koska kuka tahansa standardin tunteva voi todentaa kortin ja muokata sen sisältöä. Tee-se-itse-projekteissa on suhteellisen yleinen käytäntö käyttää samoja avaimia kaikilla sektoreilla, vaikka todellisen turvallisuuden takaamiseksi olisi parempi hajauttaa niitä.
Lisäksi sektorin 0 lohko 0 on erityinen: se tallentaa kortin UID:n (yleensä 4 tavua näissä MIFARE Classic -korteissa) ja valmistajan tiedot. Käytännössä tätä lohkoa pidetään vain luku -tilassa; sen muokkaaminen voi peruuttamattomasti vahingoittaa korttia.
Vaihda sektorin näppäimet A ja B
Jos haluat käyttää MIFARE-korttia Arduino- ja RC522-projektissa millään mielekkäällä tavalla, sinun tulee ensin vaihtaa oletusavaimet . Tämä estää ketään, jolla on lukija ja vakiokirjasto, peukaloimasta korttiasi luvattomasti.
Tietyn sektorin (esimerkiksi sektorin 15) avainten päivittämisen perusajatus on seuraava:
- Määritä koodin nykyiset avaimet (tehdasasetukset, jos niitä ei ole muutettu).
- Määrittele uudet avainsanat A ja B, joita haluat käyttää kyseisessä sektorissa.
- Laske kyseisen sektorin perävaunulohkon numero, joka on sektori * 4 + 3 (sektorille 15, lohkolle 63).
- Todenna ensin nykyisellä avaimella A käyttämällä PCD_Todennus() trailerilohkosta.
- Lue trailerin lohko MIFARE_Luettu() saadaksesi sisältösi.
- Muokkaa puskurissa olevia uusia avaimia vastaavia tavuja.
- Todenna uudelleen tarvittaessa (esimerkiksi avaimella B).
- Kirjoita päivitetty trailerilohko seuraavasti: MIFARE_Write().
Tämän prosessin aikana on erittäin tärkeää olla siirtämättä korttia lukijasta ennen kuin toiminto on valmis , koska keskeytynyt kirjoitus trailer-lohkoon voi tehdä sektorista käyttökelvottoman. Kun avaimet on vaihdettu, sinun on myös päivitettävä Arduino-koodi käyttääksesi näitä uusia avaimia tulevissa toiminnoissa kyseisellä sektorilla.
Luku- ja kirjoituslohkot: matkakortin simulointi
Hyvin havainnollistava MIFARE Classic -kortin lukemisen ja kirjoittamisen sovellus on ladattavan julkisen liikenteen kortin toiminnan simulointi . Idea on yksinkertainen: kortti tallentaa tietyn määrän matkoja tiettyyn lohkoon, ja järjestelmä antaa sinun ladata matkoja (lataa uudelleen) tai käyttää niitä (vahvistetaan bussiin tai raitiovaunuun noustessa).
Tätä tarkoitusta varten sektori 15 voitaisiin varata esimerkiksi käyttäjädatalle, ja yhtä sen datalohkoista (esimerkiksi lohkoa 60) voitaisiin käyttää matkalaskurin tallentamiseen. Käytettävissä olevien matkojen määrä tallennetaan lohkon tavuun 0. Lohkon jäljellä olevia tavuja voitaisiin käyttää muulle datalle tai ne voitaisiin yksinkertaisesti jättää nollaksi.
Tyypillinen koodinkulku uudelleenlatausosuudelle olisi seuraava:
- Määritellä Avain A ja avain B nykyiset kyseistä toimialaa suojaavat säännökset (esimerkiksi ne, joita muutimme edellisessä vaiheessa).
- Määrittele sektorinumero, datalohko (60) ja trailerlohko (63).
- Määrittele 16-tavuinen taulukko (blockData), jossa ensimmäinen tavu edustaa matkojen lukumäärää.
- Joka kerta, kun kortti tuodaan lukijan lähelle, Lue lohko 60 käyttämällä MIFARE_Read()-funktiota nykyisten matkojen hakemiseen.
- Lisää lukemaan latauskertojen määrä (esimerkiksi 10).
- Päivitä tiedot. Estä uusi matkojen määrä.
- Todenna avain A:lla vastaavaa perävaunulohkoa vasten.
- Kirjoita lohko 60 seuraavasti: MIFARE_Write().
- Lue uudelleen varmistaaksesi, että arvo on päivittynyt oikein.
Matkakulutuksen osalta (validoiminen väylässä) koodi on käytännössä identtinen, mutta yhteenlaskun sijaan laskurista vähennetään yksi. Ennen vähentämistä tarkistetaan, onko luettu arvo nolla: jos matkoja ei ole jäljellä, pääsy evätään ja käyttäjää pyydetään lataamaan laskuri uudelleen . Jos laskuri on suurempi kuin nolla, sitä vähennetään, lohko kirjoitetaan uudelleen ja jäljellä olevien matkojen lukumäärä näytetään näytöllä.
Molemmissa tapauksissa on tärkeää käsitellä MFRC522-kirjastofunktioiden paluukoodit (esim. todennus- tai kirjoitusvirheet) oikein ja pysäyttää aina salattu tietoliikenne PCD_StopCrypto1()-funktiolla ja itse kortti PICC_HaltA()-funktiolla jokaisen syklin lopussa.
Yksinkertainen UID:hen perustuva pääsynhallinta
Toinen klassinen RC522:ta ja Arduinoa hyödyntävä projekti on peruskäyttöoikeusjärjestelmä , jossa pääsy sallitaan tai evätään esitetyn piirilevyn UID:n perusteella. Tämä lähestymistapa ei käytä piirilevyn sisäistä muistia, vain sen yksilöllistä tunnistetta, ja on siksi turvallisuudeltaan melko rajallinen, mutta se toimii nopeana esimerkkinä.
Tyypillinen lähestymistapa on:
- Lue kortin UID käyttämällä kirjaston perusfunktioita (PICC_IsNewCardPresent, PICC_ReadCardSerial jne.).
- Kopioi luetun UID:n tavut väliaikaiseen taulukkoon (esim. ActualUID).
- Määrittele koodissa useita taulukoita, jotka sisältävät valtuutettujen korttien UID:t (esimerkiksi Käyttäjä1, Käyttäjä2).
- Luo tavutaulukon vertailufunktio, joka palauttaa totta, jos molemmat ovat identtisiä.
- Vertaa ActualUID:tä kuhunkin valtuutettuun UID:hen ja jos jokin niistä vastaa toisiaan, aktivoi digitaalinen lähtö, näytä "Pääsy myönnetty" -viesti tai aktivoi sähkölukko.
- Jos mikään niistä ei vastaa asetuksia, näytä teksti ”Pääsy estetty” ja pidä järjestelmä suljettuna.
Todellisessa ympäristössä tällainen järjestelmä on altis tunnisteiden kloonaukselle, koska monet edulliset lukijat sallivat UID-tunnusten kopioinnin tai emuloinnin. Tietoturvan lisäämiseksi olisi käytettävä kortin sisäistä muistia, mukautettuja avaimia ja mahdollisesti MIFARE Classicia vankempia kryptografisia mekanismeja, joiden turvallisuutta tällä hetkellä kyseenalaistetaan laajalti. Silti se toimii erinomaisena pedagogisena esimerkkinä kortinlukutyönkulun oppimiseen ja fyysisten toimilaitteiden integrointiin.
Kaiken edellä mainitun avulla sinulla on nyt vankka ymmärrys RFID-tekniikan keskeisistä käsitteistä, ymmärrät eri taajuusalueiden käyttäytymisen, tunnet MIFARE Classic 1K -kortin sisäisen toiminnan, hallitset RC522-moduulin perusliitännät ja käytön Arduinon kanssa ja olet nähnyt yksityiskohtaisesti, miten lohkoja luetaan ja kirjoitetaan todellisten järjestelmien, kuten kulunvalvonnan tai matkakorttien, luomiseksi . Tästä eteenpäin seuraava luonnollinen askel on yhdistää RFID muihin moduuleihin (LCD-näytöt, releet, Wi-Fi, pilvitietokannat) ja oppia ohjaamaan älylamppuja rakentaaksesi kattavampia ratkaisuja, jotka ovat entistäkin lähempänä ammattimaisia järjestelmiä, joita näet joka päivä kaupoissa, julkisessa liikenteessä ja kontaktittomissa maksulaitteissa.
