Encoder Temelleri
Encoder Nedir? Encoder'lar, bazı motorlara entegre edilmiş bir tür sensördür ve robotumuza geri bildirim sağlamaya yardımcı olur. Farklı encoder türleri olsa da, bu eğitimde quadrature encoder adı verilen türüne odaklanacağız. Bu encoder'lar, motorun kaç dönüş yaptığını sayabilir, buna bazen "tick" denir.
Quadrature encoder'lar kesin pozisyonları belirleyemese de, motoru belirli bir noktaya hareket ettirmek için kullanılabilirler. Bunu nasıl yapacağımızı bu eğitimde ilerleyen bölümlerde göreceğiz, ancak bu işlem, önce kodda bir başlangıç noktası belirtmek ve ardından motorun hareket etmesi gereken noktayı belirlemekle çalışır.
Motor Modlarını Keşfetmek
Motorumuzun encoder'ını hangi modda kullanabileceğimize daha yakından bakalım. Mod, genellikle kodun başlatılma sürecinde belirlenir, yani motorlar program boyunca kullanıma hazır olur, ancak özel kullanım senaryoları için çalıştırma esnasında değiştirilebilir.
Hangi modu kullanmamız gerektiği büyük ölçüde motorun ve bağlı mekanizmanın amacına bağlıdır. Örneğin, joystick'in girdisiyle kontrol edilen drivetrain motorları için encoder'ların aktif olmasına gerek olmayabilir. Ancak, belirli bir hızı gerektiren bir flywheel tasarımımız varsa, encoder'lar bu hızın elde edilmesinde bize yardımcı olabilir.
STOP_AND_RESET_ENCODER Kullanımı
Encoder'ları kullanırken, başlatmadan önce STOP_AND_RESET_ENCODER'ı kullanmak şiddetle tavsiye edilir. Bu, motorun hangi pozisyonda başladığını bilmenizi sağlar, ancak her seferinde tekrar edilebilir bir başlangıç yapılandırması planlamanız gerekecektir.
Bir motor, kod çalışırken de STOP_AND_RESET_ENCODER'a geçirilebilir. Bu genellikle, bir motorun düzgün çalışmaması durumunda encoder'ı sıfırlamak için gamepad üzerindeki bir buton kullanılarak yapılır, örneğin robot bir engelle takıldığında.
Aşağıda, OnBot Java'da encoder'ı nasıl sıfırlayacağınızı gösteren bir kod örneği bulunmaktadır. Eğer motor nesnesini hardwareMap üzerinden zaten aldıysanız, ilk satırı atlayabilirsiniz:
DcMotorEx motor = hardwareMap.get(DcMotorEx.class, "Motor");
motor.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER);RUN_WITHOUT_ENCODER Kullanımı
Bu modu, Control Hub'ın encoder'ları kullanarak sabit bir hız korumaya çalışmasını istemediğinizde kullanırsınız. Yine de encoder değerlerine erişebilirsiniz, ancak gerçek motor hızınız, batarya ömrü ve sürtünme gibi dış faktörlere bağlı olarak daha fazla değişecektir. Bu modda, -1 ile 1 arasında bir güç seviyesini belirtirsiniz, burada -1 tam hız geri, 0 duraklama, 1 ise tam hız ileri anlamına gelir. Gücü azaltmak, hem torku hem de hızı azaltır.
RUN_WITHOUT_ENCODER motor modu oldukça basittir, sadece program boyunca bir güç seviyesi belirlersiniz, örneğin drivetrain için joystick'ler ile belirlenebilir.
Java'da güç seviyesi şu şekilde ayarlanır:
DcMotorEx motor = hardwareMap.get(DcMotorEx.class, "Motor");
motor.setMode(DcMotor.RunMode.RUN_WITHOUT_ENCODER);
// Bu, motoru yarım güçle ileri çalıştırır
double motorPower = 0.5;
motor.setPower(motorPower);RUN_USING_ENCODER Kullanımı
Bu modda, Control Hub encoder'ı aktif bir şekilde motor hızını yönetmek için kullanacaktır. Doğrudan mevcut gücün bir yüzdesini uygulamak yerine, RUN_USING_ENCODER modu, belirli bir hız hedefler. Bu, motorun sürtünme, batarya voltajı ve diğer faktörleri hesaba katmasını sağlar. RUN_USING_ENCODER modunda hala bir güç seviyesi verebilirsiniz, ancak bu önerilmez çünkü hedef hızı önemli ölçüde sınırlayacaktır.
RUN_WITHOUT_ENCODER modundan hız belirlemek, motoru RUN_USING_ENCODER moduna otomatik olarak geçirecektir. Motorun tam yük ve düşük batarya ile bile ulaşabileceği bir hız seçmelisiniz.
Hız, Java'da setVelocity() fonksiyonu ile ayarlanır:
DcMotorEx motor = hardwareMap.get(DcMotorEx.class, "Motor");
motor.setMode(DcMotor.RunMode.RUN_USING_ENCODER);
// Bu, motoru saniyede 200 tick hızında döndürür
double motorVelocity = 200;
motor.setVelocity(motorVelocity);RUN_TO_POSITION Kullanımı
Bu modda, Control Hub motorun hızını değil, belirli bir pozisyona ulaşmayı hedefler. Yine de hız belirleyebilirsiniz, ancak bu yalnızca maksimum hız olarak kullanılır. Motor, hedefine ulaştıktan sonra bile pozisyonunu tutmaya devam eder.
Motor, belirlenen pozisyona ulaşamazsa, o pozisyona ulaşmak veya o pozisyonu korumak için çalışmaya devam eder, bu da motorun durmasına ve aşırı ısınmasına neden olabilir.
RUN_TO_POSITION modunu kullanmak için şu adımları takip etmelisiniz:
Bir hedef pozisyon belirleyin (tick cinsinden ölçülür)
RUN_TO_POSITION moduna geçin
Maksimum hızı ayarlayın (gamepad girişi tarafından belirlenmemişse)
Her zaman encoder'ı başlatmadan önce sıfırlamak önerilir, ancak robotunuzun fiziksel olarak başlangıç pozisyonuna sıfırlandığından emin olmanız gerekir. Örneğin, bir kolun başlangıç konfigürasyonuna getirilmesi gerekebilir, tıpkı FTC yarışmalarının başında olduğu gibi.
Motor, pozisyona ulaştıktan sonra bile pozisyonunu tutmaya devam edecektir, hız veya güç sıfıra ayarlanmadığı veya başka bir motor moduna geçilmediği sürece.
package org.firstinspires.ftc.teamcode;
@TeleOp
public class JavaRunToPositionExample extends LinearOpMode {
DcMotorEx motor;
@Override
public void runOpMode() {
motor = hardwareMap.get(DcMotorEx.class, "Motor");
// Başlangıçta encoder'ı sıfırla
motor.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER);
waitForStart();
// Motorun hedef pozisyonunu 300 tick olarak ayarla
motor.setTargetPosition(300);
// RUN_TO_POSITION moduna geç
motor.setMode(DcMotor.RunMode.RUN_TO_POSITION);
// Motoru 200 tick/saniye hızında hareket ettir
motor.setVelocity(200);
// Op Mode çalışırken motorun durumunu telemetry ile göster
while (opModeIsActive()) {
telemetry.addData("velocity", motor.getVelocity());
telemetry.addData("position", motor.getCurrentPosition());
telemetry.addData("is at target", !motor.isBusy());
telemetry.update();
}
}
}Last updated