为了账号安全,请及时绑定邮箱和手机立即绑定

如何写一个树莓派的驱动来控制GPIO LED

file
一直以来,物联网开发者面对新的硬件都是一件头痛的事情。有些时候明明有现成的驱动,我们却没法直接利用。公司的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灯泡进行供电。

电路图如下:
file

图中GPIO的22,23,19针分别控制了红,绿,黄三个LED。最后串联的330欧电阻是为了防止LED电流过大烧毁。

第二步:电路实施

根据Raspberry Pi官方文档中的针脚布局(Pin Layout),我们可以看到针脚的具体位置,这里用到了第15,16,35,39号针脚:
file

将这四个针脚接上线缆的母口,然后在面包板上将剩余的电路连接好:
file

图中红,绿,黄,灰线缆分别对应了GPIO22,GPIO23,GPIO19和地(ground)
file

至此,电路设计与连接部分结束。

第三步:树莓派的准备:

首先在树莓派中安装一个操作系统,本文中用到的是Raspberry Pi OS (64-bit)

将SD卡插入读卡器,连接到电脑的USB端口中,再将下载后的压缩包通过balenaEtcher刷入SD卡即可

balenaEtcher链接: https://www.balena.io/etcher/

将SD卡放入树莓派,插入电源,显示器即可开始配置。

首先,为了方便开发/调试我们需要开启SSH,从桌面上开启终端:
file

然后输入“sudo raspi-config”来进入配置界面
file

选择“Interface Options”
file

选择“SSH”:
file

按回车,接着按左键选择“Yes”来开启SSH服务:
file

之后按右选择Finish,再回车退出即可:
file

这时,SSH服务已经开启了,但是我们需要知道树莓派的IP才可以SSH,这里我们通过系统自带的”ip addr”来查看:
file

可以看到,IP地址为 “192.168.15.122”

回到电脑中,通过“ssh pi@192.168.15.122”即可以远程进入到树莓派的命令行中
file

至此,树莓派以及硬件的准备就结束了。

注:早些版本的树莓派OS可能需要手动开启GPIO

第四步:驱动编写

一切就绪,现在我们来编写第一个驱动!

首先先确保系统中安装了python,如果没有的话可以运行如下命令:

var example = “sudo apt-get update && sudo apt install python3 -y”

安装完毕后可以通过“python -V”来检查安装状态,如显示版本则成功:
file

接下来让我们先从一个LED灯泡控制开始,我们要控制红色LED的亮/灭,使用以下代码:
file

驱动中用到的模块有:

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”

file

至此,给树莓派编写的简单控制LED灯泡驱动就编写完了!

总结
在此篇文章中,我们实现了树莓派的配置,LED灯泡连接GPIO以及编写一个可以操控LED灯泡的简单驱动。

本质上这个驱动实现了树莓派GPIO针的操控,所以我们也可以使用这个驱动来操控任意可以被3.3V控制的电路,针脚也不仅限于本文中的22,23和19。大家可以自行发挥想象力制作各式各样的测试电路。

这就是一个“传统”意义上的驱动了。但是这远远不够,在当今这个一切都可以被远程调用,远程操控的数字化时代,这个驱动仍然是太简陋了。

那么如何完善这个驱动,来实现更多,更加柔性的功能呢?除了修改/重写驱动以外,还有什么更好的办法来做嘛?

我们的下一篇文章,将向各位介绍边无际自研的开源框架Shifu的解决方案,可以让开发者在不必修改/重写驱动的状态下,实现对设备的操控。

非常感谢您看到了这里,我们期待您的反馈,如果觉得文章写得不错或者有任何建议请毫不犹豫地留言。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消