Hareket Alanını Kontrol Etmek İçin Sınırlar Kullanma
Part 2: Robot Kontrol'de, bir limit anahtarı oluşturma fikri, dokunma sensörü gibi fiziksel bir sensör kullanılarak tanıtıldı. Bunun benzerini motorun yerleşik encoder'ını kullanarak da yapabiliriz. Fiziksel bir sensör sert bir limit olarak tanımlanırken, yerleşik encoder kullanmak "yumuşak limit" olarak adlandırılır.
Yumuşak limitleri ayarlamak için, son bölümlerde oluşturduğumuz programı (HelloRobot_ArmEncoder) kullanacağız!
@TeleOp
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;
@Override
public void runOpMode() {
arm = hardwareMap.get(DcMotor.class, "arm");
waitForStart();
while (opModeIsActive()) {
telemetry.addData("Status", "Running");
telemetry.update();
}
}
}minPosition ve maxPosition Oluşturma
minPosition ve maxPosition OluşturmaBaşlamak için, üst ve alt limitlerimizi oluşturmalıyız. minPosition ve maxPosition adında iki yeni değişken oluşturup bunları başlatma kısmına ekleyeceğiz.
Bu değişkenleri OpMode'un başlatma kısmına, waitForStart(); komutundan önce ekleyin.
public void runOpMode() {
arm = hardwareMap.get(DcMotor.class, "arm");
int minPosition;
int maxPosition;
waitForStart();Şimdilik, minPosition'ı başlangıç pozisyonu olarak, maxPosition'ı ise 90 derece pozisyonu olarak ayarlamak istiyoruz. minPosition'ı 0 olarak ve maxPosition'ı COUNTS_PER_DEGREE * 45 olarak ayarlayın.
Unutmayın, veri türü dönüşümü yapmanız gerekebilir!
int minPosition = 0;
int maxPosition = (int)(COUNTS_PER_DEGREE * 45);If/Else Koşulunu Düzenleme
If/Else Koşulunu DüzenlemeBaşlamak için, If/Else koşulumuzu, kolun pozisyonunu tahmin etmeye başlamadaki basitleştirilmiş formata geri döndüreceğiz.
while(opModeIsActive()) {
if(gamepad1.dpad_up) {
arm.setPower(0.5);
}
else if (gamepad1.dpad_down) {
arm.setPower(-0.5);
}
else {
arm.setPower(0);
}
}Sınırı ayarlamak için, if/else koşulumuzu, sınırlarımızı içerecek şekilde düzenlememiz gerekiyor:
Dpad yukarı tuşuna basılırsa ve kolun pozisyonu
maxPosition'dan küçükse, kolmaxPosition'a hareket edecektir.Dpad aşağı tuşuna basılırsa ve kolun pozisyonu
minPosition'dan büyükse, kolminPosition'a doğru hareket edecektir.
while (opModeIsActive()) {
if (gamepad1.dpad_up && arm.getCurrentPosition() < maxPosition) {
arm.setPower(0.5);
}
else if (gamepad1.dpad_down && arm.getCurrentPosition() > minPosition) {
arm.setPower(-0.5);
}
else {
arm.setPower(0);
}
}Mevcut kod yapılandırması, motoru, motoru çalıştırmak için gerekli koşullar karşılanmadığında durduracaktır. Mekanizmanın ağırlığı ve taşıdığı yük gibi faktörlere bağlı olarak, motor durduğunda kol maxPosition'ın altına düşebilir. Kodu test etmek için zaman ayırın ve beklediğiniz gibi davrandığından emin olun.
Limitleri Aşma
Yumuşak limitlerin avantajlarından biri, bu limitlerin aşılabilir olmasıdır.
Unutmayın ki encoder'ın sıfır tıklama pozisyonu, Control Hub açıldığında kolun pozisyonuyla belirlenir! Bu nedenle, robotu açmadan önce kolu sıfırlamazsak, kolun hareket alanını etkileyebiliriz. Örneğin, eğer kol Control Hub açıldığında 90 derece pozisyondaysa, 90 derece pozisyonu sıfır encoder tıklaması olarak kabul edilir.
Yedek olarak, hareket alanı için bir geçersiz kılma (override) oluşturabiliriz. Geçersiz kılma oluşturmanın birkaç farklı yolu vardır, ancak biz bu örnekte "A" tuşunu ve dokunma sensörünü kullanarak hareket alanımızı sıfırlayacağız.
Gamepad Geçersiz Kılma Eklemek
İlk olarak, if/else if koşulunu düzenleyerek başka bir else if koşulu ekleyin. Koşul olarak gamepad1.a satırını kullanın. Eylem öğesi olarak ise arm.setPower(-0.5); komutunu ekleyin.
while (opModeIsActive()) {
if (gamepad1.dpad_up && arm.getCurrentPosition() < maxPosition) {
arm.setPower(0.5);
}
else if (gamepad1.dpad_down && arm.getCurrentPosition() > minPosition) {
arm.setPower(-0.5);
}
else if(gamepad1.a) {
arm.setPower(-0.5);
}
else {
arm.setPower(0);
}
}Artık bu değişiklikle, "A" tuşuna basıldığında kol başlangıç pozisyonuna doğru hareket edecektir.
Dokunma Sensörü Limit Ekleme
Kol, dokunma sensörüne ulaşır ve sensöre basarsa, STOP_AND_RESET_ENCODER komutunun çalışmasını istiyoruz.
Bunu başarmak için, dokunma sensörünün basıldığını kontrol eden bir if ifadesi oluşturabiliriz.
if (touch.isPressed()) {
arm.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER);
}Yani, eğer dokunma sensörü doğru dönerse (veya basılırsa), motorun çalışma modu STOP_AND_RESET_ENCODER olacak ve motor encoder'ı sıfırlayarak 0 tıklama pozisyonuna dönecektir.
Kodu Test Etme
Şimdi bu kod tamamlandığında, test etmeye başlayabilirsiniz!
@TeleOp
public class HelloRobot_ArmEncoder extends LinearOpMode {
private DcMotor arm;
private Servo claw;
private DcMotor leftmotor;
private DcMotor rightmotor;
private TouchSensor touch;
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;
@Override
public void runOpMode() {
arm = hardwareMap.get(DcMotor.class, "arm");
claw = hardwareMap.get(Servo.class, "claw");
leftmotor = hardwareMap.get(DcMotor.class, "leftmotor");
rightmotor = hardwareMap.get(DcMotor.class, "rightmotor");
touch = hardwareMap.get(TouchSensor.class, "touch");
int minPosition = 0;
int maxPosition = (int)(COUNTS_PER_DEGREE * 45);
waitForStart();
// Maç sonuna kadar çalıştır (sürücü STOP'a basana kadar)
while (opModeIsActive()) {
if (gamepad1.dpad_up && arm.getCurrentPosition() < maxPosition) {
arm.setPower(0.5);
}
else if (gamepad1.dpad_down && arm.getCurrentPosition() > minPosition) {
arm.setPower(-0.5);
}
else if (gamepad1.a) {
arm.setPower(-0.5);
}
else {
arm.setPower(0);
}
if (touch.isPressed()) {
arm.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER);
}
telemetry.addData("Arm Test", arm.getCurrentPosition());
telemetry.update();
}
}
}Last updated