用Raspberry Pi控制2个伺服电机的速度

时间:2018-11-06 16:55:54

标签: python raspberry-pi raspberry-pi3 servo

我正在尝试使用Raspberry Pi B +(已安装树莓派)控制2 Servo motors的速度。

我不知道如何缓慢平滑地旋转它们。这可能是由于典型的业余伺服系统设计为尽可能快地旋转到命令位置。我只是一步一步地做到了,中间只有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()

0 个答案:

没有答案