Arduino+RC-S620/SでFeliCa IDmを取得してLCDに表示する
今さら説明する必要もないのかもだけれど、まあ、書いておくだけ書いておく。まあまあ、なんくるないさー。
使うものリスト
- Arduino
- RC-S620S
- FeliCa RC-S620S ピッチ変換基板(フラットケーブル付き)
- LCDシールド(私が使ったのはスイッチサイエンスさんのもの。要組み立て。)
- ブレッドボード、ジャンパ線など
目的
Arduinoには、「シールド」と呼ばれる拡張基板を取り付けられるようになっている。各シールドは便利な機能を持っていることが多く、シールドについている足はArduinoの各ピンにぴったり合わさるように作られている。Arduinoで何かモノづくりをするときは適切なシールドを使いこなせば良い。そしてこの気楽さこそが、Arduinoの醍醐味なのだ。
数多いシールドの内の一つにキャラクタLCDシールドがある。これを使うと任意の文字列や数値を表示することができる。LCDシールドのすごいところは文字を表示するのにシリアルポートを使わないことだ。つまり、ハードウェアシリアルポートが1ポートしかないArduino Unoなどでも問題なく情報を表示することができるのだ。さらに標準ライブラリ、LiquidCrystalを使えば苦労することなく情報を表示させることができる。素晴らしい。SoftwareSerialで悩んでいたのが嘘のようだ。
本記事では、FeliCa R/WであるRC-S620/Sで取得したIDmをLCDシールドに表示することを目標とする。
回路図
- (LCD Shield on Arduino)
- Arduino D0(RX) – RC-S620/S 3(TXD)
- Arduino D1(TX) – RC-S620/S 2(RXD)
- Arduino 5V – RC-S620/S 1(Vdd)
- Arduino GND – RC-S620/S 6(GND)
スケッチコード
- 必要ライブラリ:
- See Also:
#include
#include
#define COMMAND_TIMEOUT 400
#define POLLING_INTERVAL 500
#define LED_PIN 13
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
RCS620S rcs620s;
void setup() {
int ret;
pinMode(LED_PIN, OUTPUT); // for Polling Status
digitalWrite(LED_PIN, LOW);
Serial.begin(115200); // for RC-S620/S
lcd.begin(16, 2); // for LCD
// initialize RC-S620/S
ret = rcs620s.initDevice();
while (!ret) {} // blocking
}
void loop() {
int ret, i;
// Polling
digitalWrite(LED_PIN, HIGH);
rcs620s.timeout = COMMAND_TIMEOUT;
ret = rcs620s.polling();
lcd.clear();
if(ret) {
lcd.print("IDm:");
lcd.setCursor(0, 1);
for(i = 0; i < 8; i++)
{
if(rcs620s.idm[i] / 0x10 == 0) lcd.print(0);
lcd.print(rcs620s.idm[i], HEX);
}
} else {
lcd.print("Polling...");
}
rcs620s.rfOff();
digitalWrite(LED_PIN, LOW);
delay(POLLING_INTERVAL);
}
RCS620S.hを読めば分かるように、RC-S620/SライブラリはPollingで返ってきたIDmをpublic変数にしている。故、スケッチ中からも参照することができるのだ。
また、IDmの表示部では1バイトごとに表示を行っているが、これが2桁とならない場合(すなわち0x10より小さい場合)に以下のコードで0埋めするようにした。
if(rcs620s.idm[i] / 0x10 == 0) lcd.print(0);
実行結果
Polling表示
LEDがペカペカ光ってLEDにPolling...と表示されれば成功。
IDmを表示した状態
Pollingに応答したカードやデバイスのIDmをLCDに表示してくれる(Riccaの中身はSUGOCA)。