2025年1月28日
023-1.SPIKEプライム Bluetooth入門-第2回「サンプルプログラムのバグを取る」
この連載ではBluetooth Low Energy(ブルートゥース・ロー・エナジー。以下、Bluetooth LE)という機能を使って、「レゴ エデュケーションSPIKEプライム(以下、SPIKE)」のラージハブと通信する方法について紹介します。この技術を応用すると、パソコンからラージハブにプログラムを送ったり、パソコンでセンサーの測定値を受け取ったり、いろいろなことができるようになります。なお、この記事ではWindows10以上のパソコンを推奨しています。(文/松原拓也)
◆ ラージハブとの接続
前回はレゴ グループの公式資料「LEGO Education SPIKE Prime protocol documentation」に付いてくるサンプルプログラム(examples/python/~)を実行しました。
https://github.com/LEGO/spike-prime-docs/
今回も同じサンプルプログラムを使います。プログラムの動かし方については、前回の記事を参考にしてください。
Bluetooth LEで通信するデータのことを「メッセージ」といいます。SPIKEのメッセージはレゴ グループの公式資料「SPIKEプライム・プロトコル」で仕様が決められています。
https://lego.github.io/spike-prime-docs/messages.html
この資料は重要です。
◆ バグを突き止める
エラー発生直前のメッセージは「3c」で始まっています。
調べてみると、「DeviceNotification」のメッセージだとわかります。 「DeviceNotification」はバッテリー残量やセンサーやモーターに関するデータです。 データの構造が2重になっていて、センサーやモーターの接続数によってサイズが変わります。
「DeviceNotification」を受信するには、事前に「DeviceNotificationRequest」というメッセージをラージハブに送ってから、「DeviceNotificationResponse」というメッセージを受信して、データを送る周期を設定する必要があります。サンプルプログラムでは周期は5秒に設定されています。
カラーセンサーだけを接続している時の「DeviceNotification」は次のとおりです。
・Device5x5MatrixDisplay(ライトマトリクスの情報。26バイト)
・DeviceImuValues(IMUの情報。21バイト)
・DeviceBattery(バッテリー残量の情報。2バイト)
・DeviceColorSensor(カラーセンサーの情報。9バイト)
、、、最後に「余分な1バイト」があります。これは一体、何でしょうか?この1バイトのせいで「バッファが必要(足りない)」のエラーが出ているのではないでしょうか?
あと、RGBの値の範囲は0~1023だと書かれていますが、実際は0~65535だと思います。
◆ プログラムを修正する
原因がわかったので、対策してみましょう。 ソースファイル「messages.py」の「DEVICE_MESSAGE_MAP」という配列にDeviceColorSensorのデータ構造が書かれています。structモジュールのフォーマット文字という書式です。これによると、DeviceColorSensorのデータ構造は次のとおりです。
・ID、0x0c(1バイト)。
・接続しているポート番号(1バイト)。
・認識した色の番号。-1の場合は認識失敗(1バイト)。
・赤色の値(2バイト)。
・緑色の値(2バイト)。
・青色の値(2バイト)。
、、、このデータ構造自体には間違いはありません。しかし、ここで「余分な1バイト」を受け取ることで、データ化けを防ぐことができるのではないでしょうか?
当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。