前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >树莓派的GPIO编程

树莓派的GPIO编程

作者头像
Vamei
发布于 2018-01-18 08:45:01
发布于 2018-01-18 08:45:01
2.6K00
代码可运行
举报
文章被收录于专栏:Vamei实验室Vamei实验室
运行总次数:0
代码可运行

树莓派除了提供常见的网口和USB接口 ,还提供了一组GPIO(General Purpose Input/Output)接口。这组GPIO接口大大拓展了树莓派的能力。GPIO不仅能实现通信,还能直接控制电子元器件,从而让用户体验到硬件编程的乐趣。

GPIO简介

在树莓派3上,GPIO接口由40个针脚(PIN)组成。每个针脚都可以用导线和外部设备相连。你可以通过焊接的方式来把导线固定在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。它们属于ID EEPROM (Electrically Erasable Programmable Read-Only Memory) 接口,用于和拓展树莓派功能的附加电路板通信。其他的PIN大多编程GPIOX的编号,如GPIO14。树莓派的操作系统中,会用GPIO的编号14来指代这个PIN,而不是位置编号的8。有一些PIN除了GPIO功能外,还提供了高级端口功能。比如说,GPIO14和GPIO15就同时可以充当UART端口。此外,GPIO上还能找到I2C和SPI端口。

树莓派3的GPIO针脚

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

控制LED灯

我们先来看GPIO输出的一个例子。我们在GPIO21和地线之间接了一个串联电路。电路上有一个LED灯,还有一个用于防止短路的330欧电阻。当GPIO21位于高电平时,将有电流通过电路,从而点亮LED灯。

我们用bash命令来控制GPIO21。在Linux中,外部设备经常被表示成文件。向文件写入或读取字符,就相当于向设备输出或者从设备输入字符。树莓派上的GPIO端口也是如此,其代表文件位于/sys/class/gpio/下。首先,激活GPIO21:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo 21 > /sys/class/gpio/export 

这个命令的意思,是把字符"21"输入到/sys/class/gpio/export。可以看到,命令执行后,/sys/class/gpio/下面增加了代表GPIO21的一个目录,目录名就是gpio21。下一步,我们把GPIO21置于输出状态:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo out > /sys/class/gpio/gpio21/direction

文件/sys/class/gpio/gpio21/direction用于控制GPIO21的方向。我们向里面写入了代表输出的字符"out"。最后,向GPIO21写入1,从而让PIN处于高电压:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo 1 > /sys/class/gpio/gpio21/value

可以看到,LED灯亮了起来。如果想关掉LED灯,只需要向GPIO21写入0:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo 0 > /sys/class/gpio/gpio21/value

使用完毕GPIO21,可以删除该端口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo 21 > /sys/class/gpio/unexport

/sys/class/gpio/gpio21随即消失。

两个树莓派之间的GPIO

我们可以用GPIO的方式连接两个树莓派。一个树莓派的GPIO输出,将成为另一个树莓派的GPIO输入。连接方式很简单,只需要2根导线。一个导线连接两个树莓派的地线,另一根导线连接树莓派的两个PIN:

我们用左侧的树莓派来输出,右侧树莓派来输入。输出过程和上面控制LED灯的例子相似。在第一个树莓派中的GPIO21准备输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo 21 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio21/direction

在第二个树莓派中,准备好读取GPIO26:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo 26 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio26/direction

当我们往/sys/class/gpio/gpio26中写入"in"时,就把GPIO26置于输入状态。

此后,在第一个树莓派中,就可以更改输出值为1或0:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo 1 > /sys/class/gpio/gpio21/value
echo 0 > /sys/class/gpio/gpio21/value

在第二个树莓派中,可以用cat命令来读取文件,获得输入值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat /sys/class/gpio/gpio26/value

由于cat命令读完一次后会返回。为了持续读取,我们可以用bash中的无限循环,来反复调用cat:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while true; do cat /sys/class/gpio/gpio26/value; done

随着第一个树莓派中输出的改变,第二个树莓派获得的输入也随之改变。我们在两个树莓派之间实现了简单的通信。

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

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,在文件末尾增加:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dtoverlay=pi3-disable-bt

修改后重启。此后的UART通信,就可以通过/dev/ttyAMA0进行。

如果是采取第二种解决方案,还是要修改/boot/config.txt,上面的修改变成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
core_freq=250
dtoverlay=pi3-miniuart-bt

修改后重启。此后的UART通信,就可以通过/dev/ttyS0进行。

我们以第一种解决方案为例,进行UART通信。设定波特率:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
stty -F /dev/ttyAMA0 9600

输出文本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo "hello" > /dev/ttyAMA0

读取文本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat /dev/ttyAMA0

如果使用第二种解决方案,那么只需要把上面的/dev/ttyAMA0改为/dev/ttyS0。

可以看到,UART可以实现更加复杂的文本通信。

用UART连接PC

一般的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登陆树莓派

我们还可以用UART的方式连接并登陆树莓派。进入树莓派设置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo raspi-config

在Interfacing Options->Serial中,允许开机时通过串口登陆。

重启后,树莓派启动时会自动把开机信息已115200的波特率推到UART端口。在UART另一端的PC上,如果你使用Mac OSX,那么你可以用下面命令连接:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
screen /dev/cu.SLAB_USBtoUART 115200

如果PC是Linux系统,只需要把USB设备文件改为对应的设备文件即可。如果是Windows系统,还可以用图形化软件。这里不再赘述。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-04-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
树莓派基础实验36:通用串口通信实验
  对于树莓派 3B+来说,他的UART功能有三种: 1、内部蓝牙使用; 2、控制终端使用; 3、与其他设备进行串口通信。
张国平
2020/09/27
4K0
树莓派3b+串口配置
树莓派从大的方向来说一共出了3代,每一代的CPU外设基本相同,但内核不同,外设里面一共包含两个串口,一个称之为硬件串口(/dev/ttyAMA0),一个称之为mini串口(/dev/ttyS0)。硬件串口由硬件实现,有单独的波特率时钟源,性能高、可靠,mini串口性能低,功能也简单,并且没有波特率专用的时钟源而是由CPU内核时钟提供,因此mini串口有个致命的弱点是:波特率受到内核时钟的影响。内核若在智能调整功耗降低主频时,相应的这个mini串口的波特率便受到牵连了,虽然你可以固定内核的时钟频率,但这显然不符合低碳、节能的口号。在所有的树莓派板卡中都通过排针将一个串口引出来了,目前除了树莓派3代以外 ,引出的串口默认是CPU的那个硬件串口。而在树莓派3代中,由于板载蓝牙模块,因此这个硬件串口被默认分配给与蓝牙模块通信了,而把那个mini串口默认分配给了排针引出的GPIO Tx Rx。 树莓派的串口默认为串口终端调试使用,如要正常使用串口则需要修改树莓派设置。关闭串口终端调试功能后则不能再通过串口登陆访问树莓派,只能通过ssh或者远程桌面连接树莓派后进行控制。
全栈程序员站长
2022/09/12
1.8K0
树莓派3b+串口配置
树莓派与arduino通信
(2)安装python的GPIO模块,用于控制LED、电机等: wget https://sourceforge.NET/projects/raspberry-gpio-python/files/RPi.GPIO-0.6.2.tar.gz    (下载GPIO库,因为更新,具体参考官网网址变动)
似水的流年
2018/01/14
1.8K0
STM32和树莓派串口透传
1、树莓派UART端口的位置:TXD位于HEAD-8;RXD位于HEAD-10;GND位于HEAD-6(可选其他GND)。
不脱发的程序猿
2021/01/20
2.1K0
树莓派基础实验38:逻辑分析仪分析PWM、UART信号
  逻辑分析仪是专门针对数字信号的调试工具,可长时间采集,无波形死区,支持复杂触发定位以及全面的协议内容解析。
张国平
2020/09/27
3K0
树莓派4b串口通信配置
请注意:在默认状态下,serial0(就是GPIO14,15)是映射到ttyS0的(就是MINI串口:/dev/ttyS0),ttyS0的特点是其工作时钟来自于CPU,CPU的时钟呢又是从600MHZ到1.5Ghz动态变化的,所以这个串口经常会因为时钟频率发生变化而发生错误,因此我们不用这个串口。
全栈程序员站长
2022/09/05
2K0
树莓派3B+使用GPIO实现串口通信[通俗易懂]
  由于项目原因需要使用树莓派连接串口,从串口获取机器人的信息同时也向机器人发送控制信息,因此串口在这里灰常重要。下面简单介绍下目前的方案:
全栈程序员站长
2022/09/12
2.4K0
树莓派3B+使用GPIO实现串口通信[通俗易懂]
树莓派基础实验39:解析无线电接收机PWM、SBUS信号
  虽然如今或者将来,5G网络的建设带来人工智能和工业自动化的全面升级,生产活动中劳动力的需求大大减少,大量的劳动力将向内容生产行业和服务行业转移。教育、医疗、娱乐、公共管理等诸多领域,乃至整个社会都将迎来巨大变革。可参阅我的一篇读书笔记5G社会:万物互联新时代。
张国平
2020/09/27
4.8K0
树莓派基础实验37:pyserial模块通信实验
  串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。串口是计算机上一种非常通用的设备通信协议,pyserial模块封装了python对串口的访问,为多平台的使用提供了统一的接口。
张国平
2020/09/27
3K0
树莓派4b c语言,【树莓派4B学习】七、树莓派4B的GPIO基础操作
链接:https://pan.baidu.com/s/1icgrCoc-piC0Eid0NlRlMA 提取码:6h0b
全栈程序员站长
2022/09/02
2.4K0
树莓派4b c语言,【树莓派4B学习】七、树莓派4B的GPIO基础操作
树莓派综合项目2:智能小车(三)无线电遥控
《智能小车(一)四轮驱动》中,实现了代码输入对四个电机的简单控制。《智能小车(二)tkinter图形界面控制》中,实现了本地图形界面控制小车的前进后退、转向和原地转圈。
张国平
2020/11/04
1.9K1
树莓派综合项目2:智能小车(三)无线电遥控
树莓派新手入门教程
树莓派(Raspberry Pi)是学习计算机知识、架设服务器的好工具,价格低廉,可玩性高。 本文根据我的亲身经验,介绍如何从零开始,搭建一个树莓派服务器,控制 LED 灯。你会看到,树莓派玩起来实在
ruanyf
2018/04/13
2.7K0
树莓派新手入门教程
树莓派基础实验35:USB TO TTL模块实验
  PC机与树莓派的常用通信方式SSH(Secure Shell)远程登录、VNC Viewer虚拟网络控制台都需要网络连接,但还有一种不需要网络的通信方式:Serial port串口通信。
张国平
2020/09/27
3.3K1
打造机器人:为遥控小车加一个树莓派
2. 你已经对树莓派已有了相当的了解,并已 SD卡上烧制了 Raspbian/Wheezy系统
博文视点Broadview
2020/06/12
1.7K0
打造机器人:为遥控小车加一个树莓派
在树莓派3上测试Modbus RTU通信
本文主要涉及Modbus RTU模式的测试。关于Modbus TCP/IP在之前的文章中也推送过,因为树莓派3的硬件串口和蓝牙是公用的,所以在用串口通信的时候,需要对树莓派做一些配置和设置。并关掉串口
用户1605515
2018/04/10
3.6K0
在树莓派3上测试Modbus RTU通信
Python+树莓派制作IoT(物联网)门控设备
因为考虑需要在户外使用这套物联网门控设备,所以利用树莓派完成这个设备有两个问题需要解决, 第一是需要解决树莓派和相关模块的供电问题。 第二就是需要户外没有宽带网络情况下的信号传输问题。 只要解决这两个问题那么剩下来的问题就是编程方面的了,针对以上两个问题,这里我们采用比较大众化的方式解决,设备的供电问题我们使用太阳能配合蓄电池进行实现7X24小时供电,信号的传输问题我们使用一块叫做SIM868的通讯模块来实现。下面来介绍一下设备制作的材料准备、制作过程以及程序的编写和调试。
緣來
2020/01/02
3.3K0
Python+树莓派制作IoT(物联网)门控设备
树莓派pico官方网站_树莓派pico参数
Raspberry Pi Pico是具有灵活数字接口的低成本,高性能微控制器板。它集成了Raspberry Pi自己的RP2040微控制器芯片,运行速度高达133 MHz的双核Arm Cortex M0 +处理器,嵌入式264KB SRAM和2MB板载闪存以及26个多功能GPIO引脚。对于软件开发,可以使用Raspberry Pi的C / C ++ SDK或MicroPython。1
全栈程序员站长
2022/11/04
3.3K0
树莓派4裸机基础教程:从hello world开始
当我们去研究一个系统的时候,首先需要从最简单的程序开始入手。前面文章的介绍已经描述了项目的环境搭建以及启动过程。
bigmagic
2020/09/18
2.8K0
Mjpg-Streamer+Node.js实现在树莓派上的监控与拍照
最近在做一个机器人项目,需要将试试捕获安装于机器人身上的视频图像,并能够对机器人进行无线运动控制。作为前端工程师的我,很自然的想到了使用Node作为服务器和机器人的控制中心,通过前端页面实现对机器人控制和视频图像的捕捉。
vincentKo
2022/09/19
2.2K0
Mjpg-Streamer+Node.js实现在树莓派上的监控与拍照
树莓派无界面初始化
无界面初始化,也就是常说的 headless initialization,目的是在不需要给树莓派接入额外的显示器的情况下完成基本的无线网络配置,并且启动好必要的远程管理工具比如 ssh 等。
evilpan
2023/02/12
1.5K0
树莓派无界面初始化
相关推荐
树莓派基础实验36:通用串口通信实验
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验