树莓派硬件编程——(一)用RPi.GPIO库输出信号

一、认识RPi.GPIO库

树莓派硬件编程不仅可以用Python进行开发,也可以用C++进行开发,那么想要对硬件进行控制,就需要了解树莓派的电路设计和芯片的控制规则,只有知道了这些,我们才能驱动我们的树莓派。那么RPi.GPIO库就是Python对树莓派的控制库,它提供了很多函数可以让我们获取引脚信息、与外部设备进行数据交互等等,所以RPi.GPIO是我们硬件编程非常重要的工具。

二、如何下载安装RPi.GPIO库

一般来讲,树莓派官方镜像已经默认安装了RPi.GPIO库的,我们可以用 pip3 list 来查看一下已安装库列表

如果没有安装的话,那么我们可以通过 pip3 install rpi.gpio 来对其进行安装,或者 apt-get install python3-rpi.gpio 进行安装;

这边友情提醒,不要好好的去卸载RPi.GPIO库,这是血泪教训,因为我想试验命令安装,然后把库给卸载了,命令应该没有错,但是可能现实其他依赖会有问题,所以,没事别瞎试;

三、引脚编号

我们通过上图可以看见,我们可以通过三种编码模式对树莓派引脚进行控制,那么这三种编码分别是什么意思呢?

  1. wiringPi编码:这是在C++进行开发时所使用的编码,这边不做重点讲解;
  2. BCM编码:任何一个开发板想要进行控制,肯定会有一个主控芯片,那么这个芯片就会有很多引脚,不同的引脚就有不同的功能,我们这里引出的是40Pin,但是一般来讲这个芯片是多于40个的,多出的引脚就要负责其他零部件的控制等等;那么,BCM编码我们可以理解成是主控芯片的引脚编号,直接通过主控芯片来进行控制当然是没有问题的。但是这里就有一个问题,树莓派每个版本不一样,或者升级之后,不能够保证主控芯片不变,所以当树莓派进行升级之后,以前的程序可能就不能用了,所以我们一般不用BCM编码;
  3. BOARD编码:这个就很好理解了,我们拿着树莓派,从上到下这么数过去,就是BOARD编码,我们也叫它物理引脚;
    那么BOARD编码和BCM编码有什么联系呢?这么来说吧,物理引脚和主控芯片的功能引脚一一对应,也就是说它始终和功能对应,所以当芯片升级或者其他原因,我们之前所写的代码都是可用的,这样就可以保证极好的兼容性。
    那么物理引脚是连到哪的呢?整个板子是由主控芯片控制的呀,物理引脚肯定也是和芯片引脚相连呀。

总结:我们一般使用python进行硬件开发的时候,最好使用BOARD编码,这样可以保证其兼容性。

四、使用RPi.GPIO库控制LED灯闪烁

  1. 导入RPi.GPIO库
    import RPi.GPIO as GPIO
  2. 指定编码模式
    GPIO.setmode(GPIO.BOARD)
    # GPIO.setmode(GPIO.BCM)
  3. 设置引脚功能
    GPIO.setup(引脚编码,引脚功能,initial=GPIO.HIGH)

    引脚编号:这个就是根据不同的编码模式,配置其引脚编号

    pin_list = [15,16]
    GPIO.setup(pin_list,GPIO.OUT)    # 我们可以通过列表的方式,批量对引脚模式进行设置

    引脚功能:我们可以将引脚配置成输出(GPIO.OUT)模式,输入后面再讲
    initial=GPIO.HIGH:这个表示其引脚的初始状态为高电平状态,我们可以通过这么参数设置引脚的初始状态,且参数只有在输出模式才有

  4. 输出高电平
    GPIO.output(引脚编号,状态)

    引脚编号: 同上
    状态:这里其实就是一个逻辑值,我们可以用True/False或者用1/0或者用GPIO.HIGH/GPIO.LOW

  5. 清理引脚
    GPIO.cleanup()

    这里为什么需要清理引脚呢?这是因为我们在结束程序的时候,我们要将所有的引脚恢复成初始的状态,一般来讲为输入模式,这是要避免短路造成设备的损坏。

OK,下面我们就举个LED灯闪烁的栗子:

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
GPIO.setup(16,GPIO.OUT)

try:
    while True:
        GPIO.output(16,GPIO.HIGH)
        time.sleep(1)
        GPIO.output(16,GPIO.LOW)
        time.sleep(1)
except KeyboardInterrupt:    # 异常处理,如果Ctrl+C退出程序
    GPIO.output(16,GPIO.LOW)
    GPIO.cleanup()

五、使用RPi.GPIOk库实现呼吸灯效果

对于什么是呼吸灯,呼吸灯是怎么实现的,我的另一篇文章(炫酷LED呼吸灯)应该讲的比较清楚了,这里就不做赘述;

那么这边我们使用的还是PWM脉宽调制来实现LED灯的呼吸灯效果,PWM的实质就是控制高低电平的时间比,单位时间内,高电平比例越高,那么LED灯工作的时间就越长,也就越亮。PWM不仅可以控制LED灯的亮暗,直流电机的转速、舵机的角度、无源蜂鸣器的频率等等都可以控制,一句话总结:脉宽调制就是用数字信号来实现模拟信号输出的一种技术。

  1. 库导入、引脚编码、引脚功能设置等是常规操作
    import RPi.GPIO as GPIO
    import time
    
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(16,GPIO.OUT)
  2. 划重点,创建一个PWM对象
    p = GPIO.PWM(16,50)    # 创建一个PWM对象
    p.start(0)             # 启动PWM,初始值为0

    GPIO.PWM(引脚编号,频率): 这里的频率是指单位时间内变化的次数,即频率越高,亮暗过渡就越平滑

    上面从左到右,频率分别是:10、20、50,大家可以对比他们的效果,区别还是比较明显的;

  3. 实现效果
    try:
    while 1:
        for i in range(0,100,5):
            p.ChangeDutyCycle(i)
            time.sleep(0.05)
        for i in range(100,0,-5):
            p.ChangeDutyCycle(i)
            time.sleep(0.05)
    except KeyboardInterrupt:
        p.ChangeDutyCycle(0)
        GPIO.cleanup()

    我们可以用 ChangeDutyCycle([0,100]) 来控制PWM的占空比,其实这里我们可以理解成百分比,给他多少能量,他就可以发出多大的亮光;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章