Encoder Tıklarını Mesafeye Çevirme

Bir robotu doğru bir şekilde kontrol etmek için, motorun encoder'ından gelen tıklamaları fiziksel bir mesafeye dönüştürmek önemlidir. Bu, robotun belirli mesafelerde hareket etmesini sağlamak için kullanılır.

Dönüşüm İçin Gerekenler

Encoder tıklarını fiziksel bir mesafeye çevirmek için şu bilgilere ihtiyacınız var:

  1. Encoder Şaftının Her Dönüşü İçin Tık Sayısı Bu değer, motor ve encoder'a özgüdür. Örneğin, 28 tık HD Hex Motorları için standarttır.

  2. Toplam Dişli Oranı Dişli oranları, motor şaftının tekerleğe göre kaç kez döneceğini değiştirir ve bu, belirli bir mesafeyi kat etmek için gereken tık sayısını etkiler. Bu oran, dişliler, dişli kutuları, dişlilerle güç iletimi gibi bileşenleri içerir.

  3. Tahrik Tekerleğinin Çevresi Tekerleğin çevresi, encoder tıklarını fiziksel mesafeye dönüştürmek için gereklidir. Çevre hesaplama formülü şudur:

    C¸evre=C¸ap×π\text{Çevre} = \text{Çap} \times \pi

Adım Adım Dönüşüm Örneği

Adım 1: Verilerin Toplanması

Class Bot V2 için aşağıdaki bilgilere sahibiz:

  • Motorun Her Dönüşü İçin Tık Sayısı (COUNTS_PER_MOTOR_REV) = 28 tık

  • Toplam Dişli Oranı (DRIVE_GEAR_REDUCTION) = 30.21

  • Tekerlek Çapı = 90 mm (bu da çevreyi 90×π=282.74 mm90 \times \pi = 282.74 \, \text{mm} olarak verir)

Adım 2: Değişkenlerin Tanımlanması

Bu sabitleri, kodda değişkenler olarak tanımlayalım:

public class HelloRobot_EncoderAuton extends LinearOpMode {
    private DcMotor leftmotor;
    private DcMotor rightmotor;

    // Motor ve robot parametreleri için sabitler
    static final double COUNTS_PER_MOTOR_REV = 28.0; // Motorun her dönüşü için tık sayısı
    static final double DRIVE_GEAR_REDUCTION = 30.21; // Toplam dişli oranı
    static final double WHEEL_CIRCUMFERENCE_MM = 90.0 * Math.PI; // Tekerleğin çevresi mm cinsinden
}

Adım 3: Tekerlek Dönüşü Başına Tık Sayısının Hesaplanması

Tekerleğin bir tam dönüşü için kaç tık olduğunu hesaplamak için Motor Dönüşü Başına Tık SayısıToplam Dişli Oranıyla çarpmamız gerekir:

COUNTS_PER_WHEEL_REV=COUNTS_PER_MOTOR_REV×DRIVE_GEAR_REDUCTION\text{COUNTS\_PER\_WHEEL\_REV} = \text{COUNTS\_PER\_MOTOR\_REV} \times \text{DRIVE\_GEAR\_REDUCTION}

static final double COUNTS_PER_WHEEL_REV = COUNTS_PER_MOTOR_REV * DRIVE_GEAR_REDUCTION;

Adım 4: Milimetre Başına Tık Sayısının Hesaplanması

Şimdi, tekerleği 1 mm hareket ettirmek için gereken encoder tık sayısını hesaplamamız gerekir. Bunu yapmak için COUNTS_PER_WHEEL_REV'i WHEEL_CIRCUMFERENCE_MM'ye böleriz:

COUNTS_PER_MM=COUNTS_PER_WHEEL_REVWHEEL_CIRCUMFERENCE_MM\text{COUNTS\_PER\_MM} = \frac{\text{COUNTS\_PER\_WHEEL\_REV}}{\text{WHEEL\_CIRCUMFERENCE\_MM}}

static final double COUNTS_PER_MM = COUNTS_PER_WHEEL_REV / WHEEL_CIRCUMFERENCE_MM;

Tam Kod Örneği

Tüm bu hesaplamalarla birlikte, kodunuz şu şekilde görünebilir:

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
public class HelloRobot_EncoderAuton extends LinearOpMode {
    private DcMotor leftmotor;
    private DcMotor rightmotor;

    // Motor ve robot parametreleri için sabitler
    static final double COUNTS_PER_MOTOR_REV = 28.0; // Motorun her dönüşü için tık sayısı
    static final double DRIVE_GEAR_REDUCTION = 30.21; // Toplam dişli oranı
    static final double WHEEL_CIRCUMFERENCE_MM = 90.0 * Math.PI; // Tekerleğin çevresi mm cinsinden

    // Tekerlek dönüşü başına tık sayısını ve milimetre başına tık sayısını hesaplamak
    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(DcMotor.class, "leftmotor");
        rightmotor = hardwareMap.get(DcMotor.class, "rightmotor");

        // Sağ motoru ters çevirerek robotun düz hareket etmesini sağla
        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);

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

        // Her iki motorun hedef pozisyonunu (1000 tık) ayarla
        leftmotor.setTargetPosition(1000);
        rightmotor.setTargetPosition(1000);

        // Motorları pozisyona gitme moduna al
        leftmotor.setMode(DcMotor.RunMode.RUN_TO_POSITION);
        rightmotor.setMode(DcMotor.RunMode.RUN_TO_POSITION);

        // Motorların hareket etmesi için güç ayarla
        leftmotor.setPower(0.8);
        rightmotor.setPower(0.8);

        // Motorlar hedef pozisyona ulaşana kadar çalıştır
        while (opModeIsActive() && (leftmotor.isBusy() && rightmotor.isBusy())) {
            telemetry.addData("Sol Motor Pozisyonu", leftmotor.getCurrentPosition());
            telemetry.addData("Sağ Motor Pozisyonu", rightmotor.getCurrentPosition());
            telemetry.update();
        }
    }
}

Ana Noktalar:

  • COUNTS_PER_MOTOR_REV, motorun encoder şaftı için bir dönüş başına kaç tık olduğunu gösterir (HD Hex motorları için 28 tık).

  • DRIVE_GEAR_REDUCTION, motorun tekerleğe göre dönüş oranını değiştirir, bu da belirli bir mesafeyi kat etmek için gereken tık sayısını etkiler.

  • WHEEL_CIRCUMFERENCE_MM, tekerleğin bir dönüşüyle robotun kat ettiği mesafedir.

  • COUNTS_PER_WHEEL_REV, robotun bir tekerlek dönüşüyle ne kadar tık kaydettiğini hesaplar.

  • COUNTS_PER_MM, robotun 1 mm hareket etmesi için gereken tık sayısını verir.

Encoder geri bildirimi kullanarak hedef pozisyonları tıklama birimleri olarak ayarlayarak robotun tam mesafelerle hareket etmesini sağlayabilirsiniz.

Last updated