Použití NFC po 1-Wire sběrnici (DS2401)

Použití NFC po 1-Wire sběrnici (DS2401)

You are here:
< Zpět

Další zajímavý projekt postavený na Arduinu, který bych zde rád představil, integruje čtení NFC karet.

Zdrojové kódy

http://jirin.deso.cz/NFC_to_1-Wire/

Video tutoriál

Potřebný hardware

Pro výrobu toho modulu budete potřebovat Arduino, doporučuji Pro Mini či Nano kvůli velikosti (lze je bez problémů strčit do krabice).


Odkazy na zakoupení:
https://www.aliexpress.com/wholesale?SearchText=arduino+pro+mini+5v+atmega328
https://www.aliexpress.com/wholesale?SearchText=arduino+nano

Další důležitá věc je čtečka NFC karet, tento projekt je postaven na PN532:

Odkaz na Aliexpress: https://www.aliexpress.com/wholesale?SearchText=pn532

Zapojení

Arduino je potřeba s čtečkou propojit pomocí 6ti drátů.

  • VCC čtečky jde na 5 V Arduina
  • GND čtečky jde na GND Arduina
  • SS čtečky => pin D9 Arduina
  • MOSI čtečky => pin D10 Arduina
  • MISO čtečky => pin D11 Arduina
  • SCK čtečky => D12 Arduina

Čtečku je nutné přepnout do SPI módu pomocí malých přepínačů:

Dále jsou používány piny D4–D8, ale záleží na tom, jaké módy se rozhodnete používat (zmíněno níže). Zde je standardní stav, pokud jsou povoleny všechny módy a piny nejsou změněny:

  • D8 – 1-Wire výstup (připojit na 1-Wire extension)
  • D7 – pulzní výstup
  • D6 – načtena neznámá karta
  • D5 – načtena validní karta
  • D4 – čtečka je v učícím se režimu + notifikace o nově naučené kartě (připojit na notifikační diodu)

Módy, možnosti použití

Je možné využívat 4 různých módů, které lze libovolně kombinovat.

ONE_WIRE_MODE

Tento mód je víceméně primární, kvůli kterému byla aplikace původně vyvinuta. Pokud je povolen, tak se Arduino po načtení karty vydává za DS1990 / DS2401 1-Wire zařízení. Při použití Mifare Classic (4 byty) se vyplní byty 2 a 3 hodnotou 0x00, pro Mifare Ultralight (7 bytů) je nutné přeskočit jeden byte, takže se vynechá první. Simulované 1-Wire zařízení lze zachytit pomocí Loxone 1-W extension, ale třeba také i pomocí UDP 1-W gateway.

PULSE_MODE

Pokud je tento mód aktivován dochází k pulzu na pinu 7. Důvod proč byl uveden byl požadavek na identifikaci specifické čtečky (při použití více čteček).

DB_MODE

Pomocí tohoto módu si můžete do Arduina definovat svoje karty. Jsou využívány piny 5 a 6, kdy se podle toho, jestli je načtena známá či neznámá karta, pošle pulz na jeden z nich. Takto vydefinované karty lze pak použít v následujícím „učícím se“ módu jako tzv. master karty.

LEARNING_MODE

Tento mód je nutné provozovat s předchozím (DB_MODE). Funguje tak, že je možné Arduino učit nové karty, bez toho, aby bylo nutné pokaždé do modulu nahrát nový sketch s aktualizovaným seznamem karet. Postup učení je následující:

  1. Na čtečku se přiloží master karta (definovaná v DB_MODE)
  2. Po 10ti vteřinách se rozsvítí notifikační dioda (výstup D4)
  3. Během 60 sekund je nutné na čtečku přiložit novou kartu
  4. Dojde k trojbliku diody a v tento okamžik je karta uložena do EEPROM

Vzhledem k limitu velikosti EEPROM je maximální limit 100 karet.

Zapnutí / vypnutí módů

Logiku sketche lze jednoduše ovlivnit pomocí řádků:

#define ONE_WIRE_MODE
#define PULSE_MODE
#define DB_MODE
#define LEARNING_MODE

Pokud chcete použít kupříkladu jen 1-Wire móde upravte tyto řádky na:

#define ONE_WIRE_MODE
//#define PULSE_MODE
//#define DB_MODE
//#define LEARNING_MODE

Použití v Loxone

NFC karty se vydávají za běžné DS1990 / DS2401 1-Wire zařízení a podle toho s nimi i Loxone pracuje. Stačí aktivovat 1-Wire monitor, přiložit kartu a přidat si ji jako nové zařízení.

S pulzními výstupy pak lze pracovat jako s každým jiným digitálním vstupem v Loxonu.

Další vývoj

Do budoucna uvažuji o verzi s rolling codes (do EEPROM a kartu se budou zapisovat náhodná čísla, která musí odpovídat).

Dále se zde určitě objeví i velmi příbuzný projekt, který s systémy řízení přístupů také velmi souvisí – klávesnice, která se také bude vydávat za DS1990 / DS2401. Bude ji tak možné velmi jednoduše integrovat, třeba i v jednom projektu s touto NFC čtečkou.

Autor článku a projektu: Jiří Jaša, http://www.deso.cz

Poslední úprava článku December 04, 2018

4 thoughts on “Použití NFC po 1-Wire sběrnici (DS2401)

  1. Čau.
    Pokoušel jsem se tvůj zdroják nahrát do Arduina (nano) ale nebyl jsem moc úspěšný. Při kompilaci mi to vyhazuje tyhle chyby:

    E:\Arduino\NFC-1.0.5\NFC\NFC.ino: In function ‘void loop()’:

    E:\Arduino\NFC-1.0.5\NFC\NFC.ino:201:40: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    dumpCard(“Received card:”, card, “”);
    ^
    E:\Arduino\NFC-1.0.5\NFC\NFC.ino:201:40: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]

    C:\Users\ABC\Documents\Arduino\libraries\Adafruit-PN532-master\Adafruit_PN532.cpp: In member function ‘uint8_t Adafruit_PN532::mifareclassic_WriteNDEFURI(uint8_t, uint8_t, const char*)’:

    C:\Users\ABC\Documents\Arduino\libraries\Adafruit-PN532-master\Adafruit_PN532.cpp:1056:53: warning: narrowing conversion of ‘(((int)len) + 5)’ from ‘int’ to ‘uint8_t {aka unsigned char}’ inside { } [-Wnarrowing]

    uint8_t sectorbuffer1[16] = {0x00, 0x00, 0x03, len+5, 0xD1, 0x01, len+1, 0x55, uriIdentifier, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
    ^

    C:\Users\ABC\Documents\Arduino\libraries\Adafruit-PN532-master\Adafruit_PN532.cpp:1056:72: warning: narrowing conversion of ‘(((int)len) + 1)’ from ‘int’ to ‘uint8_t {aka unsigned char}’ inside { } [-Wnarrowing]

    uint8_t sectorbuffer1[16] = {0x00, 0x00, 0x03, len+5, 0xD1, 0x01, len+1, 0x55, uriIdentifier, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
    ^

    C:\Users\ABC\Documents\Arduino\libraries\Adafruit-PN532-master\Adafruit_PN532.cpp: In member function ‘uint8_t Adafruit_PN532::ntag2xx_WriteNDEFURI(uint8_t, char*, uint8_t)’:

    C:\Users\ABC\Documents\Arduino\libraries\Adafruit-PN532-master\Adafruit_PN532.cpp:1424:8: warning: narrowing conversion of ‘(((int)len) + 5)’ from ‘int’ to ‘uint8_t {aka unsigned char}’ inside { } [-Wnarrowing]

    len+5, /* Payload Length (not including 0xFE trailer) */
    ^

    C:\Users\ABC\Documents\Arduino\libraries\Adafruit-PN532-master\Adafruit_PN532.cpp:1427:8: warning: narrowing conversion of ‘(((int)len) + 1)’ from ‘int’ to ‘uint8_t {aka unsigned char}’ inside { } [-Wnarrowing]

    len+1, /* Payload len */
    ^

    Tušíš co se m může nelíbit?
    Díky!

    1. Předpokládám, že sis stáhnul všechny knihovny. Podle popisů jde o konverzi datových typů. Osobně jsem to do Nano nahrával a když jsem měl stažené všechny knihovny, tak nebyl žádný problém…

  2. Jo, stahnul jsem knihovnu Adafruit-PN532 plus v IDE nainstaloval knihovny Wire.h a SPI.h.
    Mám taky nano, jel jsem podle návodu ale zarazil jsem se hned na začátku při kompilaci 🙁

  3. Díky za super stavebnici! Funkční a v nejbližších dnech budu integrovat do Loxone. Jsem zvědavý na další projekt (klávesnice). Však by mě zajímalo jak vymazat paměť EEPROM. Čtečka obsahuje 25 karet, už z výroby? Díky

Leave a Reply

Your email address will not be published. Required fields are marked *