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:
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.
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.
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ını 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