2025年6月30日

026-1.SPIKEプライム Python入門(SPIKE App3)-第1回「非同期処理の実験をする」

この記事では「レゴ エデュケーションSPIKEプライム(以下、SPIKE)」と専用アプリ(SPIKEアプリ)を使った、Pythonのプログラミング方法について紹介します。(文/松原拓也)

◆ SPIKEアプリのバージョンについて

SPIKEのプログラミングに使用する公式のアプリのことを「SPIKEアプリ(SPIKE App)」と言います。 SPIKEアプリではPythonという言語を使ってプログラムを作成することができます(厳密にはMicroPythonです)。
原稿執筆時点で、SPIKEアプリの最新バージョンは3.5.1です。このバージョン3のSPIKEアプリを「SPIKE App3」と呼びます。そして、バージョン2のSPIKEアプリは「SPIKEアプリ2」または「SPIKEアプリLegacy(レガシー)」と呼びます。SPIKEアプリはバージョンによって仕様が大きく違っています。 SPIKEアプリ2は今でも公式サイトから入手可能です(バージョン2.0.10)。SPIKEアプリはWindow版、macOS版、Webブラウザ版などがあります。この記事ではWindowを使用しています。Webブラウザ版はバージョン3のみです。 バージョン2のサポートは2023年で終了しています。このため、バージョン2→バージョン3への移行が必要となります。

ラージハブのハブOS(ファームウェア)もバージョンごとに動作が違います。ラージハブに電源を入れた時、バージョン2の場合はライトが白色に光ります。バージョン3の場合はライトが緑色に光ります。 SPIKEアプリ3を使用すると、ラージハブにはバージョン3専用のハブOSが書き込まれます。バージョン3専用のハブOSではバージョン2のプログラムは実行できません。バージョン2のプログラムを実行したい場合には、ハブOSをバージョン2に戻さないといけません。ハブOSを戻す方法については、次のページで紹介されています。
https://afrel.co.jp/product/spike/technology-spike/basic/software-basic/54122/

Pythonのプログラムもバージョンごとに違います。 たとえば、これは「ライトマトリクスに文字列を表示する」というプログラムですが、モジュールの名前が違っていたり、手順が違います。 プログラムを保存した場合、バージョン2のファイルの拡張子は「llsp」となります。バージョン3のファイルの拡張子は「llsp3」です。

例を挙げるとキリがありませんが、このようにありとあらゆる書式が違います。困ったことにSPIKE App3はバージョン2に対しての互換性がありません。
SPIKEアプリ3でバージョン2を読み込むことは可能です。読み込んだ場合、ファイルの拡張子が自動的にllspからllsp3に変更されます。しかし、書式の互換性がないので、そのまま実行するとエラーが出てしまいます。エラーを修正するには膨大な手間がかかります。 バージョン2のソフトウェア資産をバージョン3でうまく活用できないのが難点です。

SPIKEのライブラリについては、SPIKEアプリ3に搭載されている「ナレッジベース」で学ぶことができます。 いわゆるオンラインヘルプです。
ここに書かれているのはライブラリの書式についてだけです。Pyhtonの基本的な使い方については書かれていません。そこで、このブログではこの書かれていない部分を重点的に紹介したいと思います。


◆ 非同期処理の実験

Pythonでファイルを新規作成すると、自動生成されるプログラムがこちらです。
「async」「await」は非同期処理を行うための構文です。非同期処理は複数の処理を並列的に行う機能のことです。
「async def 関数名():」と記述すると、非同期処理用の関数を定義することができます。この関数をコルーチンと呼びます。
「await 関数()」と記述すると、処理が終わるまで待つことができます。待っている間に別の処理を行うことができます。
MicroPythonで非同期処理を管理するには通常、「uasyncio」というモジュールを使います。 しかし、SPIKEアプリの場合は「runloop」というモジュールを使います。「runloop.run(関数名())」と記述すると、関数を実行します。

非同期処理を実験するためのプログラムです(task_test.llsp3)。「task1」と「task2」という2つの関数を並列的に実行させます。
プログラムを実行すると、コンソールが画面に文字が表示されます。「task1」は1秒おきに表示。「 task2」は2秒おきに表示します。

先ほどのプログラムの改良版です(task_test2.llsp3)。 ライトマトリクスと決定ボタンのライトを点灯/消灯させます。
プログラムを実行すると、ライトマトリクスが中央の1ピクセルだけ点滅します。ピクセルは1秒おきに点灯/消灯が切り替わります(点滅周期は2秒)。
決定ボタンのライトも点滅します。ライトは2秒おきに点灯/消灯が切り替わります(点滅周期は4秒)。点灯時の色は赤色です。

非同期処理については、まだよくわからない部分があります。
「light_matrix.~」の前に「await」を付けるとエラーが出てしまいました。新規作成した時のプログラムには「await」が付いていたのですが、関数によって対応/非対応が違うようです。

以上の技術を応用すると、「センサーを読みながらモーターを動かす」というようなロボットを作ることができます。
今回作成したプログラム

非同期処理のプログラムを実行中の様子

当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。