Ejemplo n.º 1
0
class Turret(object):
    left = 1
    right = -1

    def __init__(self, tilt_min=0, tilt_max=180):
        self.min_angle = tilt_min
        self.max_angle = tilt_max
        self._init_servos()
        self._init_stepper()
        self._init_led()

    def _init_servos(self):
        #init global PWM
        self.pwm = Adafruit_PCA9685.PCA9685()
        #init servos
        self.servos = ServoPair(self.pwm,
                                chan_a=0,
                                chan_b=1,
                                min=self.min_angle,
                                max=self.max_angle)

        #calibrate
        self.servos.set_angle(90)
        self.tilt_angle = 90
        self.tilt_speed = 45  # Default tilt speed, in degrees per second
        self.tilt_delay = 1.0 / 60.0  # time between step increments; servo pulses are only 60hz
        self.tilt_loop = None
        self.tilt_dir = 0  # Angle increment per step

    def _init_stepper(self):
        #init steppers
        self.stepper = Stepper()
        self.pan_angle = 0  # angle

    def _init_led(self):
        self.status_led = DimmerRGB(self.pwm, 8, 9, 10)
        self.status_led.set_color(1, .4, 0)

    def tilt_to(self, angle):
        self.tilt_angle = max(self.min_angle, min(self.max_angle, angle))
        print("tilt:{}".format(self.tilt_angle))
        self.servos.set_angle(self.tilt_angle)
        return self.tilt_angle == self.max_angle or self.tilt_angle == self.min_angle

    def pan(self, d_angle):
        self.pan_angle += d_angle
        self.pan_angle %= 360
        self.stepper.step_to_angle(d_angle)

    def pan_forever(self, direction):
        """ Direction is 1 or -1 """
        self.stepper.step_forever(-direction)

    def stop_pan(self):
        self.stepper.stop()

    def _tilt_loop(self):
        maxed = self.tilt_to(self.tilt_angle - self.tilt_dir)
        if maxed:
            self.stop_tilt()

    def tilt(self, speed=None):
        """ Tilt up until told to stop
        
        """
        if speed == None: speed = self.tilt_speed
        self.tilt_dir = speed * self.tilt_delay
        if self.tilt_loop: self.stop_tilt()
        self.tilt_loop = task.LoopingCall(f=self._tilt_loop)
        self.tilt_loop.start(self.tilt_delay)

    def tilt_down(self, speed=None):
        if speed == None: speed = self.tilt_speed
        self.tilt(-speed)

    def stop_tilt(self):
        try:
            self.tilt_loop.stop()
        except:
            pass
        self.tilt_loop = None

    def fire(self):
        print("bang")

    def calibrate(self):
        print("Calibrating... DING")

    def __del__(self):
        IO.cleanup()