Skip to main content

コントローラーの入力を元にモーターの回転速度を変える

前のページでは、モーターを一定のスピードで回しました。
今回は、コントローラーからの入力を元に、スピードが変わる様に改変してみましょう。

コントローラーのボタン

コントローラーは1と2の2つ接続することができ、各ボタンの名称・配置は以下の様になっています。

出典:gm0
今回は、左のスティックの上下(Left Joystick Y)を使いたいと思います。

コントローラーからの入力を受け取る

まずは、コントローラーが正常に接続されていることをDriver Hubから確認しましょう。
今回はA(1)のコントーローラー差し込み口に挿したコントローラーを使うので、User 1が光っていることを確認します。

前回のプログラムを修正する

前回のプログラムでは、以下の様に0.1という値を直にいれていました。

  motor.setPower(0.1);

それを、コントローラーからの値に変更します。

  motor.setPower(gamepad1.left_stick_y);

コントローラーのスティック(gamepad1.left_stick_y)の値はモーターが期待している-1.0〜1.0を返してくれるので、特に値の変換などはする必要はあります。
プログラムが書けたら、実行してみて、スティックの値に応じてモーターの回転速度が変化すれば、成功です。

今回のプログラム(全体)

package org.firstinspires.ftc.teamcode;

import com.qualcomm.robotcore.eventloop.opmode.OpMode;
import com.qualcomm.robotcore.eventloop.opmode.TeleOp;
import com.qualcomm.robotcore.hardware.DcMotor;

@TeleOp(name = "Main OpMode", group = "Main")
public class Main extends OpMode {

    //ここにモーターの定義を行う
    DcMotor motor;

    /*
     * ドライバーがINITを押した際に、1度だけ実行されます。
     */
    @Override
    public void init() {
        motor = hardwareMap.get(DcMotor.class, "motor");
        telemetry.addData("Status", "Initialized");
    }

    /*
     * ドライバーがINITを押した後、PLAYを押す前に繰り返し実行するコード
     */
    @Override
    public void init_loop() {
    }

    /*
     * プログラム開始時に一度だけ実行される
     */
    @Override
    public void start() {
        telemetry.addData("Status", "Started");
    }

    /*
     * Enableの間ずっと実行される
     * while (opModeIsActive()) と同じ
     */
    @Override
    public void loop() {
        motor.setPower(gamepad1.left_stick_y);
    }

    /*
     * コードが停止されるときに一度だけ実行される
     */
    @Override
    public void stop() {
        telemetry.addData("Status", "Stopped");
    }
}