Untitled

 avatar
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...