2025年1月28日

023-1.SPIKEプライム Bluetooth入門-第1回「ラージハブと通信をする」

この連載ではBluetooth Low Energy(ブルートゥース・ロー・エナジー)という機能を使って、「レゴ エデュケーションSPIKEプライム(以下、SPIKE)」のラージハブと通信する方法について紹介します。この技術を応用して、パソコンからラージハブを制御してみましょう。なお、この記事ではWindows(10以上)搭載のパソコンを使用しています。(文/松原拓也)

◆ Bluetoothとは?

まず、Bluetoothについての大まかな紹介です。
Bluetoothというのは無線の通信規格の一つです。無線と言うと「Wi-Fi」が有名ですが、BluetoothはWi-Fiと違って、狭い範囲での通信に使われています。現在、ワイヤレスイヤホンやゲーム機のコントローラはほとんどBluetoothを採用しています。Bluetoothの最新バージョンは5.4です。 2010年ごろに、Bluetoothはバージョン4.0となり、そこで「Bluetooth Low Energy」という機能が追加されました。名前が長いので以後は「Bluetooth LE」と書くことにします。4.0より前からあった機能は「Bluetooth Classic(BR/EDR/HS)」と呼び、今でも使うことができます。
SPIKEのラージハブはBluetoothを使ってパソコンやスマートフォンと通信することができます。2022年の末にSPIKEアプリはVer.2(Legacy)→Ver.3にバージョンアップして、通信方法が「Bluetooth Classic」から「Bluetooth LE」に変更されました。これにより、Webブラウザ版のSPIKEアプリはプログラムをラージハブへ直接転送できるようになりました。それ以前はSPP(Serial Port Profile)という技術を使い、COMポートから接続していましたが、それが廃止されています。

ラージハブ~パソコン間の通信プログラムをどうやって作ったら良いのでしょうか? いきなり難問です。
そのヒントはレゴ グループの「LEGO Education SPIKE Prime protocol documentation」という公式の資料にあります。
https://github.com/LEGO/spike-prime-docs/ こちらのページを開いて、「Code」ボタンをクリックしたら、「Download zip」ボタンをクリックしましょう。
これで「spike-prime-docs-main.zip」という圧縮ファイルがダウンロードされます。

圧縮ファイルを展開します。
「spike-prime-docs-main.zip」にマウスのカーソルを合わせた状態で右クリックして、「すべて展開」を選択します。

ファイルを展開したら、 「spike-prime-docs-main」フォルダを開いて、 次に「exmaples」フォルダを開きます。 その中にある「python」フォルダの中身(ファイル4つとフォルダ1つ)を使います。これがラージハブと通信するためのサンプルプログラムです。言語はPythonです。

フリーソフトのPython用の開発環境「Thonny」を起動します。「Thonny」を持っていない場合はインストールしておきましょう。 起動したら、「ツール」→「オプション」をメニュー選択して設定画面を開きます。 「インタプリタ」タブをクリックして、 「ローカルPython3」を選択して、最後にOKボタンをクリックしましょう。

「bleak」というBluetooth LE用のライブラリ(パッケージ)をインストールします。 「ツール」→「パッケージを管理」をメニュー選択して、 ライブラリの管理画面を開きます。テキストボックスに「bleak」を入力したら、「PyPIを検索」ボタンをクリックします。 候補がたくさん出てきますが、一番上にあるものを選びましょう。 「インストール」ボタンをクリックすると、ライブラリをインストールすることができます。
これでプログラムを実行するための準備は完了です。

◆ サンプルプログラムを動かす

先ほどダウンロードしたソースファイル「app.py」をThonnyのエディタで開きます。
注釈には「Bluetooth LEを使って、ラージハブの状態を読み取ったり、プログラムを転送することができます。」という意味のことが書かれています。

ラージハブの決定ボタンを長押しして電源を入れます。起動すると、決定ボタンは緑色に点灯します。もし、白色に点灯している場合にはハブOSのバージョンが古いので、アップデートが必要です。
電源を入れたら、Bluetoothボタンを長押しします。これで通信の待機状態になります。「ピッピッピッピッ」という音が鳴り続けます。

プログラム「app.py」を実行すると、シェル画面に「スロット0にプログラムを上書きしますが、よろしいですか?」という意味のメッセージが表示されます。
キーボードの「Y」「Enter」キーを押します。

ラージハブが見つからない場合、「No hubs detected.」というエラーが表示されて、異常終了します。
ラージハブの電源を入れ忘れてないか。Bluetoothボタンを押し忘れていないか確認しましょう。

ラージハブが見つかった場合には「Hub detected!」と表示されます。
続いて、ラージハブへの接続を開始します。接続に成功した場合には「Connected!」と表示されます。

接続が成功した場合、スロット0にPythonのプログラムを転送します。「TransferChunkRequest」という関数の引数を見ると、プログラムのソースコードがそのまま表示されています。

プログラムの転送が完了すると、プログラムを実行します。ライトマトリクスに「Hello, world!」の文字が表示されます。

文字の表示が終わったら、プログラムが自動的に終了します。
終了しても、Bluetoothの接続は続いています。

ラージハブ側のプログラムの動作は終わりましたが、パソコン側のプログラムはまだ動いています。約5秒おきにラージハブの情報が表示されます。「Battery」はバッテリー残量、「IMU」は加速度とジャイロ、「5x5」はライトマトリクスの状態という意味です。
この状態でラージハブにモーターを接続すると、「Motor」という項目が追加されて、軸の角度などの情報が表示されます。
カラーセンサーを接続すると、エラーが表示されてしまいます。どうやらプログラムにバグがあるようです。
プログラムを終了するにはキーボードのCtrl+Cキーを押します。ツールバーの「STOP」ボタンを押しても終了できます。

ラージハブ~パソコン間でどのような通信をやりとりしているのでしょうか? この問いについては、レゴ グループの次の公式の資料が参考になります。
https://lego.github.io/spike-prime-docs/#
この資料を見ると、Messages(メッセージ)という項目に通信のコマンドの仕様が書かれています。あとは、サンプルプログラムの「messages.py」と照らし合わせていけば、オリジナルのプログラムが作れるようになると思います。サンプル側にクラスがない場合は追加しないといけません。かなり大変な作業になりそうです。

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