MicroPython的午睡(104) ESP32版、改めてModule群を眺めてみる

Joseph Halfmoon

このところ前日の別シリーズ「Rubyちゃん」と似たことをMicroPythonでやってみる流れです。今回はRubyちゃんでは見当たらないとブーたれていたAPIについて、使用中のESP32版のMicroPythonでどうなっているのか調べてみました。ドキュメントには書いてないことも多いので最後は「マシンに聞く」のが確実。

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

Rubyちゃん(mruby)で見当たらなかったAPI

別シリーズで見当たらないと嘆いていた?のが以下のようなAPIです。

    1. 外部入力端子からの割り込み受け
    2. タイマを使った周期実行
    3. メモリアドレスを直接指定しての読み書き

以前やっていたSTM32版のMicroPythonには上記のようなAPIが備わってました。でもESP32版の場合、いつもお世話になっております以下のクイックリファレンスには書いてないような機能もあります。

ESP32 用クイックリファレンス

まあコマケーことはドキュメントに書いてないこと多いからね。ソースを読むか?それよりは直接実機に「聞く」のが速いっす。

ESP32版MicroPythonのバージョン

以前もATOM LiteなどでESP32版のMicroPythonを使っております。ただし、今回使用のバージョンはそのときとは異なります。実装によって結構いろいろ(特にバンドルされているモジュール群が)変わる、というのがMicroPythonを使ってきての感想です。

esp32micropythonVersion
今回は、自前でプログラム書いて実験するのを一回お休みして、上記バージョンのMicroPythonにバンドルされているモジュール群を確認してみることにいたします。ターゲットは、冒頭のアイキャッチ画像で黄色のマーカを引いたモジュールです。

umachine

まず最初に調べたのは machineモジュール(リストでは umachineと頭にuがついてますが同じもの)です。結論から言えば、Rubyちゃんで見当たらないとブー垂れていたAPIは、すべてこのモジュール内に存在します。ただしまだ実動作確かめてないので動くかどうか知らんけど。

esp32machine_0Y

上記はリストの先頭の方だけです。冒頭に直接メモリアクセスの「危ない奴ら」が登場。これはどのMicroPythonでもだいたいお約束通りかと。これで1件クリアね。

続いて登場するのがTimerです。STM32版のpybクラスに存在したTimerクラスとの差異があるのか無いのかはまた別途確かめます。とりあえず2件目もクリア。esp32machine_1Y

上のリストには外部端子割り込みらしいものは見当たりませぬ。しかし上のリストで赤線引いてあるPinのところを一段下に降りれば以下のように、割り込みAPIらしき関数と定数が見つかります。esp32MachinePinY

使い方はまた後でだけれども、これで3件すべてクリアね。

espモジュールとesp32モジュール

machineモジュールはmachine毎の実装が収められている筈なのだけれど、他機種との標準化というか共通化の圧力?もあって、ホントにマシンにユニークな機能は外に追い出されてます。このESP32版の実装ではespモジュールとesp32モジュールかと。

まずはESP32モジュールから。esp32Module

上記をみると、外部からのウエイクアップを制御する機能などはここにあるみたいですな。これも一種のインタラプト?また、オンボードの温度センサとかホールセンサなどもここに関数があるみたい。調べがいのありそうなモジュールっす。

つづいて esp モジュール。ここはお名前からすると ESP32の前の 「32」じゃないESP時代からの伝統なんでしょうか。この中身にもgpio入力らしき機能がありです。espModule

 

micropythonモジュール

さて micropython モジュールには micropython実装毎のあれやこれやが入っている筈。こんな感じ。ここにキーボード割り込みみたいな関数がありますが、多分これはSTDIN(シリアル)経由でもたらされるCTRL-Cとかの制御キャラクタに対応するものでないかと想像。ホントか?esp32microPythonMicroPythonModule

 

uplatformモジュール

つづいて奥深そうなのが uplatform モジュール。MicroPythonの実装そのものに迫るモジュールでありますな。esp32micropythonPlatform

上記のようにMicroPythonのバージョンだけでなく、ビルドしたIDF環境のバージョンとか、newlib(ライブラリ)のバージョンとかも判明。

uosモジュール

uos(以下のようにosとしても呼び出し可)には御本家のフルPython同様ファイルシステムにアクセスする関数などが収められております。MicroPythonの下にはosなどなく、MicroPythonのモジュール自体がosみたいなことをしているわけですが。esp32osModule

 

upyshモジュール

上記のosモジュールを使えば、Pythonの関数としてファイルシステムにアクセスしたりできるわけですが、いわゆるシェルみたいな感じでアクセスして~という人のためのモジュールも含まれてました。upyshモジュールとな。ただし、単にimport しようとすると以下のようにメッセージ(実はupyshの中でmanと打ったときと同じ)が出力されました。esp32upysh

言われたとおりにfrom upysh import * してみるとこんな感じ。

esp32upysh1

太字で表示されている pwd とか ls とかがこちらから打ち込んだ「コマンド」です。他にもheadとかすればファイルの先頭をダンプすることもできました。なお、このモードから抜けようとして quit とか exit とか打ったのですが抜けられません。manみても書いてないし。CTRL-Dで「ソフトリブート」をかけると通常のコマンドモードに戻れました(CTRL-Cは効きませなんだ。)

usysモジュール

最後にちょっと謎なのが、usysモジュールです。ここにもシステム関係のあれやこれやが詰まっているはずが、help(usys)でまさかの例外が発生しました。こんな感じ。usysModule

途中まで普通にhelp()出力していたのに、エラーとな。help()だぜ。

Guru Meditation Error

ってどんなエラーなんじゃ。これまた不思議。

MicroPython的午睡(104) ESP32版、12bit ADC、アッテネータ設定と読み取り へ戻る

MicroPython的午睡(105) ESP32版、インターバルタイマ2本使ってみる へ進む