ブログ
ESP32のコンパイル:エラー・フラグ・速度
コンパイルエラー、ツールチェーンの欠落、Windowsのアクセス権トラブル——ESP32のビルド失敗には、いつも決まったパターンがあります。原因さえわかってしまえば対処は一瞬です。実際に多くの人が立ち往生するコンパイルの疑問に、ひとつずつ短く答えます。
ESP32開発ボードでコンパイルできない?
原因の大半は「ボードパッケージ」にあります。Tools → Board を開いてもESP32がまったく表示されない、あるいはビルドを始めた瞬間に ‘exec: gcc: No such file’ というエラーで止まる——こんな症状が出たら、arduino-esp32コアがそもそもインストールされていないか、インストールの途中で壊れている可能性が高いです。対処はシンプルで、ボードマネージャからESP32パッケージを選び直して入れ直し、IDEを完全に再起動してから、もう一度コンパイルしてみてください。「コンパイルできない」という相談の大半は、この壊れたボードパッケージが原因だと断言していいレベルです。正しいインストールの手順順序はArduino IDE FAQに最初から載っているので、手順どおりにやり直すのが最短ルートです。
ESP32にCコードをコンパイルして書き込むには?
ESP-IDFかPlatformIOを使いましょう。どちらも素のCをそのままコンパイルできます。ESP-IDFの場合、まず idf.py build でビルドし、続けて idf.py -p COM5 flash で書き込むのが基本の流れです。PlatformIOなら、platformio.ini に framework = espidf と書いておけば、pio run -t upload の1コマンドでビルドと書き込みの両方が完了します。main.c はどちらの構成でも main/ フォルダに置くのが決まりです。環境のセットアップは最初の1回だけなので、一度通り抜ければあとはサクサク進められます。
ESP32をゼロから自作できますか?
チップそのものは無理です。ESP32は工場で製造されるSoCで、RFフロントエンドに加えて40 MHz水晶発振子が必要——手作業で組み立てられる代物ではありません。ですが「ゼロから作る」対象を基板に変えれば、話は別です。ESP32-WROOMモジュールを、アンテナ領域をしっかり空けたキャリアPCBの上にハンダ付けし、USBシリアルチップと3.3Vレギュレータを追加すれば、ちゃんと動く開発キットが完成します。モジュール単体は手頃な値段で入手できるので、はじめてのオリジナル基板づくりとしてちょうど良い難易度です。
ESP32で「アクセスが拒否されました」と出てコンパイルできない?
ビルド中に ‘Access is denied’ が出るのはWindows特有のエラーで、コンパイラがプロジェクトフォルダに書き込めないことを意味しています。引き金になるのはいつも同じ3つ。アンチウイルスがビルドディレクトリをロックしている、OneDriveがフォルダを同期しようとしている、Program Files 配下にプロジェクトを置いている——このどれかです。対処は、プロジェクトを C:dev のようなスペースなしのシンプルなパスに移し、AVスキャンの除外リストにフォルダを加えてから再ビルドするだけです。ちなみに私の環境では犯人はOneDriveでした。フォルダをオフラインに切り替えたら、1分で直りました。原因の見当もつかないときは、まずここから疑ってみてください。
ESP32は何回コンパイルできますか?
コンパイルはディスクへの書き込みでしかないので、何千回ビルドしてもチップには一切ダメージがありません。耐久限界があるのはフラッシュの消去回数で、セクタあたりおよそ10,000回。しかも回数が減るのは「書き込み(フラッシュ)」を行ったときだけで、コンパイルだけでは減りません。1日1回のペースで書き込んでも27年は持ちます。逆に言えば、書き込みを伴わないコンパイルは文字通り永遠に無料です。「何回までなら大丈夫?」と心配する必要はまったくありません。どんどんビルドしてください。
最初のビルドがやたら遅いのはなぜ?
初回ビルドはSDK全体をコンパイルするので、5〜10分かかるのが普通です。2回目以降は変更分だけを処理する差分ビルドなので、体感できるほど速くなります。注意点は2つ。ターゲットは idf.py set-target で一度決めたら、頻繁に変えないこと。それと、クセで clean を連打しないことです。この2つを守るだけで、待ち時間の無駄はかなり減ります。LinuxやmacOSを使っているなら、ccache を有効にするのも効果抜群です。
BLEライブラリがコンパイルできない?
BLE系スケッチの失敗は、たいてい「ライブラリが古いコア向けに作られている」が原因です。arduino-esp32の2.xと3.xではBLE APIが大きく変わったため、どちらかのバージョンに固定されたライブラリは、もう片方では見事に壊れます。対処は2択です。ライブラリのREADMEに書かれているバージョンにコアを固定するか、ライブラリ側を最新版に更新するか。「can’t compile esp32 dev board ble library」で検索するのがこの問題の最短ルートで、ヒットするスレッドの大半がバージョン不一致の話です。検索ワードに惑わされず、まずバージョンを疑いましょう。
コンパイラのフラグは何を意味するの?
-Os はサイズ最適化のフラグで、ESP32ではデフォルトで有効になっています。-DARDUINO_ARCH_ESP32 はコア側が自動的に定義するもので、自分で指定する必要はありません。Arduino IDEで作業している限り、フラグに触れる機会はほぼゼロです。PlatformIOなら board_build_flags に自分のフラグを追加でき、ESP-IDFではコンパイルオプションをコマンドラインではなくmenuconfigで管理します。フラグの書き方と実例はPlatformIO FAQにまとめました。
ESP ATファームウェアはESP32-S3用にコンパイルできますか?
できます。ESP-ATはv3.0以降、ESP32-S3を公式にサポートしています。ビルド方法は esp-at リポジトリを取得して、通常のESP-IDFプロジェクトとして扱うだけです。条件は、フラッシュ4 MB以上のモジュールを用意すること。さらにS3の特長として、ネイティブUSBを使えば AT+USBSERIAL という経路も選べます。ATコマンドをシリアル以外の経路で使いたい場合に役立つポイントです。
ESP32でAndroidは動かせますか?
残念ながら動きません。ESP32はマイコンであって、アプリケーションプロセッサではないからです。Androidの起動にはMMUと、はるかに大きなRAMが必要になります。ただ、実は「how to build android for esp32」で検索している人の多くが本当に欲しいのは、基板と通信するAndroidアプリです。MQTTやBLEでESP32に接続する連携アプリなら、ESP32側でサーバースケッチを動かせば簡単に作れます。この組み合わせはまったく現実的で、基板側の準備は書き込みFAQに手順どおり載っています。
この記事のテーマのプロジェクトは、sensbench の無料シミュレーターでそのまま実行できます。回路は配線済み、ファームウェア同梱、アカウントもインストールも不要です。