树莓派开发相关知识二

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()
相关推荐
用户277844910499312 小时前
借助DeepSeek智能生成测试用例:从提示词到Excel表格的全流程实践
人工智能·python
JavaEdge在掘金14 小时前
ssl.SSLCertVerificationError报错解决方案
python
我不会编程55514 小时前
Python Cookbook-5.1 对字典排序
开发语言·数据结构·python
老歌老听老掉牙15 小时前
平面旋转与交线投影夹角计算
python·线性代数·平面·sympy
满怀101515 小时前
Python入门(7):模块
python
无名之逆15 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
你觉得20515 小时前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义下载方法
大数据·人工智能·python·gpt·学习·机器学习·aigc
啊喜拔牙15 小时前
1. hadoop 集群的常用命令
java·大数据·开发语言·python·scala
微信1532379424315 小时前
离线语音识别 ( 小语种国家都支持)可定制词组
嵌入式硬件
weixin_5088216516 小时前
1ms软延时,不用定时器,stm32
stm32·单片机·嵌入式硬件