官方文档:https://sourceforge.net/p/raspberry-gpio-python/wiki/BasicUsage/

https://blog.csdn.net/fhqlongteng/article/details/80395059

目录

1.python和gpio的安装

2.引入GPIO模块

3.警告信息

4.编号规则

5.设置通道

6.输入

7. 上拉、下拉电阻

8.中断和边缘检测

9.输出

10.PWM脉冲调解

11.GPIO恢复默认


1.python和gpio的安装

首先安装python和pip模块,然后执行sudo pip install rpi.gpio安装gpio模块

2.引入GPIO模块

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

import RPi.CPIO as GPIO

3.警告信息

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

GPIO.setwarnings(False)

4.编号规则

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

GPIO.setmode(GPIO.BOARD)# or
GPIO.setmode(GPIO.BCM)

注意:在RPI.GPIO中,同时支持树莓派上的两种GPIO引脚编号。第一种编号是BOARD编号,这和树莓派电路板上的物理引脚编号相对应。使用这种编号的好处是,你的硬件将是一直可以使用,不用担心树莓派的版本问题(电路板升级后,不需要重写代码)。第二种编号是BCM规则,是更底层的工作方式,它和Broadcom的片上系统中信道编号相对应,在使用一个引脚时,你需要查找信道号和物理引脚编号之间的对应规则,对于不同的树莓派版本,编写的脚本文件也可能是无法通用的。

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

GPIO.getmode()

5.设置通道

需要设置输入或输出的每个通道(引脚的编号),将通道配置为输入:

GPIO.setup(channel,GPIO.IN)

要将通道设置为输出:

GPIO.setup(channel,GPIO.OUT)

还可以为输入通道指定一个初始值:

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

设置多个通道:

chan_list = [channel1, channel2]
GPIO.setup(chan_list, GPIO.OUT)

6.输入

读取GPIO引脚的值

GPIO.input(channel)

结果返回0/GPIO.LOW/False    或    1/GPIO.HIGH/True

7. 上拉、下拉电阻

如果您在输入针脚上没有连接任何元件,那么它将是“浮动(float)”的。换句话说,因为您没有连接任何元件,在按下按钮或开关之前,读取的值是没有意义的。由于电源的波动,获取到的值可能会有很大的变化。

为了解决这个问题,我们需要使用上拉/下拉电阻。这样,我们就可设定输入的默认值了。在这里,可以使用硬件或软件对电阻进行上拉/下拉。使用硬件方式,将一个 10K 的电阻连接在输入通道与 3.3V(上拉)或 0V(下拉)之间是常用的做法。而 RPi.GPIO 也允许您通过软件的方式对配置 Broadcom SOC 来达到目的:

GPIO.setup(channel, GPIO.IN,pull_up_down=GPIO.PUD_UP)
#或者
GPIO.setup(channel, GPIO.IN,pull_up_down=GPIO.PUD.DOWN)

8.中断和边缘检测

边沿是电信号从低电平变为高电平(上升沿)或从高电平变为低电平(下降沿)的状态变化。很多时候,我们更关心输入状态的变化而非值。这种状态变化是一个事件。

为了避免程序忙于做其他事情时按下按钮,有两种方法可以解决这个问题。

(1)wait_for_edge( )函数

wait_for_edge()函数用于阻止程序的执行,直到检测到边缘。用于检测到边沿之前阻止程序运行

GPIO.wait_for_edge(channel, GPIO.RISING)

例子:

channel = GPIO.wait_for_edge(channel, GPIO_RISING, timeout=5000)
if channel is None:print('timeout occurred')
else: print('edge detected on channel',channel)#延时5秒,如果超时,程序继续执行,如果没有超时将继续等待

(2)event_detected()函数

event_detected()函数设计用于与其他工作一起循环使用,但与轮询不同,在CPU忙于处理其他事情时,不会错过输入状态的变化。

多用在PyQt上

例子:

GPIO.add_event_detect(channel,GPIO.RISING)
do_something()
if GPIO.event_detected(channel):print('button pressed')#add_event_detect()多用于循环状态,并且不会错过循环中输入状态的改变

(3)threaded回调

RPi.GPIO为回调函数运行第二个线程。这意味着回调函数可以与主程序同时运行,并立即响应边缘事件。例如:

#回调函数def my_callback(channel):print("这是回调函数",channel)
#主程序监听回调函数GPIO.add_event_detect(channel, GPIO.RISING,callback=my_callback)

如果需要多个回调函数

def my_callback_one(channel):print('Callback one')def my_callback_two(channel):print('Callback two')GPIO.add_event_detect(channel, GPIO.RISING)
GPIO.add_event_callback(channel, my_callback_one)
GPIO.add_event_callback(channel, my_callback_two)

注意:在多个回调函数情况下,回调函数是按顺序运行的,而不是同时运行。这是因为只有一个线程用于回调,每个回调都按照定义的顺序运行

(4)开关抖动

每次按下按钮都会多次调用回调。这是所谓的“开关抖动”的结果。处理抖动有两种方法:

- 在开关输入脚上添加一个0.1uF的电容

- 软件除去抖动

这里使用软件去除抖动,要使用软件去抖动,请将bouncetime =参数添加到指定回调函数的函数中。抖动时间应以毫秒为单位指定。例如:

#在通道上添加上升沿检测
GPIO.add_event_detect(cahnnel,GPIO.RISING,callback=my_callback, bouncetime=200)

(5)删除时间检测

如果由于某种原因,您的程序不再希望检测边缘事件,则可以删除它们:

GPIO.remove_event_detect(channel)

9.输出

(1)设置GPIO引脚的输出状态

GPIO.output(channel,state)

(其中通道是基于您指定的编号系统(BOARD或BCM)的通道编号)。

状态可以是0 / GPIO.LOW / False或1 / GPIO.HIGH / True。

#设置输出高电平
GPIO.output(12,GPIO.HIGH)
# or
GPIO.output(12,1)
GPIO.output(12,True)#设置输出低电平
GPIO.output(12,GPIO.LOW)
# or
GPIO.output(12,0)
GPIO.output(12,False)

(2)输出到几个通道

#可以设置输出多个通道chan_list = [11,12]
GPIO.output(chan_list,GPIO.LOW) #设置11,12为低电平
GPIO.output(chan_list,(GPIO.HIGH,GPIO.LOW))#设置11为高电平,12为低电平

10.PWM脉冲调解

PWM这个多用在控制电机上,特别是对我们做树莓派小车对小车的控制上有很大的帮助

常用的方法

#1.创建PWM实例
pwm=GPIO.PWM(pin,frequence)
#2.启动PWM  dc值(0.0<dc<100.0)
pwm.start(dc)
#3.改变PWM频率
pwm.ChangeFrequence(freq)
#4.改变PWM的占空比0.0<dc<100.0
pwm.ChangeDutyCycle(dc)
#5.停止pwm
pwm.stop()

例1:使LED每两秒闪烁一次的示例

import RPI.GPIO AS GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12,GPIO.OUT)p=GPIO.PWM(12,0.5)
P.start(1)
input('点击回车停止:')
p.stop()
GPIO.cleanup()

例2:

import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.OUT)p = GPIO.PWM(12, 50)  # 通道为 12 频率为 50Hz
p.start(0)
try:while 1:for dc in range(0, 101, 5):p.ChangeDutyCycle(dc)time.sleep(0.1)for dc in range(100, -1, -5):p.ChangeDutyCycle(dc)time.sleep(0.1)
except KeyboardInterrupt:pass
p.stop()
GPIO.cleanup()

11.GPIO恢复默认

在程序的末尾,清理您可能使用的任何资源是一种很好的做法。过将您用过的所使用的通道返回到到无上拉/下拉输入的状态,这样可以避免短接GPIO引脚来导致意外损坏您的树莓派。

GPIO.cleanup()

可能不希望清理每个通道,而留下一些

GPIO.cleanup(channel)
GPIO.cleanup( (channel1, channel2) )
GPIO.cleanup( [channel1, channel2] )

GPIO模块常用的一些方法相关推荐

  1. Node.js process 模块常用属性和方法

    Node.js是常用的Javascript运行环境,本文和大家发分享的主要是Node.js中process 模块的常用属性和方法,希望通过本文的分享,对大家学习Node.js http://www.m ...

  2. python常用内置模块-Python之OS模块常用内置方法汇总

    OS模块的常用内置方法 chdir修改当前工作目录到指定目录 Change the current working directory to the specified path. chmod修改一个 ...

  3. python redis模块常用_python-Redis模块常用的方法汇总

    Redes模块常用的方法汇总 一.创建建Redis对象 1.直接使用 import redis r = redis.Redis(host='127.0.0.1', port=6379) 2.连接池使用 ...

  4. Python中random模块常用函数/方法(2)——random.random(),random.randint()和random.uniform()

    1.random.random():生成一个0到1的随机符点数: 0 <= n < 1.0 语法:random.random() #生成一个0~1之间的随机浮点数 print(" ...

  5. 常用元器件使用方法34:DCDC电源模块B1205XT-1WR3

    文章目录 前言 一.特性 二.参数 1.输入电压(V) 2.输出电压(V) 3.输出电流(mA) 4.效率 5.最大容性负载(uB) 6.静电放电 三.电路设计 1.典型应用 2.EMC电路 前言   ...

  6. 树莓派模拟量输入范围_使用 RPi.GPIO 模块的输入(Input)功能

    这篇日志的内容应该算是<RPi.GPIO 模块使用基础>Input 部分的扩展讲解,详细讲解了 Input 部分的一些高级应用技巧. 目前有几种途径可以在您的程序中获得 GPIO 的输入信 ...

  7. python系统-Python OS模块常用功能 中文图文详解

    一.Python OS模块介绍 OS模块简单的来说它是一个Python的系统编程的操作模块,可以处理文件和目录这些我们日常手动需要做的操作. 可以查看OS模块的帮助文档: >>> i ...

  8. Linux 常用命令使用方法

    Linux 常用命令使用方法 1.# 表示权限用户(如:root),$ 表示普通用户  开机提示:Login:输入用户名  password:输入口令   用户是系统注册用户成功登陆后,可以进入相应的 ...

  9. pythonxml模块高级用法_Python利用ElementTree模块处理XML的方法详解

    前言 最近因为工作的需要,在使用 Python 来发送 SOAP 请求以测试 Web Service 的性能,由于 SOAP 是基于 XML 的,故免不了需要使用 python 来处理 XML 数据. ...

最新文章

  1. 谈周六晚上的毕业典礼
  2. ASI和AFN的区别
  3. html追加行clone,调用clone()方法后就可以将复制的节点追加到body元素内。( ) 答案:√...
  4. 【五线谱】符干朝向与连音线 ( 符干朝向 | 第三线以下符干朝上 | 第三线以上符干朝下 | 连音线 )
  5. 采集文件到kafka
  6. Windows2008+sqlserver2008集群安装(图文并貌)
  7. oracle dbstart,dbstart: 未找到命令
  8. aix java home_java程序员工作日子一(java_home 配置)
  9. 求一个数的阶乘值c语言代码,求10000的阶乘(c语言代码实现)
  10. VCenter配置ESXI主机syslog日志收集
  11. java使用bks双向认证_客户端与服务器SSL双向认证(客户端:Android
  12. tensorflow精进之路(二十二)——使用slim模型对图像识别与检测(下)(VGG19模型)
  13. mysql CASE WHEN的基础和多种用法
  14. 28_Future模式1
  15. [转]手游运营后台通用需求
  16. 下载pip、安装pip
  17. 机器学习(十七):网格搜索(Grid Search)和SVM
  18. 二阶求导 算法 实现 寻峰问题(转)
  19. mysql 自旋锁,golang 自旋锁
  20. hdu 1205 吃糖果(数学)

热门文章

  1. science最新研究动态周报(2021年5月26期)
  2. 端口隔离port-isolate(二层隔离)
  3. 使用ROS开源代码和激光雷达进行小车的定位导航
  4. MySQL下载完如何打开
  5. 使用Jmeter进行接口测试和压力测试的配置和使用
  6. java毕设_城市公交系统
  7. 解决Windows 下git官网下载很慢
  8. 2020-05-06
  9. 道路车辆ISO20653标准中IPX9K试验方法
  10. FDC2214+FPGA转换芯片使用和配置(非接触液位检测设计)