【树莓派/入门】Manjaro下通过GPIO控制云台

目录

  • 说在前面
  • 说明
  • 安装`RPi.GPIO`模块
  • 连接
  • 是否需要编辑`Config.txt`
  • Not running on a RPi!
  • 单次触发
  • 运行图

说在前面

  • 树莓派版本: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的;我两个都安装了/哭

连接

  • 一般买来的云台三个引脚是粘在一起的,所以最好买一些杜邦线(公对母)。我就比较惨了,没买,就把它们剪开来了/暴风哭泣
    【树莓派/入门】Manjaro下通过GPIO控制云台_第1张图片在这里插入图片描述
  • 将云台的红色接5V power,棕色接Ground,橘色接GPIO(任意一个GPIO即可,例如17,那么在python中就对应的使用17)

是否需要编辑Config.txt

  • 不需要
  • 实验证明,即使不在Config.txt中添加dtoverlay=w1-gpio-pullup,gpiopin=17,pullup=on也可以通过pythonRPi.GPIO进行访问。

Not running on a RPi!

  • 错误信息
    >>> GPIO.setup(17, GPIO.OUT)
    Traceback (most recent call last):
      File "", 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

单次触发

  • 若有点击某个按钮,让舵机移动一定的方向,可以考虑如下代码:
    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)
    
    其中3、11是转动的最大值;不使用pwm.stop()而使用pwm.ChangeDutyCycle(0)来暂停的原因是:在pwm.stop()后,再次调用setServoAngle()会出现一些过度转动的情况(实验得出的结论,原因未知),使用上面这种方式要正常一点。

运行图

你可能感兴趣的:(树莓派)