Untitled
unknown
plain_text
5 months ago
3.0 kB
2
Indexable
import time from gpiozero import OutputDevice class StepperMotor: def __init__(self, dir_pin, step_pin, steps_per_revolution=200): self.dir_pin = OutputDevice(dir_pin) self.step_pin = OutputDevice(step_pin) self.steps_per_revolution = steps_per_revolution def step(self, steps, direction=1, min_delay=0.001, max_delay=0.01, ramp_steps=10): """ Gör stegen med motorn och ändrar hastigheten mellan min och max delay. :param steps: Antal steg att ta :param direction: 1 för framåt, 0 för bakåt :param min_delay: Minsta fördröjning mellan pulser (snabbaste hastighet) :param max_delay: Största fördröjning mellan pulser (långsammaste hastighet) :param ramp_steps: Antal steg som används för att accelerera och decelerera """ # Ställ in riktning self.dir_pin.value = direction # Accelerations- och deaccelerationsramper def calculate_delay(step, total_steps, min_d, max_d, ramp_s): if step < ramp_s: # Accelerera return max_d - (step / ramp_s) * (max_d - min_d) elif step >= total_steps - ramp_s: # Decelerera return max_d - ((total_steps - step) / ramp_s) * (max_d - min_d) else: # Konstant hastighet return min_d for current_step in range(steps): # Beräkna delay baserat på stegets position delay = calculate_delay(current_step, steps, min_delay, max_delay, ramp_steps) # Skicka pulser self.step_pin.on() time.sleep(delay) self.step_pin.off() time.sleep(delay) def rotate(self, rotations, direction=1, min_delay=0.001, max_delay=0.01, ramp_steps=10): """ Roterar motorn ett visst antal varv och justerar hastigheten under rotation. :param rotations: Antal varv att snurra :param direction: 1 för framåt, 0 för bakåt :param min_delay: Minsta fördröjning mellan pulser (snabbaste hastighet) :param max_delay: Största fördröjning mellan pulser (långsammaste hastighet) :param ramp_steps: Antal steg som används för att accelerera och decelerera """ steps = int(rotations * self.steps_per_revolution) self.step(steps, direction, min_delay, max_delay, ramp_steps) # Exempel på hur man använder klassen if __name__ == "__main__": motor = StepperMotor(dir_pin=20, step_pin=21) # Exempel med GPIO-pinnar 20 och 21 try: motor.rotate(2, direction=1, min_delay=0.001, max_delay=0.01, ramp_steps=50) # Roterar två varv med stegad hastighet time.sleep(1) motor.rotate(1, direction=0, min_delay=0.001, max_delay=0.01, ramp_steps=50) # Roterar ett varv bakåt med stegad hastighet finally: print("Motorkontroll avslutad.")
Editor is loading...