首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的RaspberryPi 2不能控制任何伺服

我的RaspberryPi 2不能控制任何伺服
EN

Stack Overflow用户
提问于 2015-10-27 04:45:04
回答 2查看 1.8K关注 0票数 0

我有一个问题,那就是我无法控制我的任何伺服系统。我有两个伺服,一个是用于模型飞机的普通伺服,第二个是微型伺服。

我将它们分开连接(信号线连接到GPIO引脚,另外两根电缆先直接连接到电路板,然后连接到外部电源)。当我尝试通过类似的python代码运行它们时

代码语言:javascript
复制
...
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)
...

伺服有时只是转了一小段,然后停在一边。在那之后,你仍然可以听到伺服发出的噪音,就像它试图跑得更远一样。在它转到最后后,我不能让它工作,也不能让它以任何方式转动。无论我做什么输入,它都会留在那里。如果我手动将它们转回起始位置,它将再次转到相同的结束位置。我不知道我做错了什么,或者我需要改变我的方式。

有没有人有什么建议或者有过类似的问题?我很感谢每一条提示和我将要迈出的每一步。

提前感谢!

EN

回答 2

Stack Overflow用户

发布于 2015-10-27 05:11:39

伺服位置由50 Hz PWM信号的脉冲宽度控制。因此,我们需要打开50 Hz的PWM序列。注意,对于50 Hz的信号,信号的周期是1/50=0.02秒,或20毫秒。记住了这个周期,因为我们稍后会回来讨论它。我们首先使用以下命令在Pin 11上创建一个50 Hz信号的PWM对象:

代码语言:javascript
复制
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%。我们使用以下命令执行此操作:

代码语言:javascript
复制
pwm.start(5)

这将启动PWM信号,并将其设置为5%。请记住,在前面的命令中创建pwm对象时,我们已经指定了50 Hz信号。现在,如果我们想改变位置,我们可以改变DutyCycle。例如,如果我们想要转到中间位置,我们希望DutyCycle为7.5,我们可以使用以下命令获得该值:

代码语言:javascript
复制
pwm.ChangeDutyCycle(7.5)

现在,如果我们想要完整的正确位置,我们想要一个10的占空比,我们可以用下面的命令得到:

代码语言:javascript
复制
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

现在,要更改到该位置,我们只需使用以下命令:

代码语言:javascript
复制
pwm.ChangeDutyCycle(DutyCycle)

详情请访问: http://www.toptechboy.com/raspberry-pi/raspberry-pi-lesson-28-controlling-a-servo-on-raspberry-pi-with-python/#sthash.LRmf7708.dpuf

票数 0
EN

Stack Overflow用户

发布于 2021-04-03 10:46:20

或者,你可以使用我的库,它隐藏了大部分pwm和GPIO板的复杂性。示例代码:

代码语言:javascript
复制
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/RaspberryMotorshttps://pypi.org/project/RaspberryMotors/#description

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33355268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档