做者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载。 html
树莓派除了提供常见的网口和USB接口 ,还提供了一组GPIO(General Purpose Input/Output)接口。这组GPIO接口大大拓展了树莓派的能力。GPIO不只能实现通讯,还能直接控制电子元器件,从而让用户体验到硬件编程的乐趣。编程
在树莓派3上,GPIO接口由40个针脚(PIN)组成。每一个针脚均可以用导线和外部设备相连。你能够经过焊接的方式来把导线固定在PIN上,也能够用母型的跳线套接在PIN上。bash
跳线异步
40个PIN中,有固定输出的5V(二、4号PIN)、3.3V(一、17号PIN)和地线(Ground,六、九、1四、20、2五、30、3四、39)。若是一个电路两端接在,5V和地线之间,该电路就会得到5V的电压输入。27和28号PIN标着ID_SD和ID_SC。它们是两个特殊的PIN。它们属于ID EEPROM (Electrically Erasable Programmable Read-Only Memory) 接口,用于和拓展树莓派功能的附加电路板通讯。其余的PIN大多编程GPIOX的编号,如GPIO14。树莓派的操做系统中,会用GPIO的编号14来指代这个PIN,而不是位置编号的8。有一些PIN除了GPIO功能外,还提供了高级端口功能。好比说,GPIO14和GPIO15就同时能够充当UART端口。此外,GPIO上还能找到I2C和SPI端口。spa
树莓派3的GPIO针脚操作系统
在计算机中,一般用高、低两个电压来表示二进制的1和0。树莓派也是如此。GPIO用相同的方式来表示数据。每一个GPIO的PIN都能处于输入或输出状态。当处于输出状态时,系统能够把1或0传给该PIN。若是是1,那么对应的物理PIN向外输出3.3V的高电压,不然输出0V的低电压。相应的,处于输入状态的PIN能够探测物理PIN上的电压。若是是高电压,那么该PIN将向系统返回1,不然返回0。就是利用上述简单机制,GPIO实现了和物理电路的互动。3d
咱们先来看GPIO输出的一个例子。咱们在GPIO21和地线之间接了一个串联电路。电路上有一个LED灯,还有一个用于防止短路的330欧电阻。当GPIO21位于高电平时,将有电流经过电路,从而点亮LED灯。code
咱们用bash命令来控制GPIO21。在Linux中,外部设备常常被表示成文件。向文件写入或读取字符,就至关于向设备输出或者从设备输入字符。树莓派上的GPIO端口也是如此,其表明文件位于/sys/class/gpio/下。首先,激活GPIO21:htm
echo 21 > /sys/class/gpio/export
这个命令的意思,是把字符"21"输入到/sys/class/gpio/export。能够看到,命令执行后,/sys/class/gpio/下面增长了表明GPIO21的一个目录,目录名就是gpio21。下一步,咱们把GPIO21置于输出状态:blog
echo out > /sys/class/gpio/gpio21/direction
文件/sys/class/gpio/gpio21/direction用于控制GPIO21的方向。咱们向里面写入了表明输出的字符"out"。最后,向GPIO21写入1,从而让PIN处于高电压:
echo 1 > /sys/class/gpio/gpio21/value
能够看到,LED灯亮了起来。若是想关掉LED灯,只须要向GPIO21写入0:
echo 0 > /sys/class/gpio/gpio21/value
使用完毕GPIO21,能够删除该端口:
echo 21 > /sys/class/gpio/unexport
/sys/class/gpio/gpio21随即消失。
咱们能够用GPIO的方式链接两个树莓派。一个树莓派的GPIO输出,将成为另外一个树莓派的GPIO输入。链接方式很简单,只须要2根导线。一个导线链接两个树莓派的地线,另外一根导线链接树莓派的两个PIN:
咱们用左侧的树莓派来输出,右侧树莓派来输入。输出过程和上面控制LED灯的例子类似。在第一个树莓派中的GPIO21准备输出:
echo 21 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio21/direction
在第二个树莓派中,准备好读取GPIO26:
echo 26 > /sys/class/gpio/export echo in > /sys/class/gpio/gpio26/direction
当咱们往/sys/class/gpio/gpio26中写入"in"时,就把GPIO26置于输入状态。
此后,在第一个树莓派中,就能够更改输出值为1或0:
echo 1 > /sys/class/gpio/gpio21/value echo 0 > /sys/class/gpio/gpio21/value
在第二个树莓派中,能够用cat命令来读取文件,得到输入值:
cat /sys/class/gpio/gpio26/value
因为cat命令读完一次后会返回。为了持续读取,咱们能够用bash中的无限循环,来反复调用cat:
while true; do cat /sys/class/gpio/gpio26/value; done
随着第一个树莓派中输出的改变,第二个树莓派得到的输入也随之改变。咱们在两个树莓派之间实现了简单的通讯。
最后,在使用完GPIO后,别忘了删除端口。
计算机的数据都是许多位的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=pi3-disable-bt
修改后重启。此后的UART通讯,就能够经过/dev/ttyAMA0进行。
若是是采起第二种解决方案,仍是要修改/boot/config.txt,上面的修改变成:
core_freq=250
dtoverlay=pi3-miniuart-bt
修改后重启。此后的UART通讯,就能够经过/dev/ttyS0进行。
咱们以第一种解决方案为例,进行UART通讯。设定波特率:
stty -F /dev/ttyAMA0 9600
输出文本:
echo "hello" > /dev/ttyAMA0
读取文本:
cat /dev/ttyAMA0
若是使用第二种解决方案,那么只须要把上面的/dev/ttyAMA0改成/dev/ttyS0。
能够看到,UART能够实现更加复杂的文本通讯。
通常的PC都没有暴露在外的UART针脚。为了经过UART来链接PC和树莓派,咱们须要一个USB和UART的转换器。这个转换器的一端是USB接口,另外一端是UART的针脚。咱们把USB一端插入到PC。另外一端按照UART到UART的方式,链接到树莓派的UART针脚。
链接好以后,就能够在PC上,利用串口操做软件来和树莓派通讯。在Linux下,USB链接表示为/dev/ttyUSB0。固然,当计算机上只有1个USB设备时,最后的编号才会是0。而在个人Mac OSX上,该USB链接被表示成/dev/cu.SLAB_USBtoUART。此后,就能够经过操做USB文件来进行UART通讯。在Windows下,也有现成的进行串口通讯的图形化软件。
咱们还能够用UART的方式链接并登录树莓派。进入树莓派设置:
sudo raspi-config
在Interfacing Options->Serial中,容许开机时经过串口登录。
重启后,树莓派启动时会自动把开机信息已115200的波特率推到UART端口。在UART另外一端的PC上,若是你使用Mac OSX,那么你能够用下面命令链接:
screen /dev/cu.SLAB_USBtoUART 115200
若是PC是Linux系统,只须要把USB设备文件改成对应的设备文件便可。若是是Windows系统,还能够用图形化软件。这里再也不赘述。
欢迎阅读“骑着企鹅采树莓”系列文章