mBotの3つのモード
Makeblockの教育用ロボット「mBot」は、最初の初期設定で、3つのモードが設定されています。
1、リモコンモード
付属のIRリモコンを利用して、mBotをラジコンのように動かすことが出来ます。
2、衝突回避モード
超音波センサーを利用して、進行方向にある障害物を検知すると、走る方向を変えるモードです。
参考記事:mBotの超音波センサーを使って衝突を防ぐプログラムを作る
3、ラインフォロワーモード
ラインフォロワーセンサーを利用して、黒い線に沿ってmBotを走行させるモードです。本体キットに同梱されている、テスト走行用パッド(八の字の線が書いてある紙)の上を走行させると確認できます。
参考記事:mBotのライントレースセンサーを使って自動運転
この3つのモードは、mBotの制御基板である、mCoreの上のボタンを押すごとに切り替えることが出来ます。
初期設定にこのようなプログラムが入っているのは、mBotがしっかりと組み立てられているかをテストする意味合いがあります。
今回は、この初期プログラムにできるだけ近いプログラムを作ることに挑戦してみたいと思います。(最初に言うと、初期プログラムとそっくりそのままのものを作るのは、結構難しい。。)
各モード毎に定義ブロックを作成
mBotにデフォルトで入っているのは、メインがこのようなプログラムになります。
このメインプログラムの中にある、起動設定・リモコンモード・衝突回避モード・ライントレースモードというブロックをmBlock5のブロックパレット内にある「ブロック定義」で作っていきます。
まずは、各モードの動作プログラムを一つにまとめた定義ブロックを作成します。
定義ブロックの作成方法は、↓の動画の感じですね。
ブロックの名前は任意で作成することが可能です。↑の動画のように「起動設定」の動作を定義するブロックを作成すると、スクリプトエリアに、「起動設定」というハットブロックが出現します。
※ハットブロックとは、イベントブロックのように帽子の形をしたブロックです。
そのハットブロックの下に、定義した任意の動作プログラムを作成するという格好です。
今回の以下のように4つの定義をしました。
起動設定
起動設定は、最初に電源を入れたときに、音とともに、LEDが3色に変化する部分です。下のプログラムでは、音の長さが0.25拍で、本来のデフォルトプログラム(多分0.5拍)より、テンポが速く聞こえます。
リモコンモード
このプログラムは、上下左右を押したら、その方向にmBotが動くように設定します。
衝突回避モード
下のプログラムでは、10㎝以内に障害物を検知したら止まり、その障害物が無くなったら、また動き出すというプログラムにしています。mBotのデフォルトは、障害物を検知するとランダムに進行方向が変わるというプログラムだと思います。その場合は、乱数を使いますが、今回は、その辺は省略(笑)。乱数によるプログラムを知りたい方はこちら
ライントレースモード
このプログラムは、デフォルトのプログラムに比べて、ラインフォロー走行の滑らかさはありません(笑)。確か、市販のMakeBlock公式解説本には、滑らかなラインフォロー走行のサンプルプログラムが掲載されていたので、良かったらそれを確認して頂くのが良いかと思います。
ポイントは、オンボードボタンが押されるまで繰り返すという部分ですね。これによって、モード切替をすることが可能になります。この定義ブロックは、一般的なプログラミングでは、関数と呼ばれ、「メインプログラムに関数を呼び出す」みたいな言い方でよく使われています。
ここまでで、一旦は完成です。スクリプトエリア全体としては、↓のような構成になります。小さくて字は見えませんが(笑)
mBotのプログラムを一通り学んだ人には、そんなに難しくない処理ですね。ですが、ここからが問題です。上記のプログラムで実行すると、下の動画のように、ボタンを押しても、うまくモードが切り替わらない現象が起きます。
物理的スイッチに付きまとうチャタリング問題
ここからは、少々マニアックな話になるので、お好きな方だけ読んでいただけたらと思います。
上の動画のように、ボタンを押しても、上手くいかない現象は、チャタリングという言葉で、電子工作などをしている人には、お馴染みですね(笑)
ボタンを押した際に、基板と、ボタンが接するとONするのですが、その際に基板とボタンの接点の振動により、1回の押しただけなのに、何回も押したように、電気信号が発生してしまう現象をいいます。
こんなイメージのようです。
引用元:https://jumbleat.com/2016/08/19/switch_without_chatter/
上のgifのような感じを波形で見ると間な感じになります。
引用元:ITmedia https://monoist.atmarkit.co.jp/mn/articles/0912/16/news099_3.html
mBotの制御基板mCoreに搭載されているマイコンはArduino互換なので、非常に高性能なため、数ミリ秒間隔で発生する電気信号も読み取ってしまうんですねえ。
なので、こちらとしては、1回しかボタンを押していなくても、何回も押されたように認識されて、モードがスキップしたりしてしまうんです。
さて、このチャタリングは、mBotに限った話ではないので、賢人たちの知恵で、様々な回避方法がネット上に公開されています。ハードウェア的に改造して処理する方法もありますが、mBotのように、電子基板や回路を修正できない場合、どうしましょうかね?以下の2つくらいは、すぐに思い浮かびます。
1、拡張パーツで回避
例えば、静電容量タッチセンサーなど、接点スイッチ以外のセンサーを使い、接点スイッチによるチャタリングを無くす
2、mBlock5のソフトウェアで回避
という事で、今回は、mBlock5のプログラムで回避できる方法を考えてみました。簡単に言うと、スイッチが「接地して、離れた」という事をプログラムにしっかり記述すればよいですね。修正としては、メインプログラムを以下のように変えればよいです。
ポイントは、0.2秒待つという所ですかね。
MakeXでは、複数のタスクがあり、そのタスクにあったプログラムを予めmBotにアップロードしておくのが有効ですが、その場合に、このチャタリング問題を理解しておかないと、意図したプログラムにならないという事が、発生してしまいそうですね。