2025年1月27日
022-1.SPIKE&AIカメラ入門-第4回「AIカメラをラージハブに接続する」
この連載では「レゴ エデュケーションSPIKEプライム(以下、SPIKE)」と「ハスキーレンズ(HuskyLens)」を組み合わせたロボットの作り方を紹介したいと思います。ハスキーレンズとはDFROBOT(Zhiwei Robotics Corp.)というメーカーが開発した特殊なカメラ(AIカメラ)です。このカメラを使って、物体追跡、物体認識、ライン追跡などの機能を備えたロボットを作ってみましょう。この連載では最終的にハスキーレンズをSPIKEプライムのラージハブに接続して動かしたいと思います。
ハスキーレンズの基本的な情報については、メーカーのWikiページを読むことをオススメします。ページのURLは以下のとおりです。
https://wiki.dfrobot.com/HUSKYLENS_V1.0_SKU_SEN0305_SEN0336(文/松原拓也)
◆ レスポンスを解読する

前回の続きです。 前回は物体追跡(Object Tracking)モードに設定したハスキーレンズに「get object by ID」コマンドを送信して、レスポンスを受信した、というところで終わっていました。
レスポンスは暗号のようになっていて、そのままでは意味不明です。そこで、公式のライブラリ「huskylib.py」を参考にして解読してみました。

こちらが解読した結果です。
レスポンスは最初に16バイトだけを受信します。受信データの6~7バイト目に「認識した物体の数」が記録されています。 数が「0」の場合、認識できなかったという意味になり、データは終了です。 数が「1」の場合、1つ認識したという意味となり、続きの16バイトを受信します。受信データの6~13バイト目には認識した物体の「X座標」「Y座標」「幅」「高さ」が記録されています。 カメラの解像度は320×240ピクセルなので、座標の範囲は(0,0)~(319,239)となります。
以上の点をふまえて改良したのが「huskylens_pico.py」というテストプログラムです。プログラムは3ページ目の下のリンクからダウンロードすることができます。 Raspberry Pi Picoとパソコンを接続して、Thonnyで実行します。この写真が実行した結果です。ハスキーレンズと通信を行い、認識した物体の座標を画面に表示します。これで公式のライブラリを使わず、100%自前のプログラムでハスキーレンズと通信ができるようになりました。
◆ ラージハブを接続する

ラージハブと接続するため、ハスキーレンズの電源の供給方法を見直します。
前回はバスパワーは「VBUS」端子から5V電源(USBのバスパワー)を取り出して、ハスキーレンズを動かしていました。
これを「3V3(OUT)」端子からの3.3V電源(DC/DCコンバータの出力)でハスキーレンズを動かすように変更します。

ここで必要となるのが、「ショットキーバリアダイオード」です。秋月電子通商などで売ってます。 部品は円筒形で、両側から端子が出ています。黒っぽい印が付いている方がカソード。印の付いていない方がアノードです。アノードからカソードに向かって電気が流れます。

ラージハブと接続するためのコネクタを追加しました。ラージハブのVCCの電圧は実測したところ3.1Vでした。これを3.3Vに引き上げて、ハスキーレンズとRaspberry Pi Picoの電源として使います。 ショットキーバリアダイオードは電気の逆流を防ぐために使います。
回路の仕組みについては、以前連載した「センサー自作入門」で解説しています。

回路図のとおりに接続すると、こうなります。
ラージハブのポートAにRaspberry Pi Picoを接続します。ポートBにモーターを接続します。そして、ハスキーレンズをモーターの回転軸に取り付けます。これでカメラの向きが動くようになりました。
「センサー自作入門」で作成した「自作きょりセンサー(DIY Distance Sensor)」を改造して、ハスキーレンズを接続させるプログラムを作ってみました。ファイル名は「diydistsensor.py」です。プログラムは3ページ目の下のリンクからダウンロードすることができます。
Thonnyを使って、プログラムをRaspberry Pi Picoに書き込みます。
◆ カメラで物体を追跡する

続いて、SPIKEアプリを起動して、ラージハブ側のプログラムを用意します。
自作きょりセンサーではハスキーレンズが「認識した物体のX座標」を「きょり0~99(cm)」として入力します。「カメラの中心」は「きょり50(cm)」です。そこで、50未満の場合はモーターを反時計回り、50以上の場合はモーターを時計回りに回転させるようにしました。
残念ながらY座標は受信することができません。きょりセンサーではなくて、チルトセンサーに化けたらY座標も伝えることができますが、その場合はPythonでプログラムを作る必要があります。

実行すると、ハスキーレンズのカメラが認識した物体を追跡します。これで見事、ハスキーレンズをラージハブにつなぐことができました。
3度ずつモーターを回転させているので、カメラの動きがぎこちないです。これはすぐに改善できると思います。
現状の問題点として、ショットキーバリアダイオードの発熱が激しいです。電流が流れすぎ→ハスキーレンズが電気を食いすぎるのが原因です(3.3V時は320mA)。このままでは安心して使えないので、解決策を考えないといけません。
今回作成したプログラム(Raspberry Pi Pico用)
当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。