2025年1月27日
020-1.SPIKEセンサー自作入門-第9回「チルトセンサーを自作する」
この連載では「レゴ エデュケーションSPIKEプライム(以下、SPIKE)」で動作するセンサーの作り方を紹介します。センサーを自作して、市販のセンサーにはできないような面白い使い方を考えてみましょう。センサーを作るには電子工作のスキルが必要となります。様々な危険がともないますので、充分に注意して行いましょう。なお、以下の内容によって生じた損害については保障できかねますのでご了承ください。
SPIKEアプリおよびハブOSは、SPIKE App Legacyを利用しています。SPIKE App3での動作は未確認となりますのでご了承ください。(文/松原拓也)
◆ チルトセンサーとは

今回はRaspberry Pi Picoを使って、「チルトセンサー」の互換品を自作してみたいと思います。
チルトセンサーとは「レゴ エデュケーションWeDo2.0」の基本セットに付属するセンサーです。このセンサーはX・Y軸の傾きを検出することができます。

チルトセンサーはSPIKEのラージハブ(以下、ハブ)に接続しても、そのままでは使うことができません。 しかし、SPIKEアプリでPythonのプログラムを工夫すれば、ハブでもチルトセンサーを読み取ることが可能です。
写真のようにプログラムを作成しましょう(ReadTiltSensor.llsp)。「hub.port.ポート名.device」クラスからオブジェクトを作成して、「オブジェクト.get()」という関数を呼び出すだけで、センサーの値を取得することができます。

実行中の様子です。 センサーのX・Y軸の傾きをライトマトリクスの点として表示します。 センサーが傾いていない場合、点は中心に表示されます。
このプログラムは最後に使用します。
◆ チルトセンサーの通信方式

チルトセンサーの回路図です。
「きょりセンサー」の回路と全く同じです。本来ならば、なんらかのセンサーを取り付けるべきですが、今回はダミーの値を返すため、センサーは何も付けません。

回路を組み立てるとこうなります。

チルトセンサーの通信仕様については、Philippe Hurbain(Philo)さんという方が独自の調査結果を次のページで公開しています。
https://www.philohome.com/wedo2reverse/protocol.htm
これによると、チルトセンサーとハブが最初に接続されると、2400bpsで通信を行います。この情報を参考にして、プログラムを作成します。

「Thonny」を使って、Raspberry Pi Pico側のプログラムを作成します(diytiltsensor.py)。 チルトセンサー側の送信内容はこのように配列に格納します。これでRaspberry Pi Picoがチルトセンサーになりきることができます。

ハブとチルトセンサーの接続した後の転送中のグラフです。ここでの通信速度は115200bpsです。ハブはチルトセンサーに対して1バイトのコマンド(0x02)を送ります。すると、チルトセンサーは4バイトのデータを返信します。このデータ内にX・Y軸の傾きが含まれています。
「ヘッダー」は常に16進数の0xC8です。「サム」はデータの転送ミスを検出(サムチェック)するための値です。サムの値は特殊な式で計算します。

反転している部分がダミーの測定値を作成している処理です。 変数「sensor_value_x」「sensor_value_y」にはセンサーの傾きを格納します。単位は度です。ここでは、一度実行するたびに1度ずつ変化するようにします。変化の範囲は-45~+45としました。
プログラムが完成したら、「main.py」というファイル名でRaspberry Pi Pico本体に保存します。これで、電源オン時にプログラムが自動的に実行されます。
◆ 実行

実際に動かしてみましょう。
最初に作成した「チルトセンサーの読み取りプログラム(ReadTiltSensor.llsp)」をハブ側で実行します。 すると、測定値(ダミーのX・Y軸の傾き)が表示されます。測定値に合わせて、ライトマトリクスの点が動きます。

ハブとパソコンをUSBケーブルで接続している場合、コンソールに測定値(X・Y軸の傾き)が表示されます。単位は度です。値は-45~+45度の範囲で変化します。 センサー側は測定値を1度ずつ変化させています。しかし、ターミナルの値は1度ずつ変化していません。つまり、プログラムの流れとは関係なく、Raspberry Pi Picoとハブが通信しているということになります。
以上でチルトセンサーを自作することができました。 次回には、実際にセンサーを付けて、ダミーではない測定値を転送してみたいと思います。
今回作成したプログラム(Thonny用/SPIKE App用)
当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。