二足歩行ロボットコミュニティサイト

【サイトの使い方】  【サイトマップ】  【お問い合わせ】 
ロボット動画  |   ロボット写真  |   BBS  |   ダウンロード  |   イベント予定  |   スタッフ日記  |   リンク  |  
ログイン パスワード    新規登録   パスワード紛失  

 

Beautoビルダーを使ってみる 3

さて、今回もBeautoビルダーのアクションブロックに関する説明です。
今回は「変数演算」と「割り込み」のアクションブロックについて説明したいと思います。

変数演算

前回、ロボット本体には様々な値を記録しておける「ユーザ変数」というものがあると説明しました。
forループでは8個あるユーザ変数の内の一つを使って繰り返し回数を数えていましたが、変数演算のアクションブロックを使うとより自由にユーザ変数に値を代入したり、+−×÷などの四則演算を行なうことができます。
それでは、プログラムに変数演算のアクションブロックを追加してみましょう。
アイコンエリアの上から四番目、濃い緑色のアイコンが変数演算のアクションブロックです。

変数演算のアクションブロック変数演算のアクションブロック
変数演算のアクションブロック。

プログラムエリアに変数演算のアクションブロックを追加したら、ダブルクリックして詳細を見てみましょう。

変数演算のアクションブロックの詳細設定ダイアログ
変数演算のアクションブロックの詳細設定ダイアログ。参照変数、演算方法(「代入(=)」と「四則演算(+−×÷)」から選択)、計算に使用する定数をそれぞれ設定する。

ダイアログでは、使用するユーザ変数、計算方法、及び計算に使用する定数を設定します。
例えば、上記ダイアログでは「ユーザ変数1に0を代入する」という設定になります。

例えば、何かにぶつかるまで前進し続け、ぶつかったら方向転換して別の方に進むというプログラムに、方向転換のたびにユーザ変数を加算しその合計がある回数を超えたら動作を終了する、というプログラムも、この変数演算を使用すると可能です。

5回右バンパーセンサが何かにぶつかるまで前進するプログラム
5回右バンパーセンサが何かにぶつかるまで前進するプログラム。

例えば、上記の場合5回何かにぶつかったらプログラムを終了します。
なお、この場合注意しなければならないのは、最初に必ずユーザ変数1に0を代入することです。
Beautoに限らず、ほとんどのマイコンボードでは、プログラムを実行すると最初にメモリにはどのような値が記録されているのか、実はまったく分からないのです。
例えばBeautoで上記のプログラムを実行した後に再び同じプログラムを実行すると、ユーザ変数1には先ほどプログラムを実行した時に最後に記録されていた値(=「5」)がそのまま入っています。
ということは、プログラムの最初にユーザ変数1を0にするようにしておかないと、二回目以降プログラムを実行した時にすぐにwhileループを抜けてプログラムを終了してしまいます。
なぜなら、プログラムを実行して最初に出てくるwhileループのところで、条件である「ユーザ変数1<5」が既に成立しなくなっているからです。

ちなみに、一回目のプログラム実行時にもユーザ変数1の値は0であるという確証はありません。 例えば、直前に全く別のプログラムでユーザ変数1を使用し0以外の値が代入されていれば、同じようにプログラムは想定したものと異なる動きになってしまいます。
このように、常に正しくプログラムが実行されるように使用する変数に最初からあらかじめ特定の値を代入しておくことを「変数の初期化」といい、プログラムを作成する上で必須の基本事項です。
プログラム中で使用するユーザ変数は、必ずプログラムの最初かそのユーザ変数を使う直前で初期化しましょう。

プログラム最初にユーザ変数1の初期化
プログラムの最初にユーザ変数1に「0」を代入して初期化を行なう。これにより、何回プログラムを実行しても常に正しく5回バンパースイッチに反応して終了するようになる。

また、変数の使い方には、数を数える以外に「プログラム中の特定の処理を実行したかどうか」を調べるためにも使えます。
例えば、条件分岐を含むプログラムで、分岐の一方を通った時にユーザ変数1に「1」を代入すると、プログラムを終了した時にユーザ変数1の値を確認することで、実際に条件分岐のどちらを実行したかが分かるようになります。
更に複雑な条件分岐があったとしても、「条件Aを通ったら1」「条件Bを通ったら2」「条件Cを通ったら3」のようにそれぞれで数値を変えると判別することができます。

このような使い方は、プログラムでは「フラグを立てる」といい、あらゆる事象を数字に落としこめます。
本格的なプログラムでは、変数を2進数にして、1の位には条件Aの情報、10の位には条件Bの情報・・・といった具合に、一つの変数に複数の情報を記録して使います。このように、数字を二進数に置き換えた上で各桁に別の情報を記録・操作する方法を「ビット演算」と言います。

ちなみに、先ほどのプログラムでは本体の左前のバンパーセンサにしか反応しませんでしたが、以下のようにフラグを立てる方式に変更すると、左右両方のバンパースイッチに対応できます。

ユーザ変数2をフラグとして使用
ユーザ変数2をフラグとして使用。このように「反応があったか」と「反応した場合動行動するか」の処理を分けることでプログラムガすっきりする。

上記のプログラムでは、フラグ用の変数にユーザ変数2を使います。
ループの最初に左右のバンパーセンサの反応を見る条件分岐をそれぞれ作成し、それぞれの条件分岐で「YES」の場合にのみユーザ変数2に「1」を代入します。
この場合、もし左右どちらかのバンパーセンサが反応する、もしくは両方のバンパーセンサが反応してもユーザ変数2に「1」が代入されます。また、どちらのバンパーセンサも反応しなければ「0」が代入されます。
次にユーザ変数2を確認する条件分岐が来ます。ここでユーザ変数2が0か否かを確認し、0の場合はバンパースイッチに反応がないものとして前進を継続し、1の場合はバンパースイッチに反応があったものとして後退・旋回を行います。

フラグを立てない方法でも、これと同じようなプログラムは作成できますが、その場合どうしても「後退・旋回」の動作を二つ入れなければならなくなり、また条件分岐などの組み方も複雑になります。
なお、ユーザ変数2の初期化はループ開始時に行ないます。プログラム開始直後、whileループが始まる前にユーザ変数を初期化する処理を入れると、whileループで一度バンパーセンサに反応があった時に次のループ時には値が0に戻されないため、例えスイッチに反応していなくても連続してバンパースイッチに反応した状態になってしまいます。
このように初期化のタイミングもちゃんと考えてプログラムを作成する必要があります。

ちなみに、現在配布されている「Beautoビルダー Release1」では、変数演算にユーザ変数しか選択できず、また計算も定数しか使用できませんでしたが、今後バージョンアップにより、「デジタル出力」などユーザ変数以外に値を代入・四則演算したり、変数同士を代入・四則演算できるように拡張されていく予定です。また、「論理積」や「論理和」などのビット演算にも対応を予定しています。

割り込み

さて、いよいよBeautoビルダーに備わっている最後のアクションブロックの説明です。
最後は、プログラム中に別の処理を割り込む機能を持つ「割り込み」のアクションブロックです。
では、早速プログラムエリアにアクションブロックを追加しましょう。
割り込みのアクションブロックは、アイコンエリアの一番下にある紫のアイコンです。

割り込みのアクションブロック割り込みのアクションブロック
割り込みのアクションブロック。「START」や「END」と同じようにプログラムのもっとも外側の開始・終了に相当する。ここで設定した条件が成立すると、プログラムのどの部分を実行していても即座に割り込みのアクションブロックのプログラムを実行する。割り込みのプログラムが終了したら、再び「START」からプログラムを再開する。

割り込みのアクションブロックは条件分岐と似ていますが、その性質は大きく異なります。
条件分岐は、プログラムを最初から実行していて、条件分岐の命令が出た瞬間に指定の条件が成立しているかどうかをはじめて確認するというものですが、割り込みは、プログラム実行中常に条件が成立しているかどうかの確認がされ、条件が成立した時にすぐ指定したプログラムを実行するようになります。
この処理は、Beauto本体でプログラムするときの「センサ」の設定と同じですね。
とりあえずダブルクリックして詳細設定のダイアログを見てみましょう。

割り込みのアクションブロックの詳細ダイアログ
割り込みのアクションブロックの詳細設定ダイアログ。上半分は条件の設定。条件分岐やwhileループと同じ。下半分は割り込みのアクションブロック同士の優先順位。複数の割り込み条件が同時に成立した場合、このリスト中の上にある割り込みのほうを優先して実行する。

上半分は条件分岐などで見覚えのある内容そのままですね。しかし、下半分にそれとは異なる内容が追加されています。
まずは上半分の設定について説明します。
こちらは条件分岐やwhileループのように、条件の元となる「参照変数」、条件の成立する値を設定する「比較数値」、両社の比較方法を設定する「比較条件」の三つを設定します。
参照変数には赤外線センサやバンパースイッチなどの情報を記録する「アナログ入力」や、ユーザ変数などの値を設定でき、比較方法は「=(両者が同じ値か)」「≠(両者が違う値か)」「>(参照変数の方が大きい値か)」「<(比較数値の方が大きい値か)」の四通りから選べます。

割り込みのアクションブロックの条件詳細設定
詳細設定ダイアログの上半分では割り込みの条件を設定する。設定方法は条件分岐やwhileループのアクションブロックと同じ。

よければ、前回の「条件を指定して繰り返す」の項目もご参照ください。

さて、次はダイアログ下半分の設定についてです。
こちらは、割り込みのアクションブロックが複数存在する場合、それぞれの優先順位を設定するものです。
前述の通り、割り込みのアクションブロックはプログラム実行中常に条件が成立するか監視しています。
では、もし二つ以上の条件が同時に成立したらどちらの条件を実行すればよいのでしょうか?
そこでこの優先順位の設定が必要になります。

割り込みのアクションブロックの優先順位詳細設定割り込みのアクションブロックの優先順位詳細設定
詳細設定ダイアログの下半分では割り込みの優先順を設定する。設定を変更する場合は、リスト中の項目をクリックして「上げる」「下げる」ボタンをクリックする。ボタンをクリックするとクリックした項目が上下に入れ替わる。

ダイアログのリストには、現在プログラムに存在する割り込みのアクションブロックが条件の優先順に並んでおり、リストの上の方にあるものほど優先度が高くなります。
設定を変更する場合は、リスト中の変更したい項目をクリックして選択状態にし、「上げる」及び「下げる」のボタンをクリックします。「上げる」ボタンをクリックすると、選択した項目が一つ上に移動し優先順位を高くすることができます。「下げる」ボタンをクリックすると、選択した項目がひとつ下に移動し優先順位を低くすることができます。
ちなみに、この設定は割り込みのアクションブロックが二つ以上存在する場合に必要です。割り込みのアクションブロックがプログラムに一つしか存在しないときは、特にこの設定を行なう必要はありません。

例えば、「前進中、左右のバンパーセンサに当たると後退・旋回する」というプログラムを割り込みを使用して記述すると下記のようになります。

割り込みのアクションブロックの使用例
割り込みのアクションブロックの使用例。普段は前進し、本体のバンパーセンサに反応があったら「後退・旋回」の動作を割り込ませる。

このプログラムでは、バンパーセンサに何も無いときは「前進」の動作を繰り返し、何かにぶつかって左右のバンパーセンサに反応があるとすぐに「後退・旋回」の動作を割り込んで実行します。

最後に

次回は、これまで説明した内容を元にいくつかサンプルの例題を紹介したいと思います。


前のページ
Beautoビルダーを使ってみる 2
コンテンツのトップ


検索
メインメニュー
Beauto