背景故事

树莓派主板集成了丰富的IO口,可以用于输入输出,通信等功能,常常用于物联网控制、传感器数据交互等方面,这里我们讲解一下怎么使用IO口作为输入输出,并控制一些简单的电路。

硬件准备

  1. 树莓派主板(这里以3B为例)
  2. 基础电路1搭建:面包板流水灯电路

软件准备

  1. 确保树莓派系统为官方系统,系统安装可以参考我的其他教程。非官方系统安装方式因系统而异,不在本篇讨论。
  2. 安装pigpio库
    pigpio是一个由C语言编写的库函数,并提供Python接口。
    安装指令如下:
sudo apt-get install pigpio python-pigpio python3-pigpio
  1. pigpio库的基本介绍
    根据官方文档上的介绍,这个库主要特性有(翻译自官方文档,可能有错漏):
  • 能够同时在31个GPIO口进行精确至5微秒的硬件定时采样
  • 能够同时在31个GPIO口产生硬件定时PWM
  • 能够同时在31个GPIO口产生硬件定时伺服脉冲
  • 同时监听31个GPIO口,电平更改时进行回调(精确到几个微秒)
  • 同时监听31个GPIO口,电平更改时通过管道发送通知 可以在规定的时间间隔内进行回调
  • 可以同时读取/写入存储区中的所有GPIO(0-31,32-53)
  • 可以实现对GPIO状态的读,写模式和内部拉动 提供套接字和管道接口
  • 可以用于生成GPIO电平变化的波形(精确到几个微秒)
  • 可以使用任何用户的GPIO的软件串行链接 通过套接字和管道接口进行基本权限控制
  1. 安装完检查
    4.1 输入如下指令:
dpkg -l|grep pigpio

返回结果如下:

树莓派python智能控制 python控制树莓派io口_树莓派python智能控制


4.2 输入 sudo pigpiod 检查能否启动gpio守护进程

正常启动后不会有任何返回,也不会报错,仿佛不存在一样,返回结果如下:

树莓派python智能控制 python控制树莓派io口_树莓派_02


此时可通过查看进程来确定是否运行,输入如下指令:

ps -ef|grep pigpio

返回结果如下:

树莓派python智能控制 python控制树莓派io口_树莓派python智能控制_03

我这个遇到一个端口占用问题,返回结果如下:

树莓派python智能控制 python控制树莓派io口_物联网_04


通过查看端口和进程ID,查询到有个jupyter-lab软件也使用了8888端口,修改该软件的默认端口,或者关闭该进程即可恢复正常。

关于如何通过端口查看进程,可以参考我的这篇文章

树莓派python智能控制 python控制树莓派io口_python_05

编写简易流水灯程序
#!/usr/bin/python3
# -*- coding: utf-8 -*-

""" gpio 控制简易流水灯实验
 1. 4个led从左流到右,又从右到左,循环往复
 """
__date__ = "2021/9/5"
__version__ = "1.1.0"

from time import sleep
import pigpio


# 定义编号1到4流水灯的GPIO引脚
LED1 = 4
LED2 = 17
LED3 = 27
LED4 = 22


def delay():
    sleep(0.5)

def main():
    pi = pigpio.pi()

    # IO初始化
    pi.set_mode(LED1, pigpio.OUTPUT)  # 设置为推挽输出
    pi.set_mode(LED2, pigpio.OUTPUT)  # 设置为推挽输出
    pi.set_mode(LED3, pigpio.OUTPUT)  # 设置为推挽输出
    pi.set_mode(LED4, pigpio.OUTPUT)  # 设置为推挽输出

    # 简易流水灯
    while True:
        pi.write(LED1, 1)
        pi.write(LED2, 0)
        pi.write(LED3, 0)
        pi.write(LED4, 0)
        delay()
        pi.write(LED1, 0)
        pi.write(LED2, 1)
        pi.write(LED3, 0)
        pi.write(LED4, 0)
        delay()
        pi.write(LED1, 0)
        pi.write(LED2, 0)
        pi.write(LED3, 1)
        pi.write(LED4, 0)
        delay()
        pi.write(LED1, 0)
        pi.write(LED2, 0)
        pi.write(LED3, 0)
        pi.write(LED4, 1)
        delay()
        pi.write(LED1, 0)
        pi.write(LED2, 0)
        pi.write(LED3, 1)
        pi.write(LED4, 0)
        delay()
        pi.write(LED1, 0)
        pi.write(LED2, 1)
        pi.write(LED3, 0)
        pi.write(LED4, 0)
        delay()


if __name__ == '__main__':
    # 版本控制
    print("当前版本: ", __version__)
    main()
代码解读
  1. 注意需要先设置推挽输出,增加输出能力。
  2. 单独定义灯的编号,方便随时修改,单独定义延时,也是为了方便后期修改
  3. 注意LED编号是下图圈住的数字,不要弄错了
  4. 树莓派python智能控制 python控制树莓派io口_物联网_06


效果展示

树莓派python智能控制 python控制树莓派io口_python_07

绿灯为电源指示灯

拓展示例:PWM输出
#!/usr/bin/python3
# -*- coding: utf-8 -*-

""" gpio 控制简易流水灯实验
 1. gpio产生PWM波
 2. 控制一个LED呼吸渐变
 """
__date__ = "2021/9/5"
__version__ = "1.1.0"

from time import sleep
import pigpio


# 定义编号1到4流水灯的GPIO引脚
LED1 = 4
# 定义占空比变量
PWM = 0


def delay():
    sleep(0.025)


def main():
    global PWM, LED1
    pi = pigpio.pi()

    # IO初始化
    pi.set_mode(LED1, pigpio.OUTPUT)    # 设置为推挽输出
    pi.set_PWM_frequency(LED1, 1000)    # 设定14号引脚产生的pwm波形的频率为1000Hz,方便录像,减少频闪
    pi.set_PWM_range(LED1, 2000)        # 指定要把14号引脚上的一个pwm周期分成多少份,这里是分成2000份,这个数据的范围是25-40000
    pi.set_PWM_dutycycle(LED1, 150)     # 指定pwm波形的占空比,这里的占空比为150/2000,2000是上一个函数设定的

    flag_dir = 1            # 呼吸灯渐变方向,默认为1,增加,当变为0时,数值减小
    # 简易呼吸灯
    while True:
        if flag_dir == 1:
            PWM += 10
            if PWM >= 1000:
                flag_dir = 0
        else:
            PWM -= 10
            if PWM <= 0:
                flag_dir = 1
        pi.set_PWM_dutycycle(LED1, PWM)
        delay()

if __name__ == '__main__':
    # 版本控制
    print("当前版本: ", __version__)
    main()
呼吸灯效果展示

树莓派python智能控制 python控制树莓派io口_树莓派_08