方向パッドを使ってみる
図11のVPL図に方向パッドを使う機能を追加してみます。方向パッドを押すと押す方向によってロボットが前進、後退、進行方向が左右に動くVPLを作成します。
1. 必要なブロックを「Basic Activities」欄から配置する
左上の「Basic Activities」欄からIf、Data(5個)、Merge(2個)、Join(2個)ブロックを中央の「ダイアグラム領域」にドラック&ドロップで配置します。
Joinブロックも2つ以上のデーターフローを結合させる場合に使用するブロックですが、データに名称をつけて処理できる点がMergeブロックと異なります。
2. 必要なブロックを「Services」欄から配置する
次に左下の「Services」欄からSimulatedGenericDifferentialDriveブロックを中央の「ダイアグラム領域」にドラック&ドロップで配置します。
1、2で配置した状態を図12に示します。
3. [Connections]ダイアログを設定する
2.で、XInputControllerとIfブロックを接続すると、[Connections]ダイアログが表示されるので、XInputControllerブロックのどの機能を使用するかを設定します。今回は方向パッドを使用してロボットを制御したいのでFrom側で方向パッドの状態が変更した場合に通知を発生する「DPadChanged」、To側でボタンの状態を受け取る「Condition」を選択し、[OK]ボタンを押します。
4. Ifブロックを設定する
3.で「DPadChanged」を指定した場合、Up、Down、Left、Rightの4種類のボタンを判別することができます。今回はそれぞれ、前進、後退、進行先を左に向ける、進行先を右に向けるという動作を割り当てるため、Ifボタンのテキストボックスに「Up」と入力し、テキストボックス下方にあるプラスマークを押すとテキストボックスが追加されるので、順に「Down」「Left」「Right」と入力します。この状態を図13に示します。
5. Dataブロックを設定し、Ifブロックと接続する
前進はYボタンに割り当てた機能と同じものを使用するため、Mergeブロックを使って、上記、「Bボタン、Yボタンを使ってみる」の手順5.で設定した「0.8」と入力したDataブロックとを接続します。
次に、後進させる場合のスピードとして、Dataブロックのテキストボックスに「-0.8」と入力し、下三角マークを押して、データ型にdoubleを選択します。同様に進行先を左に向けるために、2つのDataブロックを使用し、上から順にテキストボックスに「0」「0.1」と入力し、データ型をdoubleとします。進行先を右に向けるためには2つのDataブロックを使用し、上から順にテキストボックスに「0.1」「0」と入力し、データ型をdoubleとします。
5つすべてのDataブロックを設定し終えたら、Ifブロックの「Down」の結果出力ピン上でマウスを左クリックしたまま、「-0.8」と入力したDataブロックの入力ピンまでドラックし、この2つのブロックを接続します。また、Ifブロックの「Left」の結果出力ピンから次の「0」と「0.1」と入力した2つのDataブロックの入力ピンへそれぞれ接続します。同様にIfブロックの「Right」の結果出力ピンから次の「0.1」と「0」と入力した2つのDataブロックの入力ピンへそれぞれ接続します。
6. DataブロックをJoinする
進行先を左や右に向けるためには左右のモータに与える値を別の値にする必要があります。そこで、どのDataブロックの値がどのモータに対する値なのかを指定するためにJoinブロックを使用して、Left、Rightと名称をつけます。Joinブロックのテキスボックスに上から順に「Left」「Right」と入力します。今回は進行先を左に向けるために左モータを止めて、右モータのみ出力するという方法をとるので、Ifブロックの「Left」の結果出力ピンと接続してあるDataブロックのうち「0」と「Left」を、「0.1」と「Right」を接続してください。同様に、Ifブロックの「Right」の結果出力ピンと接続してあるDataブロックのうち「0.1」と「Left」を、「0」と「Right」を接続してください。
7. Dataブロックをマージし、SimulatedGenericDifferentialDriveと接続する
後進は左右のモータに与える数値は同じでよいので、Ifブロックの「Down」の結果出力ピンと接続してあるDataブロックと上記、「Bボタン、Yボタンを使ってみる」の手順6.でマージしたMergeブロックと接続します。
進行先を左や右に向ける場合は左右のモータに与える数値を変えなければいけないので、まずは手順6.の2つのJoinブロックとMergeブロックを接続します。次にMergeブロックの結果出力ピンとSimulatedGenericDifferentialDriveの入力ピンを接続します。
8. [Connections]ダイアログを設定する
手順7.でMergeブロックとSimulatedGenericDifferentialDriveを接続すると、[Connections]ダイアログが表示されるので、前進させる駆動力をSimulatedGenericDifferentialDriveに入力するためにFrom側で手順7.でマージした値を持つ「ForwardedOutput」、To側でモータの出力をセットする「SetDrivePower」を選択し、[OK]ボタンを押します。
9. [Data Connections]ダイアログを設定する
7.で[OK]ボタンを押すと、[Data Connections]ダイアログが表示されます。
Dataブロックで入力した値で左右のモータを制御したいので、LeftWheelPowerとRightWheelPowerに対してValue側でそれぞれ方向パッドの左ボタンと右ボタンの値を持つ「Left」「Right」を選択し、[OK]ボタンを押します。
10. シミュレーション環境を指定する
図14にここまでのVPL図を示します。
上記、「左右のトリガー(アナログ)ボタンを使ってみる」の手順4.と同様にマニフェストファイルに「LEGO.NXT.Tribot.Simulation.Manifest.xml」を指定します。
11. 作成したVPL図を実行する
メニューのRunからStartを選択すると、DSSランタイムが実行され[Run]ダイアログ、[Visual Simulation Environment]画面がそれぞれ続けて立ち上がります。
方向パッドを押すと押す方向によってロボットが前進、後退、進行方向が左右に向かう様子を確認してください。実行を終了するときは[Run]ダイアログの[STOP]ボタンを押します。



