树莓派的GPIO端口详解

article/2025/5/14 11:34:48

首先上一张端口图

 

GPIO(GeneralPurposeI/OPorts)意思为通用输入/输出端口,通俗地说,就是一些引脚,可以通过它们输出高低电平或者通过它们读入引脚的状态-是高电平或是低电平。GPIO是个比较重要的概念,用户可以通过GPIO口和硬件进行数据交互(如UART),控制硬件工作(如LED、蜂鸣器等),读取硬件的工作状态信号(如中断信号)等。GPIO口的使用非常广泛。掌握了GPIO,差不多相当于掌握了操作硬件的能力。

 

图上可以看到,每一个针脚都有Pin#和NAME字段。Pin代表的是该针脚的编号,其中01和02针脚对应第一张图中GPIO最右边竖排的两个针脚。而NAME代表的是该针脚的BCM名称,当然NAME也可以直接看得出针脚的默认功能。比如3.3v和5v代表着该针脚会输出3.3v和5v的电压,Ground代表着该针脚是接地的,GPIO0*则是一些待用户开发的针脚。每个针脚都可以使用程序进行控制操作。

控制GPIO编程

可以用下面的代码导入RPi.GPIO模块。

  importRPi.GPIOasGPIO

  引入之后,就可以使用GPIO模块的函数了。如果你想检查模块是否引入成功,也可以这样写:

  try:

  importRPi.GPIOasGPIO

  exceptRuntimeError:

  print(“引入错误”)

针脚编号

  在RPi.GPIO中,同时支持树莓派上的两种GPIO引脚编号。第一种编号是BOARD编号,这和树莓派电路板上的物理引脚编号相对应。使用这种编号的好处是,你的硬件将是一直可以使用的,不用担心树莓派的版本问题。因此,在电路板升级后,你不需要重写连接器或代码。

  第二种编号是BCM规则,是更底层的工作方式,它和Broadcom的片上系统中信道编号相对应。在使用一个引脚时,你需要查找信道号和物理引脚编号之间的对应规则。对于不同的树莓派版本,编写的脚本文件也可能是无法通用的。

  你可以使用下列代码(强制的)指定一种编号规则:

  GPIO.setmode(GPIO.BOARD)

  #or

  GPIO.setmode(GPIO.BCM)

  下面代码将返回被设置的编号规则

  mode=GPIO.getmode()

警告

  如果RPi.GRIO检测到一个引脚已经被设置成了非默认值,那么你将看到一个警告信息。你可以通过下列代码禁用警告:

  GPIO.setwarnings(False)

  引脚设置

  在使用一个引脚前,你需要设置这些引脚作为输入还是输出。配置一个引脚的代码如下:

  #将引脚设置为输入模式

  GPIO.setup(channel,GPIO.IN)

  #将引脚设置为输出模式

  GPIO.setup(channel,GPIO.OUT)

  #为输出的引脚设置默认值

  GPIO.setup(channel,GPIO.OUT,initial=GPIO.HIGH)

  释放

  一般来说,程序到达最后都需要释放资源,这个好习惯可以避免偶然损坏树莓派。释放脚本中的使用的引脚:

  GPIO.cleanup()

  注意,GPIO.cleanup()只会释放掉脚本中使用的GPIO引脚,并会清除设置的引脚编号规则。

 

将端口设置为输出的状态:

要想点亮一个LED灯,或者驱动某个设备,都需要给电流和电压他们,这个步骤也很简单,设置引脚的输出状态就可以了,代码如下:

  GPIO.output(channel,state)

  状态可以设置为0/GPIO.LOW/False/1/GPIO.HIGH/True。如果编码规则为,GPIO.BOARD,那么channel就是对应引脚的数字。

  如果想一次性设置多个引脚,可使用下面的代码:

  chan_list=[11,12]

  GPIO.output(chan_list,GPIO.LOW)

  GPIO.output(chan_list,(GPIO.HIGH,GPIO.LOW))

  你还可以使用Input()函数读取一个输出引脚的状态并将其作为输出值,例如:

  GPIO.output(12,notGPIO.input(12))

  读取

  我们也常常需要读取引脚的输入状态,获取引脚输入状态如下代码:

  GPIO.input(channel)

  低电平返回0/GPIO.LOW/False,高电平返回1/GPIO.HIGH/True。

  如果输入引脚处于悬空状态,引脚的值将是漂动的。换句话说,读取到的值是未知的,因为它并没有被连接到任何的信号上,直到按下一个按钮或开关。由于干扰的影响,输入的值可能会反复的变化。使用如下代码可以解决问题:

  GPIO.setup(channel,GPIO.IN,pull_up_down=GPIO.PUD_UP)

  #or

  GPIO.setup(channel,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)

  需要注意的是,上面的读取代码只是获取当前一瞬间的引脚输入信号。

  如果需要实时监控引脚的状态变化,可以有两种办法。最简单原始的方式是每隔一段时间检查输入的信号值,这种方式被称为轮询。如果你的程序读取的时机错误,则很可能会丢失输入信号。轮询是在循环中执行的,这种方式比较占用处理器资源。另一种响应GPIO输入的方式是使用中断(边缘检测),这里的边缘是指信号从高到低的变换(下降沿)或从低到高的变换(上升沿)。

  轮询方式

  whileGPIO.input(channel)==GPIO.LOW:

  time.sleep(0.01)#wait10mstogiveCPUchancetodootherthings

  边缘检测

  边缘是指信号状态的改变,从低到高(上升沿)或从高到低(下降沿)。通常情况下,我们更关心于输入状态的该边而不是输入信号的值。这种状态的该边被称为事件。先介绍两个函数:

  wait_for_edge()函数。wait_for_edge()被用于阻止程序的继续执行,直到检测到一个边沿。也就是说,上文中等待按钮按下的实例可以改写为:channel=GPIO.wait_for_edge(channel,GPIO_RISING,timeout=5000)

  ifchannelisNone:

  print(‘Timeoutoccurred’)

  else:

  print(‘Edgedetectedonchannel’,channel)

  add_event_detect()函数该函数对一个引脚进行监听,一旦引脚输入状态发生了改变,调用event_detected()函数会返回true,如下代码:GPIO.add_event_detect(channel,GPIO.RISING)#addrisingedgedetectiononachannel

  do_something()

  //下面的代码放在一个线程循环执行。

  ifGPIO.event_detected(channel):

  print(‘Buttonpressed’)

  上面的代码需要自己新建一个线程去循环检测event_detected()的值,还算是比较麻烦的。

  不过可采用另一种办法轻松检测状态,这种方式是直接传入一个回调函数:

  defmy_callback(channel):

  print(‘Thisisaedgeeventcallbackfunction!’)

  print(‘Edgedetectedonchannel%s’%channel)

  print(‘Thisisruninadifferentthreadtoyourmainprogram’)

  GPIO.add_event_detect(channel,GPIO.RISING,callback=my_callback)

  如果你想设置多个回调函数,可以这样:

  defmy_callback_one(channel):

  print(‘Callbackone’)

  defmy_callback_two(channel):

  print(‘Callbacktwo’)

  GPIO.add_event_detect(channel,GPIO.RISING)

  GPIO.add_event_callback(channel,my_callback_one)

  GPIO.add_event_callback(channel,my_callback_two)

  注意:回调触发时,并不会同时执行回调函数,而是根据设置的顺序调用它们。

  综合例子:点亮LED灯

树莓派gpio接口及编程方法

  上面说明了一大堆函数库的用法,那么现在就应该来个简单的实验了。这个实验很简单,点亮一个LED灯。

  编写代码之前,首先你需要将led灯的针脚通过杜邦线连接到树莓派的引脚上,比如你可以连接到11号引脚。

  新建一个main.py文件,写入如下代码:

  importRPi.GPIOasGPIO//引入函数库

  importtime

  RPi.GPIO.setmode(GPIO.BOARD)//设置引脚编号规则

  RPi.GPIO.setup(11,RPi.GPIO.OUT)//将11号引脚设置成输出模式

  whileTrue

  GPIO.output(channel,1)//将引脚的状态设置为高电平,此时LED亮了

  time.sleep(1)//程序休眠1秒钟,让LED亮1秒

  GPIO.output(channel,0)//将引脚状态设置为低电平,此时LED灭了

  time.sleep(1)//程序休眠1秒钟,让LED灭1秒

  GPIO.cleanup()//程序的最后别忘记清除所有资源

  保存,并退出文件。执行python3main.py,即可观看效果。Ctrl+C可以关闭程序。

  此外,不妨也试试其它的函数吧,增强印象。

  使用PWM

  这个python函数库还支持PWM模式的输出,我们可以利用PWM来制作呼吸灯效果。详情看代码:

  importtime

  importRPi.GPIOasGPIO//引入库

  GPIO.setmode(GPIO.BOARD)//设置编号方式

  GPIO.setup(12,GPIO.OUT)//设置12号引脚为输出模式

  p=GPIO.PWM(12,50)//将12号引脚初始化为PWM实例,频率为50Hz

  p.start(0)//开始脉宽调制,参数范围为:(0.0《=dc《=100.0)

  try:

  while1:

  fordcinrange(0,101,5):

  p.ChangeDutyCycle(dc)//修改占空比参数范围为:(0.0《=dc《=100.0)

  time.sleep(0.1)

  fordcinrange(100,-1,-5):

  p.ChangeDutyCycle(dc)

  time.sleep(0.1)

  exceptKeyboardInterrupt:

  pass

  p.stop()//停止输出PWM波

  GPIO.cleanup()//清除

树莓派gpio接口及编程方法

  结语

  在文中,主要讲解了GPIO的概念,以及如何使用python操作GPIO。但是想要充分了解树莓派gpio编程,还需要自己实际动手操作以及分析总结。

 

以下为测试程序

# -*- coding: utf-8 -*-                     #通过声明可以在程序中书写中文
import RPi.GPIO as GPIO                     #引入RPi.GPIO库函数命名为GPIO
import time                                 #引入计时time函数
# BOARD编号方式,基于插座引脚编号
GPIO.setmode(GPIO.BOARD)                    #将GPIO编程方式设置为BOARD模式
# 输出模式
GPIO.setup(11, GPIO.OUT)                    #将GPIO引脚11设置为输出引脚

while True:                                 # 条件为真,下面程序一直循环执行     
        GPIO.output(11, GPIO.HIGH)          #将11引脚电压置高,点亮LED灯
        time.sleep(1)                       #延时1秒
        GPIO.output(11, GPIO.LOW)           #将11引脚电压置低,熄灭LED灯
        time.sleep(1)  
 

 

 

 


http://chatgpt.dhexx.cn/article/ii1qFdBP.shtml

相关文章

树莓派管脚编码c语言,树莓派IO引脚定义 | 北岛夜话

我们使用树莓派的很重要一个原因是想通过它来进行一些智能控制,比如控制舵机、LED灯、继电器或者用来进行串口、SPI通信等,这些都需要通过控制树莓派的输入输出引脚(IO引脚)来实现的。前面的文章我们说过树莓派的输入输出引脚有26针和40针的区别,今天这篇文章我们具体看看它…

树莓派GPIO引脚详解

树莓派的GPIO引脚还是小有点复杂,有些是共用的。需要在启动时切换不同的设备树文件来设置不同的模式。详情参考: UART at Raspberry Pi GPIO PinoutRaspberry Pi UART pinshttps://pinout.xyz/pinout/uart

树莓派引脚编号说明

目前,树莓派引脚编号方式有三种: 1,基于引脚的物理位置进行编号; 2,C语言GPIO库wiringPi约定的编号方式; 3,Python语言GPIO库RPi.GPIO约定的编号方式。 如果我们要基于wiringPi库用C语言对树…

树莓派4b引脚图

感觉树莓派4B的引脚分布排序和树莓派3B的引脚排序差不太多,或者我需要的电源和串口应该是一样的。 转载自:树莓派4b引脚图_0欣欣0的博客-CSDN博客_树莓派4b引脚图

树莓派开发笔记(五):GPIO引脚介绍和GPIO的输入输出使用(驱动LED灯、检测按键)

若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062 本文章博客地址:https://blog.csdn.net/qq21497936/article/…

树莓派4B引脚定义及运行实例

一、树莓派引脚定义 学习如何用树莓派驱动LED灯时需要先了解树莓派管脚GPIO的编码方式,树莓派的管脚编码方式与51单片机的管脚编码有些不一样,在树莓派的GPIO上分为两种编码方式,分别为BCM和wiringPi编码,不同的编码方式在编写程…

树莓派 串口如何使用 以及树莓派引脚对照表

本文档为个人博客文档系统的备份版本、作者:小游、作者博客:点击访问 树莓派引脚图如下: 默认情况下,树莓派的串口有两个一个分配给蓝牙,另一个是miini串口,不过这个串口几乎不能正常使用(树莓…

树莓派引脚介绍与GPIO的初步认识与应用

树莓派引脚介绍与GPIO的初步认识 一.认识GPIO二.Python GPIO三.应用 一.认识GPIO 所谓GPIO,就是“通用输入/输出”接口,树莓派系统中已经编译自带了GPIO的驱动。 树莓派GPIO的编号方式: 1. 功…

树莓派:树莓派的各个引脚

由于第一次接触树莓派,,,emmmm,仔细写,奥里给 3.3V、5V(VCC):显然是电源正极啦 GND:接地用,负极负极负极 SDA.0、SDA.1:这个是 I2C&#xff08…

Raspberry Pi 引脚说明

除了供电针脚(包括 GND,3.3V 和 5V ),所有的GPIO针脚均可被用于数字输入或输出。 标记为 SCL(串行时钟)和SDA(串行数据)的针脚可被用于 I2C。 标记为 MOSI,MISO 和SCKL 的针脚可以用于连接高速…

基础篇——树莓派通用引脚定义

背景故事 树莓派主板集成了丰富的IO口,可以用于输入输出,通信等功能,常常用于物联网控制、传感器数据交互等方面,这里我们讲解一下怎么使用IO口作为输入输出,并控制一些简单的电路。 引脚直观图 我在网上找到一张非…

硬盘插上出不显示盘符,提示“硬盘必须经过初始化”

一个2T的Seagate希捷移动硬盘,没有怎么用过,在笔记本上拷贝了几个文件就突然消失了,而且再次拔插USB线后发现仍然看不到硬盘盘符。 但发现插上USB线后,任务栏中出现了USB插入硬盘的提示图标,看到这个我放心多了&#x…

磁盘必须经过初始化,逻辑磁盘管理器才能访问——笔记本硬盘作为移动硬盘使用时遇到的问题...

1. 问题描述 把笔记本电脑的硬盘拆出来,套上一个网上买的移动硬盘盒,就是一个移动硬盘了。 我的新的“移动硬盘”在接上别的电脑的时候,无法被识别,如下图。 显示:磁盘需要经过初始化,逻辑磁盘管理器才能访…

磁盘在磁盘管理中显示没有初始化找回文件方案

磁盘没有初始化是因为0号扇区损坏,导致机械硬盘分区表读取不出来,从而机械硬盘出现磁盘没有初始化。 工具/软件:极限数据恢复软件 步骤1:程序打开后,直接双击需要恢复数据的物理盘。 步骤2:等待程序扫描完…

服务器信息未初始化失败怎么办,初始化服务器失败

初始化服务器失败 内容精选 换一换 云服务器新增磁盘,开机自动执行磁盘初始化脚本后,Oralce、MySQL和SQL Server等数据库系统日志Msg 823错误 。磁盘初始化脚本WinVMDataDiskAutoInitialize.ps1执行过程中会调用diskpart启用virtual disk服务&#xff0c…

计算机管理 没有初始化,win7系统电脑新增的硬盘没有初始化的解决方法

win7系统想必大家都非常熟悉吧,然而有时候可能会碰到win7系统电脑新增的硬盘没有初始化的情况,想必大家都遇到过win7系统电脑新增的硬盘没有初始化的情况吧,那么应该怎么处理win7系统电脑新增的硬盘没有初始化呢?我们依照  1、当…

服务器一直显示初始化,服务器一直初始化内存

服务器一直初始化内存 内容精选 换一换 本文以云服务器的操作系统为“Windows Server 2012 R2 Standard 64bit”、磁盘容量为3 TB举例,提供容量大于2 TB的Windows数据盘的初始化操作指导。MBR格式分区支持的磁盘最大容量为2 TB,GPT分区表最大支持的磁盘容…

windows下初始化格式化磁盘

新买来的硬盘是未初始化的,以我的理解就是没有引导扇区的,通常是没有MBR,如下图磁盘1,右边有大小,但显示“未分配”, 左边显示“没有初始化”, 点鼠标右键就可以【初始化磁盘】。 初始化时可以…

RAID初始化过程

RAID系统是用来对存储数据进行数据保护的有效手段。 在RAID创建过程中往往会存在一个时间极长的系统初始化过程, 为什么RAID初始化过程中会存在这样的一个操作呢? 这个操作对SSD会导致什么方面的影响呢? 传统RAID的基本组织结构如下图所示…

计算机中磁盘管理恢复分区,电脑磁盘修复

硬盘驱动器(Hard-Disk Drive)简称硬盘,是一种主要的电脑存储媒介,由一个或者多个铝制或者玻璃制的碟片组成。这些碟片外覆盖有铁磁性材料。绝大多数硬盘都是固定硬盘,被永久性地密封固定在硬盘驱动器中。现在可移动硬盘越来越普及&#xff0c…