マイクロビットでできること 〜「ArUcoマーカー」でマイクロビットロボカーを操作する

電子工作の作例

先日、PCのカメラで検知した「ArUcoマーカー」の座標情報をマイクロビットで扱う方法を検討しました(記事は こちら)。
以下のようなものです。

  • PCとマイクロビットをUSBケーブルでつないでおきます。
  • カメラの利用やマーカーの検知、マーカー座標の取得はPythonスクリプトで行います。
  • 取得したマーカー座標情報を、シリアル通信でマイクロビットに送信します。
  • マイクロビットでは、シリアル通信で受信したマーカー座標情報をつかって、すきなプログラムをつくることができます。

今回は、この機能をつかって、以下のようなものをつくってみたいと思います。

  • 「マイクロビットロボカー」と「ターゲット」にArUcoマーカーを貼り付けます。
  • ふたつのマーカーの情報に基づいてロボカーを走らせ、ターゲットを画面の外に押し出します。


カメラ利用やマーカー座標取得のためのPythonスクリプトは こちら の記事のものをそのままつかいます。1秒ごとにふたつのマーカー(ID0、ID1)の座標情報(X座標、Y座標、向き)をシリアル通信で送信します。
マイクロビットロボカー用のプログラムは こちら の記事のものをそのままつかいます。無線で「1」を受信したら「前進」、「2」で左折、「3」で右折、「0」で停止するものです。
マイクロビットロボカーには「ID0」のマーカーを、ターゲットには「ID1」のマーカーを貼り付けておきます。

PCにつながっているマイクロビットが、ロボカーを操縦するためのコントローラーになります。Pythonスクリプトからシリアル通信で送られてきたマーカーの座標情報を元に、ロボカーの進行方向を決め、それを無線でロボカーに送信します。

コントローラー用のプログラムはこちらです。

「最初だけ」では、PC(Pythonスクリプト)とのシリアル通信、およびロボカーとの無線通信のための初期設定を行っています。
「シリアル通信 つぎのいずれかの文字を受信したとき」では、受信したデータからふたつのマーカーの座標情報を取り出しています。「x0」「y0」「a0」がID0のX座標、Y座標、角度で、「x1」「y1」「a1」がID1のX座標、Y座標、角度です。
いずれかのマーカーが検知できなかったとき(「x0」または「x1」が「-1」のとき)は、ロボカーを停止させます(無線で「0」を送信)。ふたつのマーカーを検知できたときは「ロボカー操作」関数を呼び出します。
「ロボカー操作」関数では、まず最初に、マーカーID0(ロボカー)に対するID1(ターゲット)の角度を計算して「angle」という変数に格納します。次に、「angle」とID0(ロボカー)自身の角度の差を計算して「diff」という変数に格納します。
この「diff」の値に基づいてロボカーを操作します。「diff」が「-10」より小さければ(ロボカー正面に対してターゲットが左にあれば)、ロボカーを0.1秒だけ左折させます。「diff」が「10」より大きければ、0.1秒だけ右折させます。どちらでもなければ(ターゲットがロボカー正面にあれば)、ロボカーを0.5秒だけ前進させます。

ロボカーの電源スイッチをONにしておきます。Pythonスクリプトを起動し、カメラ画像の写っているエリアにロボカーとターゲットを置くと動作が始まります。

動作の様子は以下のとおりです。

結構いい感じに動いています。
通信の頻度やロボカーの動作速度を調整すれば、もっとキビキビと動かすこともできそうです。

 

なお、私がマイクロビットの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。


初心者向けから、比較的高度なものまで、さまざまな情報が記載されているだけでなく、子供向けの作例も多数掲載されていますので、「プログラミング教育」のための題材さがしなどにもおすすめです。