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

前回はRaspberry Pi Pico(ラズパイ)とラージハブ(ハブ)との接続が完了しました。これを「DIY Distance Sensor」と呼んでいます。
今回はラズパイ側のプログラムを作ります。

接続の状態はこうなります。
PC(パソコン)とラズパイはUSBケーブルで接続したまま使います。ダミー(にせ)の測定値を返します。

将来的には、このようにVCC(電源の端子)をつないで、PCが無くても動くようにしたいと思います。 さらにラズパイには何かのセンサーを付けて、本当の測定値を送れるようにします。
これを作るにはいくつか技術的なハードルがあるので、次回に行いたいと思います。 今回はPCからラズパイの電源を供給します。
◆ プログラムの実行

https://github.com/Afrel-SPIKE-Prime-tec/diydistsensor_pico
メニューから「Download ZIP」を選択して、ダウンロードします。 ダウンロードが完了したら、ZIPファイルから「diydistsensor.py」というファイルを取り出します。

この「DIY Distance Sensor」はハブから見ると「きょりセンサー」として認識されます。つまり、「にせもの」のきょりセンサーです。
こちらは「本物」のきょりセンサーをつないだプログラムの例です。たとえば、きょりセンサーが「6cm」と測定した場合、ハブのLEDに「6」と表示されます。

プログラムを実行します。 ラズパイとハブを接続します。ハブの電源を入れておきます。
パソコン上で「Thonny」を立ち上げて、「diydistsensor.py」を開きます。
そして、「F5」キーを押す、もしくは「実行→Run~」を選択します。この時、ラズパイをPCに接続した状態にしておきます。インタプリタを「Raspberry Pi Pico」に設定しておきましょう。

Shell(シェル)画面にプログラムの実行結果が表示されます。メッセージの意味は次の通りです。
・「start」は「ラズパイ側のプログラムの実行開始」。
・「detect」は「ハブからの接続開始の信号を受信」。
・「data error」は「接続失敗」。このメッセージは数回出る可能性があります。
・「connect」は「ハブとの接続成功」。
「connect」と表示されたら成功です。表示されない場合には、接続が間違っていないか確認してみましょう。

ラズパイ側のプログラムは次のような処理を行っています。かなり専門的な内容なので、難しいと思った場合は読み飛ばしてもかまいません。
(処理1)ハブがラズパイを探します。20msの周期でハブ→ラズパイへ「0xF0」を送信します。通信方式はUART。ボーレートは2400bpsです。これをラズパイ側が一定回数受信できたら、「ハブが存在する」と判断します。「detect」と表示して、(2)に進みます。
(処理2)ラズパイがハブへセンサー情報を送信します。まず、「0xF0」を送信して、ラズパイ→ハブへ約500ms Low信号を送ります。送ったらHighに戻します。続いて、センサー情報を送信して、(3)に進みます。センサー情報は533バイトありますが、最初の「0x00」は意味がないので、実質的には532バイトです。
(処理3)ハブ側がセンサー情報を受信できた場合には、ハブ→ラズパイに「0x04」が送信されます。この直後、ボーレートを115200bpsに変更します。「connect」と表示して、(4)に進みます。もし、「0x04」が受信できない場合、接続失敗と判断して、(1)へ戻ります。
(処理4)ハブからのコマンドを待ちます。コマンドを受信した場合は(5)に進みます。 一定時間コマンドが到着しない場合はエラーと判断して、(1)へ戻ります。
(処理5)ハブにレスポンスを送ります。レスポンスのデータにきょり(0~255)の値が含まれています。(4)に戻ります。

実行中の様子です。
LEDに「1」~「9」の値が表示されます。値は「1」→「2」→「3」のように増えていきます。この値はダミーの「きょり」です。
たまに値が1つ飛んでしまいことがあります。これは通信のタイミングと表示のタイミングがズレているために起きる現象だと思います。今のところは、解決策が見つかりません。
現時点では、まだまだ使い勝手が良くないと思いますので、次回には改善したいと思います。
当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。