树莓派+pyhton控制9g舵机

项目记录:
1、因为Raspberry Pi没有模拟输出,使用类似改变电压电平的时间宽度来控制舵机的动作(PWM)
2、树莓派的接线(因为我是用树莓派3B)
树莓派+pyhton控制9g舵机_第1张图片
树莓派接口的信号口号码和第几个接口必须要区分开来
ex:树莓派上的第三个接口是2号信号口
(在这里栽了一晚上的跟头)
树莓派+pyhton控制9g舵机_第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、程序编写

树莓派+pyhton控制9g舵机_第3张图片
将用舵机的运动角度转换成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°角仰角定位

5、硬件
树莓派+pyhton控制9g舵机_第4张图片
这是在亚马逊上能买到的专用硬件

树莓派+pyhton控制9g舵机_第5张图片
这是我的半成品

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°“仰角”(倾斜角度)
树莓派+pyhton控制9g舵机_第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__':  
    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、个人总结
出错不要紧张,慢慢捋顺,板、线、舵机、程序、电源一部分一部分检查,终会发现树莓派是一样很灵性的东西,你是不会懂在哪里出错

一个挣扎在书海的当代大学生

你可能感兴趣的:(树莓派+pyhton控制9g舵机)