0

我找到了一个解决方案,使舵机逐步达到所需的角度,但这取决于舵机的当前角度。这是代码:

    if servo_current angle > servo_desired_angle :
        while(x=true) :
             servo_current_angle -=1 
             duty_cycle = (((12.5-2.5)/(180-0) * servo_current_angle) +2.5 
             p.ChangeDutyCycle (duty_cycle)
             time.sleep(0.01)
             if servo_current angle = servo_desired_angle :
                 x = false 
    elif servo_current_angle < servo_desired_angle :
         while(x=true) :
             servo_current_angle +=1 
             duty_cycle = (((12.5-2.5)/(180-0) * servo_current_angle) +2.5 
             p.ChangeDutyCycle (duty_cycle)
             time.sleep(0.01)
             if servo_current angle = servo_desired_angle :
                 x = false

问题是如何知道伺服电流角度?

4

2 回答 2

1

使用典型的开环爱好伺服(没有反馈编码器)根本无法知道位置。您所能做的就是提供如上所述的脉冲,并相信伺服器的负载不会阻止它移动到命令位置。其他选项:

  • 您可以添加自己的编码器,例如数字或光学编码器。
  • 您可以更改为内置编码器的闭环伺服系统(更昂贵),如 Dynamixel 系列。

为了解决您逐步平滑移动的问题,您需要将其命令到当前位置和所需位置之间的中间位置。将其视为采取 20(在下面的示例中)微小的步骤而不是一大步。为此,请使用循环来更新占空比。这是一个例子:

current duty_cycle = 7.5 
desired_duty_cycle = 5.0
steps = 20.0
duty_cycle_delta = (desired_duty_cycle - current_duty_cycle) / steps
while (current_duty_cycle != desired_duty_cycle):
    if (current_duty_cycle > desired_duty_cycle):
        duty_cycle_delta = -duty_cycle_delta
    current_duty_cycle = current_duty_cycle + duty_cycle_delta
    p.ChangeDutyCycle (current_duty_cycle)

这将通过命令中间位置来接近所需位置,直到达到所需位置。更改steps变量以更改其接近所需位置的速度。

于 2017-07-06T13:21:03.790 回答
0

在运行期间跟踪当前伺服位置并在此过程中更新它呢?

您可以使用RPi.GPIO 中的 PWM 模块,并在开始时将伺服器移动到其初始位置以开始。

伺服电机的位置由脉冲长度设定。伺服预计至少每 20 毫秒接收一次脉冲。如果该脉冲为高电平 1 毫秒,则伺服角为零;如果是 1.5 毫秒,它将在其中心位置;如果是 2 毫秒,则为 180 度。

伺服电机

示例程序将 PWM 频率设置为 100 Hz,这将每 10 毫秒向伺服系统发送一个脉冲。角度转换为 0 到 100 之间的占空比。这实际上产生的脉冲短于 1 毫秒的预期最小值和长于 2 毫秒的最大值。

来源在这里

于 2017-07-06T07:53:58.543 回答