Управление скоростью 2 серводвигателей с Raspberry Pi - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь контролировать скорость 2 Серводвигателей с помощью Raspberry Pi B + (установлен raspbian).

Я не могу понять, как вращать их медленно и плавно. Это может быть связано с тем, что типичные сервоприводы для хобби предназначены для максимально быстрого поворота в заданную позицию. Мне удалось сделать это только шаг за шагом, с перерывом на 1 секунду. Однако серводвигатели вибрируют во время поворота, я понятия не имею, почему это происходит. Фрагмент кода, написанный на Python, показан ниже. Любая помощь будет принята с благодарностью

from __future__ import division
import RPi.GPIO as GPIO
import numpy as np
from time import sleep

class Servo():
    def __init__(self):
        self.servoPIN1 = 3
        self.servoPIN2 = 5

        GPIO.setwarnings(False)
        # set the names to board mode to name the pins according to the numbers
        GPIO.setmode(GPIO.BOARD)
        # output pins to send PWM signal
        GPIO.setup(self.servoPIN1, GPIO.OUT)
        GPIO.setup(self.servoPIN2, GPIO.OUT)

        # setup PWM on pins at 50Hz
        self.pwm1 = GPIO.PWM(self.servoPIN1, 50)
        self.pwm2 = GPIO.PWM(self.servoPIN2, 50)

        #  start it with 7.5 duty cycle (for 90 degrees: (90/18)+2.5 = 7.5%)
        self.pwm1.start(7.5)
        self.pwm2.start(7.5)

        self.currentDuty = 90

    def set_angle(self, angle):
        def convert_angle_to_duty(angle):
            return (angle/18) + 2.5

        # send a specific signal to set the angle of the servo
        # normally it's a 10% window: 2.5-12.5% or 2-12%
        if (angle > self.currentDuty):
            steps = np.arange(convert_angle_to_duty(self.currentDuty), convert_angle_to_duty(angle) + 1, 1)
            for i in steps:
                self.pwm1.ChangeDutyCycle(i)
                self.pwm2.ChangeDutyCycle(i)
                sleep(1)
        elif (angle < self.currentDuty):
            steps = np.arange(convert_angle_to_duty(self.currentDuty), convert_angle_to_duty(angle) - 1, -1)
            if (angle == 0):
                steps = np.insert(steps, len(steps), 0)
            for i in steps:
                self.pwm1.ChangeDutyCycle(i)
                self.pwm2.ChangeDutyCycle(i)
                sleep(1)

        self.currentDuty = angle

    def terminate_servo(self):
        self.pwm1.stop()
        self.pwm2.stop()
        GPIO.cleanup()

if __name__ == "__main__":
    sv = Servo()
    try:
        while True:
            print ('Start')
            sleep(3)
            sv.set_angle(180)
            sleep(3)
            sv.set_angle(0)
            print ('Done')

    except KeyboardInterrupt:
        print('Ternminate')
        sv.set_angle(0)
        sv.terminate_servo()

# from servo import *
# sv = Servo()
...