MicroPython的午睡(39) “generic” ポートで見るATOM Lite

Joseph Halfmoon

別件やっていたのでM5 ATOM LiteのMicroPythonはインストールからかなり間が空いてしまいました。気を取り直して(?)ATOM Liteに戻りたいと思います。M5シリーズ用のMicroPythonは、機種固有実装もいろいろある中で、今回使用しているのは ESP32用のgeneric版です。これで動かしておけばM5シリーズ以外にも多種あるESP32のボードに適用可能な筈。

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

M5Stack社のM5シリーズは人気のマイコンなので、MicroPythonといっても複数の実装が見つかります。機種により、表示画面など固有のハードウエアがいろいろ異なるので、それぞれの機種に特化した実装のMicroPythonを使用するというのも一案です。しかし、機種固有の実装に依存してしまうと、当然ながら別なマイコンへの移植などは難しくなります。ま、Pythonだからなんとかなるワイ、とも思いますが。

今回 M5 ATOM LiteにMicroPythonを書き込むにあたっては、ESP32への generic port 版のMicroPythonを選択してみました。理由は以下です。

    1. MicroPython公式で、常に最新版を入手できる。他のマイコン(例えばラズパイPico)の版とも互換性がとりやすいのでは。
    2. M5 ATOM Liteは「あまり特殊化していない」ので、ESP32用MicroPythonのビーグルとして適するのであるまいか。
    3. ESP32用に続々出てきている新商品にも対応可能な筈。

機種固有実装は、MicroPythonの本流最新版からするとどうしても古い版を元に特殊化しているので、他機種への互換性という点からすると一歩譲る気がします。今回意識しているのはラズパイPico版のMicroPythonとの相互運用性です。ラズパイPicoのMicroPythonは、比較的プレーンな雰囲気の本流最新版の派生に見えます。ESP32 generic版との互換性も高そうに見えます(といってこれからいろいろ調べるつもりですが。)

そして、M5Stack, M5Stick, M5ATOMなどのM5シリーズの機種は大変多く、そのほとんどがESP32を搭載しています。これらの機種間でも genericポートであれば、そのまま動かせる(ただし機種固有のハードは個別対処)可能性が高いです。その中で、最近、とても体積の小さいM5STAMPなどというシリーズも登場し(また購入しておりませぬ)、組み込みに使いやすいんでないかい、などと思っているのです。genericポートなら展開楽でないか、と勝手に期待。

さてESP32用の genericポート版、どんなものかということは以下の文書から知れます。

General information about the ESP32 port

一か所引用させていただきます。

There is a multitude of modules and boards from different sources which carry the ESP32 chip. MicroPython tries to provide a generic port which would run on as many boards/modules as possible, but there may be limitations.

M5 ATOM Lite上の ESP32 generic port版MicroPythonから見える環境

インストール後、実質動かすのは初回なので、今回はざっと動作環境を確認してみました。まずは、machineモジュール使ってESP32の動作周波数の確認から。

import machine
import esp
import uos
import usys

def coreInfo():
    print("CLOCK SPEED: {0} [MHz]".format(machine.freq()/1e6))

上記のコードから、以下のように160MHz動作と知れます。ESP32の160MHz結構処理能力高い気がいたします(ちゃんとベンチマークしたことないけど。)

CLOCK SPEED: 160.0 [MHz]

次に、MicroPythonでは気になる、オンチップのストレージを確認してみます。上のimport 文がある前提で、以下の関数により。

def storageInfo():
    print("FLASH SIZE : {0} [Mbytes]".format(esp.flash_size()/1e6))
    rootFS = uos.statvfs("/")
    print("FILE SYSTEM:")
    print("  BLOCK SIZE: {0} [bytes], Total {1} [Kbytes]".format(rootFS[0], rootFS[0]*rootFS[2]/1e3))
    print("  BLOCKS: Free {0} (Total {1}) [blocks]".format(rootFS[3], rootFS[2]))

フラッシュメモリの総容量約4Mバイトのうち、約2MバイトがMicroPythonのローカルなファイルシステムに割り当てられていることが分かりました。BBC micro:bit v1.5でのMicroPythonファイルシステム割り当て30Kバイトとは比べものにならない大容量。ラズパイPicoと比べても余裕シャキシャキかと。

FLASH SIZE : 4.194304 [Mbytes]
FILE SYSTEM:
  BLOCK SIZE: 4096 [bytes], Total 2097.152 [Kbytes]
  BLOCKS: Free 509 (Total 512) [blocks]

データやライブラリを置いておくスペースは十分じゃないかと思われます。また、ESP32は、Flash以外にもノンボラのメモリを別に使えたと思うので、データの置き場所にはチョイスがあります(調子に乗って使うと他機種との互換性を損ないますが。)

続いて、処理系そのものの情報を引き出してみます。

def systemInfo():
    uosInfo = uos.uname()
    print(usys.implementation.name, uosInfo[3], "Based on Python", usys.version)
    print("PLATFORM: ", usys.platform)
    print("PATH:")
    for item in usys.path:
        if item == "":
            print("/")
        else:
            print(item)
        try:
            print(" ", uos.listdir(item))
        except:
            print("  not available.")

上記関数の実行結果がこちら。

micropython v1.16 on 2021-06-23 Based on Python 3.4.0
PLATFORM: esp32
PATH:
/
  ['boot.py']
/lib
  not available.

IDEにThonnyを使っています。以前にも書きましたがThonnyからであればインタプリタの一発更新可能です。また、ラズパイPicoとATOM LiteのMicroPython環境の切り替えも一撃(簡単すぎて今どちらのマイコン上で書いているのか混乱する。。。)

MicroPython的午睡(38) ラズパイPicoとDMA3重塔でZ80つづき へ戻る

MicroPython的午睡(40) まずはネット接続してntp、M5ATOM Lite へ進む