環境
Hardware:M5Stack PoE Camera
IDE:Vscode PlatformIO Arduino Framework
使用ライブラリ:esp32_camera
症状
esp32_cameraライブラリで初期化時に
esp_camera_init(): Camera probe failed with error 0x20004
と出て初期化できない。deinit、initを繰り返しても無駄。
試行錯誤からわかった 初期化の可否が変わること
- camera_config_tのledc_timerの番号
- 初期化処理の後にあるコードの内容によっても変わる
- CPU周波数によっても変わる
- CPU周波数が高いと失敗しやすい
初期化処理の後のコードの内容によっても初期化の可否が変わるというのが謎。
esp_cameraライブラリのissueではパーティションスキームを変えるのも有効と言われているが変化はなかった。
https://github.com/espressif/esp32-camera/issues/102
esp_cameraライブラリのissueから引用
この問題は設定とは関係なく、むしろesp32-camモジュール自体の設計不良による非決定論的な問題です(mcuやカメラが十分な電力を得ていない)。上記の「修正」はすべて瞬間的な運に過ぎず、因果関係はありません(ただし、様々な設定の変更がモジュールの電力消費に影響するため、間接的には影響します。この問題は、2つの複合的な部分から構成されています。カメラの検出不良と、ブラウンアウトです。どちらも散発的なものです。確実な起動のための唯一の有効な回避策は、まず無線LANを無効にし(起動時に大きな電力を消費します)、少し待ってからカメラを初期化し、さらに少し待ってから無線LANを起動し、おそらく最初は電力レベルを低く設定し、初期化後にそれを大きくすることです。電源があまり低下しないことが確実な場合、またはその可能性を気にしない場合は、ブラウンアウトを無効にすることもできます(「真の」ブラウンアウトは、起動に失敗する頻度に比べて通常まれであるため)。更新:起動コードを変更し、検出失敗のたびにカメラを終了させ、成功するまでループで再度起動させるようにしました。しかし、これだけでは、gpioのisrハンドラも終了させないとうまくいきません。しかし、その場合でも、espは電源再投入まで認識に失敗し続けます。これは、単にdeinit/initを呼び出すだけでは、mcuやカメラの状態を完全にリセットするのに十分でないため、再度検出しようとすることを意味します。つまり、自分でボードを設計するか、deinit が本当に各 gpio ラインの状態を元に戻すのか、そしてどれが特に関連するのかについての洞察を誰かが提供し、これらを手動で切り替えられるようにしない限り、特効薬のような解決策はありません。そうすれば、カメラ検出を最初からやり直すことが可能になります。私自身は、これを理解するほど深く掘り下げていませんし、今は優先順位が低いのです。
確証は無いが、個体差が生じるところからアナログ的な要因が絡んでると推測する。一応オシロでOV2640の初期化時の電源ラインを見たがブラウンアウトが発生しそうなほど電圧降下は発生していなかった。