· 

PN5180(NFC Frontend)を使ってみる(1)

 

PN5180のボードを買ってみた。Amazonで1600JPYくらいで買えるもの。まずはArduinoを使って動かしてみる。Arduinoでは、ATrappmannって方がライブラリを作ってくれている(https://github.com/ATrappmann/PN5180-Library/tree/master)ので、まずはこれを利用してみる。このライブラリはArduinoの「ライブラリ管理」ではインストールできないので、手動で入れていく。まずはgithubからzipでダウンロードする(gitコマンド使えよって言わんでー)。
で、ArduinoIDEの環境設定
で、「スケッチブックの保存場所」ってのを覚える。
で、その場所にlibrariesってフォルダがあるので、そこに解凍すればいいわけだ。

では、ハード側の準備をするっス。ところで、ArduinoUNO R3,ArdinoUNO R4だと、IOの電圧が5Vで、PN5180のIOは3V系なのでちと困ったことになる。ATrappmannさんのreadmeではレベル変換回路を使っているけど、そいつはメンドクサイ。で、3.3VのArduinoを使えばいいじゃんってことで、今回はSeeeduino XIAO (SAMD)を使う。(最近は3.3VのArduinoハードも増えてきたので、まぁこの辺はラクになった。)
こうなる。NSS, BUSY, RSTはスケッチで指定できるのでどこでもいい。今回は
NSS--1
BUSY--2
RST--3
としている。SPIはSPIのポートで。
実際はこんな感じ。

では、スケッチを書く。ATrappmannさんのところにはISO14443の例がないので、
examples/PN5180-FeliCa/PN5180-FeliCa.ino
をベースにこれをいじって、結果、こうなる。(相変わらずのいきなり感)
  1. #include <PN5180.h>
  2. #include <PN5180ISO14443.h>
  3. #define PN5180_NSS 1
  4. #define PN5180_BUSY 2
  5. #define PN5180_RST 3
  6. PN5180ISO14443 nfc(PN5180_NSS, PN5180_BUSY, PN5180_RST);
  7. void setup() {
  8.   delay(10000);
  9.   pinMode(LED_BUILTIN,OUTPUT);
  10.   digitalWrite(LED_BUILTIN, HIGH);
  11.   Serial.begin(115200);
  12.   Serial.println(F("=================================="));
  13.   Serial.println(F("Uploaded: " __DATE__ " " __TIME__));
  14.   Serial.println(F("PN5180 ISO14443 Test Sketch"));
  15.   nfc.begin();
  16.   Serial.println(F("----------------------------------"));
  17.   Serial.println(F("PN5180 Hard-Reset..."));
  18.   nfc.reset();
  19.   Serial.println(F("----------------------------------"));
  20.   Serial.println(F("Reading product version..."));
  21.   uint8_t productVersion[2];
  22.   nfc.readEEprom(PRODUCT_VERSION, productVersion, sizeof(productVersion));
  23.   Serial.print(F("Product version="));
  24.   Serial.print(productVersion[1]);
  25.   Serial.print(".");
  26.   Serial.println(productVersion[0]);
  27.   if (0xff == productVersion[1]) { // if product version 255, the initialization failed
  28.     Serial.println(F("Initialization failed!?"));
  29.     Serial.println(F("Press reset to restart..."));
  30.     Serial.flush();
  31.     exit(-1); // halt
  32.   }
  33.   
  34.   Serial.println(F("----------------------------------"));
  35.   Serial.println(F("Reading firmware version..."));
  36.   uint8_t firmwareVersion[2];
  37.   nfc.readEEprom(FIRMWARE_VERSION, firmwareVersion, sizeof(firmwareVersion));
  38.   Serial.print(F("Firmware version="));
  39.   Serial.print(firmwareVersion[1]);
  40.   Serial.print(".");
  41.   Serial.println(firmwareVersion[0]);
  42.   Serial.println(F("----------------------------------"));
  43.   Serial.println(F("Reading EEPROM version..."));
  44.   uint8_t eepromVersion[2];
  45.   nfc.readEEprom(EEPROM_VERSION, eepromVersion, sizeof(eepromVersion));
  46.   Serial.print(F("EEPROM version="));
  47.   Serial.print(eepromVersion[1]);
  48.   Serial.print(".");
  49.   Serial.println(eepromVersion[0]);
  50.   Serial.println(F("----------------------------------"));
  51.   Serial.println(F("Enable RF field..."));
  52.   nfc.setupRF();
  53.   digitalWrite(LED_BUILTIN, LOW);
  54. }
  55. uint32_t loopCnt = 0;
  56. bool errorFlag = false;
  57. void loop() {
  58.   digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
  59.   Serial.println(F("----------------------------------"));
  60.   Serial.print(F("Loop #"));
  61.   Serial.println(loopCnt++);
  62.   uint8_t uid[20];
  63.   // check for ISO14443 card
  64.   nfc.reset();
  65.   nfc.setupRF();
  66.   uint8_t uidLength = nfc.readCardSerial(uid);
  67.   if (uidLength > 0) {
  68.     Serial.print(F("ISO14443 card found, UID="));
  69.     for (int i=0; i<uidLength; i++) {
  70.       Serial.print(uid[i] < 0x10 ? " 0" : " ");
  71.       Serial.print(uid[i], HEX);
  72.     }
  73.     Serial.println();
  74.     Serial.println(F("----------------------------------"));
  75.     delay(1000);
  76.     return;
  77.   }
  78.   
  79.   // no card detected
  80.   Serial.println(F("*** No card detected!"));
  81.   digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
  82.   delay(100); // wait for a second
  83. }
では動かしてみる。
ちゃちいタグとカードが付録でついてきたので、ちゃちいタグを使ってみる。
で、こんな感じで何か読み出したものが出力される。
とりあえず、めでたし。

NXPの製品ページによるとPN5180は"何でも来い"的なNFCインタフェースらしい。
10年位前にNFCに関わったときはまだ、ISO14443(MiFARE)のNXP, ISO15693のSTマイクロ, FelicaのSONYってそれぞれがあって、NFC Forumってところでそれらをまとめた仕様がやっとこさできたばっかりで、性能として何を目指せばいいのかわからんかったんだけど、、、今もナゾ。こういうのって製造業泣かせだよなー。複数の組み合わせの評価をどこまでやればいいのかって。