Home - mhikichi1969/SPIKE-Prime-python GitHub Wiki

SPIKE PRIMEで複数ファイル構成のPythonプログラムを動かす方法

ETロボコンの競技に使えるかどうかを目的に検証しています。現状ではかなり手作業が多くなっています。実際に競技に使うには、いろいろと整備しなければならないものもあるかと思いますが、現状の手順をまとめています。

環境構築

操作に何かと必要な ampy をインストールします。

便利な環境(ampy, spike-tools)

スロットの作成

純正ソフトウェアで転送する

最も簡単な方法は、純正ソフトウェアでダミープロジェクトを作って、SPIKE PRIME HUB へダウンロードすることです。

これで、スロット管理ファイル(.slots)の更新とフォルダの作成が行われます。

SPIKE PRIME HUBのディレクトリ構成とスロット管理ファイルの構造はこちら

SPIKE PRIME HUB のディレクトリ構成

スロット管理ファイルの構造

転送先のフォルダ名を把握するために、idの値をampy を使って取得します。

例) WSL環境で COM4 を使っている場合。

ampy -p /dev/ttyS4 get /project/.slots

以下の例では id の値 41475 が以下の操作に必要となります。

0: {
     'name': '44OX44Ot44K444Kn44Kv44OIIDY=', 
     'type': 'python', 
     'modified': 1619853616450, 
     'id': 41475,
     'project_id': 'Tt6uqnH7skVy', 
     'created': 1619763176180 }

spike-toolsで転送する

純正ソフトウェア無しでもスロット領域を作ってプログラムをダウンロードすることが可能。

https://github.com/nutki/spike-tools

おそらくSPIKEのファームウェアのバージョンの関係で改変しないと転送はできるがそのままでは動かない。ツール側で対応するか、書き込まれた.slotsを編集して対応する。

jsonのパラメータで、 'type': 'python' と 'project_id' : '...' が必要。project_id は何でも動くが、何に使われいてるか不明。

spikejsonrpc.py -t /dev/ttyS4 ファイル名 スロット番号 プロジェクト名

このコマンドで転送すると、__init__.py として保存される。

このツールでも単一ファイルしか送ることはできないので、追加のファイルは個別に ampy で転送する。

コードの転送

ampy で /projetcs フォルダへ転送します。スタートファイルは __init__.py でなければいけません。

例) WSL環境で COM4 を使っている。スロットのIDが41475であった場合。

ampy -p /dev/ttyS4 put __init__.py /project/41475/__init__.py

送り先はファイル名まで必要です。

複数ファイルの場合は合わせて転送します。また、フォルダを転送することも可能です。

例) WSL環境で COM4 を使っている。app フォルダを転送する場合

ampy -p /dev/ttyS4 put app /project/41475/app

実行

電源をOFFにしてから、再度ONにする。

SPIKE PRIME HUB の左右のボタンで、スロット番号を選択して決定ボタンで通常のアプリと同様に起動します。

エラーの場合

エラーの場合はボタンのライトが赤く高速点滅しています。

エラーログは /runtime.log に保存されているので、ampy 等で取り出して確認します。

例) WSL環境で COM4 を使っている。エラーログを取り出してコンソール上に表示する

ampy -p /dev/ttyS4 get runtime.log


現状わかっている問題点

  • 動作速度

python インタプリタですので、遅いです。RandomWalker程度の処理で1周期 2ms 程かかります。

STM32のネイティブコードエミッターとか使える可能性もあり。

  • ガベージコレクションの影響

MicroPythonの特徴なのか、ガベージコレクションがかなり頻繁に発生します、しかも遅いです。ローカル変数がすべてガベージの対象になるらしいので、ガベージコレクションを停止する命令

import gc
gc.disable()

を実行すると、あっという間にシステムが停止します。

周期を守れるようにプログラムするのは骨が折れるかも。

  • 大きなプログラムがどの程度動くのか未検証

ガベージコレクションの動きから察するに、大きなプログラムにするとその影響もすぐに表れそうです。エントリークラスぐらいなら行けても、アドバンストクラス程度の課題になると、どうなるか未検証です。

起動直後の

import gc
gc.mem_alloc()
gc.mem_free()

の値は

172224
54960

でした。