M5StickCでMicroPythonを使う(公式ファームウェア編)

先月、久しぶりにM5StickCを動かしました。しかし考えてみると、これまでM5StickCでは開発環境としてはArduinoだけを使用しており、MicroPythonを動かしたことが無かったので、試してみました。

M5StickC用のMicroPythonは、公式にはUIFlow用ファームウェアとして配布されています。M5BurnerでM5StickCに書き込むことができます。マニュアルやツール類は以下からダウンロードできます。

Download
TUTORIAL M5StickC-Guide Download English 中文 日本語 introduce UIFlow Tutorial for M5StickC. Contains 8 course cases M5GO-Guide Download English 中文 日本語 introduce UIF...

UIFlowのファームウェアを書き込むとMicroPythonが使えます。本来はBlockyベースの開発環境UI.Flowでプログラミングする想定なのでしょうが、個人的にあまり興味が無いので、MicroPythonのREPLに接続していきます。
ConfigurationでApp ModeにするとUSB経由でMicroPythonのREPLを使用することができました。速度は115.2Kbps、その他の設定は8bit paritiy-none 1-stopbitです。

内蔵モジュールを見てみます。ものすごく拡張されています。

>>> help('modules')
MediaTrans/TimerCam                 hats/_finger      menu/setup        units/_dual_button
MediaTrans/__init__                 hats/_joyC        menu/startup      units/_earth
MicroWebSrv/__init__                hats/_joystick    menu/wifi         units/_env
MicroWebSrv/microWebSocket          hats/_ncir        micropython       units/_env2
MicroWebSrv/microWebSrv             hats/_pir         neopixel          units/_ext_io
MicroWebSrv/microWebTemplate        hats/_powerc      network           units/_finger
__main__          hats/_puppy       ntptime           units/_gps
_boot             hats/_roverc      ntptime           units/_heart
_flow             hats/_servo       sys               units/_imu6886
_onewire          hats/_servos      uarray            units/_ir
_thread           hats/_speaker     ubinascii         units/_joystick
_uasyncio         hats/_tof         ucollections      units/_light
_webrepl          hats/_yun         ucryptolib        units/_makey
apa106            i2c_bus           uctypes           units/_mlx90640
btree             inisetup          uerrno            units/_ncir
builtins          libs/__init__     uhashlib          units/_pahub
cmath             libs/bmm150       uhashlib          units/_pbhub
deviceCfg         libs/bmp280       uheapq            units/_pir
display           libs/config       uiflow            units/_relay
esp               libs/dht12        uio               units/_rfid
esp32             libs/easyIO       ujson             units/_rgb
espnow            libs/echo         umqtt/__init__    units/_rgb_multi
flashbdev         libs/emoji        umqtt/robust      units/_servo
flow/__init__     libs/imu          umqtt/simple      units/_tof
flow/adaptation   libs/m5mqtt       unit              units/_tracker
flow/flowDeinit   libs/mstate       units/VFunction/__init__            units/_v_function
flow/m5cloud      libs/numbers      units/VFunction/_apriltag_code      units/_weight
flow/m5ucloud     libs/nvs          units/VFunction/_bar_code           uos
flow/protocol     libs/power        units/VFunction/_color_track        urandom
framebuf          libs/servo        units/VFunction/_dm_code            ure
gc                libs/sh200q       units/VFunction/_face_detect        uselect
hardware/__init__ libs/sht30        units/VFunction/_jpeg_transfer      usocket
hardware/_led     libs/speak        units/VFunction/_line_tracker       ussl
hardware/axp192   libs/timeSchedule units/VFunction/_motion             ustruct
hardware/bm8563   libs/time_ex      units/VFunction/_qr_code            utils
hardware/button   libs/urequests    units/VFunction/_tag_reader         utime
hardware/mpu6050  libs/vl53l0x      units/VFunction/_target_track       utimeq
hardware/sh200q   m5stack           units/_accel      uwebsocket
hat               m5uart            units/_acsocket   uzlib
hats/_adc         m5ui              units/_adc        wav/chunk
hats/_beetlec     machine           units/_angle      wav/wav_player
hats/_bugc        math              units/_bps        wav/wave
hats/_cardKB      max30100          units/_button     wifiCfg
hats/_dac         menu/__init__     units/_cardKB     wifiWebCfg
hats/_env         menu/app          units/_color
hats/_env2        menu/cloud        units/_dac
Plus any modules on the filesystem
>>>

このファームウェアのソースコードは、M5StickC専用のものは見つけられませんでしたが、以下のM5Stack用のものとほぼ共通なのではないかと思います。ドキュメントはこのリポジトリのWikiにあります。しかしそれほど詳細な記載は無く、必要に応じてソースコードを参照するほうが良さそうです。

m5stack/UIFlow-Code
UIFlow micropython code. Contribute to m5stack/UIFlow-Code development by creating an account on GitHub.

また、M5StickC用の差分のみ集めたものが以下のリポジトリのようです。

m5stack/M5StickC-IDF
EDP32 IDF Library for M5stickc. Contribute to m5stack/M5StickC-IDF development by creating an account on GitHub.

もちろん、素のままのESP32用MicroPythonをインストールすることもできますが、その場合はM5StickCのハードウェアのためのライブラリを別途導入する必要があります。

boot.pyとmain.pyは以下のようになっていました。

boot.py:

from m5stack import *

main.py:

from m5stack import *

lcd.clear(lcd.BLACK)
lcd.text(lcd.CENTER, lcd.CENTER, 'user app')

m5stackモジュールのM5StickC版は見つかりませんでしたが、M5Stack版はこちらにあります。

dir(m5stack)

で確認すると、M5StickCでは、グローバル変数としてlcd, btnA, btnB, node_id, rtcが定義されていました。例えば

>>> lcd.text(lcd.CENTER, 72, 'Hello')

としてLCDに文字を表示することができます。

ライブラリを使用する場合はこんな感じで使えました。

>>> import i2c_bus
>>> from hardware.mpu6050 import MPU6050
>>> 
>>> imu = MPU6050(i2c_bus.get(i2c_bus.M_BUS))
>>> imu.acceleration
(-0.016, 0.09799999, 1.063)
>>> imu.gyro
(-10.076, -10.015, -8.305)
>>> 

コメント