Я пытаюсь контролировать скорость 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()