microbitを2個使用して、無線でロボットカーをコントロールします。左右のサーボ回転方向・速度を無線で制御し、前進・後退・旋回・停止をするプログラムを組みます。今回はRing:bit Carというキットを使用しますが、プログラムの組み方は他のロボットカーに応用できると思います。
Ring:bit Carとは
「Ring:bit Car」は、micro:bitを使用した2輪走行ロボットカーを作成するキットです。このようなキットは多数販売されていますが、Ring:bit Carはお手頃価格(約3千円)で組み立てが簡単です。また、MakeCodeでプログラミングするための拡張機能が準備されており、直感的にわかりやすいプログラムを組みことができます。さらに、アクセサリーパーツ(超音波センサ、トラッキングモジュール、LEDライトバー)も販売されていますので、より高度なロボットカーを作成することもできます。購入はAmazonもしくは、製造元のElecfreaksのオンラインストアでできます。
ハードウェア構成
ロボットカーの駆動は、360°回転サーボ「EF90D」を2個使用します。タイヤは、このサーボに直接取り付けられるようになっています。2輪だけだと転倒するので、車体を支えるためのキャスターボールがあります。このサーボモータとmicro:bitを接続するために、拡張ボードを使用します。あとは、micro:bitに拡張ボードと電池ボックスを接続するためのRing:bitボードがあります。主なキットの構成はこれだけです。キットとは別に、ロボットカー用のmicro:bitと、コントローラ用のmicro:bitを用意してください。
プログラミング準備
Ring:bit Carをプログラミングするために、MakeCodeの拡張パックをダウンロードします。MakeCodeを起動して、「高度なブロック→拡張機能」をクリックします。すると、様々な拡張機能が表示されます。今回使用するのは、下記画像にある通り、「RingbitCar」です。
拡張機能をインストールすると、下記画像のようにRingbitCarのブロックが追加されます。
動作確認用プログラム
Ring:bit Carの組み立てが完了したら、下記のプログラムで動作確認してみましょう。
最初に、「左の車輪を設置するP1 右の車輪を設置するP2」を実行します。これで、microbitの出力端子P1,P2と左右のサーボを関連付けています。次に、ボタンAが押されたときに「急速な前進」、ボタンBが押されたときに「急速な後ろ向き」とします。
プログラムができたら、micro:bitにダウンロードして動かしてみてください。もし、動かなければ、タイヤやサーボの駆動部分が車体に接触していない確認してください。
無線コントロールプログラム(送信側)
まずはコントローラ側のプログラムを作成します。無線通信については、「micro:bitでSTEM教育:無線通信機能を使ってみよう」で基本的な使い方を説明していますので、ご参考にしていただければと思います。
最初に、無線のグループを設定します。これは受信側プログラムと同じ番号にしてください。そして、「ずっと」ループで、無線で加速度Xを送信します。これは、micro:bitを右に傾けたときに最大+1023の値となります。反対に、左に傾けると、最小-1023の値になります。
次に、ボタンを押したときに、前進・後退・停止の動作となるように、値を設定します。
- ボタンAが押されたとき → 前進(move=1を送信)
- ボタンBが押されたとき → 後退(move=-1を送信)
- ボタンAとBが同時に押されたとき → 停止(move=0を送信)
無線コントロールプログラム(受信側)
ロボットカー側のプログラムを作成します。最初に、動作確認用プログラムと同様に、「左の車輪を設置するP1 右の車輪を設置するP2」を実行します。無線のグループは、送信側と同じ番号を設定します。変数「R_SPEED」「L_SPEED」「delta」は、このあとで使用しますが、送信側から値が送られてくるまでは、これらの変数値は不定となってしまいます。そのため、最初に0で初期化しています。
「ずっと」ループでは、左右のサーボ回転速度を「move × L_SPEED」のように設定します。この値がプラスだと前進方向にサーボが回転し、マイナスだと後退方向に回転します。変数moveとL_SPEEDは送信側の値を受信して決めます。
「無線で受信したとき」というブロックで、送信側の情報を条件分岐して、各変数に演算代入します。加速度Xは、送信側から”X”という名前で送信されますので、「もし~なら」で条件分岐します。加速度の値の範囲は-1023~+1023なのに対して、速度を設定するブロックの入力値範囲は-100~+100です。ここで、便利なのが数値をマップするブロックです。このブロックは、「高度なブロック→入出力端子」にあります。このブロックを使用して、現在の-1023~+1023を-50~+50の範囲に変換しして、変数deltaに代入します。そして、R_SPEEDを「50-delta」、L_SPEEDを「50+delta」とします。
次の条件分岐は”move”の場合で、受信側ブロックでも変数をmoveとして、値をそのまま代入します。
実演
それでは、実際に動かしてみます。
コメントを残す