2025年1月28日

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

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

◆ 用意するもの

前回は公式資料「LEGO Education SPIKE Prime protocol documentation」に付いてくるサンプルプログラム(examples/python/~)を実行して、カラーセンサーの読み取りに成功しました。
「Bluetoothでラージハブと通信ができる」というメリットを活かすため、今回はカラーセンサーの測定値をパソコン側に保存します。

必要なものはラージハブとカラーセンサーです。センサーはポートAに接続します。
色の付いたブロックも用意しましょう。

使い勝手を良くするため、測定したデータはCSV形式で保存することにします。CSV形式は表計算ソフトで開くことができるので、計算に使ったり、グラフを描くことができます。

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

公式資料のサンプルプログラムを改造します。やることが多いので、要点だけを説明します。
まず、次のWebページからソースファイルを入手します。
"https://github.com/LEGO/spike-prime-docs/

必要となるファイルは「app.py」「cobs.py」「crc.py」「messages.py」の4つです(2024年11月現在、まだカラーセンサーを読めないバグが残っているので、連載第2回目で紹介した方法で「messages.py」を修正してください)。
Thonnyを起動して、「app.py」を開いて、内容を修正します。今回は「Hello World」という文字を表示する機能がまるごと不要なので、関係する処理を削除します。
初期設定値では「5秒おき」にラージハブからセンサーの測定値が送られてきますが、遅すぎるので「1秒おき」に変更します。 保存できる測定値はカラーセンサーときょりセンサーとフォースセンサーとモーターだけにします。修正のじゃまになってしまうので、バッテリー残量やIMUの測定値は保存しません。

「append」という新しく作った関数です。 この関数を呼ぶと、CSVファイルにデータを一件だけ書き込むことができます。同時に現在の日付と時間も書き込みます。
すでに同じ名前のファイルが存在する場合には、ファイル内のデータの最後に追加で書き込みます。 引数の「name」はセンサーやモーターの名前です。 引数の「datalist」はデータを格納した配列(リスト)です。
ちなみにThonnyでは「¥(円)」は「\(バックスラッシュ)」として表示します。

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

実行中の様子です。 1秒おきにカラーセンサーの値を読み取ります。
センサーの測定値はコンソール画面(シェル)に表示されます。Ctrl+Cキーを押したら、プログラムは止まります。

「app.py」と同じ階層に「log.csv」というCSVファイルが作成されます。「log.csv」をテキストエディタで読み込むと、このような画面になります。
CSVファイルの書式は、一つ一つのデータを「”(ダブルクォーテーション)」で囲みます。データとデータの間には「,(カンマ)」を入れます。 そして、改行すると、データの集まりを区切ることができます。

◆ CSVファイルを開く

CSVファイル(log.csv)を開くには、表計算ソフトを使います。ここではフリーソフトの「OpenOffice Calc」を使うことにします。
CSV形式のファイルを開くと、最初にデータの構造を選択するためのダイアログが表示されます。 ここでは「コンマ」のチェックボックスをオンにして、「OK」ボタンを押します。

CSVファイルを開いた様子です。カラーセンサーの測定値の表が出来上がりました。
これで終わりにしても良いのですが、このままでは数値が並んでいるだけで、内容が伝わりにくいです。

センサーの測定値のフォーマットは公式資料の「SPIKEプライム・プロトコル」に書かれているとおりです。
https://lego.github.io/spike-prime-docs/messages.html
カラーセンサーの場合は先頭から3番目のデータがカラー番号です。

カラー番号(-1~+10)を「色の名前」に置き換えて表示します。ただし、困った問題として、色の名前が資料によってバラバラで統一されていません。
図の左側は海外のレゴ エデュケーションの公式サイトに書かれているカラーセンサーの資料です。図の右側は「SPIKEプライム・プロトコル」に書かれている資料です。両者を比較するお、半分近くが食い違っています。
実際に試したところでは、カラー番号の2番と5番と8番はセンサーが返すことがない値なので、空欄にします。色の名前の「アズール」や「ヴァイオレット」は日本では馴染みがないので、別の名前に変更することにします。結果として、次のようになりました。
・-1: No object(なし)
・ 0: Black(黒)
・ 1: Purple(紫)
・ 3: Blue(青)
・ 4: Sky Blue(水色)
・ 6: Green(緑)
・ 7: Yellow(黄)
・ 9: Red(赤)
・10: White(白)

カラー番号から「色の名前」に変換して表示する機能を追加します。画面の右側にあるのが「カラー番号」と「色の名前」の対応表です。カラー番号から「色の名前」を求めるには「VLOOKUP」という関数を使います。VLOOKUP関数の書式は次のとおりです。
=VLOOKUP(検索する値;検索範囲;使用する列数)
引数の「検索する値」は検索したい内容です。ここではカラー番号を指定します。
「検索範囲」は検索するセルの範囲です。ここでは対応表の範囲を指定します。
「使用する列数」は検索がヒットした時に取り出す値が存在する列のことです。選択範囲の一番左側を「1」列目として考えます。ここでは色の名前を取り出したいので「2」列目を指定します。
CSV形式のファイルでは関数を使えないので、「ods」というファイル形式で保存し直す必要があります。

この記事ではカラーセンサーだけを使いましたが、その他のセンサーも使用できるので、ためしてみてはいかがでしょうか。以上でセンサーの入力方法については理解できたかと思います。次回にはモーターの制御を行ってみたいと思います。
今回作成したプログラム

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