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