Encoders - Software, Kodlayıcılar - Yazılım

Not

Bu bölüm yazılımdaki kodlayıcıları kapsar. Kodlayıcılarla ilgili bir donanım kılavuzu için bkz .:ref:docs / hardware / sensor / encoders-hardware: Encoders - Hardware.

Quadrature Encoders determine direction by observing which pulse channel (A or B) receives a pulse first.

Kodlayıcılar, hareketi (genellikle bir şaftın dönüşünü) ölçmek için kullanılan cihazlardır. FRC | reg | ‘de kullanılan kodlayıcılar “karesel kodlayıcılar” olarak bilinir. Bu kodlayıcılar, çeyrek dönem faz dışı olan iki kanalda kare dalga sinyalleri üretir (bu nedenle “kareleme” terimi). Darbeler dönüşü ölçmek için kullanılır ve hareketin yönü hangi kanalın diğerine “yönlendirdiği” belirlenebilir.

A Quadrature Decoder analyzing the A, B, and Index signals.

FPGA, şunlara bağlı olarak bir sayaç modülü veya bir kodlayıcı modülü aracılığıyla kodlayıcıları işler decoding type seçim WPILib tarafından otomatik olarak yapılır. FPGA, 8 kodlayıcı modülü içerir.

Encoder sınıfı

WPILib kodlayıcılar için Encoder class (Java, C++) aracılığıyla destek sağlar. Bu sınıf, kodlayıcılardan verileri yapılandırmak ve okumak için basit bir API sağlar.

Önemli

The Encoder class is only used for encoders that are plugged directly into the roboRIO! Please reference the appropriate vendors’ documentation for using encoders plugged into motor controllers.

Bir encoder-kodlayıcıyı başlatma

Bir kodlayıcı aşağıdaki gibi başlatılabilir:

// Initializes an encoder on DIO pins 0 and 1
// Defaults to 4X decoding and non-inverted
Encoder encoder = new Encoder(0, 1);

Decoding type- Kod çözme türü

WPILib: code:Encoder sınıfı, kodlayıcı sinyallerinin kodunu üç farklı modda çözebilir:

  • ** 1X Decoding **: Enkoder sinyalinin her tam periyodu için mesafeyi artırır (dört kenarda bir).

  • ** 2X Decoding **: Enkoder sinyalinin her yarım dönemi için mesafeyi artırır (iki kenarda bir kez).

  • ** 4X Decoding **: Kodlayıcı sinyalinin her kenarı için mesafeyi artırır (periyot başına dört kez).

4X Decoding-kod çözme, en yüksek hassasiyeti sunar, ancak hız ölçümlerinde artan “jitter-seğirme” potansiyel maliyetiyle. Farklı bir kod çözme türü kullanmak için aşağıdaki yapıcıyı kullanın:

// Initializes an encoder on DIO pins 0 and 1
// 2X encoding and non-inverted
Encoder encoder = new Encoder(0, 1, false, Encoder.EncodingType.k2X);

Enkoder parametrelerini yapılandırma

Not

Encoder sınıfı, mesafe birimleri hakkında herhangi bir varsayımda bulunmaz; darbe başına mesafe değerini hesaplamak için kullanılan birimlerdeki değerleri döndürür. Kullanıcılar böylece kullanılan mesafe birimleri üzerinde tam kontrole sahip olur. Ancak, zaman birimleri *always-her zaman * saniye cinsindendir.

Not

Darbe başına mesafe hesaplamasında kullanılan darbe sayısı şuna * bağlı değildir * decoding type her “pulse-darbe” her zaman dikkate alınmalıdır tam bir döngü (dört kenar).

Encoder sınıfı bir dizi yapılandırma yöntemi sunar:

// Configures the encoder to return a distance of 4 for every 256 pulses
// Also changes the units of getRate
encoder.setDistancePerPulse(4./256.);

// Configures the encoder to consider itself stopped after .1 seconds
encoder.setMaxPeriod(.1);

// Configures the encoder to consider itself stopped when its rate is below 10
encoder.setMinRate(10);

// Reverses the direction of the encoder
encoder.setReverseDirection(true);

// Configures an encoder to average its period measurement over 5 samples
// Can be between 1 and 127 samples
encoder.setSamplesToAverage(5);

Kodlayıcılardan bilgi okuma

Encoder sınıfı, kullanıcıya kodlayıcının hareketi hakkında zengin bilgi sağlar.

Distance-Mesafe

Not

Quadrature kodlayıcılar relative- göreli mesafeyi ölçer, mutlak değil; döndürülen mesafe değeri, robot açıldığında veya kodlayıcı değeri en son olduğunda kodlayıcının konumuna bağlı olacaktır reset.

Kullanıcılar, kodlayıcının kat ettiği toplam mesafeyi : code: `getDistance ()’ yöntemiyle elde edebilir:

// Gets the distance traveled
encoder.getDistance();

Rate-Oran

Not

Encoder sınıfı için zaman birimleri saniye cinsinden always-her zaman şeklindedir.

Kullanıcılar, kodlayıcının geçerli değişim oranını : code: getRate () yöntemiyle elde edebilir:

// Gets the current rate of the encoder
encoder.getRate();

Stopped-Durduruldu

Kullanıcılar, kodlayıcının sabit olup olmadığını şu yöntemle öğrenebilir : code: getStopped () yöntemi:

// Gets whether the encoder is stopped
encoder.getStopped();

Direction-Yön

Kullanıcılar, kodlayıcının en son hareket ettiği yönü: code: getDirection () yöntemiyle elde edebilir:

// Gets the last direction in which the encoder moved
encoder.getDirection();

Period

Kullanıcılar, kodlayıcı darbelerinin süresini (saniye cinsinden): code : getPeriod () yöntemiyle elde edebilir:

// Gets the current period of the encoder
encoder.getPeriod();

Resetting an encoder-Bir kodlayıcının sıfırlanması

Bir kodlayıcıyı sıfır mesafeli okumaya sıfırlamak için : code: reset () yöntemini çağırın. Bu, ölçülen mesafenin istenen gerçek fiziksel ölçüme karşılık gelmesini sağlamak için kullanışlıdır ve genellikle : ref: homing <docs/software/sensors/encoders-software:Homing a mechanism> rutini sırasında çağrılır:

// Resets the encoder to read a distance of zero
encoder.reset();

Using encoders in code-Kodlayıcıları kodda kullanma

Kodlayıcılar, FRC’deki en kullanışlı sensörlerden bazılarıdır; bunlar, otomatik olmayan çalıştırma ve hareket kabiliyetine sahip bir robot yapmak için neredeyse bir gerekliliktir. Kodlayıcıların robot kodundaki potansiyel uygulamaları burada tam olarak özetlenemeyecek kadar çoktur, ancak aşağıda birkaç temel örnek verilmiştir:

Driving to a distance-Bir mesafeye sürüş

Kodlayıcılar, basit bir “”drive to distance-uzaklığa sür” rutini oluşturmak için bir robot sürücüsünde kullanılabilir. Bu, robot özerkliği için çok kullanışlıdır:

// Creates an encoder on DIO ports 0 and 1
Encoder encoder = new Encoder(0, 1);

// Initialize motor controllers and drive
Spark left1 new Spark(0);
Spark left2 = new Spark(1);

Spark right1 = new Spark(2);
Spark right2 = new Spark(3);

SpeedControllerGroup leftMotors = new SpeedControllerGroup(left1, left2);
SpeedControllerGroup rightMotors = new SpeedControllerGroup(right1, right2);

DifferentialDrive drive = new DifferentialDrive(leftMotors, rightMotors);

@Override
public void robotInit() {
    // Configures the encoder's distance-per-pulse
    // The robot moves forward 1 foot per encoder rotation
    // There are 256 pulses per encoder rotation
    encoder.setDistancePerPulse(1./256.);
}

@Override
public void autonomousPeriodic() {
    // Drives forward at half speed until the robot has moved 5 feet, then stops:
    if(encoder.getDistance() < 5) {
        drive.tankDrive(.5, .5);
    } else {
        drive.tankDrive(0, 0);
    }
}

Stabilizing heading-Yönü sabitllemek

Uyarı

Tüm kontrol döngülerinde olduğu gibi, kullanıcılar sensör yönünün ve dönüş yönünün tutarlı olmasını sağlamak için dikkatli olmalıdır. Aksi takdirde, döngü dengesiz olacak ve robot çılgınca dönecektir.

Kodlayıcılar, bir robotun aşağıdakine oldukça benzer bir şekilde düz hareket etmesini sağlamak için kullanılabilir <docs/software/sensors/gyros-software:Stabilizing heading while driving>`. P döngüsü ile basit bir uygulama aşağıda verilmiştir:

// The encoders for the drive
Encoder leftEncoder = new Encoder(0,1);
Encoder rightEncoder = new Encoder(2,3);

// The gain for a simple P loop
double kP = 1;

// Initialize motor controllers and drive
Spark left1 = new Spark(0);
Spark left2 = new Spark(1);

Spark right1 = new Spark(2);
Spark right2 = new Spark(3);

SpeedControllerGroup leftMotors = new SpeedControllerGroup(left1, left2);
SpeedControllerGroup rightMotors = new SpeedControllerGroup(right1, right2);

DifferentialDrive drive = new DifferentialDrive(leftMotors, rightMotors);

@Override
public void autonomousInit() {
    // Configures the encoders' distance-per-pulse
    // The robot moves forward 1 foot per encoder rotation
    // There are 256 pulses per encoder rotation
    leftEncoder.setDistancePerPulse(1./256.);
    rightEncoder.setDistancePerPulse(1./256.);
}

@Override
public void autonomousPeriodic() {
    // Assuming no wheel slip, the difference in encoder distances is proportional to the heading error
    double error = leftEncoder.getDistance() - rightEncoder.getDistance();

    // Drives forward continuously at half speed, using the encoders to stabilize the heading
    drive.tankDrive(.5 + kP * error, .5 - kP * error);
}

Daha gelişmiş uygulamalar, daha karmaşık kontrol döngüleri kullanabilir. Kodlayıcı farkında bir kontrol döngüsünün kapatılması, başlık hatasında kapatılmasına kabaca benzer ve bu nedenle PD döngüleri özellikle etkilidir.

PID Kontrol

Enkoderler özellikle PID denetleyicilerine girdi olarak kullanışlıdır (yukarıdaki başlık sabitleme örneği basit bir P döngüsüdür).

Bir mekanizmaya yön verme

Kodlayıcılar * relative-göreli * mesafeyi ölçtüğünden, “zero-point-sıfır noktalarının” doğru yerde olmasını sağlamak genellikle önemlidir. Bunu yapmanın tipik bir yolu, bir mekanizmanın bilinen bir konuma (genellikle bir limit anahtarı ile gerçekleştirilir) veya “ana konuma” ulaşana kadar hareket ettirildiği ve ardından kodlayıcının sıfırlandığı bir “hedef arama rutini” dir. Aşağıdaki kod, temel bir örnek sağlar:

Encoder encoder = new Encoder(0, 1);

Spark spark = new Spark(0);

// Limit switch on DIO 2
DigitalInput limit = new DigitalInput(2);

public void autonomousPeriodic() {
    // Runs the motor backwards at half speed until the limit switch is pressed
    // then turn off the motor and reset the encoder
    if(!limit.get()) {
        spark.set(-.5);
    } else {
        spark.set(0);
        encoder.reset();
    }
}