2010/05/29(土)RFIDリーダーを使ってみた

2010/05/31 11:56 使ってみたimportnucho
私の通っている学校では、出席のチェックや部屋の電子錠を学生証を兼ねた非接触ICカードで行っています。
ひょんなことからその学生証がMifare仕様であることを知りました。

そこで、日新テクニカさんで取り扱っているMifare対応のRFIDモジュールを使って学生証のCardIDを読んでみました。

Adiaryで記事を書く練習がてら、その流れを書いていこうと思います。


ISO 14443 Type-A(Mifare)対応 13.56MHz RFIDモジュールについて

日新テクニカさんが取り扱っているRFIDモジュールで、Mifareに対応しています。
Web上で探してみるとデータシートがここにおいてありました。

データシートによるとピンアサインは以下のようになっています。

表1 RFIDモジュールのピンアサイン
imagePINSymbolTypeDescriptions
RFID_MODULE_PIN_ASSIGN.JPG
J1-1RXDIUart Receiver
J1-2TXDOUart Transmitter
J1-3OUT1OOUTPUT1
J1-4OUT2OOUTPUT2
J1-5RSTIReset,active-low,floating for power on reset by default
J1-6BUZOBuzzer output, high level drive
J1-7IRQOInterrupt output,LOW level indicates card in the field
J1-8VccPWRPower supply(3.3V)
J1-9GNDPWRPower supply Groud
J2-1232RXDIRS232 Receiver
J2-2232TXDORS232 Transmitter
J2-3VccPWRPower supply(3.3V)
J2-4GNDPWRPower supply Ground
初期状態だと左上のICが実装されていないのでRS232で通信したい場合はこのへんのICを取り付けるのかなと思います。


100530-171539.jpg

また、このモジュールの特徴として基板の配線として既にアンテナが用意されていて、このモジュールだけでMifare仕様のICカードと情報のやりとりをすることができます。

通信してみる

シリアル通信で信号のやり取りをします。
通信できさえするならどんな手を使ってもいいと思いますが、こちらで紹介されているモジュールを使うと便利かなと思います。
その場合はおそらく3.3Vは別電源で供給しないと電流が足りないと思うので注意してください。


私の手元に簡単に3.3V電源を供給するものがなかったので、今回は下のような回路とプログラムでmbedに接続を仲介させて、通信をしてみました。

connect_RFID.PNG

#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ボタンをへこませたら準備は完了です。

テストコマンドを送る

フォームの中に以下のコマンドを入れて送信してください。
HeaderLenCommandDataXOR Checksum
0xaa0xbb0x090x000x010x020x030x040x050x060x070x09

以下のようにデータがそのまま返ってくれば成功です。
HeaderLenStatusDataXOR Checksum
0xaa0xbb0x090x000x010x020x030x040x050x060x070x09

返ってこない場合は配線や通信速度を確認してみてください。

Card IDを読む

初期状態だとICカードを近づけることでモジュール上のLEDが赤く光ると思います。
その状態で今度は以下のようなコマンドを送信してみてください。
HeaderLenCommandDataXOR Checksum
0xaa0xbb0x020x200x22

このようなコマンドが返ってくれば成功です。
HeaderLenStatusDataXOR Checksum
0xaa0xbb0x060x200x920xbf0x720x590x20
Dataの4ビットが個々のCardIDとなっていてそれぞれで異なります。
このCardIDを記録しておくことで個人の識別ができますね。

自動的にCardIDを読んでもらう

カードが近けてからいちいち命令を送るのは面倒ですよね。
カードが近づくと自動的にデータを送ってもらえるようにする設定があるので、それをやってみましょう。

このようなコマンドを送ると、自動でCardIDを読むモードに変更されます。
HeaderLenCommandDataXOR Checksum
0xaa0xbb0x120x040x020x000xff0xff0xff0xff0xff0xff0x000x000x000x000x000x000x000x050x11

こういうデータが返ってくればモード変更が成功です。
HeaderLenStatusDataXOR Checksum
0xaa0xbb0x020x40x06
この後でRST端子にlow pluseを入れるか、いったん電源を切ってリセットをしましょう


そしてカードをかざすと、LEDが一瞬点滅して自動的に以下のようなデータが送られてくるはずです。
HeaderLenStatusDataXOR Checksum
0xaa0xbb0x060x500x920xbf0x720x590x50
コマンドを送ってCardIDを読んだときと同じく、Dataの4バイトがCardIDとなっています。


ちなみに最初の状態に戻すときはこういうコマンドを送ってください。
HeaderLenCommandDataXOR Checksum
0xaa0xbb0x120x040x010x000xff0xff0xff0xff0xff0xff0x000x000x000x000x000x000x000x050x12

今回やったことは以上です。

CardIDを読む以外にもアンテナのオンオフ等色んな機能があるようです。
興味ある方はデータシートをご覧になると良いかと思います。