Python 物联网入门指南(八)(2)https://developer.aliyun.com/article/1507343
速度控制
能够如此轻松地制作一个机械臂真是太神奇了,只需一点点代码,我们现在就能够按照自己的意愿来控制它。然而,你可能已经注意到了一个问题,那就是,机器人按照我们的意愿移动,但速度不是我们想要的。这是在使用基于数字 PWM 的舵机时非常常见的问题。
这些舵机没有内置的速度控制。它们的控制系统被编程为尽可能快地移动舵机以达到目标位置。因此,要控制速度,我们必须对程序本身进行调整,并给它一个平稳的线性进展。
速度控制可以通过几种不同的技术来实现。所以,不多说了,让我们去看看代码。在你编写代码之前,先读一遍,然后看一下下面的解释。之后,你会更清楚我们在做什么。这将使编写代码更快、更容易。所以,让我们来看看:
import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setup(14,GPIO.OUT) GPIO.setup(16,GPIO.OUT) GPIO.setup(18,GPIO.OUT) GPIO.setup(20,GPIO.OUT) GPIO.setup(21,GPIO.OUT) GPIO.setup(22,GPIO.OUT) GPIO.setwarnings(False) pwm1 = GPIO.PWM(14, 50) pwm2 = GPIO.PWM(16, 50) pwm3 = GPIO.PWM(18, 50) pwm4 = GPIO.PWM(20, 50) pwm5 = GPIO.PWM(21, 50) pwm6 = GPIO.PWM(22, 50) pwm1.start(0) pwm2.start(0) pwm3.start(0) pwm4.start(0) pwm5.start(0) pwm6.start(0) def cvt_angle(angle): dc = float(angle/90) + 0.5 return dc prev0 = 90 prev1 = 90 prev2 = 90 prev3 = 90 prev4 = 90 prev5 = 90 pwm1.ChangeDutyCycle(cvt_angle(prev0)) pwm2.ChangeDutyCycle(cvt_angle(prev1)) pwm3.ChangeDutyCycle(cvt_angle(prev2)) pwm4.ChangeDutyCycle(cvt_angle(prev3)) pwm5.ChangeDutyCycle(cvt_angle(prev4)) pwm6.ChangeDutyCycle(cvt_angle(prev5)) while True: a = raw_input("enter a list of 6 values for motor 1") b = raw_input("enter a list of 6 values for motor 2") c = raw_input("enter a list of 6 values for motor 3") d = raw_input("enter a list of 6 values for motor 4") e = raw_input("enter a list of 6 values for motor 5") f = raw_input("enter a list of 6 values for motor 6") speed = raw_input("enter one of the following speed 0.1, 0.2, 0.5, 1") for i in range(6): while prev0 =! a[i] and prev1 =! b[i] and prev2 =! c[i] and prev3 =! d[i] and prev4 =! e[i] and prev 5 =! f[i] if a[i] > 10 and a[i]< 180 : if prev0 > a[i] prev0 = prev0 - speed if prev0 < a[i] prev0 = prev0 + speed if prev0 = a[i] prev0 = prev0 pwm1.ChangeDutyCycle(cvt_angle(prev0)) if b[i] > 10 and b[i] < 180: if prev2 > b[i] prev2 = prev2 - speed if prev2 < b[i] prev2 = prev2 + speed if prev2 = b[i] prev2 = prev2 pwm2.ChangeDutyCycle(cvt_angle(b[i])) if c[i] > 10 and c[i] < 180: if prev3 > c[i] prev3 = prev3 - speed if prev3 < c[i] prev3 = prev3 + speed if prev3 = c[i] prev3 = prev3 pwm3.ChangeDutyCycle(cvt_angle(c[i])) if d[i] > 10 and d[i] < 180: if prev4 > d[i] prev4 = prev4 - speed if prev4 < d[i] prev4 = prev4 + speed if prev4 = d[i] prev4 = prev4 pwm4.ChangeDutyCycle(cvt_angle(d[i])) if e[i] > 10 and e[i] < 180: if prev5 > e[i] prev5 = prev5 - speed if prev0 < e[i] prev5 = prev5 + speed if prev5 = e[i] prev5 = prev5 pwm5.ChangeDutyCycle(cvt_angle(e[i])) if f[i] > 10 and f[i] < 180: if prev6 > f[i] prev6 = prev6 - speed if prev6 < f[i] prev6 = prev6 + speed if prev6 = f[i] prev6 = prev6 pwm6.ChangeDutyCycle(cvt_angle(f[i])) flag = 0
在这个程序中,有很多东西。我们应该逐一了解它们。所以,让我们看看我们在做什么:
prev0 = 90 prev1 = 90 prev2 = 90 prev3 = 90 prev4 = 90 prev5 = 90
在这里,我们定义了六个新变量,名称为prev0
到prev5
,它们都被赋予了值90
。这里的术语prev
代表之前的值,因此它将指示先前的值。
while prev0 =! a[i] and prev1 =! b[i] and prev2 =! c[i] and prev3 =! d[i] and prev4 =! e[i] and prev 5 =! f[i]
在代码行for i in range 6
之后,我们有前面的代码行,基本上是检查a[i]
的值与prev0
的值。类似地,它正在检查b[i]
的值与prev1
的值,依此类推。直到所有这些条件都成立,while
循环将为真,并在其中循环程序,直到条件不再为假。也就是说,所有的prev
值恰好等于列表相应值的值。
再次,这对你可能有点奇怪,但相信我,它会非常有用,我们一会儿会看到:
if a[i] > 10 and a[i]< 180 : if prev0 > a[i] prev0 = prev0 - speed if prev0 < a[i] prev0 = prev0 + speed if prev0 = a[i] prev0 = prev0 pwm1.ChangeDutyCycle(cvt_angle(prev0))
现在,真正的问题来了。这是将控制舵机速度的主程序。在这个程序中,第一行很简单;它将检查给定的值是否有效,也就是在安全极限之间。一旦完成,它将检查a[Ii]
的值是否小于或大于先前的值。如果大于a[i]
的值,那么它将采用先前的值,并用用户指定的速度递减。如果小于a[i]
的值,那么它将用指定的速度递增先前的值。
因此,如果你看一下,代码只是在while
循环运行时每次递增或递减先前的值。现在,while
循环将一直运行,直到prev
的值等于相应列表值。也就是说,循环将一直递增值,直到达到指定位置。
因此,速度值越低,每次递增的值就越低,从而整体减慢速度。
这个过程对所有其他舵机也是一样的。听起来可能很复杂,但实际上并不是!编程很容易,每次你把它分解成小块并逐一理解时,它都会继续保持简单!
总结
在本章中,我们已经了解了机械臂的基础知识、其电源和其编程。通过一个非常简单的程序,我们能够找出舵机的极限,然后应用这些极限以确保舵机不会损坏自己。我们对框架有了一个基本的概念,并根据框架进行了一些编程。最后,我们还继续控制了舵机的速度,使用了我们自己的基本级别的程序。