ゆるく楽しむプログラミング

RFID-RC522ユニットで「セキュリティカードごっこ」やってみた

 RFID-RC522モジュールで「セキュリティカードごっこ」をやってみました。
 I2C接続のユニットもあるようですが、今回使用するのはSPI接続のユニットです。

MFRC-522 RFID ICカード モジュール


MFRC522は、13.56MHzでの非接触通信のための高度に統合されたリーダー/ライターICです。
MFRC522の内部送信機は、ISO/IEC 14443 A/MIFAREカードやトランスポンダとの通信を行うために設計されたリーダー/ライターアンテナを、追加のアクティブ回路なしで駆動することができます。
受信モジュールは、ISO/IEC 14443 A/MIFARE互換カードやトランスポンダからの信号を復調および解読するための堅牢で効率的な実装を提供します。
デジタルモジュールは、ISO/IEC 14443Aのフレーミングおよびエラー検出(パリティおよびCRC)の機能を完全に管理します。
と言う訳で、使用するのは MIFAREカードです。
非接触通信カードでは Suica等に使用されているFeliCaがメジャーですが、FeliCaとは通信方式が異なり互換性はありません。
※RFID-RC522ユニットではFeliCaにはアクセスできません。
方式名 推進企業 国内での利用実績(例)
ISO/IEC 14443 Type A NXPセミコンダクタ Taspo、Mifareカード
ISO/IEC 14443 Type B Motorola 住基カード、運転免許、パスポート
FeliCa SONY Suica、ICOCA、manaca、PASMO、Edy

--------------------------------------------------------------------
RC522ユニットはArduino用のライブラリが多数存在します。
今回は GithubCommunity版のMFRF522ライブラリを使用しました。

ArduinoIDEのライブラリマネージャーでRC522を検索。
GithubCommunity版のMFRF522をインストールします。


Arduino用のライブラリをM5Stackで使用する場合にはいくつか問題があります。

MFRC522ユニットとArduinoUNOの接続

 ArduinoUNOで使用する場合には、普通にSPIユニットとして接続すれば良いので
 SLCK-13 / MISO-12 / MOSI-11 で使用できます。

 MFRC522(SPI)のサンプルスケッチも、この接続を想定しています。


MFRC522ユニットとM5Stack BASICの接続

 SPI通信用として出ている23/19/18番ピンは、内蔵のSPIと共通なので、このGPIOピンを使用すると内蔵のTFT液晶、SDカードと競合します。

 MFRC522(SPI)ライブラリ使用時にSPIモードを変更するため、M5ライブラリで設定しているSPIモードが書き換わってしまい、内蔵デバイスが動作しなくなります。

M5ライブラリを使用せずにTFT液晶、SDカード、MFRC522の整合性を取れば良いのですが・・・


それでもM5Stack BASIC(ESP32)には「JPEGファイルを画像データに展開する機能がある」ので、SDカードからTFT液晶に簡単にJPEG画像を表示できる機能を持つM5ライブラリ使用は魅力的です。

23/19/18番ピン以外で使用する場合
 3番ピン(RX0)、1番ピン(TX0)はSerial通信に使用していて使えません。
 15番ピンはスピーカーに繋がっていて使えません。※出力としては使えますが、音が鳴ります、煩いです。
 17番ピン(TX2)は出力ピンで入力には使えません。
なので、 SCLK(16)、MOSI(17)、MISO(2)、SS(5)、RESET(26) で使用します。

Mifareカードのフォーマット情報

Mifare 1K Standard
Sector Block 0 1 2 3 4 5 6 7 8 9 A B C D E F Description
0 0 Manufacture
1 Data Block
2 Data Block
3 KEY-A Access Bits KEY-B Sector Trailer
1 4 Data Block
5 Data Block
6 Data Block
7 KEY-A Access Bits KEY-B Sector Trailer
2 8 Data Block
・・・・・・・・・・・・
58 Data Block
59 KEY-A Access Bits KEY-B Sector Trailer
15 60 Data Block
61 Data Block
62 Data Block
63 KEY-A Access Bits KEY-B Sector Trailer
   Mifare Standard(Mifare1 S50)は1Kバイトの容量を持っています。
各カードには、4バイトのグローバルな固有識別子番号(USN/UID)があります。

Mifare1 S50の容量(1Kバイト)は16Byteのブロック64個で構成されます。
4ブロックで1セクタを構成します。

各セクタには、セクタの最後のブロックに配置された独立したパスワードとアクセス制御があります。
このブロックはセクタトレーラーとも呼ばれ、各セクタのブロック3です。
セクタ0、ブロック0(絶対アドレス0)はベンダーコードの保存に使用されます。
このコードは固定されており、変更できません。
残りはデータブロックであり、データの保存に使用することができます。

新しいカードのデフォルトパスワードは、
通常、パスワードAにはA0A1A2A3A4A5が、パスワードBにはB0B1B2B3B4B5が設定されています。
または、パスワードAとパスワードBの両方が6つのFFに設定されている場合もあります。
アクセス制御は、セクタ内の各ブロック(制御ブロック自体を含む)のアクセス条件を設定するために使用されます。

デフォルトでは、パスワードAまたはパスワードBを認証した後、データブロックへの読み書き操作が可能です。
また、パスワードAを認証した後、制御ブロックへの読み書き操作が可能です。
ただし、パスワードAは読み取ることができません。
パスワードAを認証することを選択し、パスワードAを忘れた場合、そのブロックは二度と読み取ることができなくなります。

初心者は制御ブロックの内容を変更しようとしないことを強くお勧めします。

Read/Writeはブロック単位で、16Byteずつ行います。
MFRC522ライブラリを使用した場合、Read/Writeはブロックの絶対アドレスを指定して行いますので、ブロック0とパスワードブロックには書き込まないように注意してください。
実験段階で、うっかりパスワードブロックに書き込んでしまったセクターは二度とアクセスできなくなってしまいました。

ソフトウエアSPI

M5Stack BASICはVSPIとHSPIの2種類のハードウエアSPIを持っています。
内蔵TFT液晶とSDカードに使用されているのはVSPIなので、HSPIを使えば内蔵SPIとは競合しません。
↓ な感じにすれば HSPIが使えますが ・・・ 今回は、折角なのでソフトウエアSPIを使用します。
  ソフトウエアSPIにしておけば、他のマイコンボードでもスケッチの使いまわしが出来そうな気がしますので。

----- HSPIを使用する場合の宣言 ----
#define CK 5
#define MI 17
#define MO 16
#define SS 22

#define HSPI_CLK 1000000

SPIClass hspi(HSPI);
SPISettings spiSettings = SPISettings(HSPI_CLK,SPI_MSBFIRST,SPI_MODE0);

void setup() {
  M5.begin();

  pinMode(CK,OUTPUT);
  pinMode(MI,INPUT);
  pinMode(MO,OUTPUT);
  pinMode(SS,OUTPUT);

  hspi.begin(CK,MI,MO,SS);
  hspi.beginTransaction(spiSettings);
}
----- -----

ソフトウエアSPIクラスは SOFT_SPI.cpp 内で
SOFT_SPI SSPI ;
として SSPI でインスタンス化して使用します。

MFRC522ライブラリはSPIライブラリを使用しているので、ライブラリをソフトウエアSPIを使用するように書き換えます。
インストールしたRC522ライブラリは「スケッチブックの保存場所」の\libraries\MFRC522\srcにあります。
このフォルダにあるファイルを全て、スケッチフォルダにコピーして、ファイル名を変更します。
※とりあえず、ファイル名の後ろにSを付け足しました。
同時にSofytwareSPIクラスのファイルもスケッチフォルダにコピーしておきます。

名称を変更したファイル内で宣言している includeのファイル名も全て変更します。
同時にincludeの<>を""に変更します。 ※<>で宣言するとライブラリフォルダを探しに行くので。
_Arduino_宣言をしている箇所は不要なので全て削除、SPIをSSPIに変更します。
これで、ソフトウエアSPIを使用した汎用的なMFRC522(SPI)ライブラリの出来上がりです。

スケッチ

RFID-RC522(MFRC522 - SPI) を M5Stack BASICで使用する「セキュリティカードごっこ」のスケッチです。
基本的に、MFRC522のサンプルスケッチの表示部分をM5Stack BASICのTFT液晶に表示するように変更しただけのお手軽スケッチです。

GithubcommunityのRC522ライブラリをソフトウエアSPIに改造したファイルを含みます。
ライセンスが怪しいので再配布はやめてください。
※再配布の場合はGithubcommunityのRC522ライブラリを含めてください。

ライブラリ部分はArduinoUNO R3/R4でテストしましたので、ライブラリ部分をマルっと持っていけば大抵のマイコンで動きます。(多分)

RC522.zip

・ReadNUID - UIDを読み取るスケッチ
・InitCARD - Mifeaカードに「セキュリティカードごっこ」用のデータ(ID番号と名前)を書き込むスケッチ
・checkCARD - 「セキュリティカードごっこ」のスケッチ

著作権的な問題で顔写真に使用しているJPEGファイルの配付はできません。
160x120ドットのJpeg画像を 0000.jpeg / 0001.jpeg のファイル名で SDカードに保存してください。
Mifeaカードに書き込んだID番号.jprgが表示されます。

0000.jpeg 0001.jpeg 0002.jpeg 0003.jpeg

解説動画