新しい「Arduino® UNO Q」が手に入りました。
Qualcomm Linux HostとSTM32 Zephyr RTOSのデュアル構成を持つ、非常にユニークで強力なボードです。
今回は、このボードの多彩な機能を試すため、MIPI-CSI2、USB、SPIという、3種類の異なるカメラを同時に接続してみました。
マルチアングルで観察できる、面白いカメラシステムの使い方を紹介します。
Arduino® UNO Q のトリプルカメラ接続とストリーミング
新しい「Arduino® UNO Q」が手に入りました。
Qualcomm Linux HostとSTM32 Zephyr RTOSのデュアル構成を持つ、非常にユニークで強力なボードです。

今回は、このボードの多彩な機能を試すため、MIPI-CSI2、USB、SPIという、3種類の異なるカメラを同時に接続してみました。
マルチアングルで観察できる、面白いカメラシステムの使い方を紹介します。

プロジェクト・GitHubのリンク先
コンテストに提出したプロジェクトのリンク先は下記です
GiHubのリンク先は下記です

今回のシステムは、UNO Qの豊富なインターフェースを試すのに最適です。
3つのカメラを使い分けて接続します。
広角俯瞰カメラ(MIPI-CSI2)
Pi Camera v2を使用します。高速バス経由で、広範囲を綺麗にスキャンします。


可動式サブカメラ(USB)
高速なUSBウェブカメラを使用します。アングルを自由に変えて、動きを追いかけます。


極小マクロカメラ(SPI)
超小型のArducam Megaを使用します。マイコンのJSPIピン経由で、クローズアップ撮影します。


使用するハードウェアと接続(BOM)
全体のブロックダイアグラム
Arduino UNO Qは、内部でLinuxとマイコンが連携しています。
Linux側でMIPIとUSBを制御し、STM32マイコン側でSPIカメラと人感センサーを制御します。
使用パーツ一覧
本システムに使用したハードウェア構成は以下の通りです。
| 部品名 | 画像 | 役割・説明 |
|---|---|---|
| Arduino® UNO Q | Qualcomm LinuxとSTM32 RTOSを1枚で実行可能なメインユニット。 | |
| MIPI-CSI2カメラ (Pi Camera v2) |
真上から基板全体を高解像度スキャンするメインカメラ。 | |
| MIPI-CSI2 アダプター基板 | UNO QにMIPIカメラを接続するためのカスタムボード。 | |
| USBカメラ (ELP-USBFHD08s) |
高フレームレートで動的に角度調整できるサブカメラ。 | |
| USB-C ハブ (Anker 332) |
カメラへの安定給電と接続を行うためのセルフパワーハブ。 | |
| SPIマクロカメラ (Arducam Mega 3MP) |
JSPI/ICSPピンヘッダ接続の極小マクロ検査カメラ。 | |
| トリガーセンサー (PIRセンサー) |
基板の進入を検知してマイコン側カメラを起動する人感センサー。 |


SPIカメラとPIRセンサーの接続
マイコン側のJSPI(SPI2)コネクタと、GPIOピンを使用して接続します。
* Arducam MOSI/MISO/SCK: JSPIピン(PC3, PC2, PD1)へ接続。
* Arducam CS: D10(PB9)ピンへ接続。
* PIR Sensor OUT: D7(PB2)ピンへ接続。
PIRで検知した瞬間に、マイコンをスリープ解除します。


3つのカメラを同時に動かすWebサーバーの構築
3系統の映像を同時にWebブラウザで確認できるよう、Linux側でPythonを使ったWebサーバーを構築しました。




Pythonによるマルチスレッド配信サーバー(multi-cam.py)
MIPI、USB、SPIの各配信スレッドを分離し、ポート7000で並列配信します。
プログラムの全コードは、下記GitHubリポジトリで公開しています。

|
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 |
# multi-cam.py の一部抜粋 from http.server import HTTPServer, BaseHTTPRequestHandler import threading class CameraHTTPRequestHandler(BaseHTTPRequestHandler): def do_GET(self): # 1. MIPI-CSI2のリアルタイムMJPEG配信エンドポイント if self.path == '/video_feed/mipi': self.send_response(200) self.send_header('Content-Type', 'multipart/x-mixed-replace; boundary=frame') self.end_headers() # 2. USBウェブカメラのリアルタイムMJPEG配信エンドポイント elif self.path == '/video_feed/usb': self.send_response(200) self.send_header('Content-Type', 'multipart/x-mixed-replace; boundary=frame') self.end_headers() # 3. SPIカメラから取得したPNG画像(静的ポーリング) elif self.path.startswith('/video_feed/spi_png'): self.send_response(200) self.send_header('Content-Type', 'image/png') self.end_headers() with open("latest_spi_frame.png", "rb") as f: self.wfile.write(f.read()) |
レスポンシブな3カラムHTML表示
CSSグリッドを使い、3つの映像を横並びにするダッシュボードを作成しました。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<!-- ダッシュボードのHTMLレイアウト --> <div class="triple-grid"> <div class="video-card"> <h3>MIPI-CSI2 カメラ</h3> <img src="/video_feed/mipi" class="video-stream" alt="MIPI Stream"> </div> <div class="video-card"> <h3>USB カメラ</h3> <img src="/video_feed/usb" class="video-stream" alt="USB Stream"> </div> <div class="video-card"> <h3>SPI カメラ</h3> <img id="spiStreamImg" src="/video_feed/spi_png" class="video-stream" alt="SPI Stream"> </div> </div> |
「Start Save」ボタンを押すことで、3つのカメラの最新フレームを、全く同じタイムスタンプでローカルに同時保存できます。
これにより、AI用のデータ収集がワンクリックで可能です。
実際のデモ動画は下記です。
まとめ
Arduino® UNO Qの特徴である「Linux+マイコン」を活かし、3つの異なるカメラを1つに統合できました。
次回は、マイコン側でZephyr RTOSを動かし、SPIカメラとEdge Impulseで省電力AIを実装する方法について詳しく紹介します!

コメント