年末進行のハズなのに、手元にFeliCa リーダー・ライター「RC-S620/S」が到着したので手を出してしまった 松下(ニックネーム: Max) です。
Wio LTE JP Version に RC-S620/S を取り付けたら、サクッと FeliCa が読めるようになりましたので手順を紹介します。
FeliCa 近づけて IDm(製造 ID) を表示させているところ
手順
- ハードウェア
- Wio LTE の UART ポートに接続。
- ソフトウェア
- Arduino 向け RC-S620/S 制御ライブラリ をダウンロードし、 Arduino IDE のライブラリとして取り込む。
- 取り込んだライブラリの
RCS620S.cpp
を編集。
ハードウェア
最終的には以下のようになります。
RC-S620/S
RC-S620/S は既に完成してます。フラットケーブルを接続するだけです。
このフラットケーブルの接続は「気合」です。ググっと手で押し込む感じになります。表裏は写真で見ている通り、「青」が見えるように挿しこみます。
FFC-6
フラットケーブルをブレッドボードに落とすことができるモジュールです。
現行品は、はんだ付けが必要となります。
ブレッドボードに挿し、フラットケーブルを接続すると以下のようになります。フラットケーブルは引き出し型なので、RC-S620/S よりは安定して接続できます。
ピンアサインは商品ページに書かれています。
Grove ケーブル の並びと同じになっているので素直に挿すことができます。
Wio LTE との接続
ブレッドボードを介して FFC-6 と Wio LTE JP Version の UART に接続します。
ソフトウェア
Arduino 向け RC-S620/S 制御ライブラリ をダウンロードし、 Arduino IDE のライブラリとして取り込み、コードを書けば動きます。
RCS620S.cpp
の編集
RC-S620/S ライブラリを取り込んだら RCS620S.cpp
を探して2点編集します。
- 新しい Arduino ライブラリを読み込むようにする
-
Serial
とハードコードされている部分を変更する
diff -ur --color arduino-RCS620S.origin/RCS620S.cpp arduino-RCS620S/RCS620S.cpp
--- arduino-RCS620S.origin/RCS620S.cpp 2019-12-28 23:17:25.734916000 +0900
+++ arduino-RCS620S/RCS620S.cpp 2019-12-28 23:18:52.932437700 +0900
@@ -7,7 +7,7 @@
#include <stdio.h>
#include <string.h>
#include <inttypes.h>
-#include "Wprogram.h"
+#include "Arduino.h"
#include "Print.h"
#include "HardwareSerial.h"
@@ -309,7 +309,7 @@
const uint8_t* data,
uint16_t len)
{
- Serial.write(data, len);
+ Serial1.write(data, len);
}
int RCS620S::readSerial(
@@ -324,8 +324,8 @@
return 0;
}
- if (Serial.available() > 0) {
- data[nread] = Serial.read();
+ if (Serial1.available() > 0) {
+ data[nread] = Serial1.read();
nread++;
}
}
@@ -335,7 +335,7 @@
void RCS620S::flushSerial(void)
{
- Serial.flush();
+ Serial1.flush();
}
int RCS620S::checkTimeout(unsigned long t0)
Arduino API は 1.0 から include ファイルが Wprogram.h
から Arduino.h
にリネームされています。一方、配布されているライブラリは古い方を参照しているため include を調整します。
RC-S620/S と接続す UART が Serial
とハードコードされています。
本来ならば RCS620S
のインスタンス作成時に引数で UART を指定できるようにする修正を入れたいところですが、ちょっと面倒だったので Wio LTE JP Version の UART である Serial1 をハードコードして対応しています。
スケッチ
# include <WioLTEforArduino.h>
WioLTE Wio;
# define CONSOLE SerialUSB
# include <RCS620S.h>
RCS620S rcs620s;
void setup() {
delay(200);
CONSOLE.println("\n-- START");
Wio.Init();
CONSOLE.begin(115200);
Wio.PowerSupplyGrove(true);
Serial1.begin(115200); /* for Wio LTE hardware UART */
while(!rcs620s.initDevice()); /* ret=1 is failed init */
CONSOLE.println("\n-- Ready");
}
void loop() {
CONSOLE.println("\n-- loop");
if (rcs620s.polling()) {
CONSOLE.println("FeliCa detected!");
CONSOLE.print("IDm = ");
for(int i = 0; i < sizeof(rcs620s.idm) ; i++) {
char buf[2];
sprintf(buf, "%02X", rcs620s.idm[i]);
CONSOLE.print(buf);
}
CONSOLE.println();
}
rcs620s.rfOff();
delay(1000);
}
あとは FeliCa を近づければ以下のように表示してくれます。
-- loop
FeliCa detected!
IDm = xxxxxxxxxxxxxx
と表示します。
FeliCa の IDm
FeliCa が持っているユニーク ID が IDm(製造 ID)です。FeliCa を鍵のように使いたい場合はこの情報を使えば OK かと思います。
それ以外の詳細な技術資料は PDF でダウンロード できます。
読み込める FeliCa
FeliCa 規格になっているものであれば何でも読み込み可能です。(書込みは試していません)
https://www.sony.co.jp/Products/felica/business/products/
今回は以下の3つを試して IDm が読み込めることを確認しました。
- "FeliCa Lite-S" (型番: RC-S966)
- 市販されている Suica カード
- Google Pixel 4 の NFC
デバッグ用としては IDm がカードに刻印されているものが便利です。
この後の発展について
Cat.1 モデムがついている Wio LTE で読めるようになったので、 AWS Lambda 等の FaaS を直接呼び出せる SORACOM Funk を使って、クラウド上のデータベースとのマッチングをするといった事が簡単にできるでしょう。
余談: SoftwareSerial との相性が悪いみたい
Arduino UNO R3 は HardwareSerial が1つしかないので SoftwareSerial を使うしかないのですが、ちょっと試したところうまく動きません。
2012年にトライされた方の記録: http://www.atelier-nodoka.net/2012/04/arduino-software-serial-problem/
どうしたらいいんだろう。。。 Wio LTE JP Version には HardwareSerial が実装されてて良かった!
今回使った機材の費用
ざくっと計算すると、このくらいでした。
- 約 15,840円
※金額は税抜きです。
役割 | 機材 | 金額 |
---|---|---|
マイコン&モデムボード | Wio LTE JP Version | 9800円 |
FeliCa リーダー・ライター | RC-S620/S | 3350円 |
RC-S620/S ピッチ変換基板セット | FFC-6 | 510円 |
検証用 FeliCa カード | FeliCa Lite-S (RC-S966) 5枚セット | 1240円 |
ブレッドボード | どこのやつだったかな? | 300~500円くらい |
ケーブル | Grove ジャンパーピン変換ケーブル (5本入り) | 500円くらい |
おわりに
こんなことをしている場合じゃないんだが、、、
すでに持っている FeliCa が読めるようになるのは楽しいし、可能性を感じる。
入退出に使えるよね?
参考資料
EoT