文档章节

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

e哥
 e哥
发布于 2016/10/29 21:30
字数 1086
阅读 2603
收藏 18
点赞 0
评论 6

一直都听说树莓派功能很强大,这几天就买了个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)

e哥
e哥

引用来自“JadenTseng”的评论

国庆节也入手了树莓派3b 。没有买传感器杜邦线,只有一个风扇,连接02 06引脚。Python获取cpu温度代码已经有了,楼主帮忙看看,怎么控制我这个风扇,做个温控的
之前我也考虑过做个温控风扇,但现在冬天了,感觉可能用不上。
如果你已经获取了cpu温度,是可以通过pwm脉冲控制风扇的转速的,RPI.GPIO这个封装包也有pwm,使用很方便。当然不能直接把风扇接在产生pwm的引脚上,树莓派的引脚没有那么大的电流,你可以让引脚接个三极管来驱动风扇。
JadenTseng
JadenTseng
国庆节也入手了树莓派3b 。没有买传感器杜邦线,只有一个风扇,连接02 06引脚。Python获取cpu温度代码已经有了,楼主帮忙看看,怎么控制我这个风扇,做个温控的
e哥
e哥

引用来自“六月是你的谎言”的评论

感觉又会硬件又会软件的人好腻害:smile:
做硬件的多多少要学点软件,没有软件支持硬件玩的花样就比较少了
六月是你的谎言
六月是你的谎言
感觉又会硬件又会软件的人好腻害:smile:
e哥
e哥

引用来自“554330833a”的评论

用python可以编程吗?要用什么语言的
python是编程语言,分python2.x和python3.x版本,本文是用python3.x编写的。
554330833a
554330833a
用python可以编程吗?要用什么语言的
EAI激光雷达X4使用hector_slam建图(二)

通过上一节,我在虚拟机下测试雷达驱动成功,现在,我们就拿树莓派3B为例,给激光雷达单独供电后,按着上一节来操作图上为PC端通过VNC与树莓派远程桌面连接,接在按着上一节在树莓派上操作完...

zhu751191958 ⋅ 01/04 ⋅ 0

树莓派3b连接串口类型GPS使用使用串口并关闭蓝牙板载方法

树莓派3上用户目前无法正常是使用GPIO中的UART串口(GPIO14&GPIO15),也就是说用户无论是想用串口来调试树莓派,还是想用GPIO中的串口来连接GPS,蓝牙,XBEE等等串口外设目前都是有问题的。 原因...

huazwz ⋅ 04/11 ⋅ 0

树莓派3B+ 64位Ubuntu安装caffe

树莓派3B+到货了,当然要把玩一番。 背景 树莓派从3代开始就用上了64位的处理器,奈何却没有更新上64位的系统。据说用上64位的系统,能提升不少的性能,甚至有人用RPi3B测试最快能提高30倍。...

煎鱼不可能有BUG ⋅ 05/17 ⋅ 0

树莓派摄像头VLC网络监控

备忘 树莓派有网口,又有摄像头可以用,当然不能浪费资源,下面我就用红外摄像头来做个昼夜均可使用的摄像头监控~ 连接好树莓派的CSI摄像头,我用的是带有红外灯的,并且有光感控制的,只有在...

乐_然 ⋅ 03/11 ⋅ 0

树莓派pi3 串口问题的解决办法

转载: https://blog.csdn.net/aguangg6655la/article/details/54985423 其他参考1:https://blog.csdn.net/xukai871105/article/details/22713925 其他参考2:https://www.briandorey.com/......

zhenguo26 ⋅ 04/18 ⋅ 0

树莓派开启VNC,电脑远程实时操控树莓派桌面

一般远程控制树莓派,命令行使用SSH服务,但是有的时候,我们想远程控制树莓派的桌面。这时就要启用VNC了。 1.在树莓派上开启VNC服务: 这样在树莓派上就开启了VNC服务,开启成功后,在桌面右...

乐_然 ⋅ 03/07 ⋅ 0

树莓派随身工具箱:中间人劫持获取控制权

  *本文原创作者:Rc4x,本文属FreeBuf原创奖励计划,未经许可禁止转载   导读   上文讲解了树莓派随身工具箱的环境搭建,这段时间又对其进行了一些优化,主要是从便携美观上面改进。同...

FreeBuf ⋅ 04/26 ⋅ 0

如何使用树莓派制作一个数字针孔摄像头

学习如何使用一个树莓派 Zero、高清网络摄像头和一个空的粉盒来搭建一个简单的相机。 在 2015 年底的时候,树莓派基金会发布了一个让大家很惊艳的非常小的 树莓派 Zero。更夸张的是,他们随 ...

19% ⋅ 前天 ⋅ 0

微软专家教你,如何搞定树莓派 AI 服务开发

本文来自作者 微软公开课 在 GitChat 上分享 「60分钟轻松搞定树莓派 AI 服务开发」 编辑 | Mc Jin 1. 引言 目前,物联网、人工智能已经深入到医疗、家居、交通、教育和工业等多个领域,正在...

gitchat ⋅ 05/07 ⋅ 0

树莓派可视化编程软件 - BlocklyPi

本项目是一个基于Blockly的树莓派可视化编程软件,类似于Mixly,可以让让零基础不会编程的人玩转树莓派gpio。 使用说明 见项目 地址 更多说明详见BlocklyPi 实际使用 详见 http://hgccloud....

王逸伦 ⋅ 06/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 16分钟前 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 42分钟前 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

Dockerfile基础命令总结

FROM 指定使用的基础base image FROM scratch # 制作base image ,不使用任何基础imageFROM centos # 使用base imageFROM ubuntu:14.04 尽量使用官方的base image,为了安全 LABEL 描述作...

ExtreU ⋅ 昨天 ⋅ 0

存储,对比私有云和公有云的不同

导读 说起公共存储,很难不与后网络公司时代的选择性外包联系起来,但尽管如此,它还是具备着简单和固有的可用性。公共存储的名字听起来也缺乏专有性,很像是把东西直接堆放在那里而不会得到...

问题终结者 ⋅ 昨天 ⋅ 0

C++难点解析之const修饰符

C++难点解析之const修饰符 c++ 相比于其他编程语言,可能是最为难掌握,概念最为复杂的。结合自己平时的C++使用经验,这里将会列举出一些常见的难点并给出相应的解释。 const修饰符 const在c...

jackie8tao ⋅ 昨天 ⋅ 0

聊聊spring cloud netflix的HystrixCommands

序 本文主要研究一下spring cloud netflix的HystrixCommands。 maven <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-clo......

go4it ⋅ 昨天 ⋅ 0

Confluence 6 从其他备份中恢复数据

一般来说,Confluence 数据库可以从 Administration Console 或者 Confluence Setup Wizard 中进行恢复。 如果你在恢复压缩的 XML 备份的时候遇到了问题,你还是可以对整个站点进行恢复的,如...

honeymose ⋅ 昨天 ⋅ 0

myeclipse10 快速搭建spring boot开发环境(入门)

1.创建一个maven的web项目 注意上面标红的部分记得选上 2.创建的maven目录结构,有缺失的目录可以自己建立目录补充 补充后 这时候一个maven的web项目创建完成 3.配置pom.xml配置文件 <proje...

小海bug ⋅ 昨天 ⋅ 0

nginx.conf

=========================================================================== nginx.conf =========================================================================== user nobody; #......

A__17 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部