続々 FeliCa Plug と Arduino と私

Windows 開発環境構築手順編

1. Arduino - Software から Arduino IDE をダウンロードして、インストールする。これを記載している時点では Arduino 1.0.5 が正式リリースの最新版。
2. ArduinoWindows PC に接続する。
3. Arduino 統合開発環境を起動する。
4.Arduino 統合開発環境のメニューからツールマイコンボードから使用する Arduino を選択する。
5.Arduino 統合開発環境のメニューからツール→シリアルポートから使用するシリアルポートを選択する。どのシリアルポートを選択して良いのか判らない場合はコントロールパネルからデバイスマネージャーを起動して「ポート (COM と LPT)」を展開する。表示されたデバイスから「USB Serial Port」の COMx を選択すれば良い筈。
6. 「Arduino向けFeliCa Plug制御ライブラリ」 ダウンロードページ « FeliCa Developers' Blog から制御ライブラリをダウンロードする。
7. 制御ライブラリを適当なフォルダに展開する。
8. 制御ライブラリが書かれた時期の Arduino の開発環境と現在の開発環境の差異があるので、以下のパッチを適用する。

--- FeliCaPlug.cpp.orig	2011-05-06 11:14:27.000000000 +0900
+++ FeliCaPlug.cpp	2013-08-30 14:02:51.274641100 +0900
@@ -7,7 +7,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <inttypes.h>
-#include "WProgram.h"
+#include "Arduino.h"
 #include "Print.h"
 #ifdef CONFIG_FELICA_PLUG_EEPROM
 #include "EEPROM.h"

9. マイドキュメントの Arduino フォルダ下の libraries フォルダに FeliCaPlug フォルダを作成して、FeliCaPlug フォルダに制御ライブラリの以下のファイルをコピーする。マイドキュメントの Arduino フォルダが無い場合は Arduino 統合開発環境をインストールしたフォルダにlibraries フォルダがあるのでその下に FeliCaPlug フォルダを作成してファイルをコピーする。

  • FeliCaPlug.cpp
  • FeliCaPlug.h

10. Arduino 統合開発環境に以下のコードをコピーして、画面上部の○ボタンの「→」を押してコンパイルArduino への転送を実行する。

#include <FeliCaPlug.h>
#define BLOCK_SIZE 16
#include <inttypes.h>

#define NUM_OF_BLOCKS 1
uint8_t ftBlockData[BLOCK_SIZE * NUM_OF_BLOCKS];

FeliCaPlug plug;

void
setup(void)
{
  /*
   * スイッチサイエンスで購入した FeliCa Plug では
   * データフォーマットコード 0x001c を使用しましょうと言う事らしい
   * See http://trac.switch-science.com/wiki/FeliCaPlug
   */
  uint8_t dfc[2] = { 
    0x00, 0x1c,
  };
  uint8_t userParam[4] = { 
    0x01, 0x23, 0x45, 0x67,
  };

  Serial.begin(9600);
  plug.initPort();
  plug.setLEDPin(FELICA_PLUG_LED_PIN);
  plug.setParam(FELICA_PLUG_MODE_FT, dfc, userParam);
  plug.setBlockData(ftBlockData, NUM_OF_BLOCKS, 0);
  plug.setFTReadCallback(ftReadCallback);
  plug.setFTWriteCallback(ftWriteCallback);
}

void
loop(void)
{
  for (;;) {
    plug.doLoop();
  }
}

void
ftReadCallback(uint16_t blockNum)
{
  static int n;
  for (int i = 0; i < BLOCK_SIZE; i++) {
    ftBlockData[i] = n++;
  }
}

void
ftWriteCallback(uint16_t blockNum)
{
}

11. FeliCa リーダライタなり NFC リーダライタなりで適当に一ブロックを Read Without Encryption してみて読み出せるデータが毎回変更される事を楽しむ。