说在前面
- 树莓派版本:4B
- 树莓派系统:Manjaro-ARM-xfce-rpi4-20.02
- 主要参考:树莓派实验室
说明
- 参考的那篇文章挺详细的了,如果树莓派系统是
Raspbian
参考那篇应该就行了。此处记录下在Manjaro
下遇到的一些问题。
安装RPi.GPIO
模块
- pip安装
sudo pip install RPi.GPIO -i https://pypi.tuna.tsinghua.edu.cn/simple
- 通过
AUR
安装sudo pacman -S yay sudo yay -S python-raspberry-gpio
- 如果
pip
安装的不行,可以试试AUR
的;我两个都安装了/哭
连接
- 一般买来的云台三个引脚是粘在一起的,所以最好买一些
杜邦线
(公对母)。我就比较惨了,没买,就把它们剪开来了/暴风哭泣
- 将云台的红色接
5V power
,棕色接Ground
,橘色接GPIO
(任意一个GPIO即可,例如17,那么在python
中就对应的使用17)
是否需要编辑Config.txt
- 不需要
- 实验证明,即使不在
Config.txt
中添加dtoverlay=w1-gpio-pullup,gpiopin=17,pullup=on
也可以通过python
包RPi.GPIO
进行访问。
Not running on a RPi!
- 错误信息
>>> GPIO.setup(17, GPIO.OUT) Traceback (most recent call last): File "<stdin>", line 1, in <module> RuntimeError: Not running on a RPi!
- 原因是普通用户
pi
没有对GPIO
的访问权限,正确的做法应该是对用户pi
赋予访问GPIO
的权限。简单方法是直接在root
权限下运行(如直接sudo
):[pi@RaspberryPI ~]$ sudo python Python 3.8.1 (default, Jan 25 2020, 17:01:17) [GCC 9.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import RPi.GPIO as GPIO >>> GPIO.setmode(GPIO.BCM) # 设置GPIO模式为BCM,这样与上面那个引脚图就能对上了 >>> GPIO.setup(17, GPIO.OUT)# 将17号引脚作为输出(云台的输入) >>> tilt = GPIO.PWM(17, 50) # 设置频率 >>> tilt.start(0) # 启动 >>> tilt.ChangeDutyCycle(2) # 转动 >>> tilt.ChangeDutyCycle(3) >>> tilt.ChangeDutyCycle(10)
- 注意:在转动时很容易转过头,因此在调用
ChangeDutyCycle()
时的参数不要过大或者过小,建议3-10
单次触发
- 若有点击某个按钮,让舵机移动一定的方向,可以考虑如下代码:
其中3、11是转动的最大值;不使用import RPi.GPIO as GPIO from time import sleep GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) Angle = 7 GPIO.setup(17, GPIO.OUT) pwm = GPIO.PWM(17, 50) def setServoAngle(angle): global Angle global pwm pwm.start(0) Angle = Angle + angle if Angle < 3: Angle = 3 if Angle > 11: Angle =11 pwm.ChangeDutyCycle(Angle) sleep(0.1) pwm.ChangeDutyCycle(0)
pwm.stop()
而使用pwm.ChangeDutyCycle(0)
来暂停的原因是:在pwm.stop()
后,再次调用setServoAngle()
会出现一些过度转动的情况(实验得出的结论,原因未知),使用上面这种方式要正常一点。