Hız (Velocity) Ayarlama

Programımızda Hız Ayarlama

Hız, SDK içindeki kapalı döngü kontrolüdür ve motorların gerekli hızda çalışmasını sağlamak için encoder tıklamalarını kullanır. Belirli bir hız ayarlandığında, motorlar, hedef hızına ulaşmak için gereken gücü ve hızı hesaplar.

Bir hız ayarlamak için motorunuzun maksimum RPM'sinin ne kadar olduğunu bilmek önemlidir. Class Bot V2 için motorlar 300 RPM'ye kadar çalışabilir. Drivetrain kullanıyorsanız, hızı biraz daha düşük tutarak daha iyi kontrol elde edebilirsiniz. Bu örnekte, hızı 175 RPM olarak ayarlayacağız.

RPM (dakikada devir) hız birimidir ve bu değeri tıklama başına saniyeye (TPS - Ticks per Second) dönüştürmek gereklidir. Bunun için RPM'yi 60'a bölüp, ardından bu dönüşümle COUNTS_PER_WHEEL_REV (tekerlek başına tık sayısı) ile çarparız.

Adım 1: Ticks per Second (TPS) Hesaplama

175 RPM'yi saniyeye çevirelim:

TPS=17560×COUNTS_PER_WHEEL_REVTPS = \frac{175}{60} \times COUNTS\_PER\_WHEEL\_REV

Adım 2: Yeni Bir Değişken Olarak TPS Eklenmesi

Bu hesaplamayı bir değişken olarak eklemek için şu adımları izleyebilirsiniz:

public void runOpMode() {
    leftmotor = hardwareMap.get(DcMotor.class, "leftmotor");
    rightmotor = hardwareMap.get(DcMotor.class, "rightmotor");

    rightmotor.setDirection(DcMotor.Direction.REVERSE);

    leftmotor.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER);
    rightmotor.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER);

    int leftTarget = (int)(610 * COUNTS_PER_MM);
    int rightTarget = (int)(610 * COUNTS_PER_MM);
    double TPS = (175 / 60) * COUNTS_PER_WHEEL_REV;

    waitForStart();
}

Adım 3: Power (Güç) Değişkeninden Velocity (Hız) Değişkenine Geçiş

Motorlar için güç (setPower) yerine hız (setVelocity) kullanacağız. Bu işlemde, setVelocity() fonksiyonuna TPS parametresini ekleyeceğiz.

waitForStart();

leftmotor.setTargetPosition(leftTarget);
rightmotor.setTargetPosition(rightTarget);

leftmotor.setMode(DcMotor.RunMode.RUN_TO_POSITION);
rightmotor.setMode(DcMotor.RunMode.RUN_TO_POSITION);

leftmotor.setVelocity(TPS);
rightmotor.setVelocity(TPS);

while (opModeIsActive() && (leftmotor.isBusy() && rightmotor.isBusy())) {
}

DcMotor vs. DcMotorEx

Hız ayarlama fonksiyonu, DcMotorEx arayüzüne ait bir fonksiyondur. Bu arayüz, motorların daha gelişmiş fonksiyonlarını, örneğin kapalı döngü kontrol fonksiyonlarını içerir.

Dolayısıyla, setVelocity() fonksiyonunu kullanabilmek için motorları DcMotorEx olarak tanımlamalıyız. Aşağıda, değiştirmeniz gereken kısmı görebilirsiniz:

public class HelloRobot_Encoder extends LinearOpMode {
    private DcMotorEx leftmotor;
    private DcMotorEx rightmotor;
}

Ve motorları DcMotorEx olarak alalım:

public void runOpMode() {
    leftmotor = hardwareMap.get(DcMotorEx.class, "leftmotor");
    rightmotor = hardwareMap.get(DcMotorEx.class, "rightmotor");
}

DcMotorEx, DcMotor'ın bir genişlemesidir, bu nedenle DcMotor'a özgü fonksiyonlar DcMotorEx üzerinde de çalışacaktır.

Tam Program Kodu:

@Autonomous
public class HelloRobot_Encoder extends LinearOpMode {
    private DcMotorEx leftmotor;
    private DcMotorEx rightmotor;
    
    // Sabitler
    static final double COUNTS_PER_MOTOR_REV = 28.0; 
    static final double DRIVE_GEAR_REDUCTION = 30.24;   
    static final double WHEEL_CIRCUMFERENCE_MM = 90.0 * 3.14;
    
    static final double COUNTS_PER_WHEEL_REV = COUNTS_PER_MOTOR_REV * DRIVE_GEAR_REDUCTION;
    static final double COUNTS_PER_MM = COUNTS_PER_WHEEL_REV / WHEEL_CIRCUMFERENCE_MM;

    @Override
    public void runOpMode() {
        leftmotor = hardwareMap.get(DcMotorEx.class, "leftmotor");
        rightmotor = hardwareMap.get(DcMotorEx.class, "rightmotor");

        // Sağ motoru ters çevir
        rightmotor.setDirection(DcMotor.Direction.REVERSE);

        // Encoder'ları sıfırla
        leftmotor.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER);
        rightmotor.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER);

        // Hedef pozisyonlar ve TPS hesaplaması
        int leftTarget = (int)(610 * COUNTS_PER_MM);
        int rightTarget = (int)(610 * COUNTS_PER_MM);
        double TPS = (175 / 60) * COUNTS_PER_WHEEL_REV;

        // Oyun başlama için bekle
        waitForStart();

        // Hedef pozisyonları ve hızları ayarla
        leftmotor.setTargetPosition(leftTarget);
        rightmotor.setTargetPosition(rightTarget);
        
        leftmotor.setMode(DcMotor.RunMode.RUN_TO_POSITION);
        rightmotor.setMode(DcMotor.RunMode.RUN_TO_POSITION);

        leftmotor.setVelocity(TPS);
        rightmotor.setVelocity(TPS);

        // Motorlar hedefe ulaşana kadar çalıştır
        while (opModeIsActive() && (leftmotor.isBusy() && rightmotor.isBusy())) {
        }
    }
}

Last updated