前回までSTM32版でMicroPythonしてきました。回重ねたので今回からESP32版に「戻りたい」と思います。以前にもESP32機でMicroPythonしてましたが「手足の少ない」M5ATOMLite機でWiFi経由の操作が主でした。今回からは端子が出ているESP32DevKitC機を使っていきたいと思います。
※「MicroPython的午睡」投稿順 Indexはこちら
Thonny IDEで簡単にMicroPythonインストールできる筈が
さて、遊休化してホコリを被っていたESP32DevKitCを取り出してきました。以前に使っていた状態のままです。ブレッドボードに刺したまま一部端子の信号を引き出してあり、またLチカなどしやすい用に外部LEDなど接続済です。特に問題になるような接続も無いように見えましたので、そのまま。
ESP32を含む特定の機種に関してはThonny IDEのインタプリタの書き込みオプションが使える筈。以下のオプションメニューからターゲット機を指定するとThonny IDEが保持するMicroPythonのバイナリをマイコン・フラッシュに書き込んでくれるサービスです。ターゲットのマイコンボードをUSB接続しておけば、どこのポートにターゲットがある(ありそうなのか)自動で調べて接続してくれる機能もありとてもお楽です(これが動けばね。)
しかしインタプリタの書き込みサービスが動きませぬ。みればポートは正しく検出し、シリアル接続してます。以前使ったままの何かソフトウエアが動作していてダラダラとシリアルポートに出力をたれ流してます。
ブートモードに入ってないのね。
以前のソフトが爆走しているのでFlashへ書き込み可能なブートモードに入ってないようです。ESP32DevKitCのブートモードはどうやったら入れるのだっけ?これは簡単っす。ボードの端の2つのボタンで入ることが可能です。
-
- 以下の写真で右側の赤色で囲ったBootボタンを押しながら
- 左側の緑色で囲ったENボタンを押して離す(そのときはBootボタンも離してよろしと)
これでブートモードに入れる筈。しかしなかなかうまく入れませぬ。多数回試行。何かのタイミングで2度ほどブートモードに入ったのですが、Thonny IDEから書き込み試みた瞬間にFlash上に書き込み済のプログラムがスタートしてしまいます。元の木阿弥。
このままではダメだあ
ということで、余計に配線が引き出してあるブレッドボードからDevKitCを引き抜きました。外部LED以外は、どこにも接続していない配線だけれどもRESET時に浮遊容量で悪さしている?それともLED接続端子のせい?知らんけど。
なんとかブートモードに入った
抜いたら、なんのことはないです。安定してブートモードに入るようになりました。ただ、過去のプログラムがFlashに書き込まれているままであるとまた悪さをするかもしれないので、いったんFlashをイレーズすることにいたしました。
これにはEspressif社のesptool.py というツールを使いました。なおesptool.pyはPythonがインストールしてあればフツーに pipでインストール可能です。今回はWindow11上でPython 3.10.11 (もちろん「フル」Pythonです)で作業してます。
ESP32のFlash消去は以下で。なおCOMポートの番号は適宜合わせてくだされや。
$ esptool.py --port COM6 erase_flash
Flashは空になった筈。
MicroPythonの以下のページから、テキトーにESP32用のMicroPythonをダウンロード(.bin形式)してきました。ESP32といっても色々あるのでよさげなものを選ばないとなりませぬ。
無難そうなバージョンの書き込みは以下で。やはりCOMポート番号は適宜指定必要っす。
$ esptool.py --chip esp32 --port COM6 --baud 460800 write_flash -z 0x1000 esp32-20220618-v1.19.1.bin
書き込んでいるところが以下に。
ようやくESP32DevKitCにMicroPythonが書き込めたようです。
Thonny IDEに再接続
Bootモード入りに悪さをしていたらしいブレッドボードにESP32DevKitCを戻しました。一端MicroPythonがインストールできたならば大丈夫だろうと。Thonny IDEに再接続してみました。こんな感じ。
ちゃんとMicroPython走っているみたい。それに前回までSTM32F401REで動かしていたMicroPythonとバージョンも同じね。
動作確認のため、吉例Lチカを。
import machine, time ledpin = machine.Pin(23, machine.Pin.OUT) while True: ledpin.on() time.sleep(1) ledpin.off() time.sleep(1)
以下のように23番ピンに過去の遺物のLEDが接続しているので、それをそのまま使いましたです。
LチカOKっと。ESP32上のMicroPython復活。