Drivetrain Encoder'ları - OnBot Java
Motorları belirli bir pozisyona taşımak için kodlayıcıları (encoders) kullanmak, Elapsed Time kullanarak yapılan hareketlerdeki olası hataları ve tutarsızlıkları ortadan kaldırır. Bu bölümün odak noktası, robotu hedef pozisyona taşımak için kodlayıcıları kullanmaktır.
Drivetrain Encoder'larının Kurulumu
Bu eğitim için, OpMode'umuzun adı HelloRobot_Encoder olacak.
Aşağıdaki OpMode yapısı basitleştirilmiş olup, yalnızca encoder tabanlı kodu oluşturmak için gerekli bileşenleri içermektedir:
package org.firstinspires.ftc.teamcode;
import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode;
import com.qualcomm.robotcore.eventloop.opmode.Autonomous;
import com.qualcomm.robotcore.hardware.DcMotor;
@Autonomous // opMode'yi otonom bir opMode olarak ayarlar
public class HelloRobot_Encoder extends LinearOpMode {
private DcMotor leftmotor;
private DcMotor rightmotor;
@Override
public void runOpMode() {
leftmotor = hardwareMap.get(DcMotor.class, "leftmotor");
rightmotor = hardwareMap.get(DcMotor.class, "rightmotor");
// Start için bekle (sürücü PLAY'e basana kadar)
waitForStart();
// Maç bitene kadar çalışmaya devam et (sürücü STOP'a basana kadar)
while (opModeIsActive()){
}
}
}Motorların yönlerini ters çevirmeyi unutmayın! Bazı drivetrain'lerde, motorlardan birinin ters çevrilmesi gerekebilir. Örneğin, Class Bot V2'de, motorlar simetriktir ve biri ters çevrilmelidir. Örneğimizde, kodu şu şekilde değiştireceğiz:
public void runOpMode() {
leftmotor = hardwareMap.get(DcMotor.class, "leftmotor");
rightmotor = hardwareMap.get(DcMotor.class, "rightmotor");
rightmotor.setDirection(DcMotor.Direction.REVERSE);
waitForStart();
}RUN_TO_POSITION Modu
Encoder kullanımı ile, RUN_TO_POSITION modu üç adımlık bir süreç gerektirir:
Hedef Pozisyonu Ayarlama İlk adım, hedef pozisyonu ayarlamaktır. Bunu yapmak için,
leftmotor.setTargetPosition(1000);verightmotor.setTargetPosition(1000);kodlarını waitForStart(); komutundan sonra ekleyin.
waitForStart();
leftmotor.setTargetPosition(1000);
rightmotor.setTargetPosition(1000);
while (opModeIsActive()){
}Şu anda, hedef pozisyonumuzu 1000 tik olarak belirliyoruz. Robotumuzun belirli bir mesafe kat etmesini istiyorsak, önce bir hesaplama yapmamız gerekecek. Ancak basitlik adına, şimdilik hedef pozisyonumuzu 1000 tik olarak ayarlayalım.
RUN_TO_POSITION Modunu Aktif Etme Hedef pozisyonu ayarladıktan sonra, her iki motoru RUN_TO_POSITION moduna almak gerekir. Aşağıdaki kod satırlarını, setTargetPosition komutlarının altına ekleyin:
waitForStart();
leftmotor.setTargetPosition(1000);
rightmotor.setTargetPosition(1000);
leftmotor.setMode(DcMotor.RunMode.RUN_TO_POSITION);
rightmotor.setMode(DcMotor.RunMode.RUN_TO_POSITION);
while (opModeIsActive()){
}Dikkat! Sıralama çok önemlidir. TargetPosition komutları, RUN_TO_POSITION modundan önce gelmelidir, aksi takdirde hata alırsınız.
Motor Gücünü Ayarlama Normalde, motorların istenilen pozisyona ulaşabilmesi için hızlarını hesaplamak gerekir. Ancak, test amaçlı olarak, motorlara %80 güç vermek için setPower fonksiyonunu kullanacağız. Bu, hız ayarlarını yapmadan da motorların hedefe ulaşmasını sağlar.
waitForStart();
leftmotor.setTargetPosition(1000);
rightmotor.setTargetPosition(1000);
leftmotor.setMode(DcMotor.RunMode.RUN_TO_POSITION);
rightmotor.setMode(DcMotor.RunMode.RUN_TO_POSITION);
leftmotor.setPower(0.8);
rightmotor.setPower(0.8);
while (opModeIsActive()){
}STOP_AND_RESET_ENCODERS
Testlerinizi yaparken, motorların encoder'larını sıfırlamak isteyebilirsiniz. Bunu sağlamak için, waitForStart(); komutundan hemen önce aşağıdaki kodu ekleyin:
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);
waitForStart();
}Bu, her iki motorun da sıfırdan başlamasını sağlar.
While Loop Yapısını Ayarlama
Motorlar hedef pozisyona ulaşana kadar programın çalışmasını istiyoruz. Bunun için while döngüsünü düzenlemeliyiz.
LinearOpMode içinde, while döngüsünün koşulu her zaman opModeIsActive() olmalıdır. Bu, STOP düğmesine basıldığında döngünün sonlanmasını sağlar.
Motorlar hedef pozisyona ulaşana kadar döngünün devam etmesi için, aşağıdaki kodu kullanabiliriz:
while (opModeIsActive() && (leftmotor.isBusy() && rightmotor.isBusy())) {
}Bu kod, her iki motor da hedef pozisyona ulaşana kadar döngüye devam eder. Ancak, motorlardan biri hedefe ulaştığında programın sonlanmasını istiyorsak, şu şekilde de yazabiliriz:
while (opModeIsActive() && (leftmotor.isBusy() || rightmotor.isBusy())) {
}Bu şekilde, bir motor hedef pozisyona ulaşsa bile diğerinin hedefe ulaşmasını bekleyecektir.
Last updated