Skip to content

Reimanbow/cast_esp

Repository files navigation

cast_esp

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 カード保存

設計

Strategy パターンによるトランスポート抽象化

通信層は 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 の初期化部分を変更するだけでよい。

ハードウェア

ピン接続

機能 GPIO
SD MOSI 9
SD MISO 8
SD CLK 7
SD CS 21
カメラ ボード内蔵 (XIAO ESP32S3 Sense)

必要なもの

  • Docker
  • just
  • esptool (pip install esptool) - 書き込み用
  • pyserial (pip install pyserial) - モニター用

セットアップ

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 で変更できる。

App Configuration

設定項目 デフォルト 説明
Device role Sender Sender (撮影・送信) / Receiver (受信・保存)
Capture interval (ms) 5000 撮影間隔 (Sender のみ)
WiFi SSID CAST_AP WiFi ネットワーク名
WiFi Password cast1234 WiFi パスワード (8文字未満で Open)

Camera Driver

設定項目 デフォルト 選択肢
Pixel format JPEG JPEG / RGB565 / Grayscale
Frame size VGA (640x480) 96x96 / QVGA / VGA / SVGA / XGA / SXGA / UXGA
JPEG quality 12 0-63 (低いほど高画質、JPEG 時のみ)

Cast Protocol

設定項目 デフォルト 説明
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 で補完を有効にする

VS Code の Dev Containers 拡張をインストールし、コマンドパレットから Dev Containers: Reopen in Container を実行する。ESP-IDF のヘッダーが解決され、補完・定義ジャンプが有効になる。

ビルド・書き込み・モニターはホスト側のターミナルで just を使う。

About

CAST (Camera Adaptive Strategy Transmission)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published