一直以来,物联网开发者面对新的硬件都是一件头痛的事情。有些时候明明有现成的驱动,我们却没法直接利用。公司的PM/领导一句话下来,整套系统就要从新来,说明书一看就是一天,重复的软硬联调,日复一日的造轮子,到最后可能也就是一次性的需求,用过以后就在代码仓库里吃灰。
我们不禁问道为什么硬件和应用/系统的耦合度这么高?手上的一堆驱动/系统为什么就不能做到即插即用呢?
不过没关系,物联网的开发者们很快就有救了。边无际将推出系列分享,一步步的带着广大物联网开发者实现真正的软硬解耦,物理设备即插即用。让开发一个业务场景像开发一个APP一样简单!
下面就让我们进入这一系列的第一次分享:给树莓派编写一个控制GPIO LED的驱动。
介绍:
本文是一个使用Python开发一个控制树莓派GPIO LED的驱动指南,其中包含基本的连接,命令,语法,任何开发者都可以阅读本文来学习树莓派GPIO驱动的开发方法。
本文使用Python实现了一个控制驱动,为了简单起见,本文不适用任何高级语法/框架。
目标:
完成简单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号针脚:
将这四个针脚接上线缆的母口,然后在面包板上将剩余的电路连接好:
编辑切换为居中
添加图片注释,不超过 140 字(可选)
图中红,绿,黄,灰线缆分别对应了GPIO22,GPIO23,GPIO19和地(ground)
至此,电路设计与连接部分结束。
第三步:树莓派的准备:
首先在树莓派中安装一个操作系统,本文中用到的是Raspberry Pi OS (64-bit)
>>下载链接: https://www.raspberrypi.com/software/operating-systems/#raspberry-pi-os-64-bit
将SD卡插入读卡器,连接到电脑的USB端口中,再将下载后的压缩包通过balenaEtcher刷入SD卡即可
>>balenaEtcher链接: https://www.balena.io/etcher/
将SD卡放入树莓派,插入电源,显示器即可开始配置。
首先,为了方便开发/调试我们需要开启SSH,从桌面上开启终端:
然后输入“sudo raspi-config”来进入配置界面
选择“Interface Options”
选择“SSH”:
按回车,接着按左键选择“Yes”来开启SSH服务:
之后按右选择Finish,再回车退出即可:
这时,SSH服务已经开启了,但是我们需要知道树莓派的IP才可以SSH,这里我们通过系统自带的”ip addr”来查看:
可以看到,IP地址为 “192.168.15.122”
回到电脑中,通过“ssh [email protected]”即可以远程进入到树莓派的命令行中
至此,树莓派以及硬件的准备就结束了。
注:早些版本的树莓派OS可能需要手动开启GPIO
第四步:驱动编写
一切就绪,现在我们来编写第一个驱动!
首先先确保系统中安装了python,如果没有的话可以运行如下命令:
sudo apt-get update && sudo apt install python3 -y
安装完毕后可以通过“python -V”来检查安装状态,如显示版本则成功:
接下来让我们先从一个LED灯泡控制开始,我们要控制红色LED的亮/灭,使用以下代码:
驱动中用到的模块有:
o 用来控制树莓派的GPOIO
RPi.GPIO
o 用来解析命令行输入
argparse
先将GPIO的模式置到”GPIO.BCM”模式,在这个模式下针脚的数字为GPIO的数字,非树莓派板上的针脚顺序。
GPIO.setmode(GPIO.BCM)
然后将警告关闭,本文中树莓派只会被这一个驱动程序控制
GPIO.setwarnings(False)
接下来处理一下程序输入,本驱动程序会接受两个输入:
1. “-p”, “--port”, 代表程序操控的GPIO针
2. “-o”, “--operate”, 代表程序对于GPIO针的操作,”on” 代表电路中的”1”, 即3.3V, ”off” 代表电路中的”0”, 即0V
这段代码为:
parser = argparse.ArgumentParser()
接下来是一些错误处理,当针脚数和操作不为空时,将参数传入函数“turnOnLed”进行操作,否则打印出警告:
if args.pin and args.operate:
主程序部分结束,下面我们看一下控制LED灯泡的函数 “turnOnLed”
首先是对传参的判断,确定“operate”变量为”on”或者”off”,否则返回。当变量为”on”的时候,将输出变量“gpio_out”设为“GPIO.HIGH”,“off”时则设为”GPIO.LOW”。
这两个值分别代表了开或者关:
if operate == "on":
最后,就是将该针脚的模式设为输出:
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灯泡驱动就编写完了!
总结
在此篇文章中,我们实现了树莓派的配置,LED灯泡连接GPIO以及编写一个可以操控LED灯泡的简单驱动。
本质上这个驱动实现了树莓派GPIO针的操控,所以我们也可以使用这个驱动来操控任意可以被3.3V控制的电路,针脚也不仅限于本文中的22,23和19。大家可以自行发挥想象力制作各式各样的测试电路。
这就是一个“传统”意义上的驱动了。但是这远远不够,在当今这个一切都可以被远程调用,远程操控的数字化时代,这个驱动仍然是太简陋了。
那么如何完善这个驱动,来实现更多,更加柔性的功能呢?除了修改/重写驱动以外,还有什么更好的办法来做嘛?
我们的下一篇文章,将向各位介绍边无际自研的开源框架Shifu的解决方案,可以让开发者在不必修改/重写驱动的状态下,实现对设备的操控。
非常感谢您看到了这里,我们期待您的反馈,如果觉得文章写得不错或者有任何建议请毫不犹豫地留言。