MicroPython のリモート制御: mpremote

mpremote コマンドラインツールは、シリアル接続を介して MicroPython デバイスをリモートで操作したり、自動化したりするための統合されたユーティリティセットを提供します。

mpremote を使えるようにするには pip でインストールします:

$ pip install mpremote

このツールを使う最も簡単な方法は、引数なしで起動することです:

mpremote

このコマンドは、最初に利用可能なシリアルデバイスを自動的に検出して接続し、対話モードの REPL が使える状態にします。シリアルポートはエクスクルーシブモードで開かれるので、 mpremote の 2 番目(さらに3番目など)のインスタンスを実行すると、利用可能なシリアルデバイスがあれば、後続のシリアルデバイスに接続します。

コマンド

REPL にアクセスするには、たいていは引数なしで mpremote を実行するだけで十分です。 mpremote はまた、コマンドラインに与えられる一連のコマンドをサポートしていて、これによりリモートの MicroPython デバイスに対して様々なアクションを実行します。

サポートされているコマンドの全リストは以下の通りです:

  • デバイス名ショートカットで指定したデバイスに接続:

    $ mpremote <device-shortcut>
    
  • 名前で指定したデバイスに接続:

    $ mpremote connect <device>
    

    <device> は以下のいずれかです:

    • list: 利用可能なデバイスのリス
    • auto: 利用可能な最初のデバイスに接
    • id:<serial>: USB シリアル番号 <serial> (connect list コマンドで出力される2番目の項目)を持つデバイスに接続
    • port:<path>: 指定したパスを持つデバイスに接続
    • 任意の有効なデバイス名/パスを指定して、そのデバイスに接続
  • 現在のデバイスを切断:

    $ mpremote disconnect
    

    切断後、自動ソフトリセットが有効化されます。

  • 以前の mpremote セッションを再開:

    $ mpremote resume
    

    これは自動ソフトリセットを無効化します。

  • デバイスのソフトリセットを実行:

    $ mpremote soft-reset
    

    これにより、Python のヒープがクリアされ、インタープリターが再起動します。また、自動ソフトリセットを無効にします。

  • 接続したデバイスの REPL に入る:

    $ mpremote repl [options]
    

    オプションは次のとおり:

    • --capture <file>: REPL セッションの出力を指定したファイルにキャプチャーします
    • --inject-code <string>: REPL で Ctrl-J が押されたときに注入する文字を指定します
    • --inject-file <file>: Ctrl-K が押されたときに REPL に注入するファイルを指定します
  • Python の式を評価して結果を表示:

    $ mpremote eval <string>
    
  • 指定した Python のコードを実行:

    $ mpremote exec <string>
    
  • ローカルファイルシステムにあるスクリプトを実行:

    $ mpremote run <file>
    
  • デバイスに対してファイルシステムコマンドを実行:

    $ mpremote fs <command>
    

    <command> は次のとおり:

    • cat <file..> : デバイスにあるファイルの内容を表示
    • ls : カレントディレクトリを一覧表示
    • ls <dirs...> : 指定のディレクトリを一覧表示
    • cp [-r] <src...> <dest> : ファイルをコピー。接頭辞として ":" があると、デバイス上のファイルを指定したことになる
    • rm <src...> : デバイス上のファイルを削除
    • mkdir <dirs...> : デバイスにディレクトリを作成
    • rmdir <dirs...> : デバイス上のディレクトリを削除
  • リモートデバイス上にローカルディレクトリをマウント:

    $ mpremote mount [options] <local-dir>
    

    使用中に Ctrl-D を入力すると、ソフトリブートを行い、通常は自動的にマウントを再接続します。しかし、起動時に main.py が実行されている場合、再マウントは行われません。この場合、raw モードのソフトリブートを使えます。Ctrl-A Ctrl-D でリブート、Ctrl-B で通常のリプレイに戻り、マウントの準備ができます。

    オプションは次のとおり:

    • -l, --unsafe-links: デフォルトではデバイスがマウントされているローカルディレクトリの外側(1つ以上のディレクトリレベル)にあるファイルやディレクトリにアクセスすると、エラーが発生します。このオプションは、シンボリックリンクのチェックを無効にし、デバイスがローカルディレクトリの外側のシンボリックリンクをたどることを可能にします。
  • リモートデバイスからローカルディレクトリをアンマウント:

    $ mpremote umount
    

Multiple commands can be specified and they will be run sequentially.

自動接続とソフトリセット

接続と切断は、コマンドに明示的に指定されていなければ、ツールの実行開始時と終了時に自動的に行われます。自動接続では、最初に利用可能なシリアルデバイスを検索します。アクションが指定されていない場合は REPL が起動します。

デバイスに接続すると、 mpremote は必要に応じてデバイスを自動的にソフトリセットします。これは Python のヒープをクリアしてインタプリタを再起動し、その後の Python コードが新鮮な環境で実行されるようにします。自動ソフトリセットは、以下のコマンドのいずれかが初めて実行されたときに行われます: mount``, eval, exec, run, fs 。ソフトリセットを初めて行った後、 disconnect コマンドを発行するまで、自動的にソフトリセットを行うことはありません。

自動的なソフトリセットの動作は、 resume コマンドで制御することができます。また、 soft-reset コマンドを使用すると、明示的なソフトリセットを行えます。

ショートカット

ショートカットはマクロシステムを使って定義できます。内蔵のショートカットには次のものがあります:

- ``devs``: 利用可能なデバイスを一覧表示
  • a0, a1, a2, a3: /dev/ttyACM? に接続
  • u0, u1, u2, u3: /dev/ttyUSB? に接続
  • c0, c1, c2, c3: COM? に接続
  • cat, ls, cp, rm, mkdir, rmdir, df: ファイルシステムコマンド
  • reset: デバイスをリセット
  • bootloader: デバイスのブートローダを起動

ユーザー設定は、ユーザー定義のショートカットも含めて、ファイル .config/mpremote/config.py に入れることができます。たとえば、以下のようになります:

commands = {
    "c33": "connect id:334D335C3138",
    "bl": "bootloader",
    "double x=4": "eval x*2",  # x is an argument, with default 4
    "wl_scan": ["exec", """
import network
wl = network.WLAN()
wl.active(1)
for ap in wl.scan():
    print(ap)
""",],
    "test": ["mount", ".", "exec", "import test"],
}

利用例

mpremote

mpremote a1

mpremote connect /dev/ttyUSB0 repl

mpremote ls

mpremote a1 ls

mpremote exec "import micropython; micropython.mem_info()"

mpremote eval 1/2 eval 3/4

mpremote mount .

mpremote mount . exec "import local_script"

mpremote ls

mpremote cat boot.py

mpremote cp :main.py .

mpremote cp main.py :

mpremote cp -r dir/ :