ESP32 with Rust の環境構築

環境
プラットフォーム
- OS: macOS 14.1 Sonoma
- Processor: Apple M3 Max (ARMv8/aarch64、16 cores)
Rust
$ rustc --version
rustc 1.80.1 (3f5fd8dd4 2024-08-06)
$ cargo version
cargo 1.80.1 (376290515 2024-07-16)
$ rustup show
Default host: aarch64-apple-darwin
rustup home: /Users/nukopy/.rustup
stable-aarch64-apple-darwin (default)
rustc 1.80.1 (3f5fd8dd4 2024-08-06)

ツールチェーンのインストール
# ESP32 のテンプレートプロジェクトからプロジェクトを生成するためのバイナリクレート
cargo install cargo-generate
# ESP32 関連
cargo install espup
# locked つけないと cargo-espflash の依存関係の型推論のエラーが出てインストールできない
cargo install cargo-espflash --locked
テンプレートプロジェクトから新規 Cargo プロジェクト作成
cargo generate --git https://github.com/esp-rs/esp-idf-template cargo
🤷 Project Name: dennou-no-machi-agent-camera-module-firmware
🔧 Destination: /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware ...
🔧 project-name: dennou-no-machi-agent-camera-module-firmware ...
🔧 Generating template ...
✔ 🤷 Which MCU to target? · esp32s3
✔ 🤷 Configure advanced template options? · true
✔ 🤷 Enable STD support? · true
✔ 🤷 ESP-IDF version (master = UNSTABLE) · v5.1
✔ 🤷 Configure project to use Dev Containers (VS Code and GitHub Codespaces)? · true
✔ 🤷 Configure project to support Wokwi simulation with Wokwi VS Code extension? · true
✔ 🤷 Add CI files for GitHub Action? · true
🔧 Moving generated files into: `/Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware`...
🔧 Initializing a fresh Git repository
✨ Done! New project created /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware

espup install
[info]: Installing the Espressif Rust ecosystem
[info]: Checking Rust installation
[info]: Installing RISC-V Rust targets ('riscv32imc-unknown-none-elf', 'riscv32imac-unknown-none-elf' and 'riscv32imafc-unknown-none-elf') for 'nightly' toolchain
[info]: Installing GCC (xtensa-esp-elf)
[info]: Installing Xtensa Rust 1.81.0.0 toolchain
[info]: Installing Xtensa LLVM
[info]: Downloading 'rust.tar.xz'
[info]: Downloading 'idf_tool_xtensa_elf_clang.libs.tar.xz'
[info]: Downloading 'xtensa-esp-elf.tar.xz'
[info]: Creating symlink between '/Users/nukopy/.rustup/toolchains/esp/xtensa-esp32-elf-clang/esp-17.0.1_20240419/esp-clang/lib' and '/Users/nukopy/.espup/esp-clang'
[info]: Installing 'rust' component for Xtensa Rust toolchain
[info]: Downloading 'rust-src.tar.xz'
[info]: Installing 'rust-src' component for Xtensa Rust toolchain
[info]: Installation successfully completed!
To get started, you need to set up some environment variables by running: '. /Users/nukopy/export-esp.sh'
This step must be done every time you open a new terminal.
See other methods for setting the environment in https://esp-rs.github.io/book/installation/riscv-and-xtensa.html#3-set-up-the-environment-variables

cargo build でエラーが出る
cargo build
Compiling esp-idf-sys v0.35.0
The following warnings were emitted during compilation:
warning: esp-idf-sys@0.35.0: (esp-idf-sys) Removed env vars that might affect the ESP IDF C build: `CPPFLAGS=-I/opt/homebrew/opt/openjdk@17/include`
error: failed to run custom build command for `esp-idf-sys v0.35.0`
Caused by:
process didn't exit successfully: `/Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/target/debug/build/esp-idf-sys-f47b01e7352a8724/build-script-build` (exit status: 1)
--- stdout
cargo:warning=(esp-idf-sys) Removed env vars that might affect the ESP IDF C build: `CPPFLAGS=-I/opt/homebrew/opt/openjdk@17/include`
cargo:rerun-if-env-changed=ESP_IDF_TOOLS_INSTALL_DIR
cargo:rerun-if-env-changed=ESP_IDF_SDKCONFIG
cargo:rerun-if-env-changed=ESP_IDF_SDKCONFIG_DEFAULTS
cargo:rerun-if-env-changed=MCU
cargo:rerun-if-env-changed=ESP_IDF_SYS_ROOT_CRATE
cargo:rerun-if-env-changed=ESP_IDF_VERSION
cargo:rerun-if-env-changed=ESP_IDF_REPOSITORY
cargo:rerun-if-env-changed=ESP_IDF_CMAKE_GENERATOR
cargo:rerun-if-env-changed=IDF_PATH
cargo:rerun-if-env-changed=EXTRA-COMPONENTS
cargo:rerun-if-env-changed=ESP_IDF_COMPONENTS
cargo:rerun-if-env-changed=ESP_IDF_COMPONENT_MANAGER
Python 3.12.3
pip 24.2 from /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages/pip (python 3.12)
Requirement already satisfied: pip in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (24.2)
Requirement already satisfied: setuptools in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (71.0.0)
Collecting setuptools
Using cached setuptools-75.1.0-py3-none-any.whl.metadata (6.9 kB)
Using cached setuptools-75.1.0-py3-none-any.whl (1.2 MB)
Installing collected packages: setuptools
Attempting uninstall: setuptools
Found existing installation: setuptools 71.0.0
Uninstalling setuptools-71.0.0:
Successfully uninstalled setuptools-71.0.0
Successfully installed setuptools-75.1.0
Looking in indexes: https://pypi.org/simple, https://dl.espressif.com/pypi
Ignoring importlib_metadata: markers 'python_version < "3.8"' don't match your environment
Collecting setuptools (from -r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 3))
Using cached https://dl.espressif.com/pypi/setuptools/setuptools-71.0.0-py3-none-any.whl (908 kB)
Requirement already satisfied: packaging in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from -r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 4)) (24.1)
Requirement already satisfied: click in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from -r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 7)) (8.1.7)
Requirement already satisfied: pyserial in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from -r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 8)) (3.5)
Requirement already satisfied: cryptography in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from -r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 9)) (39.0.2)
Requirement already satisfied: pyparsing in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from -r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 10)) (3.0.9)
Requirement already satisfied: pyelftools in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from -r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 11)) (0.29)
Requirement already satisfied: idf-component-manager in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from -r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 12)) (2.0.4)
Requirement already satisfied: esp-coredump in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from -r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 13)) (1.12.0)
Requirement already satisfied: esptool in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from -r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 14)) (4.7.0)
Requirement already satisfied: esp-idf-kconfig in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from -r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 15)) (1.4.3)
Requirement already satisfied: esp-idf-monitor in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from -r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 16)) (1.5.0)
Requirement already satisfied: esp-idf-size in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from -r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 17)) (1.6.0)
Requirement already satisfied: esp-idf-panic-decoder in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from -r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 18)) (1.2.1)
Requirement already satisfied: construct in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from -r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 19)) (2.10.70)
Requirement already satisfied: freertos_gdb in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from -r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 22)) (1.0.3)
Requirement already satisfied: cffi>=1.12 in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from cryptography->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 9)) (1.17.1)
Requirement already satisfied: colorama in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from idf-component-manager->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 12)) (0.4.6)
Requirement already satisfied: pyyaml in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from idf-component-manager->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 12)) (6.0.2)
Requirement already satisfied: requests in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from idf-component-manager->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 12)) (2.32.3)
Requirement already satisfied: requests-file in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from idf-component-manager->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 12)) (2.1.0)
Requirement already satisfied: requests-toolbelt in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from idf-component-manager->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 12)) (1.0.0)

つづき
Requirement already satisfied: tqdm in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from idf-component-manager->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 12)) (4.66.5)
Requirement already satisfied: jsonref in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from idf-component-manager->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 12)) (1.1.0)
Requirement already satisfied: pydantic in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from idf-component-manager->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 12)) (2.9.2)
Requirement already satisfied: pydantic-core in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from idf-component-manager->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 12)) (2.23.4)
Requirement already satisfied: pydantic-settings in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from idf-component-manager->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 12)) (2.5.2)
Requirement already satisfied: pygdbmi>=0.9.0.2 in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from esp-coredump->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 13)) (0.11.0.0)
Requirement already satisfied: bitstring>=3.1.6 in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from esptool->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 14)) (4.2.3)
Requirement already satisfied: ecdsa>=0.16.0 in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from esptool->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 14)) (0.19.0)
Requirement already satisfied: reedsolo<1.8,>=1.5.3 in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from esptool->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 14)) (1.7.0)
Requirement already satisfied: intelhex in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from esptool->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 14)) (2.3.0)
Requirement already satisfied: kconfiglib>=13.7.1 in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from esp-idf-kconfig->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 15)) (14.1.0)
Requirement already satisfied: rich in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from esp-idf-size->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 17)) (13.9.2)
Requirement already satisfied: bitarray<3.0.0,>=2.9.0 in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from bitstring>=3.1.6->esptool->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 14)) (2.9.3)
Requirement already satisfied: pycparser in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from cffi>=1.12->cryptography->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 9)) (2.22)
Requirement already satisfied: six>=1.9.0 in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from ecdsa>=0.16.0->esptool->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 14)) (1.16.0)
Requirement already satisfied: annotated-types>=0.6.0 in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from pydantic->idf-component-manager->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 12)) (0.7.0)
Requirement already satisfied: typing-extensions>=4.6.1 in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from pydantic->idf-component-manager->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 12)) (4.12.2)
Requirement already satisfied: python-dotenv>=0.21.0 in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from pydantic-settings->idf-component-manager->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 12)) (1.0.1)
Requirement already satisfied: charset-normalizer<4,>=2 in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from requests->idf-component-manager->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 12)) (3.4.0)
Requirement already satisfied: idna<4,>=2.5 in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from requests->idf-component-manager->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 12)) (3.10)
Requirement already satisfied: urllib3<3,>=1.21.1 in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from requests->idf-component-manager->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 12)) (1.26.20)
Requirement already satisfied: certifi>=2017.4.17 in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from requests->idf-component-manager->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 12)) (2024.8.30)
Requirement already satisfied: markdown-it-py>=2.2.0 in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from rich->esp-idf-size->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 17)) (3.0.0)
Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from rich->esp-idf-size->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 17)) (2.18.0)
Requirement already satisfied: mdurl~=0.1 in /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/lib/python3.12/site-packages (from markdown-it-py>=2.2.0->rich->esp-idf-size->-r /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt (line 17)) (0.1.2)
Installing collected packages: setuptools
Attempting uninstall: setuptools
Found existing installation: setuptools 75.1.0
Uninstalling setuptools-75.1.0:
Successfully uninstalled setuptools-75.1.0
Successfully installed setuptools-71.0.0
Upgrading pip and setuptools...
Skipping the download of /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/espidf.constraints.v5.1.txt because it was downloaded recently.
Installing Python packages
Constraint file: /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/espidf.constraints.v5.1.txt
Requirement files:
- /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/requirements/requirements.core.txt
Current system platform: macos-arm64
Installing tools: xtensa-esp32s3-elf, cmake, ninja, esp32ulp-elf
Installing xtensa-esp32s3-elf@esp-12.2.0_20230208
Downloading https://github.com/espressif/crosstool-NG/releases/download/esp-12.2.0_20230208/xtensa-esp32s3-elf-12.2.0_20230208-aarch64-apple-darwin.tar.xz
Destination: /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/dist/xtensa-esp32s3-elf-12.2.0_20230208-aarch64-apple-darwin.tar.xz.tmp
Downloading https://github.com/espressif/crosstool-NG/releases/download/esp-12.2.0_20230208/xtensa-esp32s3-elf-12.2.0_20230208-aarch64-apple-darwin.tar.xz
Destination: /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/dist/xtensa-esp32s3-elf-12.2.0_20230208-aarch64-apple-darwin.tar.xz.tmp
Downloading https://github.com/espressif/crosstool-NG/releases/download/esp-12.2.0_20230208/xtensa-esp32s3-elf-12.2.0_20230208-aarch64-apple-darwin.tar.xz
Destination: /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/dist/xtensa-esp32s3-elf-12.2.0_20230208-aarch64-apple-darwin.tar.xz.tmp
Please make sure you have a working Internet connection.
Certificate issues are usually caused by an outdated certificate database on your computer.
Please check the documentation of your operating system for how to upgrade it.
Running "./Install\ Certificates.command" might be able to fix this issue.
Running "/Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/bin/python -m pip install --upgrade certifi" can also resolve this issue in some cases.
--- stderr
Build configuration: BuildConfig {
esp_idf_tools_install_dir: None,
esp_idf_sdkconfig: None,
esp_idf_sdkconfig_defaults: None,
mcu: Some(
"esp32s3",
),
native: NativeConfig {
esp_idf_version: Some(
Tag(
"v5.1.4",
),
),
esp_idf_repository: None,
esp_idf_cmake_generator: None,
idf_path: None,
extra_components: [],
esp_idf_components: None,
esp_idf_component_manager: None,
},
esp_idf_sys_root_crate: None,
}
Using managed esp-idf repository: RemoteSdk { repo_url: None, git_ref: Tag("v5.1.4") }
Using esp-idf v5.1.4 at '/Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4'
WARNING: Download failure: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1000)>
WARNING: Failed to download https://github.com/espressif/crosstool-NG/releases/download/esp-12.2.0_20230208/xtensa-esp32s3-elf-12.2.0_20230208-aarch64-apple-darwin.tar.xz to /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/dist/xtensa-esp32s3-elf-12.2.0_20230208-aarch64-apple-darwin.tar.xz.tmp
WARNING: Download failure: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1000)>
WARNING: Failed to download https://github.com/espressif/crosstool-NG/releases/download/esp-12.2.0_20230208/xtensa-esp32s3-elf-12.2.0_20230208-aarch64-apple-darwin.tar.xz to /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/dist/xtensa-esp32s3-elf-12.2.0_20230208-aarch64-apple-darwin.tar.xz.tmp
WARNING: Download failure: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1000)>
WARNING: Failed to download https://github.com/espressif/crosstool-NG/releases/download/esp-12.2.0_20230208/xtensa-esp32s3-elf-12.2.0_20230208-aarch64-apple-darwin.tar.xz to /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/dist/xtensa-esp32s3-elf-12.2.0_20230208-aarch64-apple-darwin.tar.xz.tmp
ERROR: Failed to download, and retry count has expired
Error: Could not install esp-idf
Caused by:
command 'IDF_TOOLS_PATH="/Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif" "/Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/python_env/idf5.1_py3.12_env/bin/python" "/Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/tools/idf_tools.py" "--idf-path" "/Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4" "install" "xtensa-esp32s3-elf" "cmake" "ninja" "esp32ulp-elf"' exited with non-zero status code 1

以下のコマンドを実行
$ /Applications/Python\ 3.12/Install\ Certificates.command
-- pip install --upgrade certifi
Collecting certifi
Using cached certifi-2024.8.30-py3-none-any.whl.metadata (2.2 kB)
Using cached certifi-2024.8.30-py3-none-any.whl (167 kB)
Installing collected packages: certifi
Successfully installed certifi-2024.8.30
[notice] A new release of pip is available: 24.0 -> 24.2
[notice] To update, run: /Library/Frameworks/Python.framework/Versions/3.12/bin/python3.12 -m pip install --upgrade pip
-- removing any existing file or link
-- creating symlink to certifi certificate bundle
-- setting permissions
-- update complete

リンカーの ldproxy
というのがないらしい。たしかに入れた覚えはない。ldproxy
は ESP-IDF のビルドシステムで使用される特殊なリンカー。
$ cargo build
Compiling esp-idf-sys v0.35.0
Compiling esp-idf-hal v0.44.1
Compiling esp-idf-svc v0.49.1
Compiling dennou-no-machi-agent-camera-module-firmware v0.1.0 (/Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware)
error: linker `ldproxy` not found
|
= note: No such file or directory (os error 2)
error: could not compile `dennou-no-machi-agent-camera-module-firmware` (bin "dennou-no-machi-agent-camera-module-firmware") due to 1 previous error
ldproxy
のインストール
$ cargo install ldproxy
Updating crates.io index
Downloaded ldproxy v0.3.4
Downloaded 1 crate (10.5 KB) in 0.14s
Installing ldproxy v0.3.4
Updating crates.io index
Locking 49 packages to latest compatible versions
Adding bitflags v1.3.2 (latest: v2.6.0)
Adding env_logger v0.9.3 (latest: v0.11.5)
Adding hermit-abi v0.1.19 (latest: v0.4.0)
Downloaded termcolor v1.4.1
Downloaded env_logger v0.9.3
Downloaded 2 crates (52.1 KB) in 0.35s
Compiling libc v0.2.159
Compiling memchr v2.7.4
Compiling proc-macro2 v1.0.87
Compiling unicode-ident v1.0.13
Compiling adler2 v2.0.0
Compiling cfg-if v1.0.0

ビルド通った。勝ち申した。
$ cargo build
Compiling bindgen v0.69.5
Compiling embuild v0.32.0
Compiling esp-idf-sys v0.35.0
Compiling esp-idf-hal v0.44.1
Compiling esp-idf-svc v0.49.1
Compiling dennou-no-machi-agent-camera-module-firmware v0.1.0 (/Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware)
Finished `dev` profile [optimized + debuginfo] target(s) in 22.71s

続いて cargo run。まずは ESP モジュールを繋いでいない状態で run してみる。
$ . ~/export-esp.sh
$ cargo run
Finished `dev` profile [optimized + debuginfo] target(s) in 0.09s
Running `espflash flash --monitor target/xtensa-esp32s3-espidf/debug/dennou-no-machi-agent-camera-module-firmware`
error: could not execute process `espflash flash --monitor target/xtensa-esp32s3-espidf/debug/dennou-no-machi-agent-camera-module-firmware` (never executed)
Caused by:
No such file or directory (os error 2)
espflash が cargo には認識されてるけど、PATH は通ってない?
$ espflash --version
zsh: command not found: espflash
$ cargo install --list
cargo-espflash v3.1.1:
cargo-espflash
cargo-generate v0.22.0:
cargo-generate
cargo-license v0.6.1:
cargo-license
cargo-watch v8.5.2:
cargo-watch
espup v0.12.2:
espup
ldproxy v0.3.4:
ldproxy

なるほど cargo-espflash と espflash が別物だったのか
cargo-espflash
A cargo extension for flashing Espressif devices.For more information and installation instructions, please refer to the cargo-espflash package's README.
espflash
A library and command-line tool for flashing Espressif devices.For more information and installation instructions, please refer to the espflash package's README.
espflash をインストール
cargo install espflash
cargo install --list
cargo-espflash v3.1.1:
cargo-espflash
cargo-generate v0.22.0:
cargo-generate
cargo-license v0.6.1:
cargo-license
cargo-watch v8.5.2:
cargo-watch
espflash v3.1.1:
espflash
espup v0.12.2:
espup
ldproxy v0.3.4:
ldproxy

再度 cargo run。esp32 モジュールは USB 接続していないので No serial ports could be detected
というエラーになっている。書き込みしようとしているところまではできてるっぽい。
$ cargo run
Compiling dennou-no-machi-agent-camera-module-firmware v0.1.0 (/Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware)
Finished `dev` profile [optimized + debuginfo] target(s) in 1.72s
Running `espflash flash --monitor target/xtensa-esp32s3-espidf/debug/dennou-no-machi-agent-camera-module-firmware`
Error: espflash::no_serial
× No serial ports could be detected
help: Make sure you have connected a device to the host system. If the device is connected but not listed, try using the `--list-all-ports` flag.

espflash の挙動を見てみる

espflash の挙動
espflash flash
のヘルプを見てみる。
✗ espflash flash --help
Flash an application in ELF format to a connected target device
Given a path to an ELF file, first convert it into the appropriate binary application image format
as required by the ESP32 devices. Once we have a valid application image, we can write the
bootloader, partition table, and application image to the connected target device.
Please refer to the ESP-IDF documentation for more information on the binary image format:
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/app_image_format.html
Usage: espflash flash [OPTIONS] <IMAGE>
Arguments:
<IMAGE>
ELF image to flash
Options:
-a, --after <AFTER>
Reset operation to perform after connecting to the target
[default: hard-reset]
Possible values:
- hard-reset: The DTR serial control line is used to reset the chip into a normal
boot sequence
- no-reset: Leaves the chip in the serial bootloader, no reset is performed
- no-reset-no-stub: Leaves the chip in the stub bootloader, no reset is performed
-B, --baud <BAUD>
Baud rate at which to communicate with target device
[env: ESPFLASH_BAUD=]
-b, --before <BEFORE>
Reset operation to perform before connecting to the target
[default: default-reset]
Possible values:
- default-reset: Uses DTR & RTS serial control lines to try to reset the chip into
bootloader mode
- no-reset: Skips DTR/RTS control signal assignments and just start sending a
serial synchronisation command to the chip
- no-reset-no-sync: Skips DTR/RTS control signal assignments and also skips the serial
synchronization command
- usb-reset: Reset sequence for USB-JTAG-Serial peripheral
-c, --chip <CHIP>
Target device
Possible values:
- esp32: ESP32
- esp32c2: ESP32-C2, ESP8684
- esp32c3: ESP32-C3, ESP8685
- esp32c6: ESP32-C6
- esp32h2: ESP32-H2
- esp32p4: ESP32-P4
- esp32s2: ESP32-S2
- esp32s3: ESP32-S3
-C, --confirm-port
Require confirmation before auto-connecting to a recognized device
--list-all-ports
List all available ports
--no-stub
Do not use the RAM stub for loading
-p, --port <PORT>
Serial port connected to target device
[env: ESPFLASH_PORT=]
-f, --flash-freq <FREQ>
Flash frequency
Possible values:
- 12mhz: 12 MHz
- 15mhz: 15 MHz
- 16mhz: 16 MHz
- 20mhz: 20 MHz
- 24mhz: 24 MHz
- 26mhz: 26 MHz
- 30mhz: 30 MHz
- 40mhz: 40 MHz
- 48mhz: 48 MHz
- 60mhz: 60 MHz
- 80mhz: 80 MHz
-m, --flash-mode <MODE>
Flash mode to use
Possible values:
- qio: Quad I/O (4 pins used for address & data)
- qout: Quad Output (4 pins used for data)
- dio: Dual I/O (2 pins used for address & data)
- dout: Dual Output (2 pins used for data)
-s, --flash-size <SIZE>
Flash size of the target
Possible values:
- 256kb: 256 KB
- 512kb: 512 KB
- 1mb: 1 MB
- 2mb: 2 MB
- 4mb: 4 MB
- 8mb: 8 MB
- 16mb: 16 MB
- 32mb: 32 MB
- 64mb: 64 MB
- 128mb: 128 MB
- 256mb: 256 MB
--erase-parts <LABELS>
Erase partitions by label
--erase-data-parts <PARTS>
Erase specified data partitions
-L, --log-format <LOG_FORMAT>
Logging format
[default: serial]
Possible values:
- defmt: defmt
- serial: serial
-M, --monitor
Open a serial monitor after flashing
--monitor-baud <BAUD>
Baud rate at which to read console output
--ram
Load the application to RAM instead of Flash
--no-verify
Don't verify the flash contents after flashing
--no-skip
Don't skip flashing of parts with matching checksum
--bootloader <FILE>
Path to a binary (.bin) bootloader file
-T, --partition-table <FILE>
Path to a CSV file containing partition table
--partition-table-offset <OFFSET>
Partition table offset
--target-app-partition <LABEL>
Label of target app partition
--min-chip-rev <MIN_CHIP_REV>
Minimum chip revision supported by image, in format: major.minor
[default: 0.0]
-h, --help
Print help (see a summary with '-h')
-V, --version
Print version

ポート一覧してみる
# USB 接続していない状態
$ espflash flash --list-all-ports tmp
[2024-10-13T01:26:52Z INFO ] Detected 4 serial ports
[2024-10-13T01:26:52Z INFO ] Ports which match a known common dev board are highlighted
[2024-10-13T01:26:52Z INFO ] Please select a port
❯ /dev/cu.SoundcoreLibertyAir2Pro
/dev/tty.SoundcoreLibertyAir2Pro
/dev/cu.Bluetooth-Incoming-Port
/dev/tty.Bluetooth-Incoming-Port
# esp32 モジュールを USB 接続している状態
# 上記と同様の出力で、esp32 モジュールが espflash に認識されていない
system_profiler で見てみる。ESP デバイスが認識されている。
$ system_profiler SPUSBDataType
USB:
USB 3.1 Bus:
Host Controller Driver: AppleT8122USBXHCI
USB 3.1 Bus:
Host Controller Driver: AppleT8122USBXHCI
ESP UVC Device:
Product ID: 0x8000
Vendor ID: 0x303a
Version: 1.00
Serial Number: 12345678
Speed: Up to 12 Mb/s
Manufacturer: Espressif
Location ID: 0x01100000 / 1
Current Available (mA): 500
Current Required (mA): 500
Extra Operating Current (mA): 0
USB 3.1 Bus:
Host Controller Driver: AppleT8122USBXHCI
claude に聞いてみた
ESP32-S3 の文脈では:
- ESP32-S3 が UVC デバイスとして認識されているということは、カメラ機能を持つファームウェアがロードされている可能性があります。
- これは、ESP32-S3 をウェブカメラやビデオストリーミングデバイスとして使用するプロジェクトで一般的です。
しかし、UART(シリアル通信)を使用してプログラミングや通信を行いたい場合、この UVC モードが邪魔になる可能性があります。
- UVC モードになっている ESP32-S3 を通常の開発モード(UART モード)に戻すには:
1. ボードのリセット方法を確認する
2. 特定のボタンの組み合わせやジャンパーピンの設定を変更する
3. 必要に応じて、非 UVC ファームウェアを書き込む
ESP32-S3 が UVC デバイスとして認識されている場合、開発やプログラミングのための通常の UART 通信ができない可能性があるため、目的に応じて適切なモードに切り替える必要があります。

UVC、UART ってなに?
by Claude 3.5 Sonnet
UVC と UART は異なる通信プロトコルや技術を指します。それぞれの特徴を説明します:
- UVC (USB Video Class):
- 定義: USB を介してビデオデータを転送するための標準規格です。
- 主な用途: ウェブカメラ、ビデオキャプチャデバイスなど。
- 特徴:
- プラグアンドプレイ対応(多くの OS で追加ドライバー不要)
- ビデオストリーミングに最適化
- カメラ制御機能(明るさ調整、フォーカスなど)をサポート
- ESP32-S3 との関連: カメラモジュールを使用するプロジェクトで利用されることがあります。
- UART (Universal Asynchronous Receiver/Transmitter):
- 定義: シリアル通信のための非同期データ転送プロトコルです。
- 主な用途: マイコンのプログラミング、デバッグ、低速データ通信など。
- 特徴:
- 簡単な2線式(TX/RX)または4線式(TX/RX/RTS/CTS)通信
- 低速だが信頼性が高い
- 多くのマイコンやデバイスに搭載されている
- ESP32-S3 との関連: プログラムの書き込み、デバッグ出力、シリアルモニタリングに使用されます。
ESP32-S3 の開発における違い:
-
UVC モード:
- ESP32-S3 がカメラデバイスとして機能
- USB 経由でビデオストリームを送信可能
- 通常の開発作業(プログラム書き込みなど)が困難
-
UART モード:
- 一般的な開発モード
- プログラムの書き込み、デバッグ情報の出力が可能
-
espflash
やesptool.py
などのツールで通信可能
現在の状況:
あなたの ESP32-S3 が UVC デバイスとして認識されているということは、カメラ機能を持つ特殊なファームウェアが書き込まれている可能性があります。通常の開発作業(新しいプログラムの書き込みなど)を行うためには、デバイスを UART モードに切り替える必要があります。
UART モードへの切り替え方法:
- ボードのリセットボタンを使用
- 特定のピンの接続状態を変更(ボードの仕様による)
- 専用のツールを使用してファームウェアを書き換え
具体的な手順はボードの型番や現在のファームウェアによって異なるため、使用しているボードの仕様書や開発ガイドを参照することをお勧めします。

ATOMS3R CAM についているボタンを長押しすると、緑色に点滅した。そんで PC には新しい USB デバイスとして認識された。具体的には、Espressif USB JTAG/serial debug unit(ESP32-S3の開発ボード)が接続されたことを示している。ESP32-S3 ボードが正しく認識され、JTAG/シリアルデバッグユニットとして検出されました。これで espflash
で書き込める状態になったはず。
長押しすると、ファームウェアの書き込みができる状態になるのは ATOMS3R M12 のドキュメントに書いてあった。ATOMS3R CAM のドキュメントの方に書いといてくれ〜。ATOM シリーズだとこれが常識なのかもしれん。
- ATOMS3R CAM のドキュメント
工場出荷時のファームウェアには、UVC機能とWi-Fi伝送機能の両方が含まれています。UVC機能を使用すると、コンピュータに直接接続でき、カメラを開くだけで画像を表示できます。Wi-Fi伝送機能を使用するには、デバイス(AtomS3R-CAM-WiFi)が発するWi-Fiネットワークに接続し、ブラウザに192.168.4.1と入力してWi-Fi伝送機能を選択します。
- ATOMS3R M12 のドキュメント
ファームウェアを書き込むには、内部の緑色LEDが点灯するまでリセットボタンを(約2秒間)押し続け、その後ボタンを離します。デバイスはダウンロードモードに入り、書き込みの準備が整います。
system_profiler
コマンドで見てみると、UVC から変わっている
$ system_profiler SPUSBDataType
2024-10-13 10:48:21.052 system_profiler[10158:70745488] SPUSBDevice: IOServiceGetMatchingService did not return anything for location 0x01100000
USB:
USB 3.1 Bus:
Host Controller Driver: AppleT8122USBXHCI
- USB 3.1 Bus:
-
- Host Controller Driver: AppleT8122USBXHCI
-
- ESP UVC Device:
-
- Product ID: 0x8000
- Vendor ID: 0x303a
- Version: 1.00
- Serial Number: 12345678
- Speed: Up to 12 Mb/s
- Manufacturer: Espressif
- Location ID: 0x01100000 / 1
- Current Available (mA): 500
- Current Required (mA): 500
- Extra Operating Current (mA): 0
+ USB 3.1 Bus:
+
+ Host Controller Driver: AppleT8122USBXHCI
+
+ USB JTAG/serial debug unit:
+
+ Product ID: 0x1001
+ Vendor ID: 0x303a
+ Version: 1.01
+ Serial Number: F0:9E:9E:32:4A:30
+ Manufacturer: Espressif
+ Location ID: 0x01100000
USB 3.1 Bus:
Host Controller Driver: AppleT8122USBXHCI

再度 espflash flash
コマンドの --list-all-ports
オプションでシリアルポートを検出してみると、先ほど接続できた ESP32 モジュール(ESP32 開発ボード)が検出されている?
$ espflash flash --list-all-ports tmp
[2024-10-13T01:55:40Z INFO ] Detected 6 serial ports
[2024-10-13T01:55:40Z INFO ] Ports which match a known common dev board are highlighted
[2024-10-13T01:55:40Z INFO ] Please select a port
❯ /dev/cu.SoundcoreLibertyAir2Pro
/dev/tty.SoundcoreLibertyAir2Pro
/dev/cu.Bluetooth-Incoming-Port
/dev/tty.Bluetooth-Incoming-Port
/dev/cu.usbmodem1101 - USB JTAG/serial debug unit
/dev/tty.usbmodem1101 - USB JTAG/serial debug unit

cu と tty の違いは?
by Claude 3.5 Sonnet
cu
と tty
は両方ともシリアルデバイスを指しますが、macOS(および他のUNIX系システム)では少し異なる用途があります。
-
cu
(Call Up):- 主に「発信」用のデバイスを指します。
- 通常、モデムやシリアルデバイスに対して接続を開始する際に使用されます。
- 双方向通信が可能です。
- 一般的に、プログラムがデバイスとの通信を開始する際に使用されます。
-
tty
(TeleTYpewriter):- 主に「着信」用のデバイスを指します。
- 端末やコンソールデバイスとして使用されることが多いです。
- 双方向通信が可能です。
- 一般的に、シェルセッションやログイン端末として使用されます。
実際の使用では:
- 多くの場合、
cu
とtty
デバイスは同じ物理デバイスを指しており、機能的にはほぼ同じです。 - 開発作業(例:ESP32-S3へのプログラム書き込み)では、どちらを使用しても通常は問題ありません。
- 一部のプログラムやスクリプトは、特定の理由で
cu
またはtty
を優先することがあります。
あなたの出力では:
-
/dev/cu.usbmodem1101
と/dev/tty.usbmodem1101
は同じESP32-S3デバイスを指しています。 - どちらを選択しても、ESP32-S3との通信は可能です。
推奨:
- ESP32-S3の開発では、通常
cu
デバイス(/dev/cu.usbmodem1101
)を使用することをお勧めします。 - ほとんどの開発ツール(espflashを含む)は
cu
デバイスでうまく動作します。
次のステップ:
-
/dev/cu.usbmodem1101
を選択して、ESP32-S3との通信を試みてください。 - この選択後、espflashを使用してプログラムの書き込みやデバッグが可能になるはずです。

シリアルデバイスって何?
by Claude 3.5 Sonnet
シリアルデバイスは、データを一度に1ビットずつ順番に送受信する通信方式を使用するデバイスのことです。この通信方式をシリアル通信と呼びます。シリアルデバイスの主な特徴と用途を説明します:
-
基本的な仕組み:
- データを順次的に送受信します。
- 通常、2本の通信線(送信用と受信用)を使用します。
-
一般的な用途:
- マイコンボード(Arduino, ESP32など)のプログラミングとデバッグ
- モデム通信
- プリンター、スキャナーなどの周辺機器との通信
- 産業用機器の制御と監視
-
利点:
- シンプルな配線(少ない本数の線で通信可能)
- 長距離通信に適している
- ノイズに強い(特にRS-232やRS-485などの規格)
-
代表的なシリアル通信規格:
- UART (Universal Asynchronous Receiver/Transmitter)
- RS-232, RS-485
- USB(高速シリアル通信の一種)
-
コンピュータとの接続:
- 現代のコンピュータでは、多くの場合USBポートを介してシリアルデバイスと接続します。
- USBシリアル変換チップ(例:FTDI, CP210x)を使用して、従来のシリアル通信をUSB経由で行います。
-
開発での使用:
- プログラムの書き込み
- デバッグ情報の出力
- デバイスの設定や制御
-
macOSでの表示:
-
/dev/cu.*
や/dev/tty.*
として表示されます。 - これらは同じ物理デバイスを指す異なる表現方法です。
-
ESP32-S3の文脈では:
- ESP32-S3ボードは、USBを介してコンピュータに接続されると、シリアルデバイスとして認識されます。
- このシリアル接続を通じて、プログラムの書き込み、デバッグ情報の確認、シリアルモニタリングなどが可能になります。
シリアルデバイスは、特に組込みシステム開発やハードウェアデバッグにおいて非常に重要な役割を果たします。ESP32-S3のような開発ボードでは、このシリアル接続が主要な通信手段となり、開発プロセスの中心的な部分を担います。

USB とシリアル通信
by Claude 3.5 Sonnet
USB とシリアル通信は別のものです。それぞれについて説明します:
- USB (Universal Serial Bus):
- 現代的な高速データ転送規格
- 複雑なプロトコルを持つ
- 様々なデバイスタイプ(ストレージ、カメラ、オーディオなど)をサポート
- バージョンと世代:
- USB 2.0, 3.0, 3.1 Gen 1, 3.1 Gen 2, 3.2, 4 など
- 高速データ転送が可能(例:USB 3.1 Gen 2 は 10 Gbps)
- プラグアンドプレイ対応
- 電力供給も可能
- シリアル通信:
- より基本的で単純なデータ転送方式
- データを1ビットずつ順次送受信
- 主に低速〜中速の通信に使用
- 代表的な規格:
- UART, RS-232, RS-485 など
- 比較的低速(典型的には 9600 bps 〜 115200 bps)
- シンプルな配線と実装
- 主に組込みシステムやレガシーデバイスで使用
関係性:
- 現代のコンピュータでは、多くの場合 USB ポートを介してシリアルデバイスと接続します。
- USB-to-Serial 変換チップ(例:FTDI, CP210x)を使用して、従来のシリアル通信を USB 経由で行うことが一般的です。
- この場合、コンピュータ側から見ると USB デバイスですが、実際のデータ通信はシリアル方式で行われます。
ESP32-S3 の場合:
- USB インターフェースを持っていますが、内部的にはシリアル通信(UART)を使用してプログラミングやデバッグを行います。
- コンピュータとの接続は USB を介して行われますが、データの送受信は実質的にシリアル通信プロトコルに基づいています。
つまり、USB は物理的な接続方式とデータ転送プロトコルを提供し、その上でシリアル通信を含む様々な通信方式をエミュレートすることができます。ESP32-S3 の開発では、USB 接続を通じてシリアル通信を行うという形になります。

USB とシリアル通信はレイヤー同じと考えて良い?
by Claude 3.5 Sonnet
USB とシリアル通信は同じレイヤーとは考えられません。これらは異なるレベルの通信プロトコルであり、OSI(Open Systems Interconnection)モデルで考えると異なるレイヤーに位置づけられます。
-
シリアル通信(例:UART):
- 主に物理層とデータリンク層に関連
- 非常に基本的なプロトコル
- ビットの送受信方法と基本的なフレーミングを定義
-
USB (Universal Serial Bus):
- 物理層からアプリケーション層まで幅広くカバー
- より複雑で高度なプロトコルスタック
- 物理的な接続、電力管理、デバイス列挙、データ転送など多くの機能を含む
レイヤーの観点から見ると:
-
物理層:
- シリアル通信: 単純な電気信号(例:TTLレベル)
- USB: 差動信号、複雑な電気仕様
-
データリンク層:
- シリアル通信: 基本的なフレーミング(スタート/ストップビット)
- USB: パケット構造、エラー検出
-
ネットワーク層以上:
- シリアル通信: 通常このレベルの機能は持たない
- USB: デバイス列挙、エンドポイント管理、高レベルのプロトコル(例:Mass Storage, HID)
実際の使用では:
-
USB over シリアル:
- USB接続を使用してシリアル通信をエミュレート
- 物理的にはUSB接続だが、論理的にはシリアル通信
-
組み込みシステムでの使用:
- ESP32-S3などのデバイスは、USB接続を介してシリアル通信(UART)を行う
- USBはここで「トランスポート」層として機能
-
抽象化:
- オペレーティングシステムは、USBシリアルデバイスを従来のシリアルポートとして抽象化
- アプリケーションからは通常のシリアルデバイスとして見える
結論:
USB とシリアル通信は同じレイヤーではありません。USBはより包括的で高度なプロトコルであり、その上でシリアル通信をエミュレートすることができます。実際の開発では、これらの違いは多くの場合抽象化されており、開発者はシンプルなシリアル通信インターフェースを使用できますが、背後では複雑なUSBプロトコルが動作しています。

FTDI
FTDI 社は UART/FIFO のレガシー・ポートを USB 変換するワンチップ IC のファブレスメーカーです。
主に USB ブリッジを主力製品としています。例えば、USB シリアル変換デバイス群、USB ホストデバイス群(USB2.0)、USB シリアル変換モジュール群、評価基板等があります。
産業機器等、シリアル(RS232, 422, 485)を大きな変更なく USB に変換したい場合に最適です。

再度 cargo run。waiting for download のあとにボタン長押ししてたら書き込みできた。
cargo run
Finished `dev` profile [optimized + debuginfo] target(s) in 0.09s
Running `espflash flash --monitor target/xtensa-esp32s3-espidf/debug/dennou-no-machi-agent-camera-module-firmware`
[2024-10-13T02:20:57Z INFO ] Detected 2 serial ports
[2024-10-13T02:20:57Z INFO ] Ports which match a known common dev board are highlighted
[2024-10-13T02:20:57Z INFO ] Please select a port
✔ Remember this serial port for future use? · yes
[2024-10-13T02:21:03Z INFO ] Serial port: '/dev/cu.usbmodem1101'
[2024-10-13T02:21:03Z INFO ] Connecting...
[2024-10-13T02:21:03Z INFO ] Using flash stub
Chip type: esp32s3 (revision v0.2)
Crystal frequency: 40 MHz
Flash size: 8MB
Features: WiFi, BLE
MAC address: f0:9e:9e:32:4a:30
App/part. size: 510,576/1,048,576 bytes, 48.69%
[00:00:00] [========================================] 14/14 0x0
[00:00:00] [========================================] 1/1 0x8000
[00:00:02] [========================================] 263/263 0x10000 [2024-10-13T02:21:08Z INFO ] Flashing has completed!
Commands:
CTRL+R Reset chip
CTRL+C Exit
ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0x15 (USB_UART_CHIP_RESET),boot:0x10 (DOWNLOAD(USB/UART0))
Saved PC:0x40378bce
0x40378bce - rtc_sleep_pu
at /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/components/esp_hw_support/port/esp32s3/rtc_sleep.c:38
waiting for download

ようやく書き込んだファームウェアが動いた!!
$ cargo run
Compiling bindgen v0.69.5
Compiling embuild v0.32.0
Compiling esp-idf-sys v0.35.0
Compiling esp-idf-hal v0.44.1
Compiling esp-idf-svc v0.49.1
Compiling dennou-no-machi-agent-camera-module-firmware v0.1.0 (/Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware)
Finished `dev` profile [optimized + debuginfo] target(s) in 23.11s
Running `espflash flash --monitor target/xtensa-esp32s3-espidf/debug/dennou-no-machi-agent-camera-module-firmware`
[2024-10-13T02:37:27Z INFO ] Detected 2 serial ports
[2024-10-13T02:37:27Z INFO ] Ports which match a known common dev board are highlighted
[2024-10-13T02:37:27Z INFO ] Please select a port
[2024-10-13T02:37:29Z INFO ] Serial port: '/dev/cu.usbmodem1101'
[2024-10-13T02:37:29Z INFO ] Connecting...
[2024-10-13T02:37:29Z INFO ] Using flash stub
Chip type: esp32s3 (revision v0.2)
Crystal frequency: 40 MHz
Flash size: 8MB
Features: WiFi, BLE
MAC address: f0:9e:9e:32:4a:30
App/part. size: 510,752/1,048,576 bytes, 48.71%
[2024-10-13T02:37:29Z INFO ] Segment at address '0x0' has not changed, skipping write
[2024-10-13T02:37:29Z INFO ] Segment at address '0x8000' has not changed, skipping write
[00:00:02] [========================================] 263/263 0x10000 [2024-10-13T02:37:34Z INFO ] Flashing has completed!
Commands:
CTRL+R Reset chip
CTRL+C Exit
ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0x15 (USB_UART_CHIP_RESET),boot:0x18 (SPI_FAST_FLASH_BOOT)
Saved PC:0x40379f6d
0x40379f6d - prvAddCurrentTaskToDelayedList
at /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/components/freertos/FreeRTOS-Kernel/tasks.c:6510
SPIWP:0xee
mode:DIO, clock div:2
load:0x3fce3818,len:0x16f8
load:0x403c9700,len:0x4
load:0x403c9704,len:0xc00
load:0x403cc700,len:0x2eb0
entry 0x403c9908
I (27) boot: ESP-IDF v5.1-beta1-378-gea5e0ff298-dirt 2nd stage bootloader
I (28) boot: compile time Jun 7 2023 08:07:32
I (29) boot: Multicore bootloader
I (33) boot: chip revision: v0.2
I (36) boot.esp32s3: Boot SPI Speed : 40MHz
I (41) boot.esp32s3: SPI Mode : DIO
I (46) boot.esp32s3: SPI Flash Size : 4MB
I (51) boot: Enabling RNG early entropy source...
I (56) boot: Partition Table:
I (60) boot: ## Label Usage Type ST Offset Length
I (67) boot: 0 nvs WiFi data 01 02 00009000 00006000
I (74) boot: 1 phy_init RF data 01 01 0000f000 00001000
I (82) boot: 2 factory factory app 00 00 00010000 00100000
I (89) boot: End of partition table
I (94) esp_image: segment 0: paddr=00010020 vaddr=3c050020 size=1f32ch (127788) map
I (134) esp_image: segment 1: paddr=0002f354 vaddr=3fc90500 size=00cc4h ( 3268) load
I (135) esp_image: segment 2: paddr=00030020 vaddr=42000020 size=4ec60h (322656) map
I (220) esp_image: segment 3: paddr=0007ec88 vaddr=3fc911c4 size=019d4h ( 6612) load
I (222) esp_image: segment 4: paddr=00080664 vaddr=40374000 size=0c490h ( 50320) load
I (245) boot: Loaded app from partition at offset 0x10000
I (246) boot: Disabling RNG early entropy source...
I (257) cpu_start: Multicore app
I (257) cpu_start: Pro cpu up.
I (257) cpu_start: Starting app cpu, entry point is 0x40375a20
0x40375a20 - call_start_cpu1
at /Users/nukopy/Projects/Rust/dennou-no-machi-agent-camera-module-firmware/.embuild/espressif/esp-idf/v5.1.4/components/esp_system/port/cpu_start.c:159
I (0) cpu_start: App cpu up.
I (275) cpu_start: Pro cpu start user code
I (276) cpu_start: cpu freq: 160000000 Hz
I (276) cpu_start: Application information:
I (279) cpu_start: Project name: libespidf
I (284) cpu_start: App version: 9cb9c7d-dirty
I (289) cpu_start: Compile time: Oct 13 2024 11:27:08
I (295) cpu_start: ELF file SHA256: 0000000000000000...
I (301) cpu_start: ESP-IDF: v5.1.4
I (306) cpu_start: Min chip rev: v0.0
I (311) cpu_start: Max chip rev: v0.99
I (316) cpu_start: Chip rev: v0.2
I (320) heap_init: Initializing. RAM available for dynamic allocation:
I (328) heap_init: At 3FC934A8 len 00056268 (344 KiB): DRAM
I (334) heap_init: At 3FCE9710 len 00005724 (21 KiB): STACK/DRAM
I (340) heap_init: At 3FCF0000 len 00008000 (32 KiB): DRAM
I (347) heap_init: At 600FE010 len 00001FD8 (7 KiB): RTCRAM
I (354) spi_flash: detected chip: gd
I (357) spi_flash: flash io: dio
W (361) spi_flash: Detected size(8192k) larger than the size in the binary image header(4096k). Using the size in the binary image header.
W (375) pcnt(legacy): legacy driver is deprecated, please migrate to `driver/pulse_cnt.h`
W (383) timer_group: legacy driver is deprecated, please migrate to `driver/gptimer.h`
I (392) sleep: Configure to isolate all GPIO pins in sleep state
I (399) sleep: Enable automatic switching of GPIO sleep configuration
I (406) app_start: Starting scheduler on CPU0
I (411) app_start: Starting scheduler on CPU1
I (411) main_task: Started on CPU0
I (421) main_task: Calling app_main()
I (431) dennou_no_machi_agent_camera_module_firmware: Hello, world! 0
I (1431) dennou_no_machi_agent_camera_module_firmware: Hello, world! 1
I (2431) dennou_no_machi_agent_camera_module_firmware: Hello, world! 2
I (3431) dennou_no_machi_agent_camera_module_firmware: Hello, world! 3
I (4431) dennou_no_machi_agent_camera_module_firmware: Hello, world! 4
I (5431) dennou_no_machi_agent_camera_module_firmware: Hello, world! 5

esp-idf-sys、esp-idf-hal、esp-idf-svc の違い
by Claude 3.5 Sonnet
これら3つのクレートは、ESP-IDF(Espressif IoT Development Framework)をRustで使用するための異なるレイヤーや機能を提供します。それぞれの役割と棲み分けを説明します:
-
esp-idf-sys
(バージョン 0.35.0):- 役割: ESP-IDFのC言語APIへの低レベルバインディングを提供します。
- 特徴:
- ESP-IDFのネイティブ関数やデータ構造へのRawバインディングを含みます。
-
unsafe
な関数呼び出しが多く含まれます。 - ESP-IDFのバージョンに密接に関連しています。
- 使用例: 他の高レベルクレートの基礎として使用されます。直接使用することは少ないです。
-
esp-idf-hal
(バージョン 0.44.0):- 役割: ハードウェア抽象レイヤー(HAL)を提供します。
- 特徴:
- ESP32デバイスの特定のハードウェア機能へのRust友好的なインターフェースを提供します。
- GPIO、I2C、SPI、ADCなどのペリフェラルへのアクセスを抽象化します。
-
esp-idf-sys
の上に構築されていますが、より安全で使いやすいAPIを提供します。
- 使用例: ハードウェア制御、センサーの読み取り、外部デバイスとの通信など。
-
esp-idf-svc
(バージョン 0.49):- 役割: 高レベルのサービスとユーティリティを提供します。
- 特徴:
- Wi-Fi、Bluetooth、HTTPクライアント/サーバー、NVS(不揮発性ストレージ)などのサービスを抽象化します。
-
esp-idf-hal
の上に構築され、より複雑な機能を簡単に使用できるようにします。 - アプリケーションレベルの機能を実装するのに役立ちます。
- 使用例: ネットワーク接続、Bluetoothデバイスとの通信、データの永続化など。
これらのクレートの関係:
-
階層構造:
-
esp-idf-sys
が最も低レベル -
esp-idf-hal
がその上に構築され、ハードウェア制御を抽象化 -
esp-idf-svc
が最も高レベルで、アプリケーション機能を提供
-
-
安全性と使いやすさ:
- 低レベルから高レベルに行くほど、APIがより安全で使いやすくなります。
-
esp-idf-sys
は多くのunsafe
コードを含みますが、esp-idf-svc
はほとんど安全なAPIを提供します。
-
抽象化レベル:
-
esp-idf-sys
はC APIに非常に近い -
esp-idf-hal
はハードウェア固有の抽象化を提供 -
esp-idf-svc
はアプリケーションレベルの抽象化を提供
-
典型的な使用パターンでは、アプリケーションコードは主に esp-idf-hal
と esp-idf-svc
を使用し、esp-idf-sys
は直接使用することは少ないです。これにより、ESP32デバイスの機能を安全かつ効率的に利用できるRustコードを書くことができます。

これやる