Limit Anahtarlarının Programlanması
Limit anahtarları sıklıkla robot üzerindeki düzenekleri yönetmek için kullanılmaktadır. Anahtarların kullanımı kolay olsa da hareket eden bir parçanın yalnızca tek bir konumunu algılayabiliriler. Buysa anahtarları hareketin belirli bir limiti aşmamasını sağlamak için iyi bir seçim yaparken limite yaklaşan hareketin hızını yönetmek konusunda pek başarılı yapmamaktadır. Örneğin, robot kolunda dönen bir omuz eklemi potansiyometre veya mutlak bir kodlayıcı kullanılarak daha iyi yönetilecektir. Limit anahtarı, potansiyometrenin yetersiz kaldığı bir durumda robotun çok ileri gidip bir hasara sebep olmasını engelleyecektir.
Limit anahtarlarının “normally open-normalde açık” veya “normally closed-normalde kapalı” çıkışları bulunabilmektedir. Bu çııkışlar, yüksek bir sinyalin anahtarın açık mı yoksa kapalı mı olduğunu kontrol edecektir. Limit anahtarı donanımı hakkında daha fazla bilgi edinmek için bu yazıya bakabilirsiniz.
Bir Motorun İki Limit Anahtarıyla Kontrol Edilmesi
DigitalInput m_toplimitSwitch = new DigitalInput(0);
DigitalInput m_bottomlimitSwitch = new DigitalInput(1);
PWMVictorSPX m_motor = new PWMVictorSPX(0);
Joystick m_joystick = new Joystick(0);
@Override
public void teleopPeriodic() {
setMotorSpeed(m_joystick.getRawAxis(2));
}
/**
* Sets the motor speed based on joystick input while respecting limit switches.
*
* @param speed the desired speed of the motor, positive for up and negative for down
*/
public void setMotorSpeed(double speed) {
if (speed > 0) {
if (m_toplimitSwitch.get()) {
// We are going up and top limit is tripped so stop
m_motor.set(0);
} else {
// We are going up but top limit is not tripped so go at commanded speed
m_motor.set(speed);
}
} else {
if (m_bottomlimitSwitch.get()) {
// We are going down and bottom limit is tripped so stop
m_motor.set(0);
} else {
// We are going down but bottom limit is not tripped so go at commanded speed
m_motor.set(speed);
}
}
}
frc::DigitalInput m_toplimitSwitch{0};
frc::DigitalInput m_bottomlimitSwitch{1};
frc::PWMVictorSPX m_motor{0};
frc::Joystick m_joystick{0};
void TeleopPeriodic() override { SetMotorSpeed(m_joystick.GetRawAxis(2)); }
void SetMotorSpeed(double speed) {
if (speed > 0) {
if (m_toplimitSwitch.Get()) {
// We are going up and top limit is tripped so stop
m_motor.Set(0);
} else {
// We are going up but top limit is not tripped so go at commanded speed
m_motor.Set(speed);
}
} else {
if (m_bottomlimitSwitch.Get()) {
// We are going down and bottom limit is tripped so stop
m_motor.Set(0);
} else {
// We are going down but bottom limit is not tripped so go at commanded
// speed
m_motor.Set(speed);
}
}
}