「Arduino UNO Q」に「USBカメラ」を接続し、「AI画像認識」によるリアルタイムな物体検出を行う方法を詳しく紹介します。
「USBカメラ」は特に設定は不要で、USBハブを使用して接続するだけで自動で認識されて使用することができます。
「Arduino UNO Q」の使い方や初期設定等は以下のリンク先で詳しく紹介しています。

1.Arduino UNO Qとは
2.USBカメラの接続
3.サンプルアプリで動作確認
・物体検出:Detect Objects on Camera
・顔認識:Face Detector on Camera
・人物検出:Person classifer on Camera
4.スケッチとの連携方法
・スケッチファイルの追加
・人物を検知したときだけLED点灯と外部出力
・LED点灯と同時に外部デバイスへ遠隔データ送信(http)
・http通信受信デバイス(M5Atom Matrix)の準備
5.まとめ
1.Arduino UNO Qとは
「Arduino UNO Q」とは、電子工作を始めたばかりの方にも、ちょっとステップアップしてAIに挑戦したい方にもおすすめな次世代シングルボードコンピュータです。
これまでの「Arduino」は「マイコンで手軽に電子工作」が魅力でしたが、「UNO Q」は1枚のボードの中に、Linux OSが動く高性能プロセッサと、いつものArduinoスケッチを動かすマイコンの両方を搭載しています。
動作確認には専用アプリの「Arduino App Lab」をパソコンにインストールして「UNO Q」ボードとUSBケーブルで接続して使用しますが、Wi-Fi経由の無線接続でも同様に使用することができます。
さらに「Raspberry Pi」のようにモニタやキーボード、マウスを接続することで「UNO Q」単体をシングルボードコンピュータ(SBC)のLinuxマシンとして使用することもできます。


基本的な開発はパソコンと直接接続したり、Wi-Fi経由で接続して使用できるため、「UNO Q」ボードとパソコン、USBケーブルがあれば使用することができます。
2.USBカメラの接続
「Arduino UNO Q」と「USBカメラ」との接続は以下のようにUSBハブで接続するだけで、自動で認識されます。

今回は「USBカメラ」だけ接続するので、以下のような「2in1」のハブを使用すると安価でシンプルな構成で使用できるのでおすすめです。

3.サンプルアプリで動作確認
「Arduino UNO Q」専用の開発環境「Arduino App Lab」にはカメラを使用して「AI画像認識」を行うサンプルアプリがいくつか用意されています。
まずはカメラの動作確認を行うために、以下の3つのサンプルアプリで動作確認を行なっていきます。
・物体検出:Detect Objects on Camera
サンプルアプリ(Examples)の中で下画像のように「Detect Objects on Camera」をクリックすると、カメラで撮影された画像内に何が写っているかを認識して確認することができます。

サンプルアプリ「Detect Objects on Camera」を選択したら、下画像のように[RUN]ボタンをクリックしてアプリを実行します。

サンプルアプリが起動すると、下画像のようにブラウザが起動して、カメラで撮影された画像が表示されます。

上画像のように人物が認識されると四角で囲われて「peason」と表示されます。

顔の一部や、手だけでも人間っぽい画像は「person」として認識されます。

上画像のように「人物(person)」と「スマホ(ceil phone)」等、画面内に複数の物体が検出された場合にはそれぞれを認識して表示します。

他にも、リモコンは上画像のように「remote」として認識されます。
その他にもパソコンやマウス、椅子やコップ、猫や犬、鳥等様々なものを検出して確認することができます。
・顔認識:Face Detector on Camera
サンプルアプリ(Examples)の中の下画像「Face Detector on Camera」をクリックすると、カメラで撮影された画像内に人間の顔が認識されると四角で囲われて「face」と表示されます。

サンプルアプリ「Face Detector on Camera」を起動して[RUN]ボタンをクリックしてアプリを実行すると、下画像のようにブラウザが起動してカメラの画像が表示され、画像の認識状況が確認できます。

画像内に人間の顔が認識されると四角で囲われて「Face」と表示されます。
・人物検出:Person classifer on Camera
サンプルアプリ(Examples)の中の下画像「Person classifer on camera」をクリックすると、カメラで撮影された画像内に人物が写っていることを認識して確認することができます。

サンプルアプリ「Person classifer on camera」を起動して[RUN]ボタンをクリックしてアプリを実行すると、下画像のようにブラウザが起動してカメラの画像が表示され、画像の認識状況が確認できます。

画像内に人物が認識されると「person」と表示されますが、四角で囲われることは無いので少しわかりにくいかもしれません。
4.スケッチとの連携方法
カメラを使用した「サンプルアプリ」には「スケッチファイル」を使用しないものがほとんどです。
「スケッチファイル」と連携してLED点灯や外部出力等を行うには「スケッチファイル」の追加が必要です。
ここでは「スケッチファイル」の無い「サンプルアプリ」に「スケッチファイル」を追加する方法を紹介します。
追加した「スケッチファイル」を使用して、カメラで人物を検知したときに「UNO Q」基板上のLEDを点灯させたり外部出力を行う方法、さらに外部デバイスへ検知状態を「http通信」で送信する方法についても詳しく紹介します。
・スケッチファイルの追加
「スケッチファイル」が無いアプリに「スケッチファイル」を追加する手順は以下になります。
- サンプルアプリのコピー
- 「sketch」フォルダの作成
- 「sketch.ino」ファイルの作成
- 「sketch.yaml」ファイルの作成
- スケッチライブラリ「Arduino_RouterBridge」の追加
以下から実際に「スケッチファイル」を追加する手順を、順を追って詳しく紹介していきます。
1.サンプルアプリのコピー
まずは例として「Detect Objects on Camera」使用するため、下画像のように「Detect Objects on Camera」をクリックします。

サンプルアプリ「Detect Objects on Camera」を開いたら、下画像のように[Copy and edit app]をクリックしてアプリをコピーしていきます。

下画像のように、ファイル名を設定して[Create new]ボタンをクリックするとアプリをコピーすることができます。

2.「sketch」フォルダの作成
サンプルアプリ「Detect Objects on Camera」には「スケッチファイル」がありませんが、アプリをコピーすることで追加することができるようになります。
アプリをコピーして開いたら、まずは「スケッチファイル」を作製するための「sketchフォルダ」を作成します。
下画像のように「Files」の横のアイコンをクリックして[Create new folder]をクリックします。

下画像のようにフォルダ名「sketch」を入力して[Enter]キーでフォルダを作成することができます。

3.「sketch.ino」ファイルの作成
次に「スケッチファイル」を作成していきます。
先程作成した「sketch」フォルダを[右クリック]して[Create file]をクリックします。

下画像のようにファイル名「sketch.ino」を入力して[Enter]キーを押すとファイルが作成されます。

4.「sketch.yaml」ファイルの作成
次に、「スケッチファイル」を使用するために必要な設定(プロファイル)を記入した「sketch.yaml」ファイル(ヤムルファイル)を作成していきます。
まずは下画像のように「sketch」フォルダの上で[右クリック]して[Create file]をクリックします。

次に拡張子なしで「sketch」というファイルを作成します。

次に以下をコピーして、作成した「sketch」ファイルに貼り付けます。
profiles:
default:
platforms:
- platform: arduino:zephyr
libraries:
default_profile: default貼り付けたものは下画像のようになります。

次にこのファイルを有効にするために、ファイル名を拡張子ありの「sketch.yaml」に変更していきます。
まずは、下画像のように「sketch」ファイルの上で[右クリック]して[Rename]をクリックします。

下画像のようにファイル名に拡張子をつけて「sketch.yaml」として[Enter]キーを押します。

ファイル名が「sketch.yaml」に変わると、下画像のように「ヤムルファイル」として認識され、一部の文字色が変わります。

「ヤムルファイル」が作成されることで「sketck.ino」のコンパイルやライブラリの追加を行うことができるようになります。
5.スケッチライブラリ「Arduino_RouterBridge」の追加
最後に、「python」や「bricks」と連携するためのライブラリ「Arduino _RouterBridge」をインストールします。
下画像のように「Sketch Library」横のアイコンをクリックします。

下画像のようなウインドウが表示されたら、検索窓に「router」と入力します。
「Arduino _RouterBridge」が表示されたら[Install]ボタンをクリックしてインストールしていきます。

下画像のように「installed」が表示されたらインストール完了です。

以上で「スケッチファイル」の無いアプリに「スケッチファイル」を追加して使用できるようになりました。
・人物を検知したときだけLED点灯と外部出力
「AI物体検出」を行うサンプルアプリ「Detect Objects on Camera」に「スケッチファイル」を追加する方法を紹介しましたが、ここからは追加した「スケッチファイル」使用して「人物を検知したときだけLED点灯と外部出力」を行う方法を紹介していきます。
スケッチファイルの準備
まずは追加した「スケッチファイル」に以下のコードをコピペして貼り付けます。
// SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc)
// SPDX-FileCopyrightText: Copyright (C) 2026 Logikara
// SPDX-License-Identifier: MPL-2.0
#include "Arduino_RouterBridge.h"
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
pinMode(13, OUTPUT); // D13 を出力に設定
Bridge.begin();
Bridge.provide("set_led_state", set_led_state);
}
void loop() {
}
void set_led_state(bool state) {
// LOW state means LED is ON
digitalWrite(LED_BUILTIN, state ? LOW : HIGH);
// D13 も 出力(検知でHIGH)
digitalWrite(13, state ? HIGH : LOW);
}実際にコピペして貼り付けたものは下画像のようになります。

pythonファイルの準備
次に「pythonファイル」を以下のコードに置き換えます。
現在の「pythonファイル」を削除して、以下のコードをコピペして貼り付けます。
# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc)
# SPDX-FileCopyrightText: Copyright (C) 2026 Logikara
# SPDX-License-Identifier: MPL-2.0
from arduino.app_utils import App, Bridge
from arduino.app_bricks.web_ui import WebUI
from arduino.app_bricks.video_objectdetection import VideoObjectDetection
from datetime import datetime, UTC, timedelta
import time
ui = WebUI()
detection_stream = VideoObjectDetection(confidence=0.5, debounce_sec=0.0)
ui.on_message("override_th", lambda sid, threshold: detection_stream.override_threshold(threshold))
led_state = False
last_person_time = None
PERSON_TIMEOUT = 1.0 # 秒:この時間 Person が見えなければ LED を消す
def send_detections_to_ui(detections: dict):
global led_state, last_person_time
now = datetime.now(UTC)
person_detected = False
# Web UI へ送信
for key, values in detections.items():
for value in values:
entry = {
"content": key,
"confidence": value.get("confidence"),
"timestamp": now.isoformat()
}
ui.send_message("detection", message=entry)
# Person 検出チェック
if key.lower() == "person" and len(values) > 0:
person_detected = True
# Person が検出された場合
if person_detected:
last_person_time = now
if not led_state:
Bridge.call("set_led_state", True)
led_state = True
# ★ 定期的に LED を消灯するためのループ
def loop():
global led_state, last_person_time
time.sleep(0.2) # 200ms 間隔でチェック
if last_person_time is None:
return
now = datetime.now(UTC)
elapsed = (now - last_person_time).total_seconds()
if elapsed > PERSON_TIMEOUT:
if led_state:
Bridge.call("set_led_state", False)
led_state = False
detection_stream.on_detect_all(send_detections_to_ui)
App.run(user_loop=loop)実際にコピペして貼り付けたものは下画像のようになります。

「スケッチファイル」と「pythonファイル」の準備ができたら、[RUN]ボタンをクリックしてアプリを実行します。
下画像では13ピンとGND間に「抵抗内蔵の青色LED」を接続して点灯させるようにしています。

・LED点灯と同時に外部デバイスへ遠隔データ(http)送信
「AI物体検出」を行うサンプルアプリ「Detect Objects on Camera」で「人物を検知したときだけLED点灯と外部出力」を行いましたが、ここではさらに「人物を検出した時に外部デバイスへ遠隔データ(http)送信」する方法を紹介します。
pythonファイルの準備
「pythonファイル」に以下のコードをコピペして貼り付けて置き換えます。
# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc)
# SPDX-FileCopyrightText: Copyright (C) 2026 Logikara
# SPDX-License-Identifier: MPL-2.0
from arduino.app_utils import App, Bridge
from arduino.app_bricks.web_ui import WebUI
from arduino.app_bricks.video_objectdetection import VideoObjectDetection
from datetime import datetime, UTC, timedelta
import time
import requests # httpリクエスト送信用
DEVICE_IP = "192.168.0.***" # 送信先デバイスのIPアドレスを設定してください
ui = WebUI()
detection_stream = VideoObjectDetection(confidence=0.5, debounce_sec=0.0)
ui.on_message("override_th", lambda sid, threshold: detection_stream.override_threshold(threshold))
led_state = False
last_person_time = None
PERSON_TIMEOUT = 1.0 # 秒:この時間 Person が見えなければ LED を消す
# 外部デバイスへLEDの状態を httpリクエスト送信
def notify_device(state: bool):
url = f"http://{DEVICE_IP}/led/{1 if state else 0}"
try:
requests.get(url, timeout=2)
except Exception as e:
print("Device notify error:", e)
# 物体検出結果をUIへ送信
def send_detections_to_ui(detections: dict):
global led_state, last_person_time
now = datetime.now(UTC)
person_detected = False
# Web UI へ送信
for key, values in detections.items():
for value in values:
entry = {
"content": key,
"confidence": value.get("confidence"),
"timestamp": now.isoformat()
}
ui.send_message("detection", message=entry)
# Person 検出チェック
if key.lower() == "person" and len(values) > 0:
person_detected = True
# Person が検出された場合
if person_detected:
last_person_time = now
if not led_state:
Bridge.call("set_led_state", True)
notify_device(True) # 外部デバイスへ検知(True)送信
led_state = True
# 定期的に LED を消灯するためのループ
def loop():
global led_state, last_person_time
time.sleep(0.2) # 200ms 間隔でチェック
if last_person_time is None:
return
now = datetime.now(UTC)
elapsed = (now - last_person_time).total_seconds()
if elapsed > PERSON_TIMEOUT:
if led_state:
Bridge.call("set_led_state", False)
notify_device(False) # 外部デバイスへ未検知(False)送信
led_state = False
detection_stream.on_detect_all(send_detections_to_ui)
App.run(user_loop=loop)実際にコピペして貼り付けたものは下画像のようになります。

「pythonファイル」を置き換えたら[Run]ボタンをクリックしてアプリを実行します。
下画像では「http通信」の受信デバイスとして「M5Atom Matrix」を使用しています。
「M5Atom Matrix」は人物が検知されたことを受信すると本体のLEDマトリックスが緑に点灯、人物が検知されなくなると白色に点灯します。

「M5Atom Matrix」にはリレーユニットを接続しているため、人物を検知するとリレーがONするようにしています。
・http通信受信デバイス(M5Atom Matrix)の準備
受信デバイスとして使用した「M5Atom Matrix」のプログラムも以下で紹介しておきます。
「ArduinoIDE」で書き込んで使用してください。
「ArduinoIDE」のインストール方法は以下のリンク先で詳しく紹介しています。

動作については下画像のようになります。

電源ONして、Wi-Fi接続中にLEDが青色点灯します。

Wi-Fi接続が完了するとLEDは白色点灯します。
人物を検知していない時も白色点灯し、リレーはOFFします。

人物を検知した時は緑色点灯し、リレーも同時にONします。
サンプルプログラムは以下になります。
コピペで貼り付けて実行してください。コピーは下の黒塗り部右上のアイコンクリックでもできます。
#include <M5Atom.h> // Atomのヘッダファイル(Arduino.h /Wire.h /FastLED.h含む)
#include <WiFi.h>
#include <WebServer.h>
#define RELAY_PIN 26 // リレー接続ピン(Groveコネクタ)
WebServer server(80); // ポート設定
// 固定IPアドレスの設定
IPAddress local_IP(192,168,0,***); // IPアドレス設定(***部に使用可能なアドレスを設定)
IPAddress gateway(192,168,0,1); // デフォルトゲートウェイ設定
IPAddress subnet(255,255,255,0); // サブネットマスク設定
// 変数宣言
const char* ssid = "自宅のWi-FiルーターのSSIDを設定"; // Wi-Fi SSID
const char* password = "自宅のWi-Fiルーターのパスワードを設定"; // Wi-Fi パスワード
bool on_frag = false; // Matlix ONフラグ
// 関数 -------------------------------------------------
// ************* Matrix LED 全点灯色設定 *************
void matrixColor(uint8_t r, uint8_t g, uint8_t b) {
for (int i = 0; i < 25; i++) { //matrix行ループ
M5.dis.drawpix(i, CRGB(r,g,b)); // フルカラーLED指定色で点灯
}
FastLED.show(); // フルカラーLED指定色で点灯
}
void matrixSkyBlue() { matrixColor(0,255,255); } // 水色(赤, 緑, 青)※3色それぞれの明るさを0〜255で指定
void matrixBlue() { matrixColor(0,100,255); } // 青色
void matrixGreen() { matrixColor(0,255,0); } // 緑色
void matrixWhite() { matrixColor(100,100,100); } // 白色
// **************** サーバー設定 ****************
void handleRoot() { // ルートアクセス処理
matrixBlue(); // ルートアクセス表示用Matrix LEDを青色に点灯
String msg = "Welcome AtomMatrix! IP: "; // 応答メッセージ作成
msg += WiFi.localIP().toString(); // IPアドレスを文字列に変換してメッセージに追加
server.send(200, "text/plain", msg); // クライアントに応答(HTTPステータスコード200、コンテンツタイプ"text/plain"、内容msg)
Serial.println("Root Access");
}
void onSignal() { // ONアクセス処理
on_frag = true; // Matlix ONフラグtrue
server.send(200, "text/html", "ON!"); // クライアントにON応答
Serial.println("ON!");
}
void offSignal() { // OFFアクセス処理
on_frag = false; // Matlix ONフラグfalse
server.send(200, "text/html", "OFF!"); // クライアントにOFF応答
Serial.println("OFF!");
}
// 初期設定 -----------------------------------------------
void setup() {
M5.begin(true, false, true); //本体初期化(UART, I2C, LED)
Serial.begin(9600); // シリアル通信開始
// WiFi接続
WiFi.config(local_IP, gateway, subnet);// 固定IPアドレス設定実行
WiFi.begin(ssid, password); // Wi-Fi接続開始
while (WiFi.status() != WL_CONNECTED) { //接続完了していなければループ
matrixSkyBlue(); // 接続中表示用Matrix LEDを水色に点灯
delay(500); // 500ms遅延
Serial.print(".");
}
// IPアドレス、SSID確認
Serial.print("\nSSID: "); // SSID表示
Serial.println(WiFi.SSID());
Serial.print("IP address: "); // IPアドレス表示
Serial.println(WiFi.localIP());
// サーバー設定
server.on("/", handleRoot); // ルートアクセス処理をサーバーに登録
server.on("/led/1", onSignal); // ONアクセス処理をサーバーに登録
server.on("/led/0", offSignal); // OFFアクセス処理をサーバーに登録
server.begin(); // サーバー開始
// リレー接続ピン(Groveコネクタ)の初期化
pinMode(RELAY_PIN, OUTPUT); // RELAY_PINを出力モードに設定
digitalWrite(RELAY_PIN, LOW); // リレーOFF
matrixWhite(); // Matrix LEDを白色に点灯
}
// メイン -------------------------------------------------
void loop() {
M5.update(); // M5Atomの状態更新
server.handleClient(); //クライアントからのアクセス処理
if (on_frag || M5.Btn.isPressed()) { // Matlix ONフラグtrue、またはボタンONなら
matrixGreen(); // Matrix LEDを緑色に点灯
digitalWrite(RELAY_PIN, HIGH); // リレーON
} else { // Matlix ONフラグfalse、かつボタンOFFなら
matrixWhite(); // Matrix LEDを消灯
digitalWrite(RELAY_PIN, LOW); // リレーOFF
}
delay(500); //遅延時間(ms)
}5.まとめ
「Arduino UNO Q」に「USBカメラ」を接続し、「AI画像認識」によるリアルタイムな物体検出を行う方法を詳しく紹介しました。
開発環境「Arduino App Lab」に用意された「Bricks」を活用することで、難しい機械学習の知識がなくても、手軽にAI機能を組み込んだアプリを制作することができます。
カメラを使用した「物体検出」「顔検出」「人物検出」は、サンプルアプリを実行するだけで簡単に動作確認を行うことができました。
また、「スケッチファイル」を追加してハードウェア制御と連携させることで、「人物を検知したときだけLEDを点灯させる」「外部出力を制御する」といった、より実用的な仕組みも構築できます。
さらに、「HTTP通信」を活用することで、「M5Atom」などの外部デバイスと連携し、離れた場所への通知までできることも確認しました。
これらの仕組みを応用すれば、「来客検知」や「防犯システム」、「見守り装置」など、さまざまなIoT用途に展開することが可能です。
「Arduino UNO Q」は、従来のArduinoの手軽さに加えて、LinuxとAI処理を組み合わせた柔軟な開発ができるため、これからAIや画像処理にチャレンジしたい方にも非常におすすめできるボードです。
ぜひ皆さんも、自分だけの「AI × IoT」システムの開発にチャレンジしてみてください。

























































































コメント