树莓派开始,玩转Linux9:GPIO触手

树莓派开始,玩转Linux9:GPIO触手

树莓派可以通过很多接口来连接到其他设备。在各种各样的接口中,最有特色的就是一组GPIO(General Purpose Input/Output)接口。
这组GPIO接口大大拓展了树莓派的能力。GPIO不仅能实现通信,还能直接控制电子元器件,从而让用户体验到硬件编程的乐趣。

1.GPIO简介:

树莓派3上的GPIO接口由40个针脚(PIN)组成,如图11-1所示。
在这里插入图片描述
每个针脚都可以用导线和外部设备相连。你可以通过焊接的方式把导线固定在PIN上,也可以用母型的跳线套接在PIN上。在40个PIN中,有固定输出的5V(2、4号PIN)、3.3V(1、17号PIN)和地线(Ground,6、9、14、20、25、30、34、39)。
如果一个电路两端接在5V和地线之间,那么该电路就会获得5V的电压输入。27和28号PIN标着ID_SD和ID_SC。它们是两个特殊的PIN,用于和附加的电路板通信。其他的PIN大多编成GPIOX的编号,如GPIO14。树莓派的操作系统会用GPIO的编号14来指代这个PIN,而不是位置编号的8。

有一些PIN不仅有GPIO功能,还能充当其他形式的端口。比如,GPIO14和GPIO15除了作为GPIO接口,还可以充当UART端口。此外,GPIO上还能找到I2C和SPI接口。

计算机中用高、低两个电压来表示二进制的1和0。树莓派上的GPIO用相同的方式来表示数据。每个GPIO的PIN都能处于输入或输出状态。
当处于输出状态时,系统可以把1或0传给该PIN。如果是1,那么对应的物理PIN向外输出3.3V的高电压,否则输出0V的低电压。相应的,处于输入状态的PIN可以探测物理PIN上的电压。如果是高电压,那么该PIN将向系统返回1,否则返回0。利用简单的二元机制树莓派实现了和物理电路的互动。

2.控制LED灯:

我们先来看GPIO输出的一个例子。在GPIO21和地线之间接一个串联电路,电路上有一个LED灯,还有一个用于防止短路的330Ω电阻。当GPIO21位于高电平时,将有电流通过电路点亮LED灯,如图所示。
在这里插入图片描述
我们通过Shell来控制GPIO21。在Linux中,外部设备经常被表示成文件。向文件写入或读取字符,就相当于向设备输出或者从设备输入字符。树莓派上的GPIO端口也是如此,其代表文件位于/sys/class/gpio/下。

首先,激活GPIO21:

在这里插入图片描述
这个命令把字符"21"输入/sys/class/gpio/export中。命令执行后,/sys/class/gpio/下面增加了代表GPIO21的一个目录,目录名就是gpio21。

其次,把GPIO21置于输出状态:
在这里插入图片描述
文件/sys/class/gpio/gpio21/direction用于控制GPIO21的方向,向里面写入了代表输出的字符"out"。

最后,向GPIO21写入1,从而让PIN处于高电压:
在这里插入图片描述
可以看到,LED灯亮了起来。

如果想关掉LED灯,那么只需要向GPIO21写入0:
在这里插入图片描述
用完GPIO21可以删除该端口:
在这里插入图片描述
/sys/class/gpio/gpio21随即消失。

3.两个树莓派之间的GPIO:

我们可以用GPIO的方式连接两个树莓派,如图所示。一个树莓派的GPIO输出将成为另一个树莓派的GPIO输入。
连接方式很简单,只需要两根导线。一根导线连接两个树莓派的地线,另一根导线连接树莓派的两个PIN。
在这里插入图片描述
用左侧的树莓派来输出,用右侧树莓派来输入。输出过程和上面控制LED灯的例子相似。第一个树莓派中的GPIO21准备输出:
在这里插入图片描述
在第二个树莓派中,准备好读取GPIO26:
在这里插入图片描述
当我们向/sys/class/gpio/gpio26中写入"in"时,就是把GPIO26置于输入状态。
此后,在第一个树莓派中就可以更改输出值为1或0了:
在这里插入图片描述
在第二个树莓派中,可以用cat命令来读取文件,获得输入值:
在这里插入图片描述
cat命令读完一次后会返回,为了持续读取,可以用bash中的while循环来反复调用cat:

在这里插入图片描述
这里的while是bash提供的循环结构,随后do和done之间的内容会重复执行。第二个树莓派将循环查看GPIO26的输入值。当第一个树莓派中的输出改变时,第二个树莓派获得的输入也随之改变。我们在两个树莓派之间实现了简单的通信。

最后,在使用完GPIO后,别忘了删除端口。

4.UART编程:

计算机的数据是许多位的0和1构成的序列。尽管GPIO可以在0和1之间切换,但无法传输二进制序列。比如,把一个二进制序列11000111输出到GPIO端口,在输入端看来,只是输入了一段时间的1,然后变成0,最后又变成1。输入端无法准确说出,一段高电平输入究竟包含了几位1。

一个解决方案是用多个PIN同时通信,每个PIN表示一位。当输入端读取完成后,通知输出端,让输出端送来下一批的数据。这种通信方式被称为并口传输。和并口传输对应的是串口传输,传输时依然是用一个PIN,但输入方可以知道一位数据持续了多长时间。GPIO上的UART、I2C、SPI都是串口通信。

UART与其余两者的区别在于,通信双方通过事先约定的速率来发送或接收数据。这种通信方式称为异步通信。
I2C和SPI这类同步通信方式会用额外的连线来保证双方速率相同。UART的连线和实现方式很简单,因而成为最流行的串口通信方式。但UART的缺点在于,如果发送方和接收方的速率不同,那么通信就会发生错误。通信速率称为波特率(Baudrate),单位是每秒通信的位数(bps)。

UART的端口至少有RX、TX和地线三个针脚。RX负责读取,TX负责输出。如果有两个UART端口,它们的连接方式如图所示。

在这里插入图片描述
在树莓派3上,TX和RX就是GPIO14和GPIO15针脚。因此,我们可以把两个树莓派按照图的方式连接起来,然后在两个树莓派之间实现UART通信。

在这里,我们要注意树莓派3发生了一点变化。树莓派1和2中都使用了标准的UART,在操作系统中的对应文件是/dev/ttyAMA0。在树莓派3中,新增的蓝牙模块占用了标准UART端口和树莓派沟通,外部的UART通信采用了简单的Mini UART,在操作系统中的对应文件是/dev/ttyS0。由于mini UART的波特率依赖于CPU时钟频率,而CPU时钟频率可能在运行过程中浮动,因此mini UART经常会带来意想不到的错误。一般有两种解决方案:一种是关闭蓝牙模块,让外部连接重新使用标准UART端口;另一种是固定CPU时钟频率,以便mini UART能以准确的波特率进行通信。

关闭蓝牙模块,需要修改/boot/config.txt。将dtoverlay键的值改为:
在这里插入图片描述
修改后重启。此后的UART通信,就可以通过/dev/ttyAMA0进行。如果采取第二种解决方案,那么要修改/boot/config.txt,把上面的修改变成:
在这里插入图片描述
修改后重启。此后的UART通信就可以通过/dev/ttyS0进行了。

我们以第一种解决方案为例,进行UART通信。首先,设定波特率:
在这里插入图片描述
然后,向UART端口输出文本:
在这里插入图片描述
在UART的另一端读取文本:
在这里插入图片描述
可以看到,UART可以实现更加复杂的文本通信。

如果使用第二种解决方案,即限定核心频率的办法,那么只需把/dev/ttyAMA0改
为/dev/ttyS0即可。

5.用UART连接PC:

一般的PC都没有暴露在外的UART针脚。为了通过UART来连接PC和树莓派,我们需要一个USB和UART的转换器。这个转换器的一端是USB接口,另一端是UART的针脚。我们把USB一端插入PC,另一端按照UART到UART的方式,连接到树莓派的UART针脚。

连接好之后,就可以在PC上利用串口操作软件来和树莓派通信了。在Linux下,USB连接表示为/dev/ttyUSB0。当然,当计算机上只有1个USB设备时,最后的编号才会是0。而在笔者的Mac OS X上,该USB连接被表示成/dev/cu.SLAB_USBtoUART。此后,就可以通过操作USB文件来进行UART通信了。

6.用UART登录树莓派:

我们还可以用UART的方式连接并登录树莓派。进入树莓派设置:
在这里插入图片描述
在Interfacing Options→Serial中,允许开机时通过串口登录。重启后,树莓派启动时会自动把开机信息以115200的波特率推到UART端口。在UART另一端的PC上,如果使用Mac OS X,那么可以用
下面的命令连接:
在这里插入图片描述
如果PC是Linux系统,则只需把USB设备文件改为对应的设备文件即可。

如果是Windows系统,则可以使用Putty通过串口连接树莓派。首先在Windows的设备管理器中找到该USB设备。假如USB设备被识别为COM3,那么在Putty的设置页面中,把连接类型(Connection Type)设置成串口(Serial),然后在串口线路(Serial Line)中输入USB设备的名称,例如COM3。速度(Speed)选择115200。设置好后单击"打开(Open)"按钮即可连接。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值