2025年1月28日

023-1.SPIKEプライム Bluetooth入門-第4回「センサーを入力する」

この連載ではBluetooth Low Energy(ブルートゥース・ロー・エナジー。以下、Bluetooth LE)という機能を使って、「レゴ エデュケーションSPIKEプライム(以下、SPIKE)」のラージハブと通信する方法について紹介します。この技術を応用すると、パソコンからラージハブにプログラムを送ったり、パソコンでセンサーの測定値を受け取ったり、いろいろなことができるようになります。なお、この記事ではWindows10以上のパソコンを推奨しています。(文/松原拓也)

◆ 用意するもの

今回はモーターを動かしてみたいと思います。必要なものはラージハブとモーターです。モーターは2つ用意して、ポートEとポートFに接続します。

Bluetoothでモーターを動かすにはどうしたら良いのでしょうか。 公式資料の「SPIKE Prime protocol」を確認してみましょう。
https://lego.github.io/spike-prime-docs/#
これによると、モーターを直接動かすためのメッセージが見当たりません(レゴ マインドストームEV3にはモーターを直接動かすためのダイレクトコマンドがあったのですが、、、)。 ここで技術的な問題にぶつかってしまいます。

そこで、苦肉の策ですが、モーター制御用のプログラムをラージハブに転送してから実行することにします。具体的には次の5種類のメッセージを送信します。
(1)「InfoRequest」メッセージを送信して、チャンクの最大サイズを取得する。
(2)「ClearSlotRequest」メッセージを送信して、スロットを消去する。
(3)「StartFileUploadRequest」メッセージを送信して、モーター制御のプログラムの転送を開始する。
(4)「TransferChunkRequest」メッセージを送信して、モーター制御のプログラムを転送する。
(5)「ProgramFlowRequest」メッセージを送信して、モーター制御のプログラムを実行する。

モーター制御のプログラムはPythonで記述します。 角度単位でモーターを動かすには「motor.run_for_degree」関数を使います。 関数の書式は「motor.run_for_degree(ポート,回転角度,ベロシティ)」です。 ポートは「port.A」~「port.F」の定数で指定できます。 回転角度の値はプラスの場合には正転、マイナスの場合には逆転します(単位は度です)。ベロシティは角速度、1秒あたりの回転角度です(たとえば360ならば1秒で1回転する速度です)。

◆ サンプルプログラムを改造する

公式資料「LEGO Education SPIKE Prime protocol documentation」に付いてくるサンプルプログラム(examples/python/~)を改造します。やることが多いので、要点だけを説明します。
まず、次のWebページからソースファイル「app.py」「cobs.py」「crc.py」「messages.py」を入手します。
https://github.com/LEGO/spike-prime-docs/tree/main/examples/python

Thonnyを起動して、「app.py」を修正します。画面はキーの入力とプログラムのデータ作成を行うためのコードです。
キー入力には「input」関数を使います。動かしたいモーターのポートと角度を変数に格納します。
続いて、ラージハブで実行するプログラムのデータを作成します。サンプルのプログラムは「Hello World」という文字を表示していましたが、これをモーター制御に書き換えます。
「code」という文字列型の変数にPythonのコードを格納します。Thonnyでは「¥(円)」は「\(バックスラッシュ)」として表示します。「\n」で改行コードという意味になります。そして、「~.encode」関数を使って、プログラムをbytes型に変換して、「EXAMPLE_PROGRAM」という変数に格納します。

スロットの消去とプログラム転送のリクエストを行うためのコードです。
スロットを消去するには「ClearSlotRequest」メッセージを送信します。ここでは0番スロットを消去します。
プログラムの転送を開始するには「StartFileUploadRequest」メッセージを送信します。
この一連の処理はサンプルのプログラムをそのまま使っています。

モーター制御用のプログラムの転送と実行を行うためのコードです。

プログラムを転送するには「TransferChunkRequest」メッセージを送信します。プログラムは一度に転送できるデータの最大サイズが決まっていて、そのデータのことをChunk(チャンク)と言います。 プログラムを実行するには「ProgramFlowRequest」メッセージを送信します。 この一連の処理もサンプルのプログラムをそのまま使っています。

◆ プログラムの実行

プログラムを実行します。Thonnyで「app.py」を開いた状態でF5キーを押します。実行する前にラージハブの電源を入れ、Bluetoothボタンを長押しして、Bluetoothの接続待機状態にしておきます。

ラージハブとの接続に成功すると、最初に「InfoRequest」メッセージが送信されます。ここでチャンクの最大サイズが4Kバイトであることがわかります。

ポート名(A~F)と角度をキーボードから入力すると、モーターが回転します。 PCから送信したメッセージと、ラージハブから受信したレスポンスが表示されます。

たとえば、「e」[Enter]、「360」[Enter]と入力すると、 ポートEのモーターが360度正転します。ポート名は小文字・大文字、どちらでもかまいません。モーターを逆転させたい場合には角度の値をマイナスにします。 プログラムを転送してからモーターを動かしているので、反応が遅いのが欠点です。

今回はモーターを回すだけで、センターの入力を行いませんでした。モーターを回すため、キー入力を待たないといけないのですが、センサー入力のメッセージ(DeviceNotification)はいつレスポンスが到着するのかわからず、同時に処理を行うことが難しかったためです。次回にはこの問題をどうにか解決して、センサー入力とモーター制御を同時に行う方法を紹介したいと思います。
今回作成したプログラム

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