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