【Micopython】Micropython CLIを脱却して、mpremoteを使うようになりました
Micropython CLIからmpremote移行の背景
私はラズパイPicoやESP32のコードはもっぱらMicroPythonで書いており、開発環境にはMicroPython CLIを用いていました。
しかし、MicroPython CLIには色々と不満点もありまして、例えば以下のような感じです。
- ラズピコやESP32への書き込みはPyMakrやMicroPico Device Controllerを使っていますが、接続不良が発生しやすい
- 2025年7月現在、MicroPython CLIはpython3.11環境下でしか動かず、いい加減に3.13で動いてほしい
- stubsの導入はできるが削除はできず、古いスタブがどんどん溜まる
AIがコードを書いたりコマンド実行してくれるようになった現代、下手にGUIで操作するよりも、コマンドを打ったほうが便利です。
MicroPython v1.17以降は、mpremoteを使ってMicroPython デバイスをリモート操作、ファイルシステム管理ができるようになりました。
mpremoteは公式が提供してくれているので、前述のようなサードパーティ性ツールのような不具合も少なく、メンテナンスも期待できます。
開始手順
$ pip install --user mpremote
フォルダ等は全部自分で作成する必要があります
/
├── lib/
├── src/
├── stubs/
└── README.md
スタブの用意
これをzipでまるっとインストールしましょう。
stubsフォルダに、色々なデバイスのスタブがあるので、必要なものをstubsディレクトリにコピーします。
(この例では、2025年7月時点のラズピコWのスタブである"micropython-v1_25_0-rp2-RPI_PICO_W-merged"をコピーしています。
無印よりmergedのほうが、カバー範囲が広い?)
コピーできたら、pyrigntconfig.jsonにスタブを読み込むよう設定します。
{
"include": ["src", "lib"],
"extraPaths": [
"./stubs/micropython-v1_25_0-rp2-RPI_PICO_W-merged"
]
}
これで、CursorやVSCodeでコード補完が効くようになりました。
例1. モジュールのインポート
"""Lチカのモジュール"""
from machine import Pin
import utime
class Module1:
def __init__(self):
self.led = Pin("LED", Pin.OUT)
def blink(self):
for i in range(10):
self.led.value(1)
utime.sleep(0.5)
self.led.value(0)
utime.sleep(0.5)
# ファイルパスを認識させる
import sys
sys.path.append('/src')
sys.path.append('/lib')
sys.path.append('/remote/src')
sys.path.append('/remote/lib')
# モジュールをインポートして実行
from module1 import Module1
module1 = Module1()
module1.blink()
アップロード
ラズピコ内にsrcフォルダを作成
% mpremote mkdir :src
srcフォルダの中身を全てラズピコにコピー
% mpremote cp -r src/* :src
REPLの実行
pythonを使う理由は、なんと言ってもインタプリタ型なのでコードを逐次的に実行できることです。
いちいちビルドが必要なNode-RedやC/C++(Aruduino言語)と違い、パパッと実行できるので開発がとても快適です。
公式ドキュメントに書かれているので、ここではよく使うコマンドだけ紹介します。
src/main.pyをラズピコ内で直接実行
% mpremote run src/main.py
PCのフォルダやファイル構成を直接ラズピコで実行
PCのフォルダやファイルをラズピコにマウント
% mpremote mount .
>>> import os
>>> print(os.listdir('/remote'))
パソコンのカレントディレクトリのファイル一覧が表示される
例えばsrc/main.pyがあったとして、これを実行する
exec(open('/remote/src/main.py').read())
Discussion