obniz Parts Library

MFRC522

GitHub
MFRC522
Usable Devices :
obniz_board
Found at :
秋月電子通商
秋月電子通商

MFRC522

RFID-RC522はNXP製のMFRC522チップを搭載したRFIDカードリーダー・ライターです.
自身で所持しているポイントカードや学生証なども,MifareカードであればUIDを取得し識別する事が出来ます.
また,3種類のサンプルプログラムを用意しました.
dump :カード内の全データ読取
read :カード内の指定データの読取
write :カードへ指定データの書込み

RFID-RC522の注意・説明

配線の注意

obnizの3Vピン設定は十分な電力ではないので、レギュレータで5Vピン設定を2.5-3.6V(3.3V推奨)に落としてください。

ピンの設定

RFID-RC522には以下の様なピンがあります.

それぞれ以下の表のような対応になっています.
| RFID-RC522 | obniz pin settings | wired()で宣言必須・不要|
|:-----------------:|:---------------------:|:---------------------:|
| SDA | cs | 必須 |
| SCK | clk | 不要 |
| MOSI | mosi | 必須 |
| MISO | miso | 必須 |
| IRQ | - | - |
| GND | gnd | 不要 |
| rst | rst | 必須 |
| 3.3V | vcc | 不要 |

UID

カード固有のID番号.
カードを識別する為に使います.

PICC_Type

MFRC522チップは格納できるデータ量によって
"MIFARE Mini, 320 bytes",
"MIFARE 1KB",
"MIFARE 4KB",
"MIFARE Ultralight or Ultralight C",
"MIFARE Plus"
等の種類が存在します.

MFRC522のメモリ構造

MFRC522はuidとPICC Typeのほかに書取,読取の出来るデータ列を用意しています.
その構成は以下のようになっています.

Sector (= 4Block) Block (= 16Byte)
0 0(UID), 1, 2, 3(Reserved)
1 4, 5, 6, 7(Reserved)
2 8, 9, 10, 11(Reserved)
3 12, 13, 14, 15(Reserved)
... ...
15 60, 61, 62, 63(Reserved)

Block:0の16Byteの1部(通常先頭5Byte)はUIDとして予約されています.
また,各Sectorの4Block目(Block:3, 7, 11...)は認証Blockとして予約されている為,ユーザーが使用可能なのは3Block分です.
UID, 認証Blockは書き換えると復帰不可能になる場合がある為,このライブラリでは書き込みを禁止しています.

また通常の"MIFARE 1KB"タイプであればBlock数は64個あり,メモリ量は
64 Block × 16 Byte = 1,024 B = 1KB
となります.
もし他のタイプのカードであれば,メモリ量に対応したブロック数まで読むことが出来ます.
ただしポイントカードなどの商用利用カードは認証パスワードが分からない為,内部のデータは読めません.UIDを取得できるだけです.

ライブラリ内の関数

wired("MFRC522", {cs, clk, mosi, miso, gnd, rst})

RFID-RC522は占有ピンが多い為,宣言不要ピンを設定しています.
上記”ピン設定”の表で表した宣言必須ピンは必ず wired() 関数内で宣言する必要があります.
宣言不要ピンは必ず wired() 関数内で宣言する必要はありませんが,その場合他のモジュールとのピンの共用が必要です.

name type required default description
cs number(obniz Board io) yes   SDAと表記のあるピンです。
clk number(obniz Board io) yes   SCKと表記のあるピンです。
mosi number(obniz Board io) yes   MOSIと表記のあるピンです。
miso number(obniz Board io) yes   MISOと表記のあるピンです。
rst number(obniz Board io) no   RSTと表記のあるピンです。
gnd number(obniz Board io) no   GNDと表記のあるピンです。
// Javascript Example
var mfrc522 = obniz.wired("MFRC522", { cs: 0, clk: 1, mosi: 2, miso: 3, gnd: 5, rst: 6});

[await] findCardWait(uid, PICC_Type)

カードを探すための関数です.
カードを検知すると,カードの'uid', 'PICC Type'が引数の要素に入ります.

// Javascript Example
var mfrc522 = obniz.wired("MFRC522", { cs: 0, clk: 1, mosi: 2, miso: 3, gnd: 5, rst: 6});
while(true) {
    try {
        let card = await mfrc522.findCardWait();
        console.log("Card is detected!");
        console.log("UID        : " + card.uid);
        console.log("PICC Type     : " + card.PICC_Type);
    } catch(e) {
        // Not Found or Error
        console.error(e)
    }
}

[await] readBlockDataWait(Block, UID)

Block数とUIDを入れることで,1Block分のデータを取得できます.

// Javascript Example
// Read block data in the card
var mfrc522 = obniz.wired("MFRC522", { cs: 0, clk: 1, mosi: 2, miso: 3, gnd: 5, rst: 6});
while(true) {
    try {
        let card = await mfrc522.findCardWait();
        const Block = 4;
        response = await mfrc522.readBlockDataWait(Block, card.uid);
        console.log("Block: " + Block + " Data: " + response);
    } catch(e) {
        // Not Found or Error
        console.error(e)
    }
}

[await] readSectorDataWait(Sector, UID)

Sector数とUIDを入れることで,4Block分のデータを配列で1度に取得できます.

// Javascript Example
// Read Sector data in the card
var mfrc522 = obniz.wired("MFRC522", { cs: 0, clk: 1, mosi: 2, miso: 3, gnd: 5, rst: 6});
while(true) {
  try {
    let card = await mfrc522.findCardWait();
    const Sector = 2;
    response = await mfrc522.readSectorDataWait(Sector, card.uid);
    console.log("Sector: " + Sector);
    for (let i = 0; i < 4; i++)
      console.log("Block: " + (Sector * 4 + i) + " Data: " + response[i]);
  } catch(e) {
    // Not Found or Error
    console.error(e)
  }
}

[await] writeBlockDataWait(Block, data)

書き込みたいBlock数と16Byteのデータを入れることで,指定したブロックに指定したデータの書き込みが出来ます.

注意:書き込み動作はメーカーが非推奨としております。不安定またはデータの破損に繋がる可能性があります。

// Javascript Example
var mfrc522 = obniz.wired("MFRC522", { cs: 0, clk: 1, mosi: 2, miso: 3, gnd: 5, rst: 6});
while(true) {
  try {
    let card = await mfrc522.findCardWait();
    let data00 = [
        0x00, 0x00
    ];
    const Block = 4;
    // Write block data to card
    console.log("Writing data to Block " + Block + "...");
    await mfrc522.writeBlockDataWait(Block, data00);
    console.log("Wrinting finished.");
  } catch(e) {
    // Not Found or Error
    console.error(e)
  }
}

サンプルプログラムについての注釈

alert(buzzer_pin)

注意:サンプルのhtml内で宣言している関数であり,ライブラリ内には存在しません.
カードを検知したとき,操作が終了した時などにブザーを鳴らすための関数です.
引数にブザーに繋いだピン番号を取ります.

try_catch(err)について

サンプルプログラム中でtry_catch構文を用いています.
これによってエラーした箇所でエラー内容を返しプログラムが止まる仕様になっています.その為エラーが重複する事はありません.
エラーの種類はサンプルプログラムに書いてあるものが全てであり,エラー内容はlogに出るようになっています.
よってユーザーは表示したいエラーのみを選択して表示することが出来ます.

Supported from: obniz.js 3.5.0