Arduino Uno R4 WiFiでRFIDによる利用権限管理とファン制御システムを作ってみた

オフィスや現場では、プリンタや工作機械、共有備品のように「誰でも自由に使える状態にしておくのは少し不安」という機器があります。たとえば、特定の担当者だけ使ってほしい機器や、誤操作を避けたい装置では、利用権限の確認が意外と重要です。今回は、Arduino Uno R4 WiFiRFIDモジュール を使って、許可されたカードをかざした時だけ機器を動かせる簡易システムを作ってみました。

PoCとしては、実際のプリンタや工作機械の代わりに、DCモーターにファンを取り付けた低電圧の負荷を使い、認証OKの時だけファンが回る構成にしています。まずはローカル表示から始め、将来的にはMQTTやWebダッシュボードへ広げられるような形でまとめました。

注意 
今回はPoCとして、小型DCモーター+ファンで「機器の動作」を模擬しています。 
商用電源を使うプリンタや工作機械そのものを直接制御する構成ではありません。
実機制御に進む場合は、電源設計や安全対策を十分に検討する必要があります。

目次

[はじめに:誰でも使えてしまう問題]
[ローカル表示の基本構成]
[開発環境と実装のポイント]
[実際のプログラム]
[RFID登録方法]
[配線情報]
[発展編:MQTTとWebダッシュボードによる利用ログ管理]
[今後の展望(改善案)]
[関連技術・参考トピック]
[まとめ]
[参考リンク]

はじめに:誰でも使えてしまう問題

共有のプリンタ、工作機械、検証用装置、あるいは特殊な備品などは、「便利だから誰でも使えるようにしたい」という気持ちがある一方で、誤操作や無断利用を避けたいという課題もあります。

現場によっては、以下のような困りごとがあります。

・利用資格のある人だけ使ってほしい
・誰が使ったか分からない
・使ってよい機器かどうか、その場で判断しにくい
・電源を入れてよいかどうかが曖昧

そこで今回は、RFIDカードを“利用許可の鍵”として使い、認証OKの時だけファンを回せる簡易制御システムを試作してみました。 
実際の設備制御の前段として、「認証された人だけ機器を有効化する」という流れを小さく検証するPoCです。

ローカル表示の基本構成

まずは基本となる、RFIDでカードを読み取り、許可されたカードならファンを回し、LCDに状態を表示するシステムを構築しました。

使用した主な部品

・Arduino Uno R4 WiFi
・MFRC522 RFIDモジュール
・RFIDカード / タグ
・I2C接続のLCDモジュール
・DCモーター
・ファン
・NPNトランジスタ(例: S8050)
・整流ダイオード(例: 1N4007)
・ブザー
・赤色LED / 緑色LED
・抵抗
・ブレッドボード
・ジャンパーピン

Arduino Uno R4 WiFiの特徴

マイコンには Arduino Uno R4 WiFi を使用しました。公式ドキュメントによると、このボードはメインMCUとして Renesas RA4M1 を採用しており、48MHz動作のArm Cortex-M4、256KB Flash、32KB SRAM を備えています。また、ESP32-S3 により Wi‑Fi / Bluetooth 接続に対応しており、Arduino Cloudとも互換性があります。 [Source]

今回の試作ではローカル認証と表示が中心ですが、Uno R4 WiFi は「まずは認証して動かすだけの小さなPoCを作る」「あとから利用ログの送信や遠隔監視へ広げる」という段階的な開発と相性が良いと感じました。 [Source]

また、Renesas RA4M1ファミリは 48MHz Arm Cortex-M4 に加え、セグメントLCDコントローラ静電容量式タッチセンシング といったHMI向け機能を持っています。将来的に「単に認証するだけ」から、「本体でモード切り替えする」「管理者カードで設定変更する」といった使い方へ発展させやすい点も魅力です。 [Source]

開発環境と実装のポイント

開発環境には Visual Studio CodePlatformIO IDE を使用しました。PlatformIO のボード設定では board = uno_r4_wifi、プラットフォームは renesas-ra を利用できます。 [Source]

利用権限判定の考え方

今回は、RFIDカードのUIDを読み取り、あらかじめ登録したUIDと一致するかどうかで利用可否を判定しました。

基本ルールは次の通りです。

・登録済みカードなら 認証成功
・認証成功時のみ ファンを一定時間回転
・未登録カードなら 認証失敗
・認証失敗時は ファンを回さず、ブザーと表示で警告

具体的には、認証成功後に 10秒間 ファンを回すようにしています。これは「利用権限がある人だけ起動できる」ことを分かりやすく確認するためのPoC的な構成です。

モーター駆動で気を付けたい点

DCモーターはArduinoのGPIOから直接駆動せず、トランジスタを介して制御します。 
今回は、S8050トランジスタ をスイッチとして使い、モーターには逆起電力対策として 1N4007ダイオード を並列に入れる構成にしています。

また、RFIDモジュール MFRC522 は一般に 3.3V系 で使うモジュールなので、電源や信号レベルの扱いには注意が必要です。実際に使用するモジュールの仕様を確認し、必要に応じてレベル変換も検討すると安心です。

配線情報

各モジュールを以下のように配線します。

配線表

回路上のイメージ

認証成功 
RFIDカード一致 → D5 をHIGH → トランジスタON → モーター回転 → ファン回転

認証失敗 
RFIDカード不一致 → モーターOFFのまま → 赤LED点灯 + ブザー

実際のプログラム

今回のローカル表示版で使用したプログラムは以下の通りです。 
RFIDカードを読み取り、登録済みUIDならファンを一定時間回転させ、LCDとLEDで状態を表示します。
※本プログラムは、生成AIを用いて作成しております。

main.cpp
#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include <MFRC522.h>
#include <LiquidCrystal_I2C.h>

#define SS_PIN   10
#define RST_PIN   9

const int buzzerPin   = 4;
const int motorPin    = 5;
const int greenLedPin = 6;
const int redLedPin   = 7;

LiquidCrystal_I2C lcd(0x27, 16, 2);
MFRC522 rfid(SS_PIN, RST_PIN);

unsigned long motorStopTime = 0;
const unsigned long fanRunTime = 10000; // 10秒

// 許可するカードUIDを登録
const byte authorizedCards[][4] = {
  {0xDE, 0xAD, 0xBE, 0xEF},
  {0x12, 0x34, 0x56, 0x78}
};
const int authorizedCardCount = sizeof(authorizedCards) / sizeof(authorizedCards[0]);

bool isAuthorizedCard(MFRC522::Uid *uid) {
  if (uid->size != 4) return false;

  for (int i = 0; i < authorizedCardCount; i++) {
    bool match = true;
    for (byte j = 0; j < 4; j++) {
      if (uid->uidByte[j] != authorizedCards[i][j]) {
        match = false;
        break;
      }
    }
    if (match) return true;
  }

  return false;
}

void setIdleDisplay() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Scan your card");
  lcd.setCursor(0, 1);
  if (millis() < motorStopTime) {
    lcd.print("Fan: RUNNING   ");
  } else {
    lcd.print("Fan: STOP      ");
  }
}

void beepDenied() {
  for (int i = 0; i < 2; i++) {
    digitalWrite(buzzerPin, HIGH);
    delay(120);
    digitalWrite(buzzerPin, LOW);
    delay(120);
  }
}

void showUid(MFRC522::Uid *uid) {
  Serial.print("UID:");
  for (byte i = 0; i < uid->size; i++) {
    Serial.print(uid->uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(uid->uidByte[i], HEX);
  }
  Serial.println();
}

void setup() {
  Serial.begin(115200);

  pinMode(buzzerPin, OUTPUT);
  pinMode(motorPin, OUTPUT);
  pinMode(greenLedPin, OUTPUT);
  pinMode(redLedPin, OUTPUT);

  digitalWrite(buzzerPin, LOW);
  digitalWrite(motorPin, LOW);
  digitalWrite(greenLedPin, LOW);
  digitalWrite(redLedPin, LOW);

  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("RFID Access");
  lcd.setCursor(0, 1);
  lcd.print("Initializing");

  SPI.begin();
  rfid.PCD_Init();

  delay(1000);
  setIdleDisplay();
}

void loop() {
  unsigned long now = millis();

  // モーター停止時間を過ぎたら停止
  if (now >= motorStopTime) {
    digitalWrite(motorPin, LOW);
  } else {
    digitalWrite(motorPin, HIGH);
  }

  // 新しいカードがないなら待機
  if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) {
    return;
  }

  showUid(&rfid.uid);

  bool authorized = isAuthorizedCard(&rfid.uid);

  if (authorized) {
    motorStopTime = millis() + fanRunTime;

    digitalWrite(greenLedPin, HIGH);
    digitalWrite(redLedPin, LOW);

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Access Granted");
    lcd.setCursor(0, 1);
    lcd.print("Fan ON 10 sec ");

    Serial.println("Access Granted -> Fan ON");
    delay(1000);
    digitalWrite(greenLedPin, LOW);
  } else {
    digitalWrite(greenLedPin, LOW);
    digitalWrite(redLedPin, HIGH);

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Access Denied ");
    lcd.setCursor(0, 1);
    lcd.print("Fan Locked    ");

    Serial.println("Access Denied");
    beepDenied();
    delay(800);
    digitalWrite(redLedPin, LOW);
  }

  rfid.PICC_HaltA();
  rfid.PCD_StopCrypto1();

  setIdleDisplay();
}
```
```platformio.ini
[env:uno_r4_wifi]
platform = renesas-ra
board = uno_r4_wifi
framework = arduino
monitor_speed = 115200
lib_deps =
    miguelbalboa/MFRC522
    marcoschwartz/LiquidCrystal_I2C

RFID登録方法

今回のPoCでは、RFIDカードの登録は「UIDを読み取ってソースコードに追加する方式」を採用しました。

登録の流れ

1. 登録したいRFIDカードのUIDを読み取る
2. シリアルモニタでUIDを確認する
3. 本番コードの authorizedCards にUIDを追加する
4. 再ビルドしてArduinoへ書き込む

1. UID読み取り用プログラムを書き込む

まずは、カードのUIDだけを確認するための簡単なプログラムを書き込みます。

 main.cpp(UID確認用)

main.cpp
#include <Arduino.h>
#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN  10
#define RST_PIN 9

MFRC522 rfid(SS_PIN, RST_PIN);

void setup() {
  Serial.begin(115200);
  SPI.begin();
  rfid.PCD_Init();

  Serial.println("Scan RFID card...");
}

void loop() {
  if (!rfid.PICC_IsNewCardPresent()) return;
  if (!rfid.PICC_ReadCardSerial()) return;

Serial.print("UID:");
for (byte i = 0; i < rfid.uid.size; i++) {
  Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
  Serial.print(rfid.uid.uidByte[i], HEX);
}
  Serial.println();

  rfid.PICC_HaltA();
  rfid.PCD_StopCrypto1();

  delay(1000);
}

 2. シリアルモニタでUIDを確認する

カードをかざすと、シリアルモニタにたとえば以下のように表示されます。

text

UID: DE AD BE EF

あるいは、

text

UID: 12 34 56 78

のように、カード固有のUIDが表示されます。

3. 本番コードの authorizedCards に追加する

確認したUIDを、本番コードの authorizedCards に追加します。

main.cpp
const byte authorizedCards[][4] = {
  {0xDE, 0xAD, 0xBE, 0xEF},
  {0x12, 0x34, 0x56, 0x78}
};

4. 再ビルドして書き込む

authorizedCards を更新したら、再度ビルドしてArduino Uno R4 WiFiへ書き込みます。 
これで、新しく追加したカードでも認証成功するようになります。

登録方式の注意点

この方式はPoCとしては分かりやすい一方で、新しいカードを追加するたびにソースコードを書き換えて再書き込みが必要です。そのため、実運用を考える場合は次のような発展が考えられます。

・管理者カードで入る 登録モード を作る
・UIDを不揮発メモリへ保存する
・Wi‑Fi経由で登録一覧を外部管理する

また、今回の方式は UIDベースの簡易認証 なので、PoCや社内向けの小規模な利用権限確認には向いていますが、本格的な高セキュリティ用途ではより強固な認証方式を検討する必要があります。

プログラムのポイント

MFRC522 ライブラリを使って、RFIDカードのUIDを読み取っています。
authorizedCards に登録したUIDと一致するかどうかで、利用権限を判定しています。
・認証成功時のみ motorPin を有効化し、10秒間だけモーターを回してファンを動作させています。
・LCDの1行目には認証結果、2行目には Fan ONFan Locked を表示しています。
・緑LEDは認証成功、赤LEDは認証失敗を示すようにし、状態がひと目で分かるようにしました。
・ブザーは認証失敗時の警告として使っています。
Serial.begin(115200) を入れているため、シリアルモニタで読み取ったUIDや認証結果を確認しながらデバッグできます。

プログラムをビルド、アップロードして、許可されたカードをかざした時だけファンが回転し、未登録カードでは回転しなければ成功です。

登録されていないRFIDカードをかざしたとき(赤LED点灯、ブザーで警告)

登録されたRFIDタグをかざしたとき(緑LED点灯、ファンが回転)

発展編:MQTTとWebダッシュボードによる利用ログ管理

ローカル認証までできたら、次は 「誰がいつ機器を有効化したか」 を見える化する発展版が考えられます。

Arduino Uno R4 WiFi は、メインMCUに加えて ESP32-S3 を搭載し、Wi‑Fi / Bluetooth 接続に対応しています。また、Arduino Cloudとも互換性があります。そのため、今回のような認証PoCを起点に、**MQTTで認証結果や利用履歴を送信し、Webダッシュボードやクラウド側で一覧表示する**方向へ広げやすい構成です。 [Source]

例えば、以下のような使い方が考えられます。

・誰がいつ機器を起動したかを記録する
・認証失敗回数を可視化する
・管理者カードだけ長時間運転を許可する
・利用履歴を蓄積して、稼働状況を分析する

ローカル表示だけでもPoCとして十分成立しますが、ネットワーク連携まで進めることで、「その場で認証結果が分かる」から「履歴として管理できる」へ価値を広げられます。

今後の展望(改善案)

今回の試作は「認証された人だけファンを動かせる」ことを主目的にしたシンプルな構成ですが、実運用を考えると、いくつか改善したいポイントがあります。

権限レベルの追加
今回は「許可 / 不許可」の二値判定ですが、実運用では以下のような権限分けも考えられます。
 ・ 一般利用者: 起動のみ可能
 ・管理者: 長時間運転や設定変更が可能
 ・メンテナンス担当: ログ初期化や診断モードが可能
利用時間の記録
認証した時刻だけでなく、起動開始から停止までの利用時間を記録すれば、稼働分析や利用実績管理にもつなげやすくなります。
複数機器への展開
1台のPoCから始めて、将来的には複数の機器に対して権限管理を行う形にも広げられます。たとえば、カードは共通で、機器ごとに許可範囲を変える設計も可能です。
実機制御向けの安全設計
今回のファン制御は低電圧のPoCですが、実際のプリンタや工作機械を扱う場合は、絶縁、保護回路、異常停止、非常停止、物理スイッチなど、安全面の設計が重要になります。
ログ保存と遠隔監視
Wi‑Fi経由でログを保存し、未承認アクセスや深夜利用などを可視化できるようにすると、管理用途としての価値が高まります。

関連技術・参考トピック

今回の実装は比較的シンプルですが、関連技術に目を向けると、今後の発展の方向性が見えやすくなります。

まず、Renesas RA4M1はHMI向けの要素として セグメントLCDコントローラ静電容量式タッチセンシング に対応しており、将来的に「認証するだけ」から「本体側で設定変更やメニュー操作を行う」方向へ広げる余地があります。 [Source]

また、Arduino Uno R4 WiFi は Arduino Cloud と互換性があるため、ローカルの電子工作から、Webダッシュボードや遠隔監視へ発展させやすいのも特徴です。今回のような「認証結果と利用履歴を管理したい」テーマとは相性が良いと感じました。 [Source]

さらに、PlatformIOでは Uno R4 WiFi 向けに uno_r4_wifi ボード定義が用意されており、プロジェクト管理やビルド設定の見通しを良くしやすい点も、PoC開発との相性が良いポイントです。 [Source]

まとめ

今回は、Arduino Uno R4 WiFiを使って、RFIDによる利用権限管理とファン制御システムを作ってみました。

構成自体はシンプルですが、

・RFIDでカードを識別する
・利用権限を判定する
・許可された時だけ機器を動かす
・その結果を表示し、将来的には記録・共有する

という流れを通して、現場の“誰でも使えてしまう問題”を小さく改善するPoCとしてまとめられる題材でした。

まずは低電圧のファン制御から始め、そこからログ管理、権限レベル追加、遠隔監視、安全設計へと広げていける点も、このテーマの面白さだと感じています。

参考リンク

Arduino UNO R4 WiFi 公式ドキュメント
PlatformIO: Arduino Uno R4 WiFi ボード情報
RA4M1 - 48MHz Arm Cortex-M4 / LCDコントローラ / Capacitive Touch 対応MCU | Renesas