前言
说实话我并不想写关于GPIO的教程。
一方面这个东西有点鸡肋,另一方面树莓派它不是单片机,GPIO的时序难以保证。
真要做硬件的话我宁愿用USB转TTL也不要用板载的UART接口。
说归说闹归闹,教程还是要写的。操作GPIO主要有两种方式,以下一一介绍。
先贴一张图,来自树莓派实验室

通过内核接口操作
Linux的硬件都被虚拟成了文件的形式,操作硬件就是操作文件。
当然由于操作文件比较麻烦,这种方式方式了解一下即可。
关于GPIO的操作在在这个目录下进行——/sys/class/gpio/
使用某个GPIO时首先要在 /sys/class/gpio/export 中声明:
echo 21 > /sys/class/gpio/export
声明结束之后会在gpio目录下多出一个对应引脚的目录/gpio21
然后指定该GPIO的方向(引脚模式),这里我们指定为输出模式。
echo out > /sys/class/gpio/gpio21/direction
接下来可以通过向 /sys/class/gpio/gpio21/value 写入0或1来控制该引脚的高低电平。
echo 1 > /sys/class/gpio/gpio21/value
操作结束之后可以取消声明,就像这样:
echo 21 > /sys/class/gpio/unexport
通过库操作
比较常用的库有两个,一个是Python模块 RPI.GPIO,另一个是wiringPi,支持通过Python、Golang、PHP等语言进行调用。有意思的地方在于,这俩都是用C写的。
鉴于树莓派已经有些年头了,目前已经发展到了第四代,而相关的教程比较陈旧而且网上一抓一大把,我这里就不重复劳动了,顶多贴一下官方手册免得大伙被奇奇怪怪的博客上的不严谨教程误导。
官方网站在这里: RPI.GPIO / WiringPi
实际上目前树莓派官网钦定的GPIO编程方式主要提供了面向少儿的Scratch,Python以及基于C/C++的第三方库pigpio。
而官方推荐的Python库并不是RPI.GPIO,而是GPIO Zero。
GPIO Zero
GPIO Zero的优势在于,分门别类地给每种元器件都单独写了方法,可以直接调用。
比如下边控制接在2号引脚上的按钮这一段代码:
这样做的好处是对纯软件出身的Coder比较友好,可以无视底层,但是对于想学习硬件的玩家来说就过于简单了,起不到学习的作用。
文档放在前面,GPIO Zero这个库比较简单,就不赘述了。
pigpio
由于使用C语言编写,pigpio的原作者提供了C语言的库以及Python模块。
除此以外,还支持以守护进程的方式提供面向底层的接口和管道,称作pigpiod。
另外还有一些第三方开发者进行了其他语言的移植,比较具有代表性的是Java,Node.js以及Perl。
在官网的Examples页面提供了大量的实例源码,包括C语言,Python以Shell脚本,大家可以自行下载阅读。
写在最后
我上次使用GPIO应该是在15年(当时还在学习树莓派的使用),在之后大大小小的项目中最主要的硬件控制方式是USB转TTL+单片机,树莓派有四个USB接口,挂四个Arduino/STM32 绰绰有余。
不喜欢使用GPIO的主要原因是在那个时候这玩意时常抽风,会引起莫名其妙的bug,当时咱还是个Linux菜鸟,也不知道怎么排查,索性弃用GPIO。
即使是现在我也对GPIO的实时性存在一定的偏见,毕竟操作硬件干嘛不用单片机呢,将树莓派作为miniPC才能最大限度的压榨它的性能(笑
