接入私有驱动
在这一篇文章中,我们会先使用 Python
编写一个 GPIO
的驱动控制 LED
,之后将其接入 Shifu 进行交互和管理。
创建驱动
目标
- 完成简单LED电路连接
- 基本的树莓派/SSH配置
- 基本的Python语法以及GPIO库知识
所用设备
- 树莓派
Raspberry Pi 3B+
运行64位Raspberry Pi OS
- 1个面包板
- 3个LED灯泡(红 黄 绿)
- 1个330欧姆的电阻
需要的基本知识
- 简单的Python语法
- Linux命令行基本操作(创建文件 安装应用 SSH 运行程序)
第一步 电路设计
首先我们来设计一下电路,我们需要设计一个电路,可以让树莓派的GPIO
输出来控制单个LED灯泡的开/关。本文采用了最直接的办法,即直接使用GPIO
来对LED灯泡进行供电。
电路图如下:
图中GPIO
的22,23,19针分别控制了红,绿,黄三个LED。最后串联的330欧电阻是为了防止LED电流过大烧毁。
第二步 电路实施
根据Raspberry Pi
官方文档中的针脚布局(Pin Layout),我们可以看到针脚的具体位置,这里用到了第15,16,35,39号针脚:
将这四个针脚接上线缆的母口,然后在面包板上将剩余的电路连接好:
图中红,绿,黄,灰线缆分别对应了GPIO22
GPIO23
GPIO19
和地(ground)。
至此,电路设计与连接部分结束。
第三步 树莓派准备
首先在树莓派中安装一个操作系统,本文中用到的是 Raspberry Pi OS (64-bit)
。下载链接
将SD卡插入读卡器,连接到电脑的USB端口中,再将下载后的压缩包通过 balenaEtcher
刷入SD卡即可。balenaEtcher链接
将SD卡放入树莓派,插入电源,显示器即可开始配置。
首先,为了方便开发/调试我们需要开启SSH,从桌面上开启终端,然后输入 sudo raspi-config
来进入配置界面,选择 Interface Options
:
选择 SSH
:
按回车,接着按左键选择Yes
来开启SSH服务:
之后按右选择Finish
,再回车退出即可:
这时,SSH服务已经开启了,但是我们需要知道树莓派的IP才可以SSH,这里我们通过系统自带的 ip addr
来查看:
可以看到,IP地址为 192.168.15.122
。
回到电脑中,通过 ssh pi@192.168.15.122
即可以远程进入到树莓派的命令行中
至此,树莓派以及硬件的准备就结束了。
早些版本的树莓派OS可能需要手动开启GPIO
第四步 驱动编写
一切就绪,现在我们来编写第一个驱动!
首先先确保系统中安装了 Python
,如果没有的话可以运行如下命令:
$ sudo apt-get update && sudo apt install python3 -y
安装完毕后可以通过 python -V
来检查安装状态,如显示版本则成功:
$ python -V
Python 3.9.2
接下来让我们先从一个LED灯泡控制开始,我们要控制红色LED的亮/灭,使用以下代码:
驱动中用到的模块有:
RPi.GPIO
用来控制树莓派的GPIOargparse
用来解析命令行输入
先将GPIO的模式置到GPIO.BCM
模式,在这个模式下针脚的数字为GPIO的数字,非树莓派板上的针脚顺序。
GPIO.setmode(GPIO.BCM)
然后将警告关闭,本文中树莓派只会被这一个驱动程序控制
GPIO.setwarnings(False)
接下来处理一下 程序输入,本驱动程序会接受两个输入:
-p
,--port
, 代表程序操控的GPIO针-o
,--operate
, 代表程序对于GPIO针的操作,on
代表电路中的1
, 即3.3V
,off
代表电路中的0
, 即0V
这段代码为:
parser = argparse.ArgumentParser()
parser.add_argument("-p", "--pin", type=int, default=None, help="Specify the GPIO pin to operate, e.g.: '17'")
parser.add_argument("-o", "--operate", type=str, default=None, help="Specify the GPIO output, e.g.: 'on/off'")
args = parser.parse_args()
接下来是一些错误处理,当针脚数和操作不为空时,将参数传入函数 turnOnLed
进行操作,否则打印出警告:
if args.pin and args.operate:
turnOnLed(args.pin, args.operate)
else:
print("need to specify both pin and operate arguments, type --help for more information")
主程序部分结束,下面我们看一下控制LED灯泡的函数 turnOnLed
。
首先是对传参的判断,确定 operate
变量为 on
或者 off
,否则返回。当变量为 on
的时候,将输出变量 gpio_out
设为 GPIO.HIGH
,off
时则设为 GPIO.LOW
。
这两个值分别代表了开或者关:
if operate == "on":
gpio_out = GPIO.HIGH
elif operate == "off":
gpio_out = GPIO.LOW
else:
print("operate is neither on/off, quitting...")
return
最后,就是将该针脚的模式设为输出:GPIO.setup(pin, GPIO.OUT)
并将针脚的输出切换到开/关:GPIO.output(pin, gpio_out)
运行效果
程序通过 python led_driver.py -p {pin #} -o {operate}
来操控
如果想让红色灯泡亮,我们执行 python led_driver.py -p 22 -o on
至此,给树莓派编写的简单控制LED灯泡驱动就编写完成了!
本质上这个驱动实现了树莓派GPIO针的操控,所以我们也可以使用这个驱动来操控任意可以被3.3V控制的电路,针脚也不仅限于本文中的22,23和19。大家可以自行发挥想象力制作各式各样的测试电路。