我有一个问题,那就是我无法控制我的任何伺服系统。我有两个伺服,一个是用于模型飞机的普通伺服,第二个是微型伺服。
我将它们分开连接(信号线连接到GPIO引脚,另外两根电缆先直接连接到电路板,然后连接到外部电源)。当我尝试通过类似的python代码运行它们时
...
GPIO.setmode(GPIO.BCM)
GPIO.setup(11, GPIO.OUT)
pwm = GPIO.PWM(11, 50)
pwm.start(2)
timelib.sleep(2)
pwm.ChangeDutyCycle(3)
timelib.sleep(2)
...伺服有时只是转了一小段,然后停在一边。在那之后,你仍然可以听到伺服发出的噪音,就像它试图跑得更远一样。在它转到最后后,我不能让它工作,也不能让它以任何方式转动。无论我做什么输入,它都会留在那里。如果我手动将它们转回起始位置,它将再次转到相同的结束位置。我不知道我做错了什么,或者我需要改变我的方式。
有没有人有什么建议或者有过类似的问题?我很感谢每一条提示和我将要迈出的每一步。
提前感谢!
发布于 2015-10-27 05:11:39
伺服位置由50 Hz PWM信号的脉冲宽度控制。因此,我们需要打开50 Hz的PWM序列。注意,对于50 Hz的信号,信号的周期是1/50=0.02秒,或20毫秒。记住了这个周期,因为我们稍后会回来讨论它。我们首先使用以下命令在Pin 11上创建一个50 Hz信号的PWM对象:
pwm=GPIO.PWM(11,50)现在,我们可以通过发出命令来指定信号的DutyCycle来启动脉宽调制序列。在此之前,我们需要简单介绍一下伺服系统的工作原理。典型的伺服希望在控制线上看到50 Hz的频率。它移动到的位置取决于信号的脉冲宽度。大多数伺服的表现大致如此,但您将需要调整这些数字为您的特定伺服。通常,当它看到1毫秒的脉冲宽度时,伺服将转到全左位置,当它看到1.5毫秒的脉冲宽度时,它将转到中间位置,当它看到2毫秒的脉冲宽度时,它将转到全右位置。但是,请注意,在Raspberry Pi上,我们没有指定脉冲宽度,但指定了DutyCycle。因此,我们可以使用以下关系:
DutyCycle =脉冲宽度/周期
记住周期=1/频率,因此:
DutyCycle =脉冲宽度/(1/频率)= PulseWidth *频率
将给我们一个完整的左位置的PulseWidth是1毫秒。我们现在计算应用的DutyCycle来给出我们想要的位置:
DutyCycle = PulseWidth*frequency=.001 *50 = .05 = 5%
因此,对于50 Hz的信号,如果我们将DutyCycle设置为5,那么我们应该看到伺服移动到完全左侧的位置。类似地,如果我们将DutyCycle设置为7.5,我们应该得到中间位置,如果我们将它设置为10,我们应该在完全正确的位置。你可以通过在5和10之间线性缩放来获得所有的中间位置。请注意,这些值在不同的品牌和不同的伺服系统之间会有所不同,所以请使用您的伺服系统进行校准。我们现在准备好应用一个命令来定位伺服。如果我们想要伺服在完全左位置,我们应该将DutyCycle设置为5%。我们使用以下命令执行此操作:
pwm.start(5)这将启动PWM信号,并将其设置为5%。请记住,在前面的命令中创建pwm对象时,我们已经指定了50 Hz信号。现在,如果我们想改变位置,我们可以改变DutyCycle。例如,如果我们想要转到中间位置,我们希望DutyCycle为7.5,我们可以使用以下命令获得该值:
pwm.ChangeDutyCycle(7.5)现在,如果我们想要完整的正确位置,我们想要一个10的占空比,我们可以用下面的命令得到:
pwm.ChangeDutyCycle(10)请记住,实际控制伺服位置的不是DutyCycle,而是PulseWidth。我们正在创建DutyCycles以提供所需的PulseWidth。
现在,玩你的特定伺服,然后找到特定的DutyCycles,导致完全左和完全右位置。对于我的伺服,我发现全左在DutyCycle=2,全右在DutyCycle=12。有了这些值,我可以创建一个线性方程,它可以给出我想要的0到180之间的任何角度。这将使Raspberry Pi的行为更像Arduino的简单直观的操作。
要解线性方程,我需要两个点。嗯,我知道对于期望的角度为0,我应该应用DutyCycle为2。这将是点(0,2)。现在我还知道,对于所需的角度180,我应该应用DutyCycle 12。这将是点(180,12)。我们现在有两个点,可以计算直线的方程。(请记住,使用您的伺服。。。你的数字可能与我的略有不同,但如果你使用你的两点,下面的方法将会起作用。)
请记住,直线的斜率为:
m=(y2-y1)/(x2-x1)=(12-2)/180-0)=10/180 = 1/18
现在我们可以使用点斜率公式得到直线的方程。
y-y1=m(x-x1)
y-2=1/18*(x-0)
Y= 1/18*x +2
放入我们的实际变量,我们得到
DutyCycle = 1/18* (DesiredAngle) +2
现在,要更改到该位置,我们只需使用以下命令:
pwm.ChangeDutyCycle(DutyCycle)详情请访问: http://www.toptechboy.com/raspberry-pi/raspberry-pi-lesson-28-controlling-a-servo-on-raspberry-pi-with-python/#sthash.LRmf7708.dpuf
发布于 2021-04-03 10:46:20
或者,你可以使用我的库,它隐藏了大部分pwm和GPIO板的复杂性。示例代码:
from RaspberryMotors.motors import servos
s1 = servos.servo(11) #create the servo objects , connected to GPIO board pin #11
s1.setAngleAndWait(45) # move S1 position of 45 degrees
s1.shutdown() #will clean up the GPIO board as well`您可以通过以下两个链接中的任何一个查看、下载代码或库:https://github.com/vikramdayal/RaspberryMotors或https://pypi.org/project/RaspberryMotors/#description
https://stackoverflow.com/questions/33355268
复制相似问题