MicroPython的午睡(59) ESP32、WebREPL、動作はするけれども

Joseph Halfmoon

再びM5ATOM Lite上のESP32 genericポートのMicroPythonに戻ってまいりました。今回はESP32系ならでは?のWebREPLを使用してみたいと思います。Network接続されているMicroPythonデバイスのREPLにホストのブラウザから接続する機能であります。確かに使えるのだけれどクセが強い。

※「MicroPython的午睡」投稿順 Indexはこちら

まずは ESP32用のMicroPythonのクイックリファレンスから該当部分へのリンクを貼り付けさせていただきます。

WebREPL (Web ベースの対話プロンプト)

当方での勝手なお試しのまとめ

まずは、WebREPL機能(MicroPythonはv1.16)を当方にて「お試し」してみた勝手な感想を以下に述べさせていただきます。なお使用したブラウザはChromeです。

    • 簡単な操作で ESP32用のMicroPythonが内蔵するWebREPLをアクティベート(イネーブル)できる(追加でMicroPython側にインストールするもの無し。)
    • ブラウザは、ローカル環境にWebREPLのクライアントを上記のページからたどってダウンロードしておくか、Web上に公開されているクライアントを利用する
    • Network経由でMicroPythonのREPLに接続し、MicroPythonのコードを送信し、実行結果を得ることが可能
    • Network経由で、MicroPythonデバイスへのファイルのアップロード、ダウンロードも可能

しかし、

    • シリアル接続のREPLのような操作性には若干欠ける(詳しくは後述)
WebREPLのデーモンの許可

WebREPLのデーモンはESP32用genericポートのMicroPythonには漏れなく含まれているようですが、通常はDisable状態のようです。上記のリファレンスページにあるとおり、Enableしないと使用はできません。

以下のように webrepl_setup を import して、Enableを選択します。

WebREPL_Setup

上記のプロンプトで、E を選択するとその後、パスワードを入力するように促されるので設定します。

なお、ESP32用のgenericポートのデフォルトの boot.py は、 WebREPLデーモンを起動するコードとなっていたので、Enable化してRESETをかければWebREPLデーモンが起動します(通常のシリアルREPL側で CTRL+D するとソフトRESETをかけることが可能です。)

WebREPLとの接続

当方では、M5ATOM Liteは、WiFiルーターのAPに接続してローカルなネットワークに参加させています。このような環境下でWebREPLと接続するには、MicroPython側は以下の状態にないとならないように見えました。

MicroPythonデバイス側は、ネットワークとのコネクションが貼られている状態でREPLに制御が戻っていること

付属文書を読む限り、表で走らせているスクリプトの裏でWebREPLに接続できそうなのです。しかし、表でネットワークを使って通信(MQTT)し、かつAsycio使って疑似的にマルチタスクしているコードだと、WebREPLはconnectできませんでした。

上記ボールドの状態で、ホストのブラウザ側で ローカルにダウンロードしていある webreplクライアントの

webrepl.html

を開けば、WebREPLクライアントが開きます。ただし、初期状態では、以下のサンプルIPアドレス?に接続するようになっているので、MicroPythonデバイスのIPアドレスに書き換えてから connect しないとなりません。

ws://192.168.4.1:8266/

アドレスを書き換えた上で、connectボタンを押すとこんな感じ。

WebREPLprompt
WebREPLデーモンのセットアップ時に指定したパスワードを Password: プロンプトに入力すれば、上記のようにコネクトされます。

また、MicroPythonデバイスのUSBポートに接続している仮想シリアル上のREPL側で観察していると、以下のようにコネクトされたこと(その後、ディスコネクトされたことなど)が報告されます。

WebREPL_REPL
WebREPLの画面にプロンプト >>> が出てきたので喜んでキー入力してみますが、当方環境では、文字がコールバックされてきません。RAWモード? しかし、文字はちゃんとMicroPython側には伝達されているみたい。RETURNキーおしても反応ないですが、

CTRL+D

を押すと、そこまで入力した文字列が「実行」されるみたいです。

CTRL_D
試みに以下のように入力し(画面には現れませんが)

print(1+2)

CTRL+Dすると、以下のように値が返ってきました。

OK3

結果の数字の前に、CR+LFを出力してやればOKの後で改行されて別行に結果が出力されるようになりました。

同じように画面には現れませんが、以下のように関数名を入力し、

help()

CTRL+Dすると、以下のようにhelp()の出力結果をWebREPL上で見ることができました。こんな感じ。

WebREPLhelp
なお、WebREPLの入力面の下に、CTRL+AしてCTRL+Vでペーストできるとわざわざ書いてあります。複数行のスクリプトなどをエディタからコピーして、WebREPLにペーストすれば実行できました。ペーストしても何も見えないけれども送信はされとります。見えるのは実行結果だけ。

ファイルの転送機能

WebREPLの入力面の右側にファイル転送のボタン類があります。

ホスト上のファイルを選択して Send to deviceを押せば、デバイスにファイル書き込みできました。

デバイス上のファイル名を入力して Get From deviceを押せば、デバイスからフィアルをゲットできました。

こんな感じ。

GetFile
ネットワーク経由で、スクリプトの書き換えとか、メンテナンスなどには使えそうな感じではあります。文字がコールバックされてこないので「REPL」として対話的に何かやるには不便だなあ。どこか設定などしたらコールバックされてくるのだろうか、それともローカルに処理しないと見えないのか。それに、MicroPythonデバイス側でネットワーク接続に失敗すると、そもそもconnectできなくなってしまう。微妙。使い道はありそうではありますが。

MicroPython的午睡(58) micro:bit v2、MicroPython書込 へ戻る

MicroPython的午睡(60) ESP32、WatchDogタイマの利用 へ進む