Arduino×NFCで遊んでみる
みんな大好きNFCを使った電子工作の入門です。
Arduino UNOとジャンパ数本とRFID-RC522を使用して、なんかしよう!って内容です。
因みに今回買ったのは、こちらの商品です。
2個セットでカードとかキーホルダー型のタグも付いてくるので、スターターセットって感じでちょうどいいです。
最初に配線方法
- 8(Arduino)- LED – GND(Arduino)
- 9(Arduino)- RST(RFID-RC522)
- 10(Arduino)- SDA(RFID-RC522)
- 11(Arduino)- MOSI(RFID-RC522)
- 12(Arduino)- MISO(RFID-RC522)
- 13(Arduino)- SCK(RFID-RC522)
- 3.3V(Arduino)- 3.3V(RFID-RC522)
- GND(Arduino)- GND(RFID-RC522)
LEDは抵抗を500Ω程度挟んでおくといいと思います。
面倒なので私は省略しましたが…
まずはソースコード
以下のコードをArduinoに書き込みます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
#include <SPI.h> #include <MFRC522.h> #define LED_PIN 8 #define RST_PIN 9 #define SDA_PIN 10 #define UID1 "XX XX XX XX" // 読み取ったUIDを入れる(空白も必ず保持) MFRC522 mfrc522(SDA_PIN, RST_PIN); MFRC522::MIFARE_Key key; void setup() { Serial.begin(9600); // Initialize serial communications with the PC while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4) SPI.begin(); // Init SPI bus mfrc522.PCD_Init(); // Init MFRC522 mfrc522.PCD_DumpVersionToSerial(); // Show details of PCD - MFRC522 Card Reader details Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks...")); dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE); //Lチカ用 pinMode(LED_PIN, OUTPUT); } void loop() { // Look for new cards if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Select one of the cards if ( ! mfrc522.PICC_ReadCardSerial()) { return; } String strBuf[mfrc522.uid.size]; for (byte i = 0; i < mfrc522.uid.size; i++) { strBuf[i] = String(mfrc522.uid.uidByte[i], HEX); // (E)using a constant integer if(strBuf[i].length() == 1){ // 1桁の場合は先頭に0を追加 strBuf[i] = "0" + strBuf[i]; } } String strUID = strBuf[0] + " " + strBuf[1] + " " + strBuf[2] + " " + strBuf[3]; //UID長い時は下のコードみたいに伸ばしておけばOK //String strUID = strBuf[0] + " " + strBuf[1] + " " + strBuf[2] + " " + strBuf[3] + " " + strBuf[4] + " " + strBuf[5] + " " + strBuf[6]; if ( strUID.equalsIgnoreCase(UID1) ){ // 大文字小文字関係なく比較 //UIDがUID1と一致した際の処理を書く Serial.print("UID: "); Serial.println(UID1); // 今回はLチカしちゃうだけ。 digitalWrite(LED_PIN, HIGH); delay(500); digitalWrite(LED_PIN, LOW); }else{ // もし登録されていないNFCなら情報を表示 mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); } } /** * Helper routine to dump a byte array as hex values to Serial. */ void dump_byte_array(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer[i] < 0x10 ? " 0" : " "); Serial.print(buffer[i], HEX); } } |
RSTとSDAのピンのみ指定しますが、他のピンはライブラリ側で指定されています。
詳しくは、こちらのPIN_LAYOUTからご覧ください。
NFCのUIDを確認
さて、上記のコードを書き込んでシリアルモニタを開いてください。
付属のNFCカードをかざすと、以下のようにシリアルモニタに表示されると思います。
1 2 3 4 5 6 7 8 9 10 11 |
Firmware Version: 0x92 = v2.0 Scan PICC to see UID, SAK, type, and data blocks... 00 00 00 00 00 00 Card UID: XX XX XX XX Card SAK: 08 PICC type: MIFARE 1KB Sector Block 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 AccessBits 15 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ] 62 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ] 61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ] 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ] |
中の数値等が多少違うのは全く問題ありません。
さて、ここで注目すべきは以下の行
4 |
Card SAK: 08 |
この、部分がNFCタグのIDになります。
「XX XX XX XX」の部分をコピーしておきましょう。(長さや内容はタグによって変わります。)
UIDの登録
ソースコードの8行目の”XX XX XX XX”の部分に先程コピーしたUIDを貼り付けます。
8 |
#define UID1 "XX XX XX XX" // 読み取ったUIDを入れる(空白も必ず保持) |
これで登録完了です。
改めて書きこんでみましょう。
同じNFCカードをかざすとLEDが光るかと思います。
LEDの点滅処理部分に他の処理を入れることで、モータを動かして自動ロックを作ったりもできますね!
是非遊んでみてください!
参考にした記事
⇒【dotstudio,inc.】非接触ICタグで遊ぼう!ArduinoでRFIDリーダRC522を使う方法
今回のブログ曲
今回投稿中に聴いていた曲はこちら