Actuator Limits

CTR Electronics actuators, such as the TalonFX, support various kinds of hardware and software limits.

Note

The TalonFX + Kraken X60 does not support hardware limit switches. Instead, control request limit overrides can be used, or a CANcoder can be used a remote limit switch.

Documentation on wiring limit switches can be found here.

Retrieving Limit Switch State

The state of the forward or reverse limit switch can be retrieved from the API via getForwardLimit() and getReverseLimit(). Additionally, the state of the forward or reverse soft limit can be retrieved from the API via getFault_ForwardSoftLimit() and getFault_ReverseSoftLimit().

var forwardLimit = m_motor.getForwardLimit();
if (forwardLimit.getValue() == ForwardLimitValue.ClosedToGround) {
   // do action when forward limit is closed
}

var forwardSoftLimit = m_motor.getFault_ForwardSoftLimit();
if (forwardSoftLimit.getValue()) {
   // do action when forward soft limit is reached
}
auto& forwardLimit = m_motor.GetForwardLimit();
if (forwardLimit.GetValue() == signals::ForwardLimitValue::ClosedToGround) {
   // do action when forward limit is closed
}

auto& forwardSoftLimit = m_motor.GetFault_ForwardSoftLimit();
if (forwardSoftLimit.GetValue()) {
   // do action when forward soft limit is reached
}
forward_limit = self.motor.get_forward_limit()
if forward_limit.value is signals.ForwardLimitValue.CLOSED_TO_GROUND:
   # do action when forward limit is closed

forward_soft_limit = self.motor.get_fault_forward_soft_limit()
if forward_soft_limit.value:
   # do action when forward soft limit is reached

Control Request Limits

Many control requests support overriding the limit switch values using LimitForwardMotion and LimitReverseMotion parameters (Java, C++, Python). These allow users to use other limit switch sensors connected to the robot controller.

final DigitalInput m_forwardLimit = new DigitalInput(0);
final DigitalInput m_reverseLimit = new DigitalInput(1);

final DutyCycleOut m_dutyCycle = new DutyCycleOut(0.0);

m_motor.setControl(m_dutyCycle.withOutput(0.5)
      .withLimitForwardMotion(m_forwardLimit.get())
      .withLimitReverseMotion(m_reverseLimit.get()));
frc::DigitalInput m_forwardLimit{0};
frc::DigitalInput m_reverseLimit{1};

controls::DutyCycleOut m_dutyCycle{0.0};

m_motor.SetControl(m_dutyCycle.WithOutput(0.5)
      .WithLimitForwardMotion(m_forwardLimit.Get())
      .WithLimitReverseMotion(m_reverseLimit.Get()));
self.forward_limit = wpilib.DigitalInput(0)
self.reverse_limit = wpilib.DigitalInput(1)

self.duty_cycle = controls.DutyCycleOut(0.0)

self.motor.set_control(self.duty_cycle.with_output(0.5)
      .with_limit_forward_motion(self.forward_limit.get())
      .with_limit_reverse_motion(self.reverse_limit.get()))

Remote Limit Switches

Supported devices (TalonFX, CANcoder, CANifier) can be utilized as a remote limit switch, disabling actuator outputs when triggers. When utilizing a CANcoder as a remote sensor, the limit will trigger when the magnet strength changes from BAD (red) to ADEQUATE (orange) or GOOD (green).

The remote limit switch can be selected using the LimitSource and LimitRemoteSensorID configs.

var limitConfigs = new HardwareLimitSwitchConfigs();
limitConfigs.ForwardLimitSource = ForwardLimitSourceValue.RemoteCANcoder;
limitConfigs.ForwardLimitRemoteSensorID = m_cancoder.getDeviceID();

m_motor.getConfigurator().apply(limitConfigs);
configs::HardwareLimitSwitchConfigs limitConfigs{};
limitConfigs.ForwardLimitSource = signals::ForwardLimitSourceValue::RemoteCANcoder;
limitConfigs.ForwardLimitRemoteSensorID = m_cancoder.GetDeviceID();

m_motor.GetConfigurator().Apply(limitConfigs);
limit_configs = configs.HardwareLimitSwitchConfigs()
limit_configs.forward_limit_source = signals.ForwardLimitSourceValue.REMOTE_CANCODER
limit_configs.forward_limit_remote_sensor_id = self.cancoder.device_id

self.motor.configurator.apply(limit_configs)