树莓派开发相关知识二

1、相关术语

树莓派装载的芯片:BCM2835是一个MCU微处理器,它可以理解为CPU+其它模块的组合。

GPIO:General-purpose input/output,通用型输入输出,其接脚可以供使用者由程控自由使用,PIN脚依现实考量可作为通用输入(GPI)或通用输出(GPO)或通用输入与输出(GPIO)。

GPIO输入:就是输入一个电压信号,可以理解为开关打开后电流可以注入的端口。

GPIO输出:让这个端口输出电,让外接设备通电。当然也可以控制断电。

编程使用时,需要导入RPI包中的GPIO模块, as 将此导入的结果用GPIO表示。

python 复制代码
#导入模块
import RPi.GPIO as GPIO

查看GPIO情况:

sudo gpio readall

注意引脚号,用python编程使用的都是BCM编号。 树莓派外接40引脚,排列在板子的一侧。 引脚可以插入拓展模块,方便操作。

2、常见使用(输出)

python 复制代码
#设置是否打印警告
GPIO.setwarnings(True/False)

#GPIO编号格式,我们选择BCM
GPIO.setmode(GPIO.BOARD/GPIO.BCM)

#设置引脚为输出,初始化高电平还是低电平,默认低电平。
GPIO.setup(channel,GPIO.OUT,initial=GPIO.HIGH/GPIO.LOW)

#输出引脚高电平或低电平。
GPIO.output(channel,GPIO.HIGH/GPIO.LOW)

3、简单使用(输出)

python 复制代码
#!/usr/bin/env python
#coding:utf-8

import RPi.GPIO as GPIO
import time

GPIO.setwarnings(False)

#设置为BCM引脚
GPIO.setmode(GPIO.BCM)

#设置引脚号,LED18
LED=18

#将引脚设置为输出,初始化为低电平
GPIO.setup(LED,GPIO.OUT,initial=GPIO.LOW)

#设置PWM,设置频率0.5hz
pwm=GPIO.PWM(LED,0.5)

#设置占空比50,即50%高电平,50%低电平
pwm.start(50)

#闪烁
try:
	while True:
		time.sleep(1)
except KeyboardInterrupt:
	#清空GPIO
	GPIO.cleanup()

4、常风方法(输入)

轮询、边缘检测、线程回调。

python 复制代码
#设置引脚为输入。
GPIO.setup(channel,GPIO.IN,pullupdown=GPIO.PUDUP/GPIO.PUDDOWN)

#读取引脚高电平或低电平。
GPIO.input(channel)

#读取引脚上升沿、下降沿或都获取
GPIO.waitforedge(channel,GPIO.RISING/GPIO.FALLING/GPIO.BOTH)

#加入线程事件循环
GPIO.addeventdetect(channel,GPIO.RISING/GPIO.FALLING/GPIO.BOTH)

#添加回调函数
GPIO.addeventcallback(channel, callback)

#添加线程事件循环,防抖200毫秒
GPIO.addeventdetect(channel,GPIO.RISING/GPIO.FALLING/GPIO.BOTH, callback=callback, bouncetime=200)

#停止线程事件循环
GPIO.removeeventdetect(channel)

5、简单使用输入

python 复制代码
#!/usr/bin/python
#-*- coding: utf-8 -*

# 导入模块
import RPi.GPIO as GPIO
 import time
 # 设置GPIO模块的警告提示,取消
GPIO.setwarnings(False)
 # 设置为BCM引脚
GPIO.setmode(GPIO.BCM)
 # 设置引脚号,IN18
 IN = 18
 # 将引脚设置为输入
GPIO.setup(IN,GPIO.IN,pull_up_down=GPIO.PUD_UP)
 # 轮询输入
def inputPolling():
    while True:
        while GPIO.input(IN) == GPIO.LOW:
            time.sleep(0.1)
        print '按键轮询输入获取成功'
 # 边缘检测
def inputEdge():
    while True:
        GPIO.wait_for_edge(IN,GPIO.RISING)
        print '按键边缘检测输入成功'
 # 边缘检测
def myCallback(channel):
    print '按键线程回调输入成功'

# 线程回调
def inputEvent():
    GPIO.add_event_detect(IN,GPIO.BOTH)
    GPIO.add_event_callback(IN,callback=myCallback)
    while True:
        time.sleep(0.01)
 try:
    inputPolling();
    #inputEdge();
    #inputEvent();
 except KeyboardInterrupt:
    # 清空GPIO
    GPIO.cleanup()

无论是哪种模式,明明按了1次,却输出很多次,这是为什么呢?轮询模式的编程错误,以及没有顾虑到按键的防抖。实际上,按键按下的一瞬间,会有多个脉冲,故会判定多次按下,需要通过代码进行防抖。

6、输入防抖

python 复制代码
#!/usr/bin/python
 #-*- coding: utf-8 -*

# 导入模块
import RPi.GPIO as GPIO
 import time

 # 设置GPIO模块的警告提示,取消
GPIO.setwarnings(False)

 # 设置为BCM引脚
GPIO.setmode(GPIO.BCM)

 # 设置引脚号,IN18
 IN = 18

 # 将引脚设置为输入
GPIO.setup(IN,GPIO.IN,pull_up_down=GPIO.PUD_UP)

 # 轮询输入,防抖
def inputPolling():
    while True:
        if GPIO.input(IN)==GPIO.HIGH:
            time.sleep(0.01)
            if GPIO.input(IN)==GPIO.HIGH:
                print '按键轮询输入获取成功'
            while GPIO.input(IN)==GPIO.HIGH:
                time.sleep(0.01)

 # 边缘检测,防抖
def inputEdge():
    while True:
        GPIO.wait_for_edge(IN,GPIO.RISING)
        time.sleep(0.01)
        if GPIO.input(IN)==GPIO.HIGH:
            print '按键边缘检测输入成功'

 # 边缘检测
def myCallback(channel):
    print '按键线程回调输入成功'

 # 线程回调
def inputEvent():
    GPIO.add_event_detect(IN,GPIO.BOTH)
    GPIO.add_event_callback(IN,GPIO.RISING,callback=myCallback,bouncetime=10)

while True:
 time.sleep(0.01)
 try:
 inputPolling();
 #inputEdge();
 #inputEvent();
 except KeyboardInterrupt:
 # 清空GPIO
 GPIO.cleanup()
相关推荐
疯一样的码农几秒前
Python 正则表达式(RegEx)
开发语言·python·正则表达式
m0_739312878 分钟前
【STM32】项目实战——OV7725/OV2604摄像头颜色识别检测(开源)
stm32·单片机·嵌入式硬件
嵌入式小章19 分钟前
基于STM32的实时时钟(RTC)教学
stm32·嵌入式硬件·实时音视频
无所谓จุ๊บ22 分钟前
树莓派开发相关知识十 -小试服务器
服务器·网络·树莓派
TeYiToKu27 分钟前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
进击的六角龙1 小时前
Python中处理Excel的基本概念(如工作簿、工作表等)
开发语言·python·excel
一只爱好编程的程序猿1 小时前
Java后台生成指定路径下创建指定名称的文件
java·python·数据下载
基极向上的三极管1 小时前
【AD】3-4 在原理图中放置元件
嵌入式硬件
Aniay_ivy1 小时前
深入探索 Java 8 Stream 流:高效操作与应用场景
java·开发语言·python
徐嵌2 小时前
STM32项目---水质水位检测
stm32·单片机·嵌入式硬件