ESP32-S3 ベースの画像キャスト(送受信)システム。 送信側がカメラで撮影した画像を WiFi + TCP 経由で受信側にストリーミングし、両デバイスとも SD カードに保存する。
2台の XIAO ESP32S3 Sense を使用し、1台が送信側(カメラ撮影 + 画像送信)、もう1台が受信側(画像受信 + 保存)として動作する。
デバイスの役割は menuconfig で切り替え可能。
Sender (WiFi AP + TCP Server) Receiver (WiFi STA + TCP Client)
───────────────────────────── ──────────────────────────────
camera_get_image()
↓
cast_send_frame(tp) cast_init_receiver(tp, cb)
↓ チャンク分割 ↑ reassembler
tp->send() → TCP send() ──────→ recv_task → s_recv_cb()
↓ ↓
SD カード保存 SD カード保存
通信層は cast_transport_interface_t (Strategy) として抽象化されている。
プロトコル層 (cast_protocol) はこのインタフェースの関数ポインタ経由でデータを送受信するため、下層が TCP・ESP-NOW・Bluetooth など何であるかを一切意識しない。
┌─────────────────────────────────────┐
│ main (アプリケーション) │
├─────────────────────────────────────┤
│ cast_protocol (chunker/reassembler)│ ← トランスポートに依存しない
│ uses cast_transport_interface_t │
├─────────────────────────────────────┤
│ cast_transport_tcp (具象実装) │ ← 差し替え可能
│ WiFi AP/STA + TCP │
└─────────────────────────────────────┘
トランスポートを差し替える場合は cast_transport_interface_t を実装する新コンポーネントを作り、main.c の初期化部分を変更するだけでよい。
- XIAO ESP32S3 Sense x 2
- microSD カード (FAT フォーマット) x 2
| 機能 | GPIO |
|---|---|
| SD MOSI | 9 |
| SD MISO | 8 |
| SD CLK | 7 |
| SD CS | 21 |
| カメラ | ボード内蔵 (XIAO ESP32S3 Sense) |
git clone <リポジトリURL>
cd cast_esp
# 初回のみ: ターゲット設定 + ビルド
just init chip=esp32s3
just build送信側と受信側それぞれで menuconfig → ビルド → 書き込みを行う。
# 1. デバイスの役割を設定
just menuconfig
# → App Configuration > Device role で Sender / Receiver を選択
# 2. ビルド
just build
# 3. 書き込み
just flash
# 4. シリアルモニター
just monitor
# ビルド → 書き込み → モニター 一括
just run設定は just menuconfig で変更できる。
| 設定項目 | デフォルト | 説明 |
|---|---|---|
| Device role | Sender | Sender (撮影・送信) / Receiver (受信・保存) |
| Capture interval (ms) | 5000 | 撮影間隔 (Sender のみ) |
| WiFi SSID | CAST_AP | WiFi ネットワーク名 |
| WiFi Password | cast1234 | WiFi パスワード (8文字未満で Open) |
| 設定項目 | デフォルト | 選択肢 |
|---|---|---|
| Pixel format | JPEG | JPEG / RGB565 / Grayscale |
| Frame size | VGA (640x480) | 96x96 / QVGA / VGA / SVGA / XGA / SXGA / UXGA |
| JPEG quality | 12 | 0-63 (低いほど高画質、JPEG 時のみ) |
| 設定項目 | デフォルト | 説明 |
|---|---|---|
| Enable detailed logging | off | プロトコル層の詳細ログ |
| コマンド | 説明 |
|---|---|
just init chip=esp32s3 |
プロジェクト初期化 + ターゲット設定 |
just build |
ビルド |
just menuconfig |
SDK 設定画面 (TUI) |
just flash |
書き込み |
just monitor |
シリアルモニター |
just run |
build → flash → monitor 一括実行 |
just clean |
ビルド成果物を削除 |
just fullclean |
ビルドディレクトリ全体を削除 |
just size |
メモリ使用量の確認 |
# ポートを指定 (デフォルト: /dev/ttyACM0)
just flash port=/dev/ttyUSB0
# ボーレートを指定
just flash baud=921600
# モニターのボーレート (デフォルト: 115200)
just monitor baud=9600.
├── Justfile # ビルド・書き込み等のコマンド定義
├── CMakeLists.txt
├── sdkconfig.defaults
├── docs/
│ └── wifi_tcp_transport.md # WiFi + TCP 構成の詳細
├── main/
│ ├── CMakeLists.txt
│ ├── Kconfig.projbuild # アプリ設定 (役割・WiFi・撮影間隔)
│ └── main.c # エントリポイント (役割別分岐)
└── components/
├── cast_protocol/ # プロトコル層 (チャンク分割・再構築)
│ ├── include/
│ │ ├── cast_itransport.h # トランスポートインタフェース定義
│ │ └── cast_protocol.h
│ └── src/
│ ├── cast_chunker.c # 画像→チャンク分割
│ └── cast_reassembler.c # チャンク→画像再構築
├── cast_transport_tcp/ # TCP トランスポート実装
│ ├── include/
│ │ └── cast_transport_tcp.h
│ └── cast_transport_tcp.c # WiFi AP/STA + TCP server/client
├── camera_driver/ # カメラドライバ
│ ├── Kconfig
│ ├── include/
│ │ └── camera_driver.h
│ └── camera_driver.c
└── sdcard_driver/ # SD カード (SPI) ドライバ
├── include/
│ └── sdcard_driver.h
└── sdcard_driver.c
VS Code の Dev Containers 拡張をインストールし、コマンドパレットから Dev Containers: Reopen in Container を実行する。ESP-IDF のヘッダーが解決され、補完・定義ジャンプが有効になる。
ビルド・書き込み・モニターはホスト側のターミナルで just を使う。