# validated: 2017-12-22 EN f9bece2ffbf7 edu/wpi/first/wpilibj/NidecBrushless.java
# ----------------------------------------------------------------------------
# Copyright (c) 2017 FIRST. All Rights Reserved.
# Open Source Software - may be modified and shared by FRC teams. The code
# must be accompanied by the FIRST BSD license file in the root directory of
# the project.
# ----------------------------------------------------------------------------
import hal
from .digitaloutput import DigitalOutput
from .sendablebase import SendableBase
from .motorsafety import MotorSafety
from .pwm import PWM
from .interfaces.speedcontroller import SpeedController
__all__ = ['NidecBrushless']
[docs]class NidecBrushless(SendableBase, MotorSafety, SpeedController):
"""Nidec Brushless Motor"""
def __init__(self, pwmChannel, dioChannel):
"""
:param pwmChannel: The PWM channel that the Nidec Brushless controller is attached to.
0-9 are on-board, 10-19 are on the MXP port
:param dioChannel: The DIO channel that the Nidec Brushless controller is attached to.
0-9 are on-board, 10-25 are on the MXP port
"""
super().__init__()
self.dio = DigitalOutput(dioChannel)
self.addChild(self.dio)
self.dio.setPWMRate(15625)
self.dio.enablePWM(0.5)
self.pwm = PWM(pwmChannel)
self.addChild(self.pwm)
MotorSafety.__init__(self)
self.speed = 0.0
self.isInverted = False
self.disabled = False
hal.report(hal.UsageReporting.kResourceType_NidecBrushless, pwmChannel)
self.setName("Nidec Brushless", pwmChannel)
[docs] def free(self):
"""Free the resources used by this object."""
super().free()
self.dio.free()
self.pwm.free()
[docs] def set(self, speed):
"""
Set the PWM value.
The PWM value is set using a range of -1.0 to 1.0, appropriately scaling the value for the FPGA.
:param speed: The speed value between -1.0 and 1.0 to set.
"""
if not self.disabled:
self.speed = speed
self.dio.updateDutyCycle(0.5 + 0.5 * (-speed if self.isInverted else speed))
self.pwm.setRaw(0xffff)
self.feed()
[docs] def get(self):
"""
Get the recently set value of the PWM.
:returns: The most recently set value for the PWM between -1.0 and 1.0.
:rtype: float
"""
return self.speed
[docs] def setInverted(self, isInverted):
"""
:type isInverted: bool
"""
self.isInverted = isInverted
[docs] def getInverted(self):
"""
:rtype: bool
"""
return self.isInverted
[docs] def pidWrite(self, output):
"""
Write out the PID value as seen in the PIDOutput base object.
:param output: Write out the PWM value as was found in the PIDController
:type output: float
"""
self.set(output)
[docs] def stopMotor(self):
"""
Stop the motor. This is called by the MotorSafetyHelper object
when it has a timeout for this PWM and needs to stop it from running.
Calling :meth:`set` will re-enable the motor.
"""
self.dio.updateDutyCycle(0.5)
self.pwm.setDisabled()
[docs] def getDescription(self):
"""
:rtype: str
"""
return "Nidec %s" % (self.getChannel(),)
[docs] def disable(self):
"""
Disable the motor. The :meth:`enable` function must be called to re-enable
the motor.
"""
self.disabled = True
self.dio.updateDutyCycle(0.5)
self.pwm.setDisabled()
[docs] def enable(self):
"""
Re-enable the motor after :meth:`disable` has been called.
The :meth:`set` function must be called to set a new motor speed.
"""
self.disabled = False
[docs] def getChannel(self):
"""
Gets the channel number associated with the object.
:returns: The channel number.
:rtype: int
"""
return self.pwm.getChannel()
[docs] def initSendable(self, builder):
builder.setSmartDashboardType("Nidec Brushless")
builder.setSafeState(self.stopMotor)
builder.addDoubleProperty("Value", self.get, self.set)