「Arduino Uno R4 WiFi」で会議室・共有席の 使用中表示システムを作ってみた

オフィスやコワーキングスペースでは、「この席、使っているのか空いているのか分からない」「会議室が今使われているのか、見に行かないと分からない」といった小さな不便が意外とよくあります。今回は、「エレクトロニクスを簡単に」をテーマに ArduinoUno R4 WiFi を使って、会議室・共有席の使用中 / 空き状況を見える化する簡易システムを作ってみました。

PIR人感センサーで人の動きを検知し、LCDに IN USE(使用中)または VACANT(空き)を表示するシンプルな構成です。

- [はじめに:空いているか分からない問題]
- [ローカル表示の基本構成]
- [開発環境と実装のポイント]
- [配線情報]
- [実際のプログラム]
- [発展編:MQTTとWebダッシュボードによるリモート確認]
- [今後の展望(改善案)]
- [関連技術・参考トピック]
- [まとめ]
- [参考リンク]

はじめに:空いているか分からない問題

オフィスの共有席や小会議室では、見た目だけでは使用状況が分かりづらいことがあります。少し席を外しているだけなのか、もう空いているのか、外からは判断しにくく、結果として「わざわざ見に行く」「声をかけて確認する」「空いていると思って行ったら使われていた」といったムダが発生しがちです。

そこで今回は、人の動きを検知して、使用中 / 空きを分かりやすく表示する簡易サインを試作してみました。「人がいること」そのものを厳密に測るというより、まずは その場所が今使われていそうかどうかを「見える化」することに主眼を置いた構成です。

ローカル表示の基本構成

まずは基本となる、PIR人感センサーで動きを検知し、LCDに状態を表示するシステムを構築しました。

使用した主な部品

- Arduino Uno R4 WiFi
- PIR人感センサー
- I2C接続のLCDモジュール
- 赤色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とも互換性があります。
- [参考:Arduino UNO R4 WiFi - Hardware]

今回の試作ではローカル表示が中心ですが、Uno R4 WiFi は「まずはセンサーと表示だけで小さく始める」「あとからネットワーク連携へ広げる」という段階的な開発と相性が良いと感じました。今回のテーマのように、現場の“ちょっとした不便”をPoCで素早く形にしたい時に扱いやすいボードです。

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

ローカル表示イメージ

以下のように、「人が検知されたら使用中」「一定時間反応がなければ空き」といった分かりやすい表示を目指します。

- 1行目: Status: IN USE または Status: VACANT
- 2行目: 最後に反応してからの経過時間

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

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

在席判定の考え方

今回は、PIR人感センサーの反応をもとに、次のようなシンプルなルールで状態を判定しました。

- 人感センサーが反応したら IN USE(使用中)
- 最後の反応から一定時間までは 使用中を維持
- 一定時間以上、反応がなければ VACANT(空き)

具体的には、最後に人の動きを検知してから 180秒 までは「使用中」、それを超えたら「空き」としています。

実装上の注意

この方式はシンプルで作りやすい一方、人が座っていても長時間ほとんど動かない場合は“空き”と誤判定する可能性 があります。逆に、通りすがりの人の動きを拾って一時的に“使用中”になることもあります。

そのため、まずはPoCとして 「ざっくり使用状況が分かること」 を重視し、実運用を考えるなら以下のような改善が有効です。

- RFIDやボタンと組み合わせて「使用開始」を明示する
- 複数センサーを組み合わせて判定精度を上げる
- 会議室と共有席でタイムアウト時間を変える
- Wi‑Fi経由で状態履歴を残し、誤判定の傾向を見直す

配線情報

| モジュール | 信号 | 接続先 | 補足 |

| --------- | --------- | --------- | --------- |

| PIR人感センサー | OUT | Arduino Uno R4 WiFi の D2 | 人の動きを検知した時にデジタル入力として読み取ります。 |

| PIR人感センサー | VCC | Arduino の 5V | モジュール仕様に応じて給電します。 |

| PIR人感センサー | GND | Arduino の GND | GNDはLCDやLEDと共通化します。 |

| I2C LCDモジュール | SDA | Arduino Uno R4 WiFi の SDA | Wire.hLiquidCrystal_I2C で制御します。 |

| I2C LCDモジュール | SCL | Arduino Uno R4 WiFi の SCL | I2Cアドレスは 0x27 を想定しています。 |

| I2C LCDモジュール | VCC / GND | Arduino の 5V / GND | LCDモジュールの仕様に応じて配線します。 |

| 赤色LED | アノード側 | Arduino の D6 | 使用中表示用。抵抗を直列に入れます。 |

| 緑色LED | アノード側 | Arduino の D7 | 空き表示用。抵抗を直列に入れます。 |

| 各LED | カソード側 | Arduino の GND | 220Ω程度の抵抗を挟んで配線します。 |

実際のプログラム

今回のローカル表示版で使用したプログラムは以下の通りです。 
PIR人感センサーの出力を D2 から読み取り、LCDとLEDで状態を表示します。最後に動きを検知した時刻を保持し、一定時間反応がなければ空き状態に戻す構成です。
※本プログラムは、生成AIを用いて作成しております。

```main.cpp
#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

const int pirPin = 2;
const int redLedPin = 6;
const int greenLedPin = 7;

bool occupied = false;
unsigned long lastMotionTime = 0;
const unsigned long vacancyTimeout = 180000; // 180秒 = 3分

void updateDisplay(unsigned long idleSec) {
  lcd.setCursor(0, 0);
  if (occupied) {
    lcd.print("Status: IN USE ");
  } else {
    lcd.print("Status: VACANT ");
  }

  lcd.setCursor(0, 1);
  if (occupied) {
    lcd.print("Last move:");
  } else {
    lcd.print("Idle for: ");
  }

  lcd.print(idleSec);
  lcd.print("s   ");
}

void updateLeds() {
  digitalWrite(redLedPin, occupied ? HIGH : LOW);
  digitalWrite(greenLedPin, occupied ? LOW : HIGH);
}

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

  pinMode(pirPin, INPUT);
  pinMode(redLedPin, OUTPUT);
  pinMode(greenLedPin, OUTPUT);

  lcd.init();
  lcd.backlight();

  occupied = false;
  lastMotionTime = millis();

  updateLeds();
  lcd.clear();
  updateDisplay(0);
}

void loop() {
  unsigned long now = millis();
  int motion = digitalRead(pirPin);

  if (motion == HIGH) {
    lastMotionTime = now;

    if (!occupied) {
      occupied = true;
      Serial.println("Status changed: IN USE");
    }
  }

  if (occupied && (now - lastMotionTime > vacancyTimeout)) {
    occupied = false;
    Serial.println("Status changed: VACANT");
  }

  updateLeds();

  unsigned long idleSec = (now - lastMotionTime) / 1000;
  updateDisplay(idleSec);

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

プログラムのポイント

- digitalRead(D2) でPIR人感センサーの出力を読み取っています。
- 人の動きを検知した時刻を lastMotionTime に保存し、そこからの経過時間で状態を判定しています。
- LCDの1行目には IN USE / VACANT、2行目には最後の反応からの経過秒数を表示しています。
- 赤LEDは「使用中」、緑LEDは「空き」を示すようにし、遠くからでも状態が分かるようにしました。
- Serial.begin(115200) を入れているため、シリアルモニタで状態変化を確認しながらデバッグできます。

プログラムをビルド、アップロードして、人が近づいた時に IN USE、一定時間動きがない状態が続いた時に VACANT と表示されれば成功です。

 発展編:MQTTとWebダッシュボードによるリモート確認

ローカル表示までできたら、次は 「その場に行かなくても分かる」 ようにする発展版が考えられます。

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

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

- 会議室A / B / C の使用中・空きを一覧表示する
- 共有席の在席状況を遠隔から確認する
- 長時間使用中の席を把握する
- 利用履歴を蓄積して、混雑時間帯を分析する

ローカル表示だけでも十分PoCとして成立しますが、ネットワーク連携まで進めることで、「誰かが見れば分かる」から「どこからでも分かる」 へ価値を広げられます。

今後の展望(改善案)

今回の試作は「人感で使用状況をざっくり見える化する」ことを主目的にしたシンプルな構成ですが、実際の運用を考えると、いくつか改善したいポイントがあります。

- 判定精度の向上
PIRセンサーだけだと、静かに座っている人を見逃す場合があります。RFIDやボタン、超音波センサーなどとの組み合わせで、誤判定を減らしたいところです。

- 状態遷移の明確化
「検知したら使用中」だけでなく、「利用開始」「一時離席」「利用終了」といったステータス設計を加えると、共有席運用により合った形になります。

- 通知機能
一定時間以上“使用中”が続く場合や、空いた瞬間に通知する仕組みを作れば、会議室運用や備品管理にも応用しやすくなります。

- 履歴の蓄積と見える化
時刻ごとの状態変化をログとして残し、Webダッシュボードで可視化することで、ピーク時間の把握や運用改善の検討材料にできます。

- 専用筐体化・サイン化
ブレッドボード上の試作から、ドア横やデスク端に設置しやすい筐体にまとめると、実用性が一気に高まります。

関連技術・参考トピック

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

まず、[Renesas RA4M1]はHMI向けの要素として セグメントLCDコントローラ静電容量式タッチセンシング に対応しており、将来的に「表示するだけ」から「本体側で予約状態やモードを操作する」方向へ広げる余地があります。

また、[Arduino Uno R4 WiFi]は Arduino Cloud と互換性があるため、ローカルの電子工作から、Webダッシュボードや遠隔監視に広げやすいのも特徴です。会議室や共有席のような「現場の状態を遠隔から把握したい」テーマとは相性が良いと感じました。

さらに、無線という観点では、Renesasは近年 Wi-Fi 6 / Bluetooth LE 対応のコンボモジュールも展開しています。今回の作例でそこまで踏み込んでいるわけではありませんが、IoT機器が「つながること」を前提に設計される流れの中で、より低消費電力・高機能な常時接続デバイスへ広げていく方向性を考える参考になります。

- [Wi-Fi® / Bluetooth® Module ルネサスエレクトロニクス製候補製品 RRQ61051]

まとめ

今回は、Arduino Uno R4 WiFiを使って、会議室・共有席の使用中 / 空き状況を見える化する簡易システムを作ってみました。

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

- 人の動きを検知する
- 状態を判定する
- その場で分かる形に表示する
- 将来的にはネットワーク越しに共有する

という流れを通して、現場の“確認の手間”を減らすIoT的な考え方 を小さく試せる題材でした。

まずはローカル表示の小さな仕組みから始め、そこからログ、通知、Webダッシュボード、認証連携へと広げていける点も、このテーマの面白さだと感じています。

参考リンク

- [Arduino UNO R4 WiFi 公式ドキュメント]

- [PlatformIO: Arduino Uno R4 WiFi ボード情報]

- [RA4M1 - 48MHz Arm Cortex-M4 / LCDコントローラ / Capacitive Touch 対応MCU | Renesas]