Hedef Pozisyon Hesaplama

Şimdi hedef pozisyonumuz için bir tahminimiz olduğuna göre, Drivetrain Encoder'ları bölümünde ele aldığımız benzer yöntemleri kullanarak bunu daha hassas bir şekilde netleştirip netleştiremeyeceğimize bakalım.

Dönüştürme İçin Gerekenler

Dönüş Başına Tıklama Hatırlayın ki, encoder mili dönüş başına tıklama sayısı, mekanizmayı kontrol eden mili dönüş başına tıklama sayısından farklıdır, tıpkı Drivetrain'imizde belirlediğimiz gibi.

Bir mekanizma üzerindeki hareket iletiminin etkisi hakkında daha fazla bilgi için Compound Gearing bölümüne bakabilirsiniz.

Encoder mili dönüş başına tıklama sayısı, motora ve encodera bağlıdır. Motorlar ve entegre encoder'lar üreten üreticiler, dönüş başına tıklama sayısı hakkında bilgi sağlar.

Motorunuz veya encoder'larınız için daha fazla bilgiye üreticinin web sitesinden ulaşabilirsiniz. HD Hex Motorlar veya Core Hex Motorlar için Motor dökümantasyonuna bakabilirsiniz.

Core Hex Motor özelliklerinde iki farklı Encoder Dönüş Başına Tıklama sayısı vardır:

  • Motorda - 4 tıklama/dönüş

  • Çıktıda - 288 tıklama/dönüş

Motorda, encoder'ın bulunduğu mil üzerindeki tıklama sayısıdır. Bu sayı, HD Hex Motor için kullandığımız 28 dönüş başına tıklama sayısına eşdeğerdir.

"Çıktıda" 288 tıklama, hareket motor ile 72:1 dişli kutusuna iletildikten sonra çözünürlükteki değişikliği hesaba katar.

Dişli kutusunu toplam dişli oranı değişkenimizde hesaba katmamak için dönüş başına 288 tıklamayı kullanacağız.

Toplam Dişli Oranı

Motor dişli kutusundan dönüş başına tıklamalara kadar olan dişli oranını oluşturduğumuzdan, bu bölümün ana odak noktası kol ekleminin dişli oranını hesaplamaktır.

Motor mili, hareketi 45 dişli bir çarkla 125 dişli bir çarka iletir. Toplam dişli oranı 125T:45T'dir. Bu dişli sistemi için dişli oranını hesaplamak için 125'i 45'e bölelim.

125 ÷ 45 = 2.777778

Özetle, Class Bot V2 için şu bilgiler doğrudur:

  • Dönüş başına tıklama: 288 tıklama

  • Toplam dişli oranı: 2.777778

Kol Encoder'larını Programa Dahil Etme

Başlatma Değişkenlerini Tanımlamak Şimdi bu bilgileri kullanarak iki sabit değişken oluşturalım:

  • COUNTS_PER_MOTOR_REV

  • GEAR_REDUCTION

COUNTS_PER_MOTOR_REV ve GEAR_REDUCTION değişkenlerini, donanım değişkenlerinin oluşturulduğu kısmın altına OpMode'a ekleyin.

public class HelloRobot_ArmEncoder extends LinearOpMode {
    private DcMotor arm;
    
    static final double     COUNTS_PER_MOTOR_REV    = 288; 
    static final double     GEAR_REDUCTION          = 2.7778;   
}

Bu iki değişken tanımlandıktan sonra, bunları kullanarak iki diğer değişkeni hesaplayabiliriz: 125T tahrik dişlisinin her dönüşü için encoder tıklama sayısı ve hareket ettirilen her derece için tıklama sayısı.

Değişkenlere Hesaplamalar Eklemek

125T dişlisinin dönüş başına tıklama sayısını (veya COUNTS_PER_GEAR_REV) hesaplamak, COUNTS_PER_WHEEL_REV değişkenimiz için Encoder Tıklamalarını Dönüştürme bölümünde kullandığımız aynı formüldür.

Bu değişkeni elde etmek için COUNTS_PER_MOTOR_REV'i GEAR_REDUCTION ile çarpabiliriz.

static final double  COUNTS_PER_GEAR_REV    = COUNTS_PER_MOTOR_REV * GEAR_REDUCTION;

Her derece için tıklama sayısını (veya COUNTS_PER_DEGREE) hesaplamak için COUNTS_PER_GEAR_REV değişkenini 360'a bölelim.

static final double     COUNTS_PER_DEGREE    = COUNTS_PER_GEAR_REV / 360;

Bu değişkenlerin her ikisini de OpMode'a ekleyin:

public class HelloRobot_ArmEncoder extends LinearOpMode {
    private DcMotor arm;
    
    static final double     COUNTS_PER_MOTOR_REV    = 288; 
    static final double     GEAR_REDUCTION          = 2.7778;   
    static final double     COUNTS_PER_GEAR_REV     = COUNTS_PER_MOTOR_REV * GEAR_REDUCTION;
    static final double     COUNTS_PER_DEGREE       = COUNTS_PER_GEAR_REV / 360;
}

If/Else Durumumuzu Ayarlamak

Bir pozisyon olarak işlev görecek bir başka sabit olmayan değişken oluşturmamız gerekiyor. Bu değişkenin adı armPosition olacak.

public void runOpMode() {
        arm = hardwareMap.get(DcMotor.class, "arm");
        
        int armPosition;
        
        waitForStart();

Bu değişkeni, gamepad1.dpad_up kısmındaki Hedef Pozisyon if/else durumuna ekleyin.

90 derece pozisyonuna ulaşmak için, kolun yaklaşık 45 derece hareket etmesi gerekir, bu nedenle arm pozisyonunu COUNTS_PER_DEGREE ile 45 çarpacak şekilde ayarlayın.

while (opModeIsActive()) {

   if(gamepad1.dpad_up){
         armPosition = (int)(COUNTS_PER_DEGREE * 45);
         arm.setTargetPosition(83);
         arm.setMode(DcMotor.RunMode.RUN_TO_POSITION);
         arm.setPower(0.4);
                 }

Hedef pozisyonu armPosition olarak değiştirin.

if(gamepad1.dpad_up){
     armPosition = (int)(COUNTS_PER_DEGREE * 45);
     arm.setTargetPosition(armPosition);
     arm.setMode(DcMotor.RunMode.RUN_TO_POSITION);
     arm.setPower(0.4);
}
else if (gamepad1.dpad_down){
      arm.setTargetPosition(0);
      arm.setMode(DcMotor.RunMode.RUN_TO_POSITION);
      arm.setPower(0.4);
} 

armPosition'u gamepad1.dpad_down kısmındaki if/else if durumu için şu şekilde değiştirebiliriz:

else if (gamepad1.dpad_down){
      armPosition = (int)(COUNTS_PER_DEGREE * 0);
      arm.setTargetPosition(armPosition);
      arm.setMode(DcMotorEx.RunMode.RUN_TO_POSITION);
      arm.setPower(0.4);
} 

Bu durumda, armPosition'u, oluşturmak istediğimiz her pozisyonun gereksinimlerine göre sürekli olarak yeniden tanımlayabiliriz.

Şu anda sadece iki pozisyonumuz olduğu için (başlangıç pozisyonu ve 90 derece pozisyonu), bunu yapmamız gerekmiyor. Ancak bu tür durumlarda bir değişken oluşturmak iyi bir uygulamadır. Eğer daha sonra başka bir pozisyon eklemek istersek, değişkeni kolayca düzenleyebiliriz.

Last updated