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 ?
答案 0 :(得分:1)
使用典型的开环爱好伺服(一个没有反馈编码器),根本无法知道位置。您所能做的就是提供如上所述的脉冲,并相信伺服的负载不会阻止它移动到指令位置。其他选择:
要解决一步一步运动更平滑的问题,您需要将其命令到当前位置和所需位置之间的中间位置。可以把它想象成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度。
示例程序将PWM频率设置为100 Hz,这将每10毫秒向伺服发送一个脉冲。该角度被转换为0到100之间的占空比。这实际上产生的脉冲短于1毫秒的预期最小值并且长度超过2毫秒。
来源here