50 lines
1.4 KiB
Python
50 lines
1.4 KiB
Python
"""Helpers for building moving mirrors."""
|
|
|
|
class Motor:
|
|
"""Model a type of servo motor."""
|
|
|
|
# Default vaules for every motor
|
|
MAX_PULSE = 2500
|
|
MIN_PULSE = 500
|
|
COVERAGE = 180 # Total degree of freedom in degrees
|
|
AREA = MAX_PULSE - MIN_PULSE
|
|
OFFSET = 2 # In degrees a constant to be added
|
|
SCALE = 1 # Scaling
|
|
|
|
# Used for ids
|
|
count = 0
|
|
|
|
def __init__(self, pi, pin, angle=0):
|
|
self.id = Motor.count; Motor.count += 1
|
|
self.pi = pi # Local pi instance
|
|
|
|
self.pin = pin
|
|
self.angle = angle
|
|
self.offset = Motor.OFFSET # Fine grained controls over every motor
|
|
self.scale = Motor.SCALE
|
|
|
|
# Initialization
|
|
self.set()
|
|
|
|
def angle_to_pulse(self, angle):
|
|
return min(max(Motor.MIN_PULSE, (Motor.MIN_PULSE + Motor.AREA * angle/Motor.COVERAGE + self.offset) * self.scale), Motor.MAX_PULSE)
|
|
|
|
# Update the motor position on hardware
|
|
def set(self):
|
|
self.pi.set_servo_pulsewidth(self.pin, self.angle_to_pulse(self.angle))
|
|
|
|
def set_angle(self, angle):
|
|
self.angle = angle
|
|
self.set()
|
|
|
|
def __str__(self):
|
|
return f"Motor {self.id} is set at {self.angle} degrees."
|
|
|
|
def __del__(self):
|
|
self.pi.set_servo_pulsewidth(self.pin, 0)
|
|
|
|
def inc(self, inc):
|
|
self.angle += inc
|
|
self.angle = min(max(self.angle, 0), Motor.COVERAGE) # Clip
|
|
self.set()
|