MaixPyをVSCodeで開発する【M5StickV,Maixシリーズ】
M5Stack社のM5StickV,UnitV、Sipeed社のMaixシリーズ(Maixduino,MaixM1Dock, MaixBit,MaixAmigoなど)をMaixPyIDEではなくVisualStudioCodeで開発するための手順を紹介します。
もくじ(Index)記事で利用した環境
ソフトウェア
- OS
Ubuntu 20.04 (Windows10のVMWare上のゲストOS) - VisualStudioCode 1.58.2
- Pymakr 1.1.12
- Nodejs v10.19.0
ハードウェア
K210搭載の下記の2機種で試しました。下記のリンクはAmazonへしています。詳しい購入の方法についてはM5Stack、M5StickC、M5StickV、M5Atom、M5Paper、M5CoreInkなどM5Stack製品の買い方を参照してください。
●microSDカード
M5StickVはmicroSDカードとの相性が良くない場合があります。当サイトではこちらのLexarの32GBものをおススメしています。
VSCodeの設定
Node.jsのインストール
いくつか方法があるようですが、私はsudo apt installを利用しました。Ubuntu20.04はNode.js Version10.19.0ですが動いています。
sudo apt install -y nodejs npm
Pymakrのインストール
VSCodeの機能拡張で「Pymakr」を検索してインストールします。
global settings
コマンドパレットから「Pymakr>Global Settings」か「Ctrl+Shift+G」を押すとpymakr.jsonの編集画面が開くので下記の2項目を編集します。
- “address”
USBで接続するのであれば、ポートを指定します。(Ubuntuなら”/dev/ttyUSB0″ Windowsなら”COM??”など) - “auto_connect”: false
trueだと失敗するようです。falseにしておきましょう。
【難しい】VSCodeのコード補完機能にMaixPyのmoduleを追加する。
このままだと、MaixPy特有のlcdやKPU等のモジュールは補完できません。データを作成してあげる必要があります。
ただ、データを作成しても補完するときの候補にはメソッド名(関数名)しか表示されず、引数の情報は表示されないので完全ではありませんので注意してください。
①micropy-cliのインストール
pip install micropy-cli
pip install micropy-cli[create_stubs]
②micropy-cliの改造
micropy-cliはMaixPyのstubには対応しておらず、またMaixPyではFlashのSPIFFSでフォルダが作成できないという致命的な制限があるのでそのままでは動きません。
「which python」を実行しpipでインストールされるフォルダを探して下記の3ファイルの修正を行います。Flashに書き込んでいる部分をsdに変更します。
●~/.platformio/penv/lib/python3.8/site-packages/micropy/main.py
120行目の”/stubs”を”/sd/stubs/”に変更
●~/.platformio/penv/lib/python3.8/site-packages/micropy/utils/pybwrapper.py
99行目の”/pyboard/”を”/sd/”に変更
●~/.platformio/penv/lib/python3.8/site-packages/micropy/lib/stubber/board/createstubs.py
① 433行目の”/flash”を”/sd”に変更
② 58~68行目のモジュールを変更(ESP32のMicroPython用なのでMaixPy独自のモジュールを足します。)
self.modules = ['_onewire', '_thread', '_uasyncio', 'ak8963', 'apa102', 'apa106', 'array', 'binascii', 'btree', 'builtins',
'cmath', 'collections', 'crypto',
'curl', 'dht', 'display', 'ds18x20', 'errno', 'esp', 'esp32', 'flashbdev', 'framebuf', 'freesans20', 'functools', 'gc', 'gsm', 'hashlib',
'heapq', 'inisetup', 'io', 'json', 'lcd160cr', 'lcd160cr_test', 'logging', 'lwip', 'machine', 'math', 'microWebSocket', 'microWebSrv', 'microWebTemplate',
'micropython', 'mpu6500', 'mpu9250', 'neopixel', 'network', 'ntptime', 'onewire', 'os', 'pyb', 'pycom', 'pye', 'queue', 'random', 're', 'requests',
'select', 'socket', 'ssd1306', 'ssh', 'ssl', 'stm', 'struct', 'sys', 'time', 'tpcalib', 'uarray', 'uasyncio/__init__', 'uasyncio/core', 'uasyncio/event',
'uasyncio/funcs', 'uasyncio/lock', 'uasyncio/stream', 'ubinascii', 'ubluetooth', 'ucollections', 'ucrypto',
'ucryptolib', 'uctypes', 'uerrno',
'uhashlib', 'uheapq', 'uio', 'ujson', 'ulab', 'ulab/approx', 'ulab/compare', 'ulab/fft', 'ulab/filter', 'ulab/linalg', 'ulab/numerical',
'ulab/poly', 'ulab/user', 'ulab/vector', 'umachine', 'umqtt/robust', 'umqtt/simple', 'uos', 'upip', 'upip_utarfile', 'uqueue', 'urandom',
'ure', 'urequests', 'urllib/urequest', 'uselect', 'usocket', 'ussl', 'ustruct', 'usys', 'utime', 'utimeq', 'uwebsocket', 'uzlib', 'websocket',
'websocket_helper', 'writer', 'ymodem', 'zlib',
'machine', 'fpioa_manager', 'image', 'video',
'lcd', 'sensor', 'speech_recognizer',
'Maix', 'KPU',
]
③micropy-cliの実行
M5StickVやMaixDuino等をPCに接続し、下記のコマンドを実行します。M5StickVは終わるまでずっとAボタンを押しっぱなしにします。(それでもうまくいかない場合あり。)
micropy stubs create /dev/ttyUSB0
下記のように表示されたら完了です。(0.6.2-66はファームウェアのバージョンなので異なる場合があります。)
MicroPy Copied Stubs: micropython-maixpy-0_6_2-66
MicroPy ✔ Added MaixPy-micropython-0.6.2 to stubs!
★M5StickVでmicropy-cliがうまくいかない場合
M5StickVは初期化の仕様がMaixシリーズと違うらしく、うまくいかない場合があります。その場合は下記手順でmicroSDカードから起動してstubを作成できます。
①microSDを準備
~/.platformio/penv/lib/python3.8/site-packages/micropy/lib/stubber/board 配下にある下記の3つのファイルをmicroSDのルートにコピーします。(修正後のもの)
- createstubs.py
- logging.py
- main.py
★main.pyはboot.pyに変えます。
②microSDをM5StickVに挿入して起動
起動し、シリアルモニターを開いておくと下記のようなメッセージが出てmicroSDにstubsフォルダが作成されます。
start stubbing in 5...
start stubbing in 4...
start stubbing in 3...
start stubbing in 2...
start stubbing in 1...
stubber version : 1.3.9
INFO :stubber :Clean/remove files in folder: /sd/stubs/micropython-maixpy-0_6_2-66
INFO :stubber :Start micropython-stubber v1.3.9 on micropython-maixpy-0.6.2-66
・
・
・
INFO :stubber :Stub module: Maix to file: /sd/stubs/micropython-maixpy-0_6_2-66/Maix.py mem:472992
INFO :stubber :Stub module: KPU to file: /sd/stubs/micropython-maixpy-0_6_2-66/KPU.py mem:472832
INFO :stubber :Finally done
INFO :stubber :Created stubs for 51 modules on board micropython-maixpy-0.6.2-66
Path: /sd/stubs/micropython-maixpy-0_6_2-66
INFO :stubber :Memory used: 8 Kb
MicroPython v0.6.2-66-gc82880691 on 2021-08-21; Sipeed_M1 with kendryte-k210
③microSDをPCに接続しフォルダを確認
PCに接続すると下記のようなフォルダ構成になっています。
- stubs
- micropython-maixpy-0_6_2-66
- stubファイル(*.py)とmodules.json
- micropython-maixpy-0_6_2-66
④フォルダ構成を変えて取り込み用のフォルダを準備
下記のように変更します。
- micropython-maixpy-0_6_2-66
- info.json
※ modules.jsonをコピーして名前を変更 - stubs
- stubファイル(*.py)とmodules.json
- info.json
⑤micropy-cliの実行
準備したフォルダを指定してmicropy-cliを実行します。
micropy stubs add ~/micropython-maixpy-0_6_2-66
これでmicropyにstubが登録されます。
プロジェクトの作成
プロジェクト用のフォルダを作成し、移動後micropy initを実行します。選択する項目は下記の3つです。
- Project Name
任意です。 - Choose any Templates to Generate(※ 上下で選んでスペースで選択します。)
VSCode Settings for Autocompletion/Intellisense - Which stubs would you like to use?
作成したスタブを選びます(MaixPy-micropython-0.6.2)
VSCodeでフォルダを開く
作成したフォルダを開くと、プロジェクトに必要な設定ファイルやフォルダが自動で作成されます。
boot.pyを作成して動かしてみる。
エクスプローラーのエリアでboot.pyを作成して実行してみましょう。
サンプルソース
import lcd
lcd.init(type=3)
lcd.rotation(0)
lcd.draw_string(10, 10, "Example", lcd.GREEN, lcd.BLACK)
補完している様子
注意点としてはstubは関数名や変数のみなので、引数の項目は何も表示されません(仕様です。)
【補足】スタブの作成が難しいという方へ
MaixPyの2021/08/22の最新で作成したものを公開しておきます。(Ver. 0.6.2-66) ※0.5ぐらいとは大きく違うので注意してください。
https://github.com/mongonta0716/stub_for_maixpy
上手く補完ができない時の対処
別のPCでセットアップをしたところ、補完が上手くいかない場合がありました。micropy initで作成される「.vscode/settings.json」のpython.languageServerが”None”の場合は”Delault”に直してみてください。
●参考: 私が使っているsettings.json
{ "python.linting.enabled": true, "python.jediEnabled": false, "python.autoComplete.extraPaths": [ ".micropy/micropython-maixpy-0_6_2-66/frozen", ".micropy/BradenM-micropy-stubs-4f5a52a/frozen", ".micropy/micropython-maixpy-0_6_2-66/stubs", ".micropy/MaixTrain" ], "python.autoComplete.typeshedPaths": [ ".micropy/micropython-maixpy-0_6_2-66/frozen", ".micropy/BradenM-micropy-stubs-4f5a52a/frozen", ".micropy/micropython-maixpy-0_6_2-66/stubs", ".micropy/MaixTrain" ], "python.analysis.typeshedPaths": [ ".micropy/micropython-maixpy-0_6_2-66/frozen", ".micropy/BradenM-micropy-stubs-4f5a52a/frozen", ".micropy/micropython-maixpy-0_6_2-66/stubs", ".micropy/MaixTrain" ], "python.linting.pylintEnabled": true, "python.languageServer": "Default", "python.analysis.extraPaths": [ ".micropy/micropython-maixpy-0_6_2-66/frozen", ".micropy/BradenM-micropy-stubs-4f5a52a/frozen", ".micropy/micropython-maixpy-0_6_2-66/stubs", ".micropy/MaixTrain" ] }
おわりに
これでMaixPyIDEではできなかったコード補完もできるようになりました。センサーの画像を見ることはできませんが、生産性が上がると思うのでぜひやってみてください。
更新履歴
- 2021/11/21 pip の記述が間違っていたので修正+補完が上手く動かない時の対処を追加
- 2021/8/22 新規作成