背景故事
树莓派主板集成了丰富的IO口,可以用于输入输出,通信等功能,常常用于物联网控制、传感器数据交互等方面,这里我们讲解一下怎么使用IO口作为输入输出,并控制一些简单的电路。
硬件准备
- 树莓派主板(这里以3B为例)
- 基础电路1搭建:面包板流水灯电路
软件准备
- 确保树莓派系统为官方系统,系统安装可以参考我的其他教程。非官方系统安装方式因系统而异,不在本篇讨论。
- 安装pigpio库
pigpio是一个由C语言编写的库函数,并提供Python接口。
安装指令如下:
sudo apt-get install pigpio python-pigpio python3-pigpio
- pigpio库的基本介绍
根据官方文档上的介绍,这个库主要特性有(翻译自官方文档,可能有错漏):
- 能够同时在31个GPIO口进行精确至5微秒的硬件定时采样
- 能够同时在31个GPIO口产生硬件定时PWM
- 能够同时在31个GPIO口产生硬件定时伺服脉冲
- 同时监听31个GPIO口,电平更改时进行回调(精确到几个微秒)
- 同时监听31个GPIO口,电平更改时通过管道发送通知 可以在规定的时间间隔内进行回调
- 可以同时读取/写入存储区中的所有GPIO(0-31,32-53)
- 可以实现对GPIO状态的读,写模式和内部拉动 提供套接字和管道接口
- 可以用于生成GPIO电平变化的波形(精确到几个微秒)
- 可以使用任何用户的GPIO的软件串行链接 通过套接字和管道接口进行基本权限控制
- 安装完检查
4.1 输入如下指令:
dpkg -l|grep pigpio
返回结果如下:
4.2 输入 sudo pigpiod
检查能否启动gpio守护进程
正常启动后不会有任何返回,也不会报错,仿佛不存在一样,返回结果如下:
此时可通过查看进程来确定是否运行,输入如下指令:
ps -ef|grep pigpio
返回结果如下:
我这个遇到一个端口占用问题,返回结果如下:
通过查看端口和进程ID,查询到有个jupyter-lab软件也使用了8888端口,修改该软件的默认端口,或者关闭该进程即可恢复正常。
关于如何通过端口查看进程,可以参考我的这篇文章:中级篇——Linux下通过进程名、ID、端口号查看进程信息
编写简易流水灯程序
#!/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()
代码解读
- 注意需要先设置推挽输出,增加输出能力。
- 单独定义灯的编号,方便随时修改,单独定义延时,也是为了方便后期修改
- 注意LED编号是下图圈住的数字,不要弄错了
效果展示
绿灯为电源指示灯
拓展示例: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()
呼吸灯效果展示
祝大家玩的愉快!
·
·
·
欢迎各位老铁一键三连,本号后续会不断更新树莓派、人工智能、STM32、ROS小车相关文章和知识。
大家对感兴趣的知识点可以在文章下面留言,我可以优先帮大家讲解哦
原创不易,转载请说明出处。