create every day - 福野泰介の一日一創

IchigoJamで読むRFID、300円で買える非接触ICカードリーダー「RFID-RC522」でNFC実験

2017/08/17 23:55:00
#IchigoJam #maker 

かざすだけでピッと読み取る、NFC(近距離無線通信)を使った、日本の非接触ICカード。
日本の代表格は、Suicaで有名なソニーのFeliCa
ただ、残念ながら世界の標準はNXPのMIFAREが押さえてます。(シェア7割)

MIFAREは特徴は安さ!
なんと、数百円でカードとチップのテストRFID付きで買えちゃいます。
AmazonでRC522で検索すると200円台も!」

接続方法は、温湿度計ADT7310FM音源YMF825スーファミコントローラーでもお馴染みSPI
ということで、IchigoJamにつないでみました。


RC522にかざすと反応して、カード固有のIDの4byteだけを取得して表示するデモ動画(BASICでゆっくり読み取り版)

IchigoJam x RC522 接続方法

RC522 - IchigoJam
SDA - OUT1 *SDA=SS chip select的なピン
SCK - OUT2 *クロックはMasterが担当
MOSI - OUT3 *MOSI = Master Out Slave In
MISO - IN1 *MISO = Master In Slave Out
IRQ NC
GND - GND
RST - OUT4
3.3V - VCC

データシートを読むのが筋ではありますが、GitHubにある「Arduino RFID Library for MFRC522」を基にIchigoJam BASICでひとまず作ってみました。 2ファイル、2KBくらいのプログラムになりました。

1 'RFID-RC522 1/2 10 OUT4,0:WAIT4:OUT1,1:OUT4,1 20 LET[0],#2400,#2600,#4826,#5480,#56A9,#5803,#5AE8,#2A40,#223D 30 FORJ=0TO8:N=[J]:GSB@SPIW:NEXT 40 N=#28:GSB@SPIR:IF N&3!=3 N=#2800|N|3:GSB@SPIW 50 @LOOP:?"."; 55 LET[0],#2400,#2600,#4826 60 FORJ=0TO2:N=[J]:GSB@SPIW:NEXT 70 N=#1C:GSB@SPIR:N=#1C00|N&#7F:GSB@SPIW 90 LET[0],#200,#87F,#1480,#1226,#1A07,#20C 100 FORJ=0TO5:N=[J]:GSB@SPIW:NEXT 110 N=#1A:GSB@SPIR:N=#1A00|N|#80:GSB@SPIW 120 N=#8:GSB@SPIR:IF N&1 GOTO@LOOP 130 IF N&#30=0 GOTO120 140 N=#C:GSB@SPIR:IF N&#13 ?"ERR1:";N:GOTO@LOOP 150 N=#14:GSB@SPIR:IF N!=2 ?"ERR2":GOTO@LOOP 160 N=#12:GSB@SPI2R 170 N=#18:GSB@SPIR 190 ?"!":LRUN FILE()+1 500 @SPIW:OUT1,0:FORI=15TO0STEP-1:OUT2,0:OUT3,N>>I&1:OUT2,1:NEXT:OUT1,1:RTN 510 @SPIR:OUT1,0:N=N|#80:FORI=7TO0STEP-1:OUT2,0:OUT3,N>>I&1:OUT2,1:NEXT:N=0:FORI=7TO0STEP-1:OUT2,0:N=IN(1)<<I|N:OUT2,1:NEXT:OUT1,1:RTN 520 @SPI2R:OUT1,0:N=N|#80:FORI=7TO0STEP-1:OUT2,0:OUT3,M>>I&1:OUT2,1:NEXT:M=N<<8:N=0:FORI=15TO0STEP-1:OUT2,0:OUT3,M>>I&1:N=IN(1)<<I|N:OUT2,1:NEXT:OUT1,1:RTN

ファイル1つ目では、リーダーの初期化とカードを認識するまでを担当。190行でUUID読み出しファイル(次の番号を想定)へLRUN!

10 N=#1C:GSB@SPIR:N=#1C00|N&~#80:GSB@SPIW:N=#1A00:GSB@SPIW 30 LET[0],#200,#87F,#1480:FORJ=0TO2:N=[J]:GSB@SPIW:NEXT 50 N=#1293:M=2<<4:GSB@SPI2W:N=#1A00:GSB@SPIW:N=#20C:GSB@SPIW 110 N=#1A:GSB@SPIR:N=#1A00|N|#80:GSB@SPIW 120 N=#8:GSB@SPIR:IFN&1GOTO@END 130 IFN&#30=0GOTO120 140 N=#C:GSB@SPIR:E=N:IFE&#13GOTO@END 150 N=#14:GSB@SPIR:IF N!=5 GOTO@END 160 M=N:N=#12:GSB@SPIAR:FORI=0TOM-1:?HEX$([I],2);:NEXT:? 170 N=#18:GSB@SPIR 190 @END:LRUNFILE()-1 500 @SPIW:OUT1,0:FORI=15TO0STEP-1:OUT2,0:OUT3,N>>I&1:OUT2,1:NEXT:OUT1,1:RTN 505 @SPI2W:OUT1,0:FORI=15TO0STEP-1:OUT2,0:OUT3,N>>I&1:OUT2,1:NEXT:FORI=7TO0STEP-1:OUT2,0:OUT3,M>>I&1:OUT2,1:NEXT:OUT1,1:RTN 510 @SPIR:OUT1,0:N=N|#80:FORI=7TO0STEP-1:OUT2,0:OUT3,N>>I&1:OUT2,1:NEXT:N=0:FORI=7TO0STEP-1:OUT2,0:N=IN(1)<<I|N:OUT2,1:NEXT:OUT1,1:RTN 530 @SPIAR:OUT1,0:N=N|#80:FORI=7TO0STEP-1:OUT2,0:OUT3,N>>I&1:OUT2,1:NEXT 540 FORJ=0TOM-1:[J]=0:FORI=7TO0STEP-1:OUT2,0:OUT3,N>>I&1:[J]=IN(1)<<I|[J]:OUT2,1:NEXT:NEXT 550 J=J+1:[J]=0:FORI=7TO0STEP-1:OUT2,0:OUT3,0:[J]=IN(1)<<I|[J]:OUT2,1:NEXT:OUT1,1:RTN

本体はそんな長くないですが、SPIの読み書きにいくつかパターンがあるので、長くなってしまって、ちょうど制限いっぱいの1024byte。 1つ目をファイル1に書き込んだら、こちらはファイル2と、次の番号に保存して使います。190行のLRUN FILE()-1 で、カード待ちに戻しています。

この戻る部分を改造すると、カードによって、いろいろなことをさせることができますね!
IchigoJam本体の保存容量だけでもまだ2ファイル分、2KB使えます!MixJuicesakura.ioでネットにつなぐのも楽しそう。
MIFAREでAmazonを検索するとカード1枚あたり100円台から買えます」
(少量だとリーダー買うほうが安い不思議w)

今回表示しているのはUUIDのたぶん先頭4byteのみ。後ろの1byteはデータ化け対策のCRCです。
本当のUUIDはもうちょっと長いと思いますが、お気軽実装ということで省略しました。
必要がでてくれば、データシートを読んで、ちゃんとした読み取りにも対応することにします。

BASICで読み取っているので、結構ゆっくりですが動作の確認ができたので、実用化する際はマシン語化ですね!
参考「マシン語で高速SPI、IchigoJamでまなぶ ARMマシン語入門その9」「マシン語SPIでコントローラ信号読み出し
マシン語化しました!(追記、2017.8.23)

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / high-res profile image