2つのマイクロビットで1つはコントローラ1つはモーター制御
このバギーキットはkitoronik社からリリースされている「Line Following Buggy for the BBC micro;bit V2.0」です。2つのmicrobitを使って、1つはリモートコントローラーとして、もう1つは本体に接続して受信とモーター制御を行います。
今回もプログラムはmakecode(メイクコード)を使って作ります。
https://makecode.microbit.org/
【STEP.1】まずは仕様を決める
マイクロビットは入門用のコンピュータですから手探りでいろいろなものを組み立てていくのが良いと思います。ものづくりは「習うより慣れろ」ですので、大まかな仕様だけ決めたらすぐに作業に取り掛かりましょう。
今回最初に決めておきたいのは、どのボタンを押したらどのように動作するかというものです。マイクロビットには標準でボタンが2個しかついていませんので、2個の組み合わせで操作することにします。
今回のコントローラーの仕様
まず、左のボタンを押したら左に曲がることにします。そして右ボタンを押したら「右」、まっすぐに進む場合は2つのボタンを同時に押すことにします。何もボタンを押していないときにはストップします。
※リモコン戦車など、2つのモーターの回転差でターンさせる場合、通常ボタンを押したモーターが駆動するため、左右の動きが今回のものと逆になります。直感的にどちらが操作しやすいかでプログラムを変更すると良いでしょう。
microbitにはせっかくLEDディスプレイがついていますので、進行方向を示す「矢印」も表示させることにします。
【STEP.2】プログラムの製作とソフトの仕様
動作の仕様を決めたら今度はソフトの仕様も考えていかないといけません。まずはどのような仕組みで動かすのか考えてみます。microbitの右ボタンを押すと、「右に曲がる」という信号が電波に乗ってmicrobitから飛んでいきます。この際に受信側で「右に曲がる」という情報をキャッチして、モータが右に曲がるように動作させます。
この「右に曲がる」という信号を出す際に、この5文字の「右に曲がる」というデータを送るのはちょっと効率が悪いので、方向を数値で決めます。
- まっすぐに進む(A+B)= 1
- 右に曲がる(A) = 2
- 左に曲がる(B) = 3
- 止まっている状態 = 0
こうすれば1文字分のデータだけ送ればよいので、通信も簡単に行えます。受信するmicrobitでは数字の「1」というデータが届いてきたらまっすぐ進むため、2つのモーターを順方向に回せば左右とも同じだけ回転するのでバギーはまっすぐ進んでいきます。
無線を使う時には「送受信」のペアを作る
まず最初に無線のグループを設定して「送信」「受信」のペアを作ります。送信したデータをどの装置でも受信してしまっては動かさないはずのものが動いたりしてちょっと困ります。
makecodeの設定では「0~255」までの256組の番号を指定してペアを作ります。
まずはmakecodeの画面をブラウザから呼び出して、ペアの設定を行いましょう。
画面が開いたら「新しいプロジェクト」をクリックします。
まずは送信側コントローラーを作る
続いて画面中にピンク色の「無線」というものがあるのでこの中から「無線のグループを設定(1)」のブロックをドラッグ&ドロップします。
無線の設定は最初だけ行えばよいので「最初だけ」という青いブロックに入れておきます。このブロックの右端の数値がペアになる番号です。今回は「1」にしておきます。後で受信機の設定も1にすることで1に設定したもの同士が通信できるようになります。
ボタン操作によって数字を送信する
次に送信機のプログラミングを行います。バギーの操作は電源を切るまでずっと続ける操作になるため「ずっと」というブロックの中にプログラムを作っていきます。もし「ずっと」のブロックが表示されていないときにはブルーのボタン「基本」の中に入っています。
ではまず、まっすぐ進むというプログラムを作ってみます。
まっすぐは「Aボタン」と「Bボタン」を同時に押すという事にしました。その際には「1」という信号を受信用マイクロビットに送り、「1」を受け取ったmicrobitはまっすぐ進むためのプログラムを動かします。
この場合「条件分岐」を使って「もしA+Bが押されたら、無線グループ(1)で数値(1)を送信」というプログラムを作ります。
この「もし~なら~する」という条件分岐は「ループ」と「論理」に入っています。どちらを使うかと言うと今回は「論理」に入っているものを使います。なぜなら、このあと条件が続くからです。条件が1つの場合は「ループ」に入っているもので良いですが、他にもAだけ、とかBだけ、とか条件がある場合は「~でなければ」という更なる条件が付いているものを使います。
この条件分岐のブロックは左下についている「+」ボタンをクリックして、条件を追加していけるのです。
広がったら更なる条件を付けていきます。
先ほど決めた仕様にそって更にプログラムを入れていきましょう。
ボタン「A」が押されたら数値の「2」を送信します。
ボタン「B」が押されたら数値の「3」を送信します。
左下の「+」のボタンを押して条件を増やすことができます。microbitにはボタンが2つしかありませんので、ボタンを押さないという操作も入れて全部で4つの条件分岐に分かれることになります。
最後の「0」を送信すると止まっている状態にするという事です。何もボタンさえ押さなければ、止まっている状態という事になります。
基本的なコントローラー側でのプログラミングはとりあえず以上ですので、画面下にあるプログラムの名称を決めて保存できる場所がありますので、今回は「Controller01」という名称にして、いったん保存しておきます。
まだこちらのLEDディスプレイの表示設定を行っていないので、後でまた追加をできるように、ダウンロードしてプログラムを取っておきます。保存すると通常は「ダウンロード」フォルダに保存されます。
続いて受信側のプログラムを考えていきます。
受信側のプログラムにはモーター用のブロックを追加!
続いて受信側のプログラムを考えます。その前にライブラリという話しをしておきます。プログラムを組む際には「ライブラリ」と呼ばれる用途によって良く使うプログラムをまとめたすでに出来上がっているプログラムがあります。
今回の例で言うと、モーターを動かすというプログラムを1から全て書くとちょっと大変ですが、モーターを動かすというプログラムは多くの人が同じように使いたいので、すでに作ってくれた人の機能を呼び出すだけにしたいところです。
makecodeではこのモーターを動かすためのブロックを別途読み込めます。ここではkitronikのモーターコントロール用ブロックを追加してみます。
先ほどまで作っていたプログラムがキャンパス上に残っている場合は、画面右上の「ギア」のマークのボタンをクリックして「リセット」をクリックするとプログラムが消えて新しいプロジェクトを設定する画面が表示されます。
再度「新しいプロジェクト」をクリックして、新規の画面を開きます。
次にモーターコントロール用のブロックを読み込んでおきます。ブロックのカテゴリの一番下にある「高度なブロック」をクリックします。高度なブロックのリストが表示されますが、それを更に一番下までスクロールさせて「拡張機能」をクリックします。
すると拡張機能の一覧が表示されます。今回利用するモータードライバーはkitronik社から発売されているものですので、この名称で検索します。画面上部の検索窓に「kitronik」と入力してEnterを押すとkitronikに関するブロック(ライブラリ)が沢山表示されます。
この中でも今回はモータードライバ用のものをつかいますので、kitronik-motor-driverをクリックします。
※microbitで利用できる様々な機能拡張がここで探せます。
これで画面上にMotor Driver という項目が出来上がりましたので、モーターに関する機能が読み込まれたわけです。
本来であれば、このMotorDriverの中にあるブロックは自分でつくらなければならないものですが、これを最初から作るのはとても大変です。
プログラムを始めたばかりの頃はまずはこのようにいろいろなライブラリを活用してプログラムを作ることに慣れていく事が大切です。
無線で受信したデータを格納する「変数」
送信の時に一番最初に設定した「最初だけ」の項目では、送信用マイクロビットと無線の番号を合わせる必要がありますので、同様に(1)を設定しておきます。
問題は次です。
送信機から送られてきたデータは今回は「0(止まった状態)、1(まっすく)、2(右)、3(左)」のどれかです。まずこのデータを受け取るという作業が必要です。
そのために「無線で受信した時」というブロックを使います。ここで受け取ったデータを「変数」と呼ばれる入れ物に一旦入れておくことにします。あとは、その変数に何が入っているのかを条件分岐で照合することで、受信機側からモーターにアクションを起こします。変数の名称は自分で好きな名前を付けられます。
ここでは、「buggymove」という名称にしておきます。「変数」ボタンをクリックして「変数を追加する」をクリック、変数名を設定して、「OK」をクリック
変数が出来上がると、「変数buggymoveを(0)bにする」というブロックが出来上がっていますので、先ほど配置した「無線で受信した時」というブロックの中に入れます。
ここで「無線で受信した時」というブロックには「receivedNumber」という変数があり、実はコントローラーから送られてきたデータの事を指しています。しかしこのままだとプログラム上で利用できないため、先ほど作ったbuggymoveという入れ物に入れて、以降プログラムの中ではbuggymoveの中に、無線で受け取った「0,1,2,3」のいずれかの番号が入っていることになります。
ここで、「変数buggymoveをreceivedNumberにする」というプログラムを作るためにreceivedNumberというブロックをドラッグしてすぐ下にある「(0)」の上に重ねると、図のようなブロックが出来上がります。
続けてプログラムを作っていきましょう。
今度は、ずっと繰り返すプログラムの中で無線で受け取った指示によりモーターを動作させるというものです。0~3までの数字が送られてくるわけですが、それぞれ対応を考えていきます。
0が送られてきたとき、このバギーに積んでいる2つのモーターはOFFの状態にします。このブロックはモータードライバーの中に入っていますので、配置します。
まずは、条件分岐が4段階ありますから「論理」の中にある「もし~なら・・・でなければ」を利用します。最初は受け取ったデータbuggymoveが「0」だったらモータ2つをOFFにするというプログラムを図のように作ります。
「もし~ 」の後の「真」の部分には条件を指定する「(0)=▼(0)」のブロックをドロップして、「変数」から先ほど作った「buggymove」という変数を持ってきて入れておきます。
続いて「Moter Driver」から「Turn off motor (1)」を呼び出し、同様にもう一度同じパーツを設置して「1」を「2」に切り替えます。これで、モーターの1,2はOFFになっている、つまり何もしていないときには止まっているという状態ができました。
条件を増やす場合には「もし~」のブロック左下の「+」をクリックして増やします。次は送信機から送られてくるデータが「1」の場合は直進するという事ですので、両方のモーターを同じパワーで動かせばよいわけです。
まずは変数buggymove = 1 の場合というブロックを作りますが、先ほど最初に作ったものをコピーして使いましょう。「buggymove =0」という六角形のブロックをクリックすると黄色く縁取りされますので、この状態でキーボードの「Ctrlキー」+「Cキー」を押すことでコピーされ、続けて「Ctrlキー」+「Vキー」を押すとブロックがコピーされます。
コピーされたブロックを「でなければもし<>なら・・・」という部分にもっていくと配置可能です。
「moter(1) on direction forward speed(0)」というブロックが「Motor Driver」の中にはいっていますので、これもモーター2個分呼び出してきて配置します。Speedは100%にします。図のように配置ができれば良いでしょう。directionはforwardに設定しておきます。
モーターの番号も「1」と「2」がきちんと設定されていることを確認してください。
続いて右に曲がる、左に曲がるという設定も行っていきます。
曲がり方を考える。
2輪がそれぞれ駆動して曲がる場合、片方のモーターを止めると反対側の車輪が進むため曲がることができます。
この場合、片方をゼロにすれば急角度に曲がることができますが、緩やかに曲がるとより乗り物らしい動き方になります。ここでは曲がる際に滑らかに曲がるように、片方のモーターを完全に止めるのではなく、20%くらいのパワーを残して設定してみます。
左右のタイヤのパワーバランスを調整することでバギーの曲がり方が変わりますので、自分のお好みのバランスでコントロールすると良いでしょう。
ここまでで最低限、リモートコントロールとしてのプログラムは完成です。それぞれに入れて動作を確かめてみましょう。曲がり方のパラメータなどを変更しても面白いかもしれません。
【STEP.3】基本プログラムに機能を追加
ここまでで基本的にコントロールするという機能は付けましたが、操作をしているときに、押したボタンによってどういった動きをしているかをLEDディスプレイに表示することで、現在どんな指示を実行しているのかが分かります。
ここでは、LEDディスプレイに矢印を表示させて方向を示します。
表示は以下のようにします。
- 止まっているとき「✖」を表示
- 直進しているとき「↑」を表示
- 右に曲がるとき「→」を表示
- 左に曲がるとき「←」を表示
LEDのコントロールを行うには「基本」の中にLEDのパネル表示そのままが入っています。
今回は受信側の設定を起こってみますので、送信側は自分なりに考えて設定してみてください。
ちなみに矢印は「基本」-「その他」の中に用意されています。
「0」を受け取った時にモーターを止める動作の後に「LED画面に表示パネルを設置して✖」を描いてみます。
プログラムの実行順番に注意!
さて、条件分岐の中にさらにLEDディスプレイの表示を追加したのですが、プログラムは基本的には上から下に向かって順番に処理を実行していきます。
今回のサンプルプログラムでは、モーターの制御を行った後にLED画面に表示を行う順番にしてありますが、この順番を逆にして、LED表示を先にしてモーター制御を行うとどうなるでしょうか?
microbitの5×5のディスプレイに収まる今回の矢印くらいの内容であればさほど変わりがないかもしれませんが、「右に曲がります」などの文字を流す場合、この文字を流す処理をおこなってから曲がり始めますので、コントロールするのにちょっと遅延が発生して操作がしずらくなってしまいます。
この違い、是非試して体験してみましょう。
「送信」「受信」にLEDディスプレイを表示
受信プログラムにLED表示を設定したら、送信プログラムももう一度読み込んで修正してみましょう。まずは、受信プログラムを「Controller-R」などの名称にして保存して、先ほど作成した「送信プログラム」も呼び出してみましょう。
送信機側のプログラムを再度呼び出す
先ほど制作した送信側のプログラムにもLEDディスプレイのプログラムを入れてみましょう。まずは、makecodeのページ右上の「ホーム」に戻り、ホーム画面の右端にある「読み込む」ボタンを押して先ほど名前を付けた送信側のプログラムを呼び出します。
受信側に入れたプログラムを参考に、どの位置に入れるか考えながらやってみます。
それぞれ条件分岐がありましたので、その分岐の中で数値を送った後にLEDを表示させるようにするのが良いでしょう。
送信側で作ったLEDディスプレイの形を無線で送ることもできますが、それだと通信に時間がかかるため、送信側は送信側で、受信側は受信側で表示の処理を行う事でネットワークへの負荷をなくしています。
ちなみに、受信側のマイクロビットには最初だけ「START!」という電源を入れたときにメッセージが流れるようにもしてあります。無線のグループ設定を行ったブロックと一緒の場所に入れるだけですので、こちらも試してみましょう。
ここまでで出来上がったプログラムを試したのが以下の動画です。
リモートコントロールで学ぶモーター制御は面白い!
このキットは、Using Line Following Buggy for the BBC micro:bit V2.0 というkitoronik社のものを利用していますが、2つのモーターと、モーターコントローラ、明るさセンサーを搭載していて応用もかなり広がるため、子どもの教育には最適です。
無線グループも0~255の256グループ作れるため、複数のバギーを同時に動かすことができます。
また、シンプルな構造であるため、自分たちで改良もしやすく、赤外線センサーで対戦型の戦車を作り、規定回数攻撃を受けてしまうと動作を止めてしまうなどのプログラムを考えたりもできます。
他にも、ライントレースによる自動運搬や、ラズベリーパイを搭載して空間認識による自動操縦など様々な用途に利用できるバギーです。