NFC Shieldのwikiを読む

2013-06-07   treby   技術メモ  , , このエントリーをはてなブックマークに追加

2013年6月6日時点のseedstudioのwikiを読むだけ読むお!まあ、英語って読めないことないけど、いまいちやる気出ないですよね、ということで記事にしてみます。

昨年末にしれっとLibraryのバージョンが上がっていますし、押し入れに眠らせているArduino引っ張りだして少し本腰入れてやってみてもおもろいんじゃないですかね。知らないけど。

イントロダクション

ここは確認になりますが、NFC ShieldはArduino向けのシールド(拡張基板)です。R/WチップとしてNXPのPN532というやつがのっています。これまた気がつかないうちにNFC Shield V2.0とやらが出ていますがライブラリが共通なあたりアンテナが外付けになっていること以外違いはないみたい。

仕様

Arduino本体とR/WはSPI接続です。ソニーの組み込み向けR/WであるRC-S620/SはSerial接続でした。ちなみにRC-S620/SにはRC-S956というチップがのっているみたいですよ。

PCBアンテナって何のことだろう、と思ったらプリント基板上のアンテナってことね。電源は3.3V、5V両方対応していますよ、と。

最大交信距離は大体5cmで、Ultralight Cチップに対しては読み書きできず、IDを読むのみ、と。マジか。

アプリケーションのアイデア

  • TypeA向けのRFIDリーダーとして使えるよ。
  • 出席システム構築とか。
  • 認証システムの設計とか。
  • スマートポスターも読めちゃう。
  • ちっちゃなデータなら他のNFC機器と安全に交換できちゃう。
  • ADKとか使って、モバイルなNFCアプリケーションも作れるよね。
  • などなど、可能性は無限大。

使い方

ハード側

  • ArduinoにNFC Shieldを挿します。
  • 提供されているサンプルスケッチをコンパイル&アップロードします。
  • MIFAREカードをアンテナの近くに持ってきます。NFC Shieldがpassive idを読み取ってくれるよ!
  • NFC Shield二つでP2Pな通信だってできちゃいますよ。

プログラミング

PN532_SPIライブラリをダウンロードしてArduino IDEにインストールしてください。この節では、MIFAREカードの全メモリを読み取るデモと、MIFAREカードにデータを書き込むデモ、P2P通信のデモの三つが紹介されていますね。

参考コード

ライブラリのAPIはPN532のコマンドを簡単に使えるようにしていますよ、と。全てのコマンドはPN532ユーザーマニュアルに載っていますよ、と。PN532_SPIライブラリで提供されているのは以下のものですよ、と。

boolean SAMConfig(void)

PN532のSAMConfigurationコマンドを実行して、チップをNormal modeにセットします。SAMはSecurity Access Moduleの略でつまりはPN532システムのことです。PN532システムはNormal modeとVirtual Card mode、Wired Card modeそしてDual Card modeのいずれかで動作します。

uint32_t readPassiveTargetId(uint8_t cardbaudrate)

このメソッドはPassive Target IDを読み取ってそれを32ビットの数値として返します。現時点ではMIFARE(TypeA)のみサポートしています。cardbaudrateにはPN532_MIFARE_ISO14443Aを指定してください。

uint32_t authenticateBlock(uint8_t cardnumber, uint32_t cid, uint8_t blockaddress, uint8_t authtype, uint8_t * keys)

このメソッドはメモリーブロックを読み書きする前に認証するのに使われます。成功したらtrueが返ってきます。(uint32_tなのに……?booleanの間違い?)

  • cardnumber : 1か2
  • cid : 32ビットのカードID
  • blockaddress : ブロックナンバー
  • authtype : 認証に使う鍵(KEY_AかKEY_B)
  • keys : 鍵へのポインタ

uint32_t readMemoryBlock(uint8_t cardnumber,uint8_t blockaddress, uint8_t * block)

このメソッドは鍵による認証の後にメモリーブロックを読み込みます。成功したらtrueを返します。

  • cardnumber : 1か2
  • blockaddress : ブロックナンバー。MIFARE Standardカードではそれぞれのブロックは16バイトです。
  • block : 読み取ったブロックデータを格納するのための16バイトの配列へのポインタ

uint32_t writeMemoryBlock(uint8_t cardnumber,uint8_t blockaddress, uint8_t * block)

このメソッドは鍵による認証の後にメモリーブロックに書き込みます。成功したらtrueを返します。

  • cardnumber : 1か2
  • blockaddress : ブロックナンバー。MIFARE Standardカードではそれぞれのブロックは16バイトです。
  • block : 書き込むブロックデータを格納した16バイトの配列へのポインタ

uint32_t PN532::configurePeerAsInitiator(uint8_t baudrate)

このメソッドはP2Pのイニシエータを実装します。成功したらtrueを返します。baudrateは通信速度で0-2の数値を指定できます。0は106kbpsで、1が201kbps、2が424kbpsです。ただし、現状1と2しかサポートしていません。

この機能は実験的で、NFC Shield同士のP2P通信をサポートしています。他のNFC機器との通信はテストしていません。

uint32_t configurePeerAsTarget()

このメソッドはP2Pのターゲットを実装します。成功したらtrueを返します。

この機能は実験的で、NFC Shield同士のP2P通信をサポートしています。他のNFC機器との通信はテストしていません。

uint32_t initiatorTxRx(char *DataOut,char *DataIn)

このメソッドはターゲットに(から)データを送受するのに使います。このコードはNFC P2Pのイニシエータで使われます。成功したらtrueを返します。

この機能は実験的で、NFC Shield同士のP2P通信をサポートしています。他のNFC機器との通信はテストしていません。

  • DataOut : 送信データの入った16バイトの配列へのポインタ
  • DataIn : 受信データのための16バイトの配列へのポインタ

uint32_t targetTxRx(char *DataOut,char *DataIn)

このメソッドはイニシエータに(から)データを送受するのに使います。このコードはNFC P2Pのターゲットで使われます。成功したらtrueを返します。

  • DataOut : 送信データの入った16バイトの配列へのポインタ
  • DataIn : 受信データのための16バイトの配列へのポインタ

感想

オレの書き方も大概いい加減ですが、wikiの内容もwikiだけにツッコミどころ満載でした。FeliCaとかいけるよね、多分とか、Seeeduino前提かよとか。まあ、PN532を満足に使うためにはライブラリまで手を入れなきゃ行けないのでしょうね。それでも以前と違って、P2Pがライブラリで標準サポートされているのが嬉しいですね。

さて、次は実際にコードでも読んでみますかね。