💨

Arduino(9) Felica ID読み取り

2021/08/25に公開

はじめに

前回はスケッチ例でFelicaが動いてるのを確認したので、今回はFelicaIDを読み取ります。

IDとは

SONYさんのページにある「Felica技術方式の各種コードについて」資料内に記載がありました。製造ID(IDm)は8バイトのバイト列で、上位から以下の意味があるみたいです。

バイト数 内容
2 製造者コード
6 カード識別番号
カード内に複数システムがある場合には、もちょっとややこしくなる様ですが、ここでは無視。

実装

スケッチ例の中にある「FelicaPush」から実装を変更していきます。
不要なLEDの点灯は削除しています。

#include <RCS620S.h>
#include <inttypes.h>
#include <string.h>

#define COMMAND_TIMEOUT  400
#define PUSH_TIMEOUT    2100
#define POLLING_INTERVAL 500

//#define LED_PIN 13

RCS620S rcs620s;
int waitCardReleased = 0;

void setup()
{
  int ret;
  
  //シリアルモニタ用のシリアル初期化
  Serial.begin(9600);
  //RCS602S用のシリアル初期化
  Serial1.begin(115200);

  //RCS602Sの初期化
  ret = rcs620s.initDevice();
  while (!ret) {}
}

void loop()
{
  int ret;
  String IDm = "";
  char buf[2];
  
  rcs620s.timeout = COMMAND_TIMEOUT;
  //Felica状態の取得
  ret = rcs620s.polling();
  if (ret) {
    //Felicaがタッチされた場合
    for (int i = 0; i < 8; i++) {
      sprintf(buf, "%02X", rcs620s.idm[i]);
      IDm += buf;
    }
    Serial.println(IDm);
  } 
  rcs620s.rfOff();
  delay(POLLING_INTERVAL);
}

大きく変更したのは、loop関数内です。
Felicaがタッチされると、pollingにてその旨が返ってくるみたいです。その時IDは、そのもの「rcs602s.idm」という配列に入る様です。この中身はバイナリの値なので、表示する為に、文字列に変換する為、「sprintf」を使用して1文字ずつ変換しています。

残件

次は、このコードをマージして、SDカードとかにIDが書き込まれる様にします。

Discussion