文档章节

在树莓派3B上使用RPi.GPIO

e哥
 e哥
发布于 2016/10/29 21:30
字数 1086
阅读 4.5K
收藏 18

精选30+云产品,助力企业轻松上云!>>>

一直都听说树莓派功能很强大,这几天就买了个pi3试玩一下。拿到手装好系统,就开始测试GPIO口,点亮一个LED。直接用python去操作GPIO好像不行,还好网上有很多python封装包可以用。RPi.GPIO使用比较简单,官方主页也给比较详细的介绍也附带了例子。

RPi.GPIO主页:https://sourceforge.net/p/raspberry-gpio-python/wiki/Home/

官网介绍的是英文了,我自己写了个中文的使用手册:

https://git.oschina.net/null_693_8693/RPi.GPIO-use-introduction/attach_files

RPi.GPIO是python调用包,提供了一些方法来操作树莓派上GPIO引脚。使用python程序可以很方便的调用这些方法。目前RPi.GPIO提供了GPIO输入、输出和软件模拟PWM方法,可惜的是暂不提供SPI、I2C、UART和硬件PWM方法。

使用不难,接下来我就来介绍下使用它的一些感受吧。

 

首先,既然是控制GPIO口,那就得看看它操作的速度了,虽然python是出了名的慢。

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
GPIO.setup(35, GPIO.OUT)

start_time = time.time()
for i in range(0, 1000000):
    GPIO.output(35, 1)
    pass
end_time = time.time()

print(end_time - start_time)
GPIO.cleanup()

上面代码我运行了五次,平均下来每次时间为2.4396s。然后去除GPIO.output(35, 1),运行五次,每次平均时间为0.5222s。有这些数据就可以计算出执行1000000次GPIO.output(35, 1)的时间为1.9174s,则每次执行GPIO.output(35, 1)时间是1.9us。我的个神啊太慢了吧,后面我又对输出0和改成输入模式,测试的时间都基本一样,一个字“慢”。现在很多8位单片机都比这速度快了。估计用这速度去软件模拟SPI、I2C传大点的数据是不行了。本来还想模拟个SPI驱动下TFT显示屏,看到这速度只能放弃了。

 

RPi.GPIO有个类似硬件中断的函数,挺好玩的。

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(35, GPIO.IN, GPIO.PUD_DOWN)

def my_callback(channel):
    print('--my_callback start--')
    for i in range(0, 10000000):
        pass
    print('--my_callback end--')
GPIO.add_event_detect(35, GPIO.RISING, my_callback, bouncetime=200)

while True:
    time.sleep(1)
GPIO.cleanup()

GPIO.add_event_detect添加事件检测,GPIO.RISING上升沿触发,my_callback回调函数,它还有个防抖延时bouncetime(单位ms),省得我们自己去软件防抖。为什么我要加for i in range(0, 10000000)呢?我是想知道当中断被触发后但还没有退出来,再次给它个上升沿,它会不会再次进入回调函数呢?答案是不会。

 

硬件中的中断有嵌套关系,需要给每个中断设定优先级。51类的需设定一个(不设定就默认),stm32要设置两个:抢占优先级和子优先级。RPi.GPIO主页文档中没有说明这一点,我想通过一段代码测试一下。

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup([35,37], GPIO.IN, GPIO.PUD_UP)

def my_callback_one(channel):
    print('--my_callback_one start--')
    for i in range(0, 100000):
        pass
    print('--my_callback_one end--')
def my_callback_two(channel):
    print('--my_callback_two start--')
    for i in range(0, 100000):
        pass
    print('--my_callback_two end--')
GPIO.add_event_detect(35, GPIO.FALLING, my_callback_one, bouncetime=200)
GPIO.add_event_detect(37, GPIO.FALLING, my_callback_two, bouncetime=200)

while True:
    time.sleep(1)
GPIO.cleanup()

我先是把35和37引脚连在一起,同时给下降沿,发现它们虽然都被触发了,但还是会先执行一个,执行完后再执行下一个,而不会出现嵌套现象。然后我再尝试先给35引脚一个下降沿,当35引脚的中断被触发,开始执行回调函数时但还没有退出回调的时候我马上给37引脚一个下降沿,此时37引脚并没有马上被触发去调用它的回调函数而是等35引脚的回调函数执行完才被触发。把35引脚和37引脚顺序调过来情况也一样。按理说树莓派用3的BCM2837处理器的GPIO口中断应该有嵌套、优先级的,估计已经被RPi.GPIO默认设置好了。可能被测试的引脚刚好被RPi.GPIO设置成优先级一个高一个低,不能被抢占。

 

综合上诉测试,RPi.GPIO可以被利用到一些时序要求不高、小量数据传输、简单IO操作的项目上。

RPi.GPIO还有其他的一些用法,如果感兴趣可以下载我写的 《RPi.GPIO使用手册》或者到 RPi.GPIO主页 查看。

e哥
粉丝 7
博文 4
码字总数 7777
作品 0
深圳
私信 提问
加载中
此博客有 6 条评论,请先登录后再查看。
python代码实现树莓派3b+驱动步进电机

python代码实现树莓派3b+驱动步进电机   之前买了个树莓派,刚买回来那会儿热情高涨,折腾了一段时间,然后就放那吃灰了。前几天忽然想起来这个东西了,决定再玩玩儿,于是就从某宝上购买了...

osc_tartz9st
2019/06/16
7
0
树莓派笔记02—树莓派硬件环境准备

在开始玩转树莓派之前,我们需要了解下树莓派的硬件配置以及所需要的配件。跟电脑PC机类似,树莓派也需要必要的输入输出设备才能工作。 1. 树莓派3B+ 2018年3月14日,树莓派基金会正式发布新...

TonyCode
2018/08/03
0
0
SIM7600CE TCP/IP连接与PPP拨号上网 4G上网

SIM7600CE联网测试分为两部分: 1、TCP/IP连接 2、PPP拨号上网 实验环境:ubuntu-meta 16.04 硬件:树莓派3B,SIM7600CE 上网卡:移动的NB-IOT物联网卡 微雪官方教程:http://www.waveshare....

osc_f47lo76p
2019/08/03
29
0
将树莓派 3B+ 变为 PriTunl VPN

PriTunl 是一种 VPN 解决方案,适用于希望私密的访问其网络的小型企业和个人。 PriTunl 是一款出色的 VPN 终端解决方案,非常适合希望以简单快捷的方式私密的访问网络的小型企业和个人。它是...

作者: Stephen Bancroft
2019/02/01
0
0
将树莓派 3B+ 变为 PriTunl VPN

PriTunl 是一种 VPN 解决方案,适用于希望私密的访问其网络的小型企业和个人。 PriTunl 是一款出色的 VPN 终端解决方案,非常适合希望以简单快捷的方式私密的访问网络的小型企业和个人。它是...

作者: Stephen Bancroft
2019/01/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

垂直对齐div中的文本[复制] - Vertically align text within a div [duplicate]

问题: This question already has an answer here: 这个问题在这里已有答案: How do I vertically align text in a div? 如何在div中垂直对齐文本? 29 answers 29个答案 The code below (......

javail
15分钟前
0
0
OSChina 周一乱弹 —— 南方水到底多深

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: Various Artists-用印度乐器演奏苏联国歌(洛天侬 remix) 手机党少年们想听歌,请...

小小编辑
24分钟前
56
0
动态规划:LC121.买卖股票的最佳时机

题目描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。 注意:你...

曦鱼violet
31分钟前
18
0
快递100云平台的安全措施--API限流

2、热点参数限流 注意: 若 entry 的时候传入了热点参数,那么 exit 的时候也一定要带上对应的参数(exit(count, args)),否则可能会有统计错误。 3、通过 ParamFlowRuleManager 的 loadRu...

bykk
41分钟前
19
0
在Bash中重定向stderr和stdout - Redirect stderr and stdout in Bash

问题: I want to redirect both stdout and stderr of a process to a single file. 我想将一个进程的stdout和stderr都重定向到一个文件。 How do I do that in Bash? 我该如何在Bash中做到...

富含淀粉
45分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部