2010/05/29(土)RFIDリーダーを使ってみた
2010/05/31 11:56
ひょんなことからその学生証がMifare仕様であることを知りました。
そこで、日新テクニカさんで取り扱っているMifare対応のRFIDモジュールを使って学生証のCardIDを読んでみました。
Adiaryで記事を書く練習がてら、その流れを書いていこうと思います。
ISO 14443 Type-A(Mifare)対応 13.56MHz RFIDモジュールについて
日新テクニカさんが取り扱っているRFIDモジュールで、Mifareに対応しています。Web上で探してみるとデータシートがここにおいてありました。
データシートによるとピンアサインは以下のようになっています。
image | PIN | Symbol | Type | Descriptions |
---|---|---|---|---|
J1-1 | RXD | I | Uart Receiver | |
J1-2 | TXD | O | Uart Transmitter | |
J1-3 | OUT1 | O | OUTPUT1 | |
J1-4 | OUT2 | O | OUTPUT2 | |
J1-5 | RST | I | Reset,active-low,floating for power on reset by default | |
J1-6 | BUZ | O | Buzzer output, high level drive | |
J1-7 | IRQ | O | Interrupt output,LOW level indicates card in the field | |
J1-8 | Vcc | PWR | Power supply(3.3V) | |
J1-9 | GND | PWR | Power supply Groud | |
J2-1 | 232RXD | I | RS232 Receiver | |
J2-2 | 232TXD | O | RS232 Transmitter | |
J2-3 | Vcc | PWR | Power supply(3.3V) | |
J2-4 | GND | PWR | Power supply Ground |
また、このモジュールの特徴として基板の配線として既にアンテナが用意されていて、このモジュールだけでMifare仕様のICカードと情報のやりとりをすることができます。
通信してみる
シリアル通信で信号のやり取りをします。通信できさえするならどんな手を使ってもいいと思いますが、こちらで紹介されているモジュールを使うと便利かなと思います。
その場合はおそらく3.3Vは別電源で供給しないと電流が足りないと思うので注意してください。
私の手元に簡単に3.3V電源を供給するものがなかったので、今回は下のような回路とプログラムでmbedに接続を仲介させて、通信をしてみました。
#include "mbed.h" Serial pc(USBTX, USBRX); // tx, rx Serial device(p13, p14); // tx, rx int main() { pc.baud(19200); device.baud(19200); while(1) { if(pc.readable()) { device.putc(pc.getc()); } if(device.readable()) { pc.putc(device.getc()); } } }
それでは実際に通信をしてみましょう。
なお、データの通信はBinary Terminalを使って行いました。
Binary Terminalを起動したらポートをmbedが接続されているポートに合わせ、Speedを19200bpsにしましょう。
そして左下のBinalyボタンをへこませたら準備は完了です。
テストコマンドを送る
フォームの中に以下のコマンドを入れて送信してください。Header | Len | Command | Data | XOR Checksum | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|
0xaa | 0xbb | 0x09 | 0x00 | 0x01 | 0x02 | 0x03 | 0x04 | 0x05 | 0x06 | 0x07 | 0x09 |
以下のようにデータがそのまま返ってくれば成功です。
Header | Len | Status | Data | XOR Checksum | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|
0xaa | 0xbb | 0x09 | 0x00 | 0x01 | 0x02 | 0x03 | 0x04 | 0x05 | 0x06 | 0x07 | 0x09 |
返ってこない場合は配線や通信速度を確認してみてください。
Card IDを読む
初期状態だとICカードを近づけることでモジュール上のLEDが赤く光ると思います。その状態で今度は以下のようなコマンドを送信してみてください。
Header | Len | Command | Data | XOR Checksum | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|
0xaa | 0xbb | 0x02 | 0x20 | 0x22 |
このようなコマンドが返ってくれば成功です。
Header | Len | Status | Data | XOR Checksum | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|
0xaa | 0xbb | 0x06 | 0x20 | 0x92 | 0xbf | 0x72 | 0x59 | 0x20 |
このCardIDを記録しておくことで個人の識別ができますね。
自動的にCardIDを読んでもらう
カードが近けてからいちいち命令を送るのは面倒ですよね。カードが近づくと自動的にデータを送ってもらえるようにする設定があるので、それをやってみましょう。
このようなコマンドを送ると、自動でCardIDを読むモードに変更されます。
Header | Len | Command | Data | XOR Checksum | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0xaa | 0xbb | 0x12 | 0x04 | 0x02 | 0x00 | 0xff | 0xff | 0xff | 0xff | 0xff | 0xff | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x05 | 0x11 |
こういうデータが返ってくればモード変更が成功です。
Header | Len | Status | Data | XOR Checksum | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|
0xaa | 0xbb | 0x02 | 0x4 | 0x06 |
そしてカードをかざすと、LEDが一瞬点滅して自動的に以下のようなデータが送られてくるはずです。
Header | Len | Status | Data | XOR Checksum | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|
0xaa | 0xbb | 0x06 | 0x50 | 0x92 | 0xbf | 0x72 | 0x59 | 0x50 |
ちなみに最初の状態に戻すときはこういうコマンドを送ってください。
Header | Len | Command | Data | XOR Checksum | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0xaa | 0xbb | 0x12 | 0x04 | 0x01 | 0x00 | 0xff | 0xff | 0xff | 0xff | 0xff | 0xff | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x05 | 0x12 |
今回やったことは以上です。
CardIDを読む以外にもアンテナのオンオフ等色んな機能があるようです。
興味ある方はデータシートをご覧になると良いかと思います。