项目记录:
1、因为Raspberry Pi没有模拟输出,使用类似改变电压电平的时间宽度来控制舵机的动作(PWM)
2、树莓派的接线(因为我是用树莓派3B)
树莓派接口的信号口号码和第几个接口必须要区分开来
ex:树莓派上的第三个接口是2号信号口
(在这里栽了一晚上的跟头)
我的接线是将舵机的正负极接在树莓派的接口上(2、4、6号口上)
3、在树莓派上下载RPi.GPIO模块
在命令提示符里面安装pip(适用于win)
> sudo apt-get install -y python-pip
安装完pip后就安装RPi.GPIO
> sudo apt-get -y python-pip
> sudo pip install rpi.gpio
一定要发现模块的名字是G P i.G P I O,不是GPI.GPIO,中间的 i 是搞死人的存在
python是一门对大小写极其敏感的语言,如果大小写出错只会得到无尽的no module named ‘GPI’
4、程序编写
将用舵机的运动角度转换成PWM的占空比:
dutycycle = angle / 18 + 3
创建一个.py 来测试
from time import sleep
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
def setServoAngle(servo, angle):
pwm = GPIO.PWM(servo, 50)
pwm.start(8)
dutyCycle = angle / 18. + 3.
pwm.ChangeDutyCycle(dutyCycle)
sleep(0.3)
pwm.stop()
if __name__ == '__main__':
import sys
servo = int(sys.argv[1])
GPIO.setup(servo, GPIO.OUT)
setServoAngle(servo, int(sys.argv[2]))
GPIO.cleanup()
执行脚本的时候,我们必须输入参数:伺服GPIO和舵机的角度
sudo python3 angleServoCtrl.py 17 45
上述命令将连接在GPIO 17上的伺服电机以45°角仰角定位
6、实物测试
from time import sleep
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
pan = 27
tilt = 17
GPIO.setup(tilt, GPIO.OUT) # white => TILT
GPIO.setup(pan, GPIO.OUT) # gray ==> PAN
def setServoAngle(servo, angle):
assert angle >=30 and angle <= 150
pwm = GPIO.PWM(servo, 50)
pwm.start(8)
dutyCycle = angle / 18. + 3.
pwm.ChangeDutyCycle(dutyCycle)
sleep(0.3)
pwm.stop()
if __name__ == '__main__':
import sys
if len(sys.argv) == 1:
setServoAngle(pan, 90)
setServoAngle(tilt, 90)
else:
setServoAngle(pan, int(sys.argv[1])) # 30 ==> 90 (middle point) ==> 150
setServoAngle(tilt, int(sys.argv[2])) # 30 ==> 90 (middle point) ==> 150
GPIO.cleanup()
创建一个python脚本来控制两个伺服器
执行脚本时,必须输入参数:平移角度和倾斜角度
sudo python3 servoCtrl.py 45 120
上述命令移动 45°“方位角”(平移角)和120°“仰角”(倾斜角度)
from time import sleep
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
pan = 27
tilt = 17
GPIO.setup(tilt, GPIO.OUT) # white => TILT
GPIO.setup(pan, GPIO.OUT) # gray ==> PAN
def setServoAngle(servo, angle):
assert angle >=30 and angle <= 150
pwm = GPIO.PWM(servo, 50)
pwm.start(8)
dutyCycle = angle / 18. + 3.
pwm.ChangeDutyCycle(dutyCycle)
sleep(0.3)
pwm.stop()
if __name__ == '__main__':
for i in range (30, 160, 15):
setServoAngle(pan, i)
setServoAngle(tilt, i)
for i in range (150, 30, -15):
setServoAngle(pan, i)
setServoAngle(tilt, i)
setServoAngle(pan, 100)
setServoAngle(tilt, 90)
GPIO.cleanup()
循环测试
7、个人总结
出错不要紧张,慢慢捋顺,板、线、舵机、程序、电源一部分一部分检查,终会发现树莓派是一样很灵性的东西,你是不会懂在哪里出错
一个挣扎在书海的当代大学生