How to make servo reach the desired angle slowly?

时间:2017-07-06 07:37:57

标签: python raspberry-pi servo

I found a solution that make a servo reach a desired angle step by step , But it depends on the current angle of servo . this is the code :

    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

the problem is How to know servo_current_angle ?

2 个答案:

答案 0 :(得分: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变量以改变其接近所需位置的速度。

答案 1 :(得分:0)

  

如何在运行期间跟踪当前伺服位置   一路上更新它?

     

您可以使用PWM module in RPi.GPIO并在开始时移动   伺服器从其初始位置开始。

伺服电机的位置由脉冲长度设定。伺服器期望至少每20毫秒接收一个脉冲。如果该脉冲高达1毫秒,则伺服角度为零;如果它是1.5毫秒,它将处于其中心位置;如果它是2毫秒,它将是180度。

Servomotors

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

来源here