Arduino、ENC28J60 Ethernet、MFRC522でネットワーク対応RFIDカードリーダーを構築
必要な部品と材料
| Mifare MFRC522 RFIDリーダー(SPI対応なら何でも可) | ×1 |
| Arduino UNO(または互換ボード) | ×1 |
| ENC28J60 Ethernetモジュール/シールド | ×1 |
| ジャンパワイヤ(汎用) | ×1 |
| ブレッドボード(汎用) | ×1 |
| コンピュータ(インターネット接続可能) | ×1 |
必要な工具
- ハサミ(またはワイヤーストリッパー)
使用するアプリとオンラインサービス
- PyCharm(Pythonサーバー開発用)
- Arduino IDE
プロジェクト概要

自宅やオフィスにRFIDタグ/カードによるセキュリティや入退室管理システムを導入したいと思ったことはありませんか? 市販システムは200〜2000ドルと高価です。友人と共に100ドル以下で、ドア解錠以上のことができるシステムを開発しました。高校生の入退室管理を目的としており、学校への導入を目指しています。

開発時間は約6時間(電源トラブル込み)でしたが、手順に従えば30分程度でセットアップ可能です。全コードと配線図を以下に示します。
事前準備:必要なライブラリ
- UIPEthernet をインストール
- MFRC522 をインストール
- 両方を
Program Files(x86)/Arduino/Libraries/に配置し、Arduino IDEを再起動
ハードウェア接続(Arduino Nano基準)
- Arduinoをブレッドボードに装着
- 使用ボードのSPIピン配置を確認し、以下のように接続:
- Arduinoピン10 (SS) → Ethernetモジュール SS/CS
- Arduinoピン12 (MISO) → RFID MISO および Ethernet SO
- Arduinoピン11 (MOSI) → RFID MOSI および Ethernet SI
- Arduinoピン13 (SCK) → RFID SCK および Ethernet SCK
- Arduinoピン9 → RFID RST
- Arduinoピン8 → RFID SSN (SDA)
- RGB LED:ピン5(緑)、4(青)、3(赤)
- AC-DCアダプタ(3.3V/5V、700mA以上)をブレッドボードの+/-に接続
- ArduinoのGNDをAC-DCのGNDと共通化
- RFIDとEthernetのVCC/GNDをAC-DCに接続(注意:これらは3.3V動作。5Vを供給すると破損します。必要なら抵抗で降圧)
- LEDのVCCをArduino 3.3VまたはAC-DC 3.3Vに接続
- Ethernetケーブルをモジュールに接続し、PCと同一ネットワークに参加
- USBでArduinoをPCに接続
コードのカスタマイズ
スケッチ内の以下の項目を環境に合わせて修正してください:
- MACアドレス(複数台作る場合のみ変更)
- IPアドレス(192.168.x.xならそのまま可)
- DNS(通常8.8.8.8、必要なら8.8.4.4)
- ゲートウェイ(
ipconfigで確認、デフォルト192.168.1.1) - PCのIPアドレス(サーバー宛先)
- 「SEND TO SERVER」セクションの送信先IPとポート(デフォルト23番)



実行手順
- AC-DCアダプタをコンセントに接続
- ArduinoをPCにUSB接続
- 両デバイスが同一ネットワークにあることを確認
- 修正済みスケッチをArduinoに書き込み
- Python等のTCP/TelnetサーバーをPCで起動(サンプルコード参照)
- Arduinoをリセット
- LEDが青く点灯したらカードをタッチ。サーバーにIDが届けば成功
LEDの意味:
- 紫/フェード赤:起動中
- 赤:エラー(カード角度不良、サーバー応答なし等)
- 緑:成功(サーバーからGO応答)
- 青:待機中(カード待ち、またはサーバー応答待ち)
30秒以上ラグって赤点灯する場合は、電源不足、サーバー未起動、ネットワーク不一致、ファイアウォール遮断等が疑われます。対処法は本文参照。
※ドアロック制御コードは含まれていません。必要に応じて追加してください。
コード
Arduinoスケッチ(C/C++)
/* MFRC522 Arduino Reader/PCD Nano v3
* Pin Layout:
* RST/Reset RST D9
* SPI SS NSS D10 (Ethernet用)
* SPI MOSI MOSI D11
* SPI MISO MISO D12
* SPI SCK SCK D13
* RFID SS D8
*/
#include <UIPEthernet.h>
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 9
#define SS_PIN 8
byte sector = 0;
byte blockAddr = 0;
byte trailerBlock = 1;
int red = 3, blue = 4, green = 5;
EthernetClient client;
MFRC522 mfrc522(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;
signed long timeout;
void setup() {
pinMode(red, OUTPUT); pinMode(blue, OUTPUT); pinMode(green, OUTPUT);
Reset();
Serial.begin(9600);
SPI.begin();
uint8_t mac[6] = {0x00,0x01,0x02,0x03,0x04,0x05};
IPAddress mip(192,168,1,160);
IPAddress mdns(8,8,8,8);
IPAddress mgate(192,168,1,5);
IPAddress msubnet(255,255,255,0);
Ethernet.begin(mac, mip, mdns, mgate, msubnet);
Serial.println("Succesful connection");
for(int t=255; t>0; t--) { analogWrite(red, t); delay(10); }
mfrc522.PCD_Init();
for(byte i=0; i<6; i++) key.keyByte[i] = 0xFF;
Serial.println(F("Scan a Card"));
dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE);
timeout = 0; delay(2000); Reset();
}
void loop() {
if (!mfrc522.PICC_IsNewCardPresent()) { digitalWrite(blue, LOW); return; }
if (!mfrc522.PICC_ReadCardSerial()) return;
digitalWrite(blue, HIGH);
byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
piccType != MFRC522::PICC_TYPE_MIFARE_4K) { Error(); return; }
byte status, buffer[18], size = sizeof(buffer);
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); Error(); return; }
status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);
if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Read() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); Error(); }
mfrc522.PICC_HaltA(); mfrc522.PCD_StopCrypto1();
if (client.connect(IPAddress(192,168,1,100), 23)) {
timeout = millis()+1000;
Serial.println("Client connected");
String ID = dump_byte_array(buffer, size);
client.println(ID);
Serial.println("sent: " + ID);
delay(10);
while(client.available()==0) { if (timeout - millis() < 0) goto close; }
int sz;
while((sz = client.available()) > 0) {
uint8_t* msg = (uint8_t*)malloc(sz);
sz = client.read(msg, sz);
Serial.write(msg, sz);
if(sz == sizeof("g")-1) Pass(); else Error();
free(msg);
}
close: client.stop();
} else { Serial.println("Couldn't connect to Server"); Error(); }
Reset();
}
String dump_byte_array(byte *buffer, byte bufferSize) {
String out = "";
for(byte i=0; i
サンプルサーバーコード(Python)
import SocketServer
class MyTCPHandler(SocketServer.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(1024).strip()
print "{} wrote:".format(self.client_address[0])
print self.data
# ここでSQL照合等を行う
self.request.sendall("g") # 簡易的に常にOK返す
if __name__ == "__main__":
HOST, PORT = "", 23
server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()
最新コード(GitHub)
https://github.com/smerkousdavid/InternetRFIDTags
配線図

製造プロセス
- グリーティングカード産業:歴史、製造、未来トレンド
- クレジットカード:歴史・設計・製造・未来トレンド
- ArduinoとRC522で作るセキュアなRFIDドアロック(MIFARE 13.56MHz)
- Arduinoで作るセキュアなRFIDロック – ステップバイステップガイド
- Python連携で信頼性向上: Arduino RFID勤怠管理システム
- Bluetooth操作のArduinoスパイボットを自作する
- FlickMote:ジェスチャー操作のIRリモコンでスマートホームを制御
- 自作Arduino TV-B-Gone:全テレビ対応の万能リモコン
- 12メートル先から見える大型LEDマスタークロック(アラーム機能付き)を自作しよう
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- ArduinoベースのAmigaフロッピーディスクリーダー - 低コスト・オープンソースなデータ復旧