2026年4月30日

024-2.SPIKE-RT入門 第4回目 「Bluetooth通信」

この記事では「レゴ エデュケーションSPIKEプライム(以下、SPIKE)」で動作する「SPIKE-RT」の使い方を紹介します。
ここではアフレルが販売している教材「レゴ エデュケーションSPIKEプライム C言語プログラミングブック」で配布しているSPIKE-RTの開発環境を使っています。同製品の紹介ページは次の通りです。
https://afrel.co.jp/product/spike/c-language/
(文/松原拓也)

◆ PybricksのWebアプリを使う

今回はSPIKE-RTでBluetooth通信について紹介します。現在主流のBluetoothは「Bluetooth Low Energy」という技術を採用しています。旧バージョンのBluetooth(Classic)はコントロールパネルでデバイスを事前に登録しておかないと使うことができませんでした。Bluetooth Low Energyでは簡単にデバイスに接続できるように改善されています。
以前に作った通信テスト用プログラムの修正版です(bttest)。 SPIKE-RTでBluetoothを使うにはシリアルポートのIDを「SIO_BLUETOOTH_PORTID」にしただけです。

完成したファームウェアをラージハブに書き込みます。 書き込みが完了すると、プログラムが実行されて、Bluetoothの接続待機状態に移行します。待機中は中央ボタンが青色に点滅します。純正のファームウェアと違って、Bluetoothボタンを長押しする必要はありません。

続いて、パソコン側の通信プログラムを用意します。
SPIKE-RTは通信仕様が公式のものとは異なっています。そのため、「LEGO Education SPIKE Prime protocol documentation」のサンプルプログラムを使うことができません。
SPIKE-RTは「Pybricks」という開発環境の通信仕様を採用しています。PybricksのWebサイトを開きます。
https://pybricks.com/
Webページを開いたら、「Start coding with Blocks & Python!」ボタンをクリックしてWebアプリを起動します。 ラージハブの電源を入れた状態で、Bluetoothのアイコンをクリックして少し待ちます。ダイアログに「不明なまたはサポートされていないデバイス」と表示されたら、それを選択して「ペア確定」ボタンをクリックします。これで、ラージハブとパソコンが通信できる状態になります。 ちなみに16進数のアドレスは起動するたびに変化するので、特定することには使えません。

画面下にあるターミナルのウインドウにカーソルを合わせてから、キーボードのキーを押すと、ラージハブに対して文字コードを送信することができます。
たとえば、「a」のキーを押したら、ラージハブのライトマトリクスに「a」と表示されました。
ターミナルに「a」と表示されています。これはエコーバックによってラージハブから折り返しで送信してきたデータです。

PybricksのWebアプリを使うには、「Web Bluetooth API」に対応したWebブラウザが必要です(Google Chromeなど)。Web Bluetooth APIとは、JavaScriptでBluetoothを制御する機能のことです。iPad用のアップル純正のWebブラウザ「Safari」はWeb Bluetooth APIに対応していないため、このようなエラーが表示されてしまい、使うことができません。
Pybricks自体は有料のサービスですが、PybricksのWebアプリは無料で使うことができます。しかし、タダ乗りしているみたいで、ちょっと後ろめたいものがあります。そこで、Webアプリに頼らないで済むように、通信ソフトを自作してみたいと思います。

◆ 通信ソフトを自作する

こちらがPythonで自作したBluetoothの通信ソフト(send.py)です。 全部で50行程度ですが、2つに分けて紹介します。
まずは1/2です。 Bluetoothの制御には「Bleak」というライブラリを使います。たとえば、ThonnyというPython用の開発環境を使った場合、「パッケージ管理」というメニューを選択するだけで簡単にライブラリを追加することができます。
通信仕様はPybricksの公式の資料を参考にしました。
https://docs.pybricks.com/projects/pybricksdev/en/latest/api/ble/index.html

福野泰介さんが作った「PybricksHub.js」というライブラリも参考にさせて頂きました。プロトコルエラーの解決に役立ちました。
https://github.com/code4fukui/PybricksHub.js/
これによると、サービスUUIDが通常のものと「Nordic UART Service」用のものとがあって、2つまとめて接続する必要があるようです。

プログラムの2/2です。
最初に見つけたラージハブと接続を試みます。接続に成功したら、input関数でデータを入力して、入力内容を送信します。

プログラムを実行すると、自動的にラージハブを探して接続します。
ターミナルに「Message:」と表示されたら、何か文字を入力してください。入力した内容がラージハブに送信されます。
ラージハブのライトマトリクスに送信した文字が表示されたら成功です

作ってから気が付きましたが、このラージハブ側のプログラムは受信するペースが遅いです。一度に1バイトしか受信していなくて、受信するたびにライトマトリクス表示を行っているので時間がかかってしまいます。
全て受信が完了すると、プログラムが終了します。

プログラムを実行中の様子

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