再起動しても内部でカチカチ言ってるだけで動かないままの時がある
一旦電源を落として再び起動すれば付くことがある
こうした悩みを解決します。
M5stack の電源が入らない問題を整理
結論から言うと、M5stack が起動に失敗するのは起動直後のブートローダーの読み込みに失敗してるからです。
(私はM5Stack Basicを使ってこの状況に陥りました)
M5.begin関数からシリアル設定を行った直後にコマンドパレット上で文字列を表示させても、カチカチ鳴って動かない時には何も表示されないことが分かりました。
つまりこのことからM5.begin関数以降で止まっているわけではなく、それ以前のブートローダーの読み込みの段階でうまく動作してないということが推測できます。
電源が入らない(厳密には電源は入っているがうまく起動できていない)場合、コマンドパレット上には以下のようなテキストが繰り返し表示され続けるはずです。
rst:0x10 (RTCWDT_RTC_RESET),boot:0x37 (SPI_FAST_FLASH_BOOT)
load:0x00000000,len:-10000
ブートローダ―が読み込まれない理由
ブートローダーが読み込まれないのは電源投入時の電圧不足が原因です。
電源投入時にGPIOの12番ピンの入力電圧がHighもしくはLowによって、ESP32のフラッシュに対して供給される電圧が変わります。
GPIO 12番ピンがHighの場合
もしHighだった場合はフラッシュへの供給電圧が1.8Vになります。
電圧が低いのでFLASH の読み込みに失敗、実際にコードが書かれているROM 領域のアドレスを無視して0番地の読み出しが行われることで起動に失敗します。
GPIO 12番ピンがLowの場合
もしLowだった場合はフラッシュへの供給電圧が3.3Vになります。
3.3Vだと正常に ROM 領域のアドレスからコードを取得することができます。
なぜHigh/Lowが電源投入時に変わるのか
M5stack の設計仕様上、 GPIOの12番ピンは浮いていて不定の状態になっています。
そのため起動した直後にハイとローのどっちに転ぶかが毎回わからない状態になってます。
GPIO 12番ピンから抵抗かましてGNDに落とせればよいのですが、M5stack Basicの場合、SMDで足が出てないのでハード的に解決するのが難しいです。
マイコン内部のプルアップ/プルダウン抵抗を選択することでソフト的に対応できそうですが、これがいかんせんよく分からん…。
そこでブートローダーを直接いじって解決させる必要が出てきます。
なぜこのような設計にしたのか…
pythonでブートローダーを直接いじる
まず、この問題の解決方法を先にまとめます。
設定変更は、フラッシュへの供給電圧をGPIOの12番ピンのレベルによって決めるのではなく常に3.3Vに固定させるものになります。
私もこの対応するまでpython触ったことありませんでした。
やりたくないのは分かりますが、調べた限りこの方法でしか解決できません。
本対応は30分程度で終えられると思います、がんばりましょう!
Pythonをインストールする
すでにインストールしている方はスキップしてください
下記URLから最新のPythonをインストールします。
Windows版Pythonのインストール
書かれている内容に従ってインストールおよびPowershellの設定を行います。
コマンドプロンプトからpythonを開く
スタート画面からコマンドプロンプトを開きます。
そこで下記コードを入力します
pip install esptool
するとesptoolがインストールされます。esptoolとは、ESP32のフラッシュの中身をごりごり書き換えることのできるpythonプログラムです。
もし下記のようにアップグレードするよう言われたら素直にやっておきましょう。
[notice] To update, run: python.exe -m pip install --upgrade pip
python.exe -m pip install –upgrade pip
を直打ちすればアップグレードされます。
ブートローダの設定変更
コマンドにてブートローダをいじっていきます。ここまでくればあと少し!
コマンドは公式を参照ください。(これは絶対読んで!)
espefuse.py
今回フラッシュへの供給電圧を設定しますが、それに対応しているのがespefuse.pyファイルになります。
このファイル内のset_flash_voltageをいじっていきます。
まず現状確認しておきましょう。下記コマンドを打ち込みます。
espefuse.py -p COM3 summary
COM3ポート(=M5stack)のespefuse.pyの一覧を見る、と書いてます。すると以下のような応答がきます。
=== Run "summary" command ===
EFUSE_NAME (Block) Description = [Meaningful Value] [Readable/Writeable] (Hex Value)
----------------------------------------------------------------------------------------
Calibration fuses:
BLK3_PART_RESERVE (BLOCK0): BLOCK3 partially served for ADC calibration data = False R/W (0b0)
ADC_VREF (BLOCK0): Voltage reference calibration = 1121 R/W (0b00011)
Config fuses:
XPD_SDIO_FORCE (BLOCK0): Ignore MTDI pin (GPIO12) for VDD_SDIO on reset = False R/W (0b0)
XPD_SDIO_REG (BLOCK0): If XPD_SDIO_FORCE, enable VDD_SDIO reg on reset = False R/W (0b0)
XPD_SDIO_TIEH (BLOCK0): If XPD_SDIO_FORCE & XPD_SDIO_REG = 1.8V R/W (0b0)
・
・
・
9,10行目の部分がフラッシュへの供給電圧部分の記載です。falseになっていることを確認します。
つづいて以下のコマンドでフラッシュへの供給電圧は3.3V固定にします。
espefuse.py -p COM3 set_flash_voltage 3.3V
すると以下のような応答があります。
This is an irreversible operation!
Type 'BURN' (all capitals) to continue.
怖いこと書いてますが、気にせずBURNを送信。書き込まれるとSuccessfulが返ってきます。
実際に設定が反映されたのか確認します。再び以下のコマンドを送ります。
espefuse.py -p COM3 summary
すると、さっきfalseだったのがtrueになっているのが分かりますね。
Config fuses:
XPD_SDIO_FORCE (BLOCK0): Ignore MTDI pin (GPIO12) for VDD_SDIO on reset = True R/W (0b1)
XPD_SDIO_REG (BLOCK0): If XPD_SDIO_FORCE, enable VDD_SDIO reg on reset = True R/W (0b1)
XPD_SDIO_TIEH (BLOCK0): If XPD_SDIO_FORCE & XPD_SDIO_REG = 3.3V R/W (0b1)
CLK8M_FREQ (BLOCK0): 8MHz clock freq override
これで完了です。何度再起動しても問題なく起動してくれるはずです。お疲れさまでした!
まとめ
M5stack の電源が入らないのは、 フラッシュへの電源供給電圧を決めるGPIOの12番ピンが不定だから。
対策として Python を用いてブートローダーのフラッシュへの供給電圧設定を変更する
コメント