VEXcode IQ のカスタム コントローラー コード

コントローラーを使用すると、タスクを完了するためにロボットを簡単に運転および移動させることができます。 ただし、Drive プログラムの使用には制限があり、ロボットのビルドや実行中のタスクによっては、異なる制御が必要になる場合があります。 コントローラーをコーディングすると、コントローラーを最適化してロボットと当面のタスクにさらに適合させることができます。 VEXcode IQ でコントローラーをコーディングするにはいくつかの方法があります。 それぞれに利点と制限があり、望ましい結果に応じて、特定の状況により適した方法もあります。

この記事では、VEXcode IQ でコントローラーをカスタム コーディングするための 3 つの異なるオプションについて説明します。 各方法について、その利点、制限事項、および方法を選択する際の参考となる使用例とともに説明します。 この記事の目的のために、示されているすべてのコード例は Clawbot 用に作成されています。 ただし、同じ概念は、 builds.vex.comにある他の多数のビルドやカスタム ビルドにも適用できます。

オプション 1: デバイス構成でボタンを割り当てる

このオプションは、BaseBot や Clawbot などの標準ビルドを使用していて、すぐに起動して実行したい場合に最適です。

このオプションを使用すると、モーター、ドライブトレイン、またはモーター グループをデバイス構成のコントローラーのボタンに割り当てることができます。 デバイス構成でコントローラーにボタンを割り当てる方法の詳細については、 この記事を参照してください。

コントローラー オプションが表示された VEXcode IQ デバイス メニュー。 ボタン コントロールの図は、2 つのジョイスティックがタンク ドライブ構成でロボットを駆動することを示しています。 E 軸ボタンは ArmMotorGroup を制御し、R 軸ボタンは ClawMotor を制御します。

オプション 1 の概要: デバイス構成でのボタンの割り当て

利点

制限事項

状況例

  • コーディング不要の素早いセットアップ
  • 最も簡単な方法
  • 簡単に調整可能
  • 個々のモーター、標準ドライブトレイン、およびモーターグループをボタンに割り当てることができます
  • ボタンの割り当てはコントローラーのボタンの数に制限されます
  • ドライブトレインは 4 モーターを超えたり、カスタマイズしたりすることはできません (標準ドライブのみがサポートされ、H ドライブ、ホロノミック、またはその他のカスタム ドライブトレインはサポートされません)。
  • BaseBot、Clawbot などの標準ビルド、またはそれらの標準ビルドの単純な変更を操作します。 たとえば、前面に吸気口が取り付けられた BaseBot は、モーター グループによって制御されます。
  • 多くのコーディングを行わずに、どのボタンがロボットのさまざまな動作に対応するかをすばやく操作します

オプション2: 永久ループを使用する

標準ビルドの代わりにカスタム ビルドを使用している場合、またはコントローラーでさらにカスタマイズできるようにしたい場合は、このオプションが適しています。 Forever ループの使用は、コントローラーのカスタム コードを作成するための優れた入門編です。

このオプションは、コントローラーとそれに関連付けられたボタンのすべての条件を永遠ループに配置します。 これにより、特にカスタム ビルド設計の場合に柔軟性が向上しますが、ある程度のコーディング経験も必要になります。 ただし、このオプションを使用する場合の考慮事項の 1 つは、プロジェクトの長さと複雑さです。 追加する条件が増えるほど、コード スタックが長くなる可能性があります。 これは、複数のブロックを順番に実行する必要があることを意味し、ブロックが多数ある場合、プロジェクトの実行が遅くなる可能性があります。 プロジェクトの実行が遅いと、コントローラーのボタンを押してからロボットの動作が表示されるまでに遅れが生じる可能性があります。

以下に示す具体的な例は、カスタム デザイン ロボット (カスタム ドライブトレインを備えたロボットなど) でフォーエバー ループを使用してロボットを駆動し、爪とアームを操作してオブジェクトと対話する方法の 1 つです。

オプション 2 ブロック プロジェクトが開かれた VEXcode IQ ワークスペース。 プロジェクトにはブロックのスタックがあり、デバイスが構成されています。 デバイス メニューが横に開き、次のデバイスがリストされます: IQ 2nd gen Brain、ポート 4 の ClawMotor、ポート 10 の ArmMotor、コントローラー、ポート 1 の LeftMotor、およびポート 6 の RightMotor。 最後に、コントローラーの入力を処理するブロックのスタックがあります。 スタックには、開始時に ArmMotor の停止を保持に設定し、ClawMotor の停止を保持に設定すると書かれています。 スタックの残りは Forever ループに含まれます。 これは「Forever」と表示され、LeftMotor の速度をコントローラー A の位置 % に設定し、LeftMotor を前方に回転させ、RightMotor の速度をコントローラー D の位置 % に設定し、RightMotor を前方に回転させます。 次に、コントローラー E の上が押された場合はアームモーターを回転させて上げ、そうでない場合はコントローラー E の下が押された場合はアームモーターを回転させて下げ、そうでない場合はアームモーターを停止します。 最後に、コントローラーの F 上が押された場合は ClawMotor が回転して開き、コントローラーの F 下が押された場合は ClawMotor が回転して閉じ、それ以外の場合は ClawMotor を停止します。

「オプション 2」VEXcode IQ (第 2 世代) プロジェクト ファイルをダウンロード >

: 第 1 世代 Clawbot を使用する場合、上記のプロジェクトで意図したとおりに動作するには、デバイス構成でアーム モーターを逆にする必要があります。

オプション 2 コードの説明。

コードピース

説明

オプション 2 VEXcode IQ プロジェクトのブロック スタックのクローズアップ。 2 つのブロックがハイライト表示され、スタックの Forever ループの外側にあります。これらのブロックには、set ArmMotor stops to hold と set ClawMotor stops to hold が示されています。

このコード例では Clawbot が使用されました。 コントローラーのボタンを使用してアームを上げ下げすると、ボタンを放すとすぐに重力によりアームが下がります。 アームとクローの両方を「ホールド」に設定すると、コントローラーのボタンを放した後でもアームとクローの両方が所定の位置に残ります。

オプション 2 VEXcode IQ プロジェクトのブロック スタックのクローズアップ。 スタックの Forever ループ内で 4 つのブロックが強調表示されます。 これらは Forever を読み取り、LeftMotor 速度をコントローラー A の位置 % に設定し、LeftMotor を前方に回転させ、RightMotor 速度をコントローラー D の位置 % に設定し、RightMotor を前方に回転させます。 ボタンとジョイスティックにラベルが付けられた IQ (第 2 世代) コントローラーの図。 コントローラーの正面から見た図です。 左ジョイスティックの軸には A と B のラベルが付いています。左ジョイスティックの中央ボタンには L3 のラベルが付いています。 左ジョイスティックの下にある 2 つの丸いボタンには、「E Up」と「E Down」というラベルが付いています。 右ジョイスティックの軸には C と D のラベルが付いています。右ジョイスティックの中央ボタンには R3 のラベルが付いています。 右ジョイスティックの下にある 2 つの丸いボタンには、「F Up」と「F Down」というラベルが付いています。

このコード例では Clawbot が使用されました。 コントローラーのボタンを使用してアームを上げ下げすると、ボタンを放すとすぐに重力によりアームが下がります。 アームとクローの両方を「ホールド」に設定すると、コントローラーのボタンを放した後でもアームとクローの両方が所定の位置に残ります。

コントローラーのどのボタンが押されているかを継続的に確認するために、Forever ループが使用されます。

[モーター速度の設定] ブロックは、A 軸および D 軸に沿った現在のコントローラーの位置にモーター速度を設定するために使用されます。 これは、車をドライブに設定するのと同じです。 それは必ずしも車を動かすわけではなく、ただ設定するだけです。

ジョイスティックの各軸は -100 ~ +100 の値を返し、中心にある場合は値 0 を返します。 これは、ジョイスティックの軸を押すと、-100% ~ 100% に相当することを意味します。 軸が 100 または -100 に近づくほど、モーターの回転が速くなります。

次に[Spin​​]ブロックを使って実際にモーターを動かします。 これは、方向が決まったら車のアクセルを踏み込むのと同じです。 これにより、各モーターを 4 つのコントローラー軸のいずれかで制御できるようになります。

オプション 2 VEXcode IQ プロジェクトのブロック スタックのクローズアップ。 スタックの Forever ループ内で、if、else if、else ブロックが強調表示されます。 コントローラー E の上が押された場合は ArmMotor が回転して上昇し、コントローラー E の下が押された場合は ArmMotor が回転して下降し、それ以外の場合は ArmMotor が停止します。

このコード例では Clawbot が使用されました。 コントローラーのボタンを使用してアームを上げ下げすると、ボタンを放すとすぐに重力によりアームが下がります。 アームとクローの両方を「ホールド」に設定すると、コントローラーのボタンを放した後でもアームとクローの両方が所定の位置に残ります。

[If then else if then else] ブロックは、コントローラーで押されるか放されるボタンに特定の動作をマッピングするために使用されます。 コードのこのセクションでは、E Up ボタンまたは E Down ボタンが押されたかどうかが条件として設定されます。 その場合、腕の上げ下げなどの特定の動作が発生します。 条件のelse部分もあります。どちらのボタンも押されていない場合、アームは動きを停止するように設定されます。

Claw のプロジェクトのコードの次のセクションも同じ説明に従っていることに注意してください。

オプション 2 の要約: 永久ループの使用

利点

制限事項

状況例

  • カスタムビルド、特に 4 つ以上のモーターを備えたドライブトレインに対応可能
  • 1 つのボタンに複数の動作を割り当てることができます
  • コントローラーの異なる軸に動作を割り当てることができます (デバイス構成の左アーケード、右アーケード、分割アーケード、タンク ドライブのオプションとは対照的に)
  • ある程度のコーディングの知識が必要です (条件文、ループ、コントローラーのボタン/ジョイスティックの知識)
  • プロジェクトの実行が遅くなったり、ボタンの応答時間に遅れが生じたりする可能性があります。 すべてのコマンドは 1 つの Forever ループ内に含まれるため、設定された条件とコードの長さによっては、コードの実行が遅くなる可能性があります。
  • カスタム構築ロボット、特に非標準ドライブトレインでのコントローラーの使用
  • 1つのボタンに複数の動作を割り当てたい場合。 たとえば、F Up ボタンを押すと、クローが開いて前進し、オブジェクトの周囲で閉じることができます。

オプション3: イベントの使用

コントローラーを大幅にカスタマイズしたい場合は、イベントの使用が最適なオプションです。 ボタンを 1 回押すだけで、ボタンを押して爪を開いたり、アームを上げたり、設定された距離だけ前進したりするなど、複数のロボットの動作をトリガーできます。 Forever ループ内でボタンごとに複数の動作をコード化しようとすると、プロジェクトの実行が大幅に遅くなります。イベントを使用すると、これをより効果的に行うことができます。

このオプションでは、イベントを使用してプロジェクト フローを分割します。 これは Forever ループの使用に似ていますが、コードをより整理できるため、ボタンの実行の応答時間が短縮されます。 応答時間が速いということは、コントローラーのボタンを押してからロボットの動作が表示されるまでに遅れがなくなることを意味します。 この例は、前のプロジェクトと同じ動作を示していますが、フォーエバー ループの代わりにイベントを使用して実行されます。

オプション 3 ブロック プロジェクトが開かれた VEXcode IQ ワークスペース。 このプロジェクトには 11 個の小さなブロック スタックがあり、デバイスが構成されています。 デバイス メニューが横に開き、次のデバイスがリストされます: IQ 2nd gen Brain、ポート 4 の ClawMotor、ポート 10 の ArmMotor、コントローラー、ポート 1 の LeftMotor、およびポート 6 の RightMotor。 最後に、コントローラーの入力を処理する 11 個の小さなブロック スタックがあります。 最初のスタックは、開始時に ArmMotor の停止を保持に設定し、次に ClawMotor の停止を保持に設定することを読み取ります。 2 番目のスタックには、コントローラー軸 A が変更されると、LeftMotor の速度をコントローラー A の位置 % に設定し、LeftMotor を前方に回転させます。 3 番目のスタックには、コントローラー D が変更されると、RightMotor の速度をコントローラー D の位置 % に設定し、RightMotor を前方に回転させます。 4 番目のスタックには、「コントローラーのボタン E の上を押すと、ArmMotor が回転します」と表示されます。 5 番目のスタックには、「コントローラーのボタン E Up を放すと、ArmMotor が停止します」と表示されます。 6 番目のスタックには、「コントローラーのボタン E の下を押すと、ArmMotor が下方向に回転します」と表示されます。 7 番目のスタックには、「コントローラーのボタン E ダウンを放すと、ArmMotor が停止します」と表示されます。 8 番目のスタックには、「コントローラーのボタン F の上を押すと、ClawMotor が回転して開きます」と表示されます。 9 番目のスタックには、「コントローラーの F ボタンを上に放すと、ClawMotor が停止します」と表示されます。 10 番目のスタックには、「コントローラー ボタンの F を下へ押すと、ClawMotor が回転して閉じます」と表示されます。 11 番目で最後のスタックには、「コントローラーの F ボタンの下を放すと、ClawMotor が停止します」と表示されます。

「オプション 3」VEXcode IQ (第 2 世代) プロジェクト ファイルをダウンロード >

: 第 1 世代 Clawbot を使用する場合、上記のプロジェクトで意図したとおりに動作するには、デバイス構成でアーム モーターを逆にする必要があります。

オプション 3 コードの説明。

コードピース

説明

オプション 3 VEXcode IQ プロジェクトのブロック スタックの 1 つをクローズアップします。 スタックには、開始時に ArmMotor の停止を保持に設定し、次に ClawMotor の停止を保持に設定すると書かれています。

このコード例では Clawbot が使用されました。 コントローラーのボタンを使用してアームを上げ下げすると、ボタンを放すとすぐに重力によりアームが下がります。 アームとクローの両方を「ホールド」に設定すると、コントローラーのボタンを放した後でもアームとクローの両方が所定の位置に残ります。

オプション 3 VEXcode IQ プロジェクトの 2 つのブロック スタックのクローズ アップ。 最初のスタックには、コントローラー軸 A が変更されると、左モーター速度をコントローラー A の位置 % に設定し、左モーターを前方に回転させます。 2 番目のスタックには、コントローラー軸 D が変更されると、RightMotor の速度をコントローラー D の位置 % に設定し、RightMotor を前方に回転させます。 ボタンとジョイスティックにラベルが付けられた IQ (第 2 世代) コントローラーの図。 コントローラーの正面から見た図です。 左ジョイスティックの軸には A と B のラベルが付いています。左ジョイスティックの中央ボタンには L3 のラベルが付いています。 左ジョイスティックの下にある 2 つの丸いボタンには、「E Up」と「E Down」というラベルが付いています。 右ジョイスティックの軸には C と D のラベルが付いています。右ジョイスティックの中央ボタンには R3 のラベルが付いています。 右ジョイスティックの下にある 2 つの丸いボタンには、「F Up」と「F Down」というラベルが付いています。

このコード例では Clawbot が使用されました。 コントローラーのボタンを使用してアームを上げ下げすると、ボタンを放すとすぐに重力によりアームが下がります。 アームとクローの両方を「ホールド」に設定すると、コントローラーのボタンを放した後でもアームとクローの両方が所定の位置に残ります。

{When controller axis} イベント ブロックは、コントローラーの 4 つの軸の 1 つがジョイスティックを使用して変更されたときに特定の動作をトリガーするために使用されます。

[モーター速度の設定] ブロックは、A 軸および D 軸に沿った現在のコントローラーの位置にモーター速度を設定するために使用されます。 これは、車をドライブに設定するのと同じです。 それは必ずしも車を動かすわけではなく、ただ設定するだけです。

ジョイスティックの各軸は -100 ~ +100 の値を返し、中心にある場合は値 0 を返します。 これは、ジョイスティックの軸を押すと、-100% ~ 100% に相当することを意味します。 軸が 100 または -100 に近づくほど、モーターの回転が速くなります。

次に[Spin​​]ブロックを使って実際にモーターを動かします。 これは、方向が決まったら車のアクセルを踏み込むのと同じです。 これにより、各モーターを 4 つのコントローラー軸のいずれかで制御できるようになります。

オプション 3 VEXcode IQ プロジェクトの 4 つのブロック スタックのクローズ アップ。 最初のスタックには、「コントローラーのボタン E の上が押されたら、ArmMotor が回転します」と表示されます。 2 番目のスタックには、「コントローラーのボタン E Up を放すと、ArmMotor が停止します」と表示されます。 3 番目のスタックには、「コントローラーのボタン E の下を押すと、ArmMotor が下方向に回転します」と表示されます。 4 番目のスタックには、「コントローラーのボタン E ダウンを放すと、ArmMotor が停止します」と表示されます。

このコード例では Clawbot が使用されました。 コントローラーのボタンを使用してアームを上げ下げすると、ボタンを放すとすぐに重力によりアームが下がります。 アームとクローの両方を「ホールド」に設定すると、コントローラーのボタンを放した後でもアームとクローの両方が所定の位置に残ります。

{When controller axis} イベント ブロックは、コントローラー上で押されるか放されるボタンに特定の動作をマッピングするために使用されます。 コードのこのセクションでは、E Up ボタンまたは E Down ボタンが押されたかどうかが条件として設定されます。 その場合、腕を上げる、下げる、停止するなどの特定の動作が発生します。

Claw のプロジェクトのコードの最後のセクションも同じ説明に従っていることに注意してください。

オプション 3 の概要: イベントの使用

利点

制限事項

状況例

  • カスタムビルド、特に 4 つ以上のモーターを備えたドライブトレインに対応可能
  • 1 つのボタンに複数の動作を割り当てることができます
  • コントローラーの異なる軸に動作を割り当てることができます (デバイス構成の左アーケード、右アーケード、分割アーケード、タンク ドライブのオプションとは対照的に)
  • コードの実行が高速になり、ボタンの応答性が向上します (各条件が個別に呼び出され、単一のコード スタックに埋め込まれないため)
  • オプション (条件、ループ、イベント、およびコントローラーのボタン/ジョイスティックの知識) に関するコーディングの知識が最も必要です。
  • 第 1 世代 VEX IQ Brain を使用している場合、プロジェクト内にイベントが多すぎると、Brain の処理制限によりプロジェクトが実行されなくなる可能性があります。
  • カスタム構築ロボット、特に非標準ドライブトレインでのコントローラーの使用
  • 複数の動作を遅延なく 1 つのボタンに割り当てたい場合。 たとえば、F Up ボタンを押すと、クローが開いて前進し、オブジェクトの周囲で閉じることができます。

For more information, help, and tips, check out the many resources at VEX Professional Development Plus

Last Updated: