NFC čtečka tagů je vstupní modul pro Arduino. Tato čtečka s obvodem PN532 pracuje na frekvenci 13.56 MHz a podporuje takzvané NFC tagy, kdy za tagy se považují všemožné RFID karty, žetony, samolepky atd. RFID bezdrátová komunikace se rozděluje dle použité frekvence na více kategorií, kdy pro jiná pásma byly již dříve vytvořeny návody, například tento pro 125kHz modul.
NFC čtečka PN532 umí komunikovat pomocí třech různých rozhraní: HSU, I2C a SPI. Pro přepnutí mezi jednotlivými sběrnicemi jsou na modulu dva přepínače, pomocí jejich kombinace zapnuto/vypnuto volíme danou sběrnici, přičemž já jsem pro tento návod použil I2C.
Pro napájení čtečky je možné použít jak napětí 3,3V, tak i 5V a proudový odběr se může dostat při aktivní komunikaci až na 150 mA.
Pro úspěšné propojení NFC čtečky s Arduinem stačí zapojit celkem čtyři vodiče. Propojíme GND se zemí Arduina, VCC s 3V3 Arduina, SDA s pinem A4 a SCL s pinem A5. A jak bylo zmíněno v úvodu, pro zvolení komunikace po I2C nastavíme přepínače na kombinaci „1|0“. Pro piny SDA a SCL musíme vybrat vždy vyhrazené I2C piny na námi vybrané desce, u Arduino UNO jsou to právě piny A4 a A5.
Pro úspěšné nahrání uvedeného ukázkového kódu je nutné stáhnout a naimportovat knihovnu PN532, návod, jak na to, je uveden zde.
Ukázkový kód obsahuje na svém začátku připojení potřebných knihoven. Poté vytvoříme nejprve instanci I2C komunikace pro čtečku PN532 a následně vytvoříme instanci NFC modulu s nastavenou I2C instancí.
V podprogramu setup v prvním kroku zahájíme komunikaci po sériové lince a poté komunikaci s NFC modulem. Jako další krok následuje uložení verze desky do lokální proměnné, která zároveň slouží jako kontrola připojeného modulu, jak můžete vidět v následující if podmínce. Pokud tedy není načtená verze platná, máme pravděpodobně chybu v zapojení a program se po vytištění hlášky zastaví. Pokud je ale verze načtena, vypíšeme si ji na sériovou linku a pokračujeme v programu. Dalším příkazem nastavíme maximální počet pokusů o načtení tagu v okolí, který s hodnotou 0xFF odpovídá přibližně jedné sekundě hledání. Po tomto nastavení už jen nakonfigurujeme NFC modul pro čtení a vytiskneme na sériovou linku hlášku o úspěšném nastavení.
Na začátku nekonečné smyčky loop si vytvoříme tři lokální proměnné, do kterých se budou ukládat výsledky měření. A za nimi následuje příkaz pro zahájení čtení, který svůj výsledek uloží do všech nastavených proměnných. Po ukončení čtení tedy zkontrolujeme proměnnou úspěch, která nám v případě hodnoty 1 označuje úspěšné čtení. Pokud se tedy tak stane, vypíšeme postupně získané informace jako je délka, tedy počet bytů UID a samotné UID v HEX formátu. A za tímto tiskem informací následuje už jen pauza po dobu jedné sekundy před novým během smyčky. Pokud ale čtení úspěšné nebylo, dostaneme se do else části podmínky, kde pouze vytiskneme informační hlášku o neúspěšném čtení.
// Arduino PN532 NFC čtečka karet // navody.dratek.cz // připojení potřebných knihoven #include <PN532_I2C.h> #include <PN532.h> #include <NfcAdapter.h> // vytvoření instance I2C komunikace pro PN532 PN532_I2C pn532i2c(Wire); // vytvoření instance PN532 NFC modulu PN532 nfc(pn532i2c); void setup() { // zahájení komunikace po sériové lince // s rychlostí 9600 baud Serial.begin(9600); // zahájení komunikace s NFC modulem nfc.begin(); // uložení verze desky pro kontrolu jejího připojení uint32_t versiondata = nfc.getFirmwareVersion(); // kontrola načtené verze NFC modulu if (!versiondata) { Serial.println("Nebyl nalezen PN53x modul!"); // zastavení programu while (1); } else { // vytištění informací o připojeném modulu Serial.print("Nalezen modul PN5"); Serial.println((versiondata >> 24) & 0xFF, HEX); Serial.print("Firmware verze "); Serial.print((versiondata >> 16) & 0xFF, DEC); Serial.print('.'); Serial.println((versiondata >> 8) & 0xFF, DEC); } // nastavení maximálního počtu pokusů o čtení NFC tagu, // odpovídá cca jedné sekundě nfc.setPassiveActivationRetries(0xFF); // konfigurace NFC modulu pro čtení tagů nfc.SAMConfig(); // vytištění informace o začátku čtení Serial.println("PN532 modul nastaven, prilozte tag..."); } void loop() { // vytvoření proměnných, do kterých se budou ukládat výsledky čtení boolean uspech; // úspěšné čtení uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // unikátní ID tagu uint8_t uidLength; // délka ID tagu // zahájení čtení tagů v okolí, výsledek čtení se uloží do nastavených proměnných uspech = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength); // pokud je čtení úspěšné, vypíšeme získané informace if (uspech) { Serial.println("Nalezen NFC tag!"); Serial.print("UID delka: "); Serial.print(uidLength, DEC); Serial.println(" bytu"); Serial.print("UID hodnoty: "); for (uint8_t i = 0; i < uidLength; i++) { Serial.print(" 0x"); Serial.print(uid[i], HEX); } Serial.println(""); // vyčkání jedné sekundy před novým čtením delay(1000); } else { // vytištění informace o vypršení času čtení Serial.println("Behem cteni nebyl prilozen zadny tag."); } }
Po nahrání ukázkového kódu do Arduino desky s připojenou NFC čtečkou PN532 dostaneme například tento výsledek:
Nalezen modul PN532 Firmware verze 1.6 PN532 modul nastaven, prilozte tag... Behem cteni nebyl prilozen zadny tag. Nalezen NFC tag! UID delka: 4 bytu UID hodnoty: 0xF2 0xE9 0xB2 0xC3 Nalezen NFC tag! UID delka: 4 bytu UID hodnoty: 0x56 0xAC 0x28 0x1F Behem cteni nebyl prilozen zadny tag.
NFC čtečka tagů PN532 je zajímavým komunikačním modulem, který nám umožňuje používat Arduino jako NFC čtečku. Díky podpoře velkého množství NFC standardů můžeme tuto čtečku používat s velkým množstvím tagů, přičemž tento modul umožňuje nejen číst, ale i zapisovat do různých částí tagů. Pokud máte zájem otestovat další funkce, doporučuji se podívat do příkladů v knihovně PN532.
Co se týká využití, tak díky tomu, že každý tag má své vlastní UID (unikátní identifikační číslo), tak můžeme podle něj vymýšlet různé kontrolní mechanismy. Jako je například vlastní Arduino trezor, docházkový systém či zabezpečovací systém. A co se týká čtecí vzdálenosti, tak ta se podle velikosti antény v tagu může pohybovat v milimetrech až jednotkách centimetrů.
Seznam použitých komponent:
https://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html
https://dratek.cz/arduino/2005-rfid-ic-ctecka-karet-13.56mhz-modul-pro-arduino-pn532-nfc.html