今回は、「FeliCa」を使って、ある場所の入退室時刻を記録するようなものを作ってみたいと思います。これがあれば、会社や研究室などに誰が何時に出入りしているのか?、FelicaやSuicaをかざすことで記録できるようになります!
今回作るのは、部屋に入ったり出たりする際に、FeliCaリーダーにFeliCaカードやFeliCa対応のスマートフォンなどをタッチすると、その時の日時をSDカードに保存する、というものです。
■今回の電子工作レシピ
完成までの時間目安:120分
名前 | 購入元 | 値段 |
---|---|---|
Arduino Mega 2560 Rev.3 | Amazonなど | 純正品は6,000円前後 互換品で代用可能(1,200円~1,500円) |
FeliCa リーダー・ライター RC-S620S | スイッチサイエンス | 3,600円 |
FeliCa RC-S620S/RC-S730 ピッチ変換基板のセット(フラットケーブル付き) | スイッチサイエンス | 540円 |
FeliCaカード | Amazonなど | 5枚組で1,500円程度 FeliCa内蔵のクレジットカードやスマートフォンで代用可能 |
20文字×4行キャラクタ液晶ディスプレイ (I2C接続アダプタ付き) |
Amazonなど | 900円前後 |
DS3231モジュール | Amazonなど | 300円前後 |
LIR2032(ボタン充電池) | Amazonなど | 360円程度 |
SDカードリーダーモジュール | Amazonなど | 150円程度 |
基板取付用スピーカー | 秋月電子通商 | 50円 |
※上記のほかに、LED3個、100~200Ω程度の抵抗3個も必要です
■目次
Arduino Megaで作る、“FeliCa入退室記録システム”
NFCとは何か? NFCの1つの規格である「FeliCa」
●NFCの基本
●NFCの1つの規格であるFeliCaとは
●個々のFeliCaカード等を識別する「IDm」
FeliCaリーダー・ライターRC-S620Sについて
Arduino MegaとRC-S620Sなどを接続する
●今回使う「Arduino Mega 2560」
プログラムの作成と動作
●接続の手順
●RC-S620Sのライブラリの準備
●LiquidCrystal_I2Cライブラリのインストール
●プログラムの書き込み
●RTCの日時を合わせる
●IDmとユーザー名の登録
●入退室日時のファイルを扱う
まとめ
Arduino Megaで作る、“Felica入退室記録システム”
カードの持ち主ごとに、入室時刻と退出時刻を記録できるシステムを作ります。
それぞれの日で、1回目にタッチした時刻を「入室時刻」、また、最後にタッチした時刻を「退室時刻」として保存します。さらに、複数のFeliCaカードなどを識別し、それぞれの持ち主の入退室時刻を別々に保存します。FeliCaカードなどには「IDm」という識別情報が記録されていて、それによってそれぞれのカードなどを識別します。
SDカードには、日ごとにCSV形式でデータを保存します。Excel等でそのファイルを読み込んで、入退室の時刻を見ることができます。
下記の動画は、実際に動作させたところです。2枚のFeliCaカードと、1枚のSuicaクレジットカードを使っています。また、FeliCaカード2枚のうち、1枚は持ち主の情報をプログラムに登録していない状態にしています。
持ち主を登録してあるカードでタッチすると、1回目のタッチでは入室(Enter)、2回目のタッチでは退室(Leave)として認識し、液晶ディプレイに結果を表示し、その日時をSDカードに記録します。また、持ち主を登録していないカードでタッチすると、「Unknown user」と液晶ディスプレイに表示します。
NFCとは何か? NFCの1つの規格である「FeliCa」
今回の工作でキーとなるのが、「FeliCa」です。工作に入る前に、まずはFeliCaの概要を理解しておきましょう。
●NFCの基本
FeliCaは「NFC」(Near Field Communication)の一種ですので、まずNFCについて解説します。
私たちの生活の中で、様々な「ICカード」が使われています。ICカードは、カードにICが内蔵されていて、情報が保存されているものです。クレジットカードやキャッシュカードなど、様々な分野のICカードがあります。
ICカードには、リーダーと接触させて使うもの(接触型)と、リーダーに近づけて無線で通信するもの(非接触型)があります。
非接触型のICカードは、通信距離によって「密着型」「近接型」「近傍型」などの種類があり、それぞれに国際規格があります。このうちの、「近接型」のICカードで使われている通信方式のことを、狭義に「NFC」と呼んでいます。
●NFCの1つの規格であるFeliCaとは
NFCは、複数のメーカーがそれぞれで開発を進めたことから、規格が複数あります(表1)。FeliCaもその中の1つです。
Type-A/Type-B/FeliCaともに、「ISO/IEC 14443」という国際規格に沿っています。通信距離は10cm以下で、13.56MHzの周波数で通信するという点は共通しています。しかし、変調方法や符号化方法がそれぞれ異なります。
FeliCaとType-Aは似た規格ですが、FeliCaはType-Aよりも通信速度が速く、セキュリティも高いというメリットがあります。しかし、その分高価なため、本記事執筆時点では、残念ながら世界的にはあまり普及していません(世界全体でみるとType-Aが普及)。しかし、日本国内では電子マネーなどで非常に普及しています。
また、AppleのiPhone 8以降では、世界標準モデルにFeliCaが搭載されています。そのため、今後は国外でもFeliCaが広く使われるようになる可能性があります。
名前 | メーカー | 日本での用途 |
---|---|---|
Type-A(MIFARE) | NXPセミコンダクターズ | taspo テレホンカード |
Type-B | モトローラ | マイナンバーカード ICカード運転免許証 |
FeliCa | ソニー | 交通系ICカード(Suicaなど) 電子マネー(楽天Edy、nanacoなど) おサイフケータイ |
表1 NFCの規格
●個々のFeliCaカード等を識別する「IDm」
FeliCaカードなどにはFeliCaのICチップが内蔵されています。そのICチップには、「IDm」という固有の値が保存されています。IDmは8バイトのデータで、他のFeliCaのICチップと重複しない値が記録されています。また、IDmを書き換えることは不可能です。そのため、IDmを使って、個々のFeliCaカードなどを識別することができます。
FeliCaリーダー・ライターRC-S620Sについて
Arduinoなどの電子工作でFeliCaを扱う際には、ソニーの「RC-S620S」というFeliCaリーダー・ライターを使うことが一般的です(写真2)。基板の上にFeliCaカードなどをかざすと、そのFeliCaカードの情報を読み書きすることができます。
また、ソニーからArduino用のライブラリが公開されていますので、それを使ってプログラムを作ることができます。
RC-S620Sは「FFC」(Flexible Flat Cableの略)というフィルム状のケーブルで他の機器と接続するようになっています。ただ、ケーブルの中に0.5mm間隔で電線が通っていて、人間が手作業でArduinoなどに接続するのはかなり難しいです。
そこで、「ピッチ変換基板」というものを使って、ブレッドボードに刺せるようにします。ピッチ変換基板には、FFCを差し込むコネクタとピンヘッダがあり、基盤上で両者の間が接続されています。これで、ピンヘッダをブレッドボードに刺して使えるようになります。
RC-S620Sと変換基板は、どちらもスイッチサイエンスで販売されています。
・RC-S620S
・FeliCa RC-S620S/RC-S730 (フラットケーブル付き)
ピッチ変換基板は、買ってきたばかりの状態(写真3)では、ピンヘッダが基板に半田付けされていませんので、自分で半田付けします。
その後、RC-S620Sとピッチ変換基板との間を、FFCで接続します。FFCの片面の両端が青くなっていますが、その面を上にして接続します(写真4)。
RC-S620S側は、FFCを少しずつスライドさせてコネクタに差し込んでいきます。FFCの青い部分はFFC本体に貼り付けられているような感じになっていて、指の爪が少しひっかかります。爪で少しずつ押すようにすると、FFCがコネクタに入っていきます。
一方の変換基板側は、黒いロックを「SWITCHSCIENCE」の字の方に1mmほどずらして解除し、FFCを差し込んだ後、ロックを元に戻します。
Arduino MegaとRC-S620Sなどを接続する
RC-S620Sの準備ができたら、Arduinoと接続します。また、SDカードリーダーなども順に接続していきます。
●今回使う「Arduino Mega 2560」
Arduinoにはバリエーションが多数あり、最もよく使われているのは「Arduino Uno」です。しかし、今回はArduino Unoではなく、「Arduino Mega 2560」を使います(写真5)。
RC-S620SとArduinoとの通信では、115,200bpsのシリアルで接続します。Arduino Unoでもシリアル通信自体は可能ですので、Arduino Unoで作ることはできなくはありません。
ただ、Arduino Unoで115,200bpsのシリアル通信を行うには、「ハードウェアシリアル」(0番ピンと1番ピンを接続)を使う必要があります。任意のピンで接続する「ソフトウェアシリアル」もありますが、ソフトウェアシリアルでは115,200bpsでの高速な通信を安定して行うことができません。
ハードウェアシリアルは、パソコンからプログラムを書き込むときにも使われますし、シリアルモニタでも使われます。そのため、RC-S620SをハードウェアシリアルでArduino Unoに接続する場合、プログラムの書き込みの際にはRC-S620Sの接続を外す必要がありますし、RC-S620Sの動作中にはシリアルモニタを使えなくなってしまいます。このようなことから、RC-S620Sを使って何かを作る場合、Arduino Unoでは不便があります。
一方、Arduino Mega 2560では、0/1番ピンを使うハードウェアシリアルの他に、3系統のハードウェアシリアルを使うことができます。そのため、Arduino Unoとは異なり、RC-S620Sを接続したままで、プログラムを書き込んだり、シリアルモニタを使ったりすることができます。
●接続の手順
今回作る物での接続は、図1のようになります。接続するものが複数ありますので、順番に接続していきます。また、5VとGNDは複数の部品で使いますので、Arduino Mega 2560の5VとGNDを、ブレッドボードの+/−のラインに接続して、そこから各部品に接続するようにします。
まず、メインとなるRC-S620S(の変換基板)と、Arduino Mega 2560の間を接続します。変換基板にはピンが6本ありますが、そのうちの1本は使われていないので、残り5本を接続します。
変換基板にはピンの名前が表示されていませんが、実際には図2のようになっています。これらのピンとArduino Mega 2560の間を、表2のように接続します。
Arduino Mega 2560 | ピッチ変換基板 |
---|---|
5V | VDD |
GND | GND |
TX1(18番) | RXD |
RX1(19番) | TXD |
表2 Arduino Mega 2560とピッチ変換基板の接続
タッチ状態の表示などは、20文字×4行のキャラクタ液晶ディスプレイで行います。本来は16本のピンを接続するものですが、それでは面倒なので、I2C接続のアダプタ付きの物を使い、表3のように接続します。
Arduino Mega 2560 | キャラクタ液晶ディスプレイ |
---|---|
5V | VCC |
GND | GND |
SDA(20番) | SDA |
SCL(21番) | SCL |
表3 Arduino Mega 2560とキャラクタ液晶ディスプレイの接続
入退室管理では、入退室の日時を記録することが必要です。Arduino Mega 2560にはRTC(リアルタイムクロック)の機能はなく、電源を入れると内蔵のクロックが初期化されるので、RTC(DS3231のモジュール)も別途接続します(表4)。なお、RTCについては前回の記事(ESP32とRTCで「二度寝防止アラーム時計」を作ろう!)もご参照ください。
SDAとSCLはキャラクタ液晶ディスプレイにも接続しますので、Arduino Mega 2560のSDA/SCLからのジャンプワイヤをいったんブレッドボードに接続し、そこからキャラクタ液晶ディスプレイ/RTCの両方に接続するような形を取ります。
Arduino Mega 2560 | RTC |
---|---|
5V | VCC |
GND | GND |
SDA(20番) | SDA |
SCL(21番) | SCL |
表4 Arduino Mega 2560とRTCの接続
入退室の日時はSDカードに保存しますので、SDカードリーダーモジュールも接続します。接続は表5の通りです。
Arduino Mega 2560 | SDカードリーダーモジュール |
---|---|
5V | +5 |
GND | GND |
50番 | MISO |
51番 | MOSI |
52番 | SCK |
53番 | CS |
表5 Arduino Mega 2560とSDカードリーダーモジュールの接続
最後に、スピーカーとLEDを接続します。スピーカーは、FeliCaをタッチしたときに音を出すために使います。また、LEDはタッチされたときの状態(入室/退室/エラー)を表すために使います。
Arduino Megaの2番ピンにスピーカーの片側を接続し、もう片側をGNDに接続します。また、Arduino Megaの3〜5番ピンのそれぞれから、抵抗→LED→GNDと順に接続します。
プログラムの作成と動作
ハードができたところで、プログラムを書き込んで動作させます。
●RC-S620Sのライブラリの準備
RC-S620Sのライブラリは、ソニーから配布されています。
こちらからダウンロードすることができます。
Arduinoのライブラリのフォルダに、「RC-S620S」というフォルダを作り、その中にダウンロードしたZipファイルの中身を解凍します。ライブラリのフォルダは、通常は以下になっています。
・Windowsの場合
「ドキュメント」 > 「Arduino」 > 「libraries」
・Macの場合
「書類」 > 「Arduino」 > 「libraries」
ただ、このライブラリは2010年11月にリリースされた古いもので、またArduino Unoを前提としているので、そのままではArduino Mega 2560の2系統目のハードウェアシリアルで動作させることができません。
そこで、「RC-S620S」フォルダにある「RCS620S.cpp」ファイルの以下の各箇所を書き換えます。10行目では「Wprogram.h」を「Arduino.h」に変えます。残りの行では、「Serial」を「Serial1」に変えます。
行 | 書き換え前 | 書き換え後 |
---|---|---|
10 | #include “Wprogram.h” | #include “Arduino.h” |
312 | Serial.write(data, len); | Serial1.write(data, len); |
327 | if (Serial.available() > 0) { | if (Serial1.available() > 0) { |
328 | data[nread] = Serial.read(); | data[nread] = Serial1.read(); |
338 | Serial.flush(); | Serial1.flush(); |
表6 RCS620S.cppの書き換え箇所
●LiquidCrystal_I2Cライブラリのインストール
キャラクタ液晶ディスプレイに状態を表示するために、「LiquidCrystal_I2C」というライブラリをインストールします。手順は以下の通りです。
- Arduino IDEで「スケッチ」 > 「ライブラリをインクルード」 > 「ライブラリを管理」メニューを選び、「ライブラリマネージャ」を開きます。
- ライブラリマネージャ右上の入力欄に「LiquidCrystal」と入力します。
- ライブラリが多数検索されますので、その中の「LiquidCrystal I2C by Fcank de Brabander」のライブラリを選び、「インストール」ボタンをクリックします(図3)。
●プログラムの書き込み
ライブラリの準備ができたら、Arduino IDEにリスト1のプログラムを入力し、「ツール」 > 「ボード」メニューで「Arduino/Genuino Mega or Mega 2560」を選んでから、「スケッチ」 > 「マイコンボードに書き込む」メニューでArduino Mega 2560に書き込みます。
なお、書き込みが終わってもキャラクタ液晶ディスプレイに何も表示されないときは、11行目の最後にある「0x3F」を「0x27」に変えて、再度書き込みます。
【ダウンロード】書き込むプログラム[リスト1]
●RTCの日時を合わせる
今回作った物では、Arduino Mega 2560の電源を切っても日時を刻み続けるように、RTCを取り付けています。RTCの日時を合わせるには、日時を入れたファイルをSDカード保存しておき、起動時に読み込むという仕組みを取ります。手順は以下の通りです。
- Arduino Mega 2560の電源を切ります。
- SDカードリーダーからSDカードを取り出し、パソコンに差し込みます。
- SDカードに「TIME.TXT」という名前のファイルを作り、「YYYY/MM/DD hh:mm:ss」という形式で合わせたい日時を入れます。
- SDカードをSDカードリーダーに戻します。
- Arduino Mega 2560の電源を入れます。
例えば、TIME.TXTファイルに「2019/01/23 01:23:45」と入れておくと、RTCの日時を2019年1月23日1時23分45秒に設定することができます。
●IDmとユーザー名の登録
このプログラムでは、複数のFeliCaカード等の情報を登録して、それぞれの持ち主の入退室日時を記録するようになっています。登録されていないfeliCaカード等でタッチしても、入退室日時は記録されません。
FeliCaカード等の情報を登録するには、それぞれのIDmを調べ、IDmと持ち主の対応の情報をプログラムに記述します。
まず、Arduino Mega 2560をUSBケーブルでパソコンにつなぎ、Arduino IDEで「ツール」 > 「シリアルモニタ」メニューを選んで、シリアルモニタを開きます。
この状態で、未登録のFeliCaカード等をRC-S620Sにタッチすると、シリアルモニタに「Unknown FeliCa: IDm = XXXXXXXXXXXXXXXX」のように表示されます(「XXXXXXXXXXXXXXXX」は16桁の16進数)。使いたいそれぞれのFeliCaカード等をタッチして、それぞれのIDmを調べ、メモしておきます。
その後、リスト1の13行目〜21行目の部分を書き換えて、FeliCaカード等のIDmと、その持ち主の名前を対応させます。名前はアルファベット19文字以下で指定します。
リスト1ではFeliCaカード等を3つ使う前提になっていますが、数を増やしたい場合は、IDm004、IDm005…やname004、name005…などの定数を追加し、またIDmsとnamesの配列にそれらの定数も追加します。
例えば、IDmと持ち主の対応を表8のようにしたい場合、リスト1の13行目〜21行目をリスト2のように書き換えます。
IDm | 持ち主 |
---|---|
0111111111111111 | Yamada |
012222222222222 | Tanaka |
0133333333333333 | Suzuki |
0144444444444444 | Takahashi |
0155555555555555 | Sato |
表8 IDmと持ち主の対応の例
const char IDm002[] PROGMEM = “0122222222222222”;
const char IDm003[] PROGMEM = “0133333333333333”;
const char IDm004[] PROGMEM = “0144444444444444”;
const char IDm005[] PROGMEM = “0155555555555555”;
const char* const IDms[] PROGMEM = { IDm001, IDm002, IDm003, IDm004, IDm005 };
const char name001[] PROGMEM = “Yamada”;
const char name002[] PROGMEM = “Tanaka”;
const char name003[] PROGMEM = “Suzuki”;
const char name004[] PROGMEM = “Takahashi”;
const char name005[] PROGMEM = “Sato”;
const char* const names[] PROGMEM = { name001, name002, name003, name004, name005 };
リスト2 表8のようにする場合のリスト1の書き換え方
●入退室日時のファイルを扱う
入退室日時の情報は、日ごとにSDカードに保存されます。ファイル名は「YYYYMMDD.CSV」のような形になります。例えば、2019年1月23日の入退室日時の情報は、「20190123.CSV」というファイル名で保存されます。
CSVファイルの各行は、以下のような形式になっています。ExcelでCSVファイルを開けば、中身を見ることができます。
IDm,持ち主の名前,入室日時,退室日時
なお、SDカードの中身を見る際には、Arduino Mega 2560の電源を切ってから、SDカードを抜くようにします。
まとめ
ソニーのRC-S620Sを使うと、FeliCa対応のICカードやスマートフォンなどを認識することができます。IDmの情報を使って、特定のICカード等だけを認識させることもできます。
今回の例ではタッチした日時をSDカードに保存しましたが、他の動作に応用することも考えられます(例:電化製品の電源を入れる、サーボモータで鍵を回す、etc.)。皆さんも試してみてください。