初识GPIO
由于项目需求,在自己的笔记本(msi,微星GE60)上跑了一个项目代码,发现一直报错(如下图),于是,对GPIO进行了一番“调查”。
GPIO全称是General Purpose Input Output(通用输入/输出)。广义上来说它并不是类似USB、DVI、HDMI 这样一种特定协议的接口,而是通用接口的总称。下面是维基百科的定义:
A general-purpose input/output (GPIO) is an uncommitted digital signal pin on an integrated circuit or electronic circuit board whose behavior - including whether it acts an input or output - is controllable by the user at run time.
从上面总结出几点:
- 数字针脚(可以是集成电路上的针脚,比如CPU或位处理器的针脚;也可以是开发板,比如树莓派、Arduino上提供的GIPO接口);
- 可以用来输入或输出;
- 运行时可控。
树莓派相比电脑最大的优势就是,通过GPIO接口可以连接很多外部设备,和设备进行通信,并且可以通过代码进行控制。
虽然电脑也可以通过USB连接很多外部设备,但USB其实也是一种通用的串行接口,就本质上来说没有太大区别。不过USB设备需要设备厂商提供驱动,目前在单片机或树莓派上外设基本都是通过GPIO连接,当然USB的也可以搜索到,但是非常少。
【关于台式电脑主板是否有GPIO】
普通PC在“通用针脚”意义上没有GPIO。PC主板上的连接器(无论是内部接口还是外部接口)都是为特定功能而设计的。
PC最接近GPIO的可能就是并行打印机端口,它有许多数据线和握手线。这些线路有点像GPIO引脚,但在方向方面灵活性较差。
【树莓派GPIO针脚说明】
在项目中,用的是树莓派,因此在这儿说一下树莓派GPIO的针脚。
什么是树莓派(Raspberry Pi)
树莓派是由树莓派基金会研发的一种只有信用卡大小的单板机电脑,最初的设计目标是用较为廉价的硬件和开源软件为儿童提供一个计算机教育平台。但其优秀的扩展性和易于开发的特性,使其不仅仅用于儿童教育,更是成为了极客们的玩具。树莓派被开发出了千千万万种玩法,并且普通人也可以轻松实现。
先看一下实物图:
其中右上角左右两排共40根针脚,并不是所有的针脚都是GPIO针脚。详情参考下图:
注意:这两张图的上下左右顺序已经对齐了,实际连线的时候不要看错方向接错针脚,否则有损坏树莓派的可能。
【选择开发语言】
控制GPIO口有很多方式,比如
- shell直接控制
- raspberry-gpio-python库(Python语言)
- wiringPi库(C语言)
- BCM2835 C Library(C语言)
【输入/输出】
对于GPIO接口来说,最重要的就是输入和输出功能。对于计算机来说能识别的只有0和1,而对于数字电路来说,通过高低电平来表示输出的值是0还是1。因为树莓派GPIO接口的电压是3.3V。所以用3.3V表示高电平,也即1,而用0V表示低电平,也即0。一般来说,高低电平是一个电压范围。
在买外设时发现,有些设备是5V高电平,有些是3.3V。了解到单片机分为3.3V和5V,就是指的GPIO接口的电压。如果用GPIO接口产生一个3.3V的高电平给一个5V的设备,可能会被认为是低电平,如果直接接上一个5V设备作为输入电平,可能会导致树莓派烧坏。所以使用外设时要注意这个外设的电压是5V还是3.3V。
当GPIO用做输入时,会有高电平、低电平、高阻态三个状态。高阻态,指的是电路的一种输出状态,既不是高电平也不是低电平,这个时候因为状态不确定,读取GPIO时可能会导致数据不正确。所以引入了上拉和下拉电阻的概念。
- 上拉电阻:电阻一端接VCC,一端接逻辑电平接入引脚(如单片机引脚)
- 下拉电阻:电阻一端接GND,一端接逻辑电平接入引脚(如单片机引脚)
树莓派每个GPIO接口都有上拉和下拉电阻,大部分是可以通过软件的方式来设置。所以树莓派在连接外设时可以不需要外部的上拉或下拉电阻。而是初始化时设置一下就可以了。
更多上下拉电阻的概念可以参考:
Pull-up and pull-down Resistors
【GPIO数据传输】
和外设之间进行通信主要通过GOIP接口进行输入和输出。GPIO接口提供了可编程的方式从外设读取或向外设发送状态数据。通过控制控制高低电平可以输出不同状态,所以用做开关控制是非常简单有效的。作为输入时可以读取数值或者是状态。虽然每次只能传递0和1这样的数据,但是多次连续传递0和1组合起来,就可以传递复杂的数据。 比如温度传感器就是用GPIO口通过单总线协议进行数据交换。 通过GPIO可以进行各种协议的通信。