嵌入式人工智能(6-树莓派4B按键输入控制LED)

1、按键

按键的原理都是一样,通过按键开关的按下导通,抬起断开的情况,GPIO引脚来检测其是否有电流流入。GPIO有input()方法,对于GPIO引脚检测电流,不能让其引脚悬空,否则引脚会受周边环境电磁干扰产生微弱电流,导致GPIO输入时高时低,,当程序不断检测其输入变化时,会发现按键不断地断开闭合,因此解决这个问题,需要采用上拉或下拉电阻将其电平钳位住。

2、上拉电阻

如果是采用上拉电阻,则按键按下,引脚会检测到一个下降沿。如果是采用下拉电阻,则按键按下,引脚会检测到一个上升沿。具体采用上拉还是下拉电阻根据实际情况而定。

3、实验接线图

我这边有独立按键与流水灯模块,采用的是上拉电阻方式,因此不需要自己连接电阻,没有的同学根据上图来接,电阻470欧即可。实现功能,GPIO11接LED,GPIO13和15分别接2个按键Key1和Key2。要求,按下按键一,LED点亮,按下按键二LED熄灭。

4、实验一代码

import RPi.GPIO as GPIO
import time

# 指定编号规则为BOARD
GPIO.setmode(GPIO.BOARD)

# 设置物理引脚11负责输出电压
GPIO.setup(11, GPIO.OUT)

# 关闭警告
GPIO.setwarnings(False)

# 设置输入引脚
channel1 = 13
channel2 = 15

# 设置GPIO输入模式, 使用GPIO内置的上拉电阻, 即开关断开情况下输入为HIGH
GPIO.setup(channel1, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(channel2, GPIO.IN, pull_up_down=GPIO.PUD_UP)


try:
    GPIO.output(11, GPIO.HIGH) 
    while True:
        # 如果检测到电平FALLING, 说明开关闭合
        if GPIO.input(channel1)==GPIO.LOW:
            GPIO.output(11, GPIO.LOW)
        if GPIO.input(channel2)==GPIO.LOW:
            GPIO.output(11, GPIO.HIGH)  
        # 10毫秒的检测间隔
        time.sleep(0.01)
 
except Exception as e:
    print(e)

# 清理占用的GPIO资源
GPIO.cleanup()

5、实验二代码

接线和实验一一样,要求按键1按下LED亮,松开LED灭。按键2按下,释放资源,退出程序。这样 如果要中止程序运行,就不用按键盘crtl+ C来中止了。

import RPi.GPIO as GPIO
import time

# 指定编号规则为BOARD
GPIO.setmode(GPIO.BOARD)

# 设置物理引脚11负责输出电压
GPIO.setup(11, GPIO.OUT)

# 关闭警告
GPIO.setwarnings(False)

# 设置输入引脚
channel1 = 13
channel2 = 15

# 设置GPIO输入模式, 使用GPIO内置的上拉电阻, 即开关断开情况下输入为HIGH
GPIO.setup(channel1, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(channel2, GPIO.IN, pull_up_down=GPIO.PUD_UP)

try:
    GPIO.output(11, GPIO.HIGH) 
    while True:       
        # 如果检测到电平FALLING, 说明开关闭合
        if GPIO.input(channel1)==GPIO.LOW:
            GPIO.output(11, GPIO.LOW)
        else:
            GPIO.output(11, GPIO.HIGH)  
        if GPIO.input(channel2)==GPIO.LOW:
            GPIO.cleanup()
            exit()
        # 10毫秒的检测间隔
        time.sleep(0.01)
        # if Led_Flag==True:
        #     GPIO.output(11, GPIO.LOW)
        # else:
        #     GPIO.output(11, GPIO.HIGH)    

except Exception as e:
    print(e)

# 清理占用的GPIO资源
GPIO.cleanup()

如果想要按下1亮,再按下1灭,那么需要定义个变量,来改变此变量的值,从而控制LED灯,这里就不再赘述了,不过采用这种轮询的方式检测,会有一些小问题,后续进行改进。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 18:52:01       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 18:52:01       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 18:52:01       57 阅读
  4. Python语言-面向对象

    2024-07-16 18:52:01       68 阅读

热门阅读

  1. SpringBoot @Value注解优化

    2024-07-16 18:52:01       18 阅读
  2. 基于形状匹配原始版放出来(给有用的人参考)

    2024-07-16 18:52:01       18 阅读
  3. 【扫盲】并查集

    2024-07-16 18:52:01       18 阅读
  4. Transforms转换Tensor数据类型、归一化

    2024-07-16 18:52:01       20 阅读
  5. 瑞宏嘉鑫建材元宇宙:探索虚拟世界的无限可能

    2024-07-16 18:52:01       18 阅读
  6. 探索深度学习与Transformer架构的最新进展

    2024-07-16 18:52:01       19 阅读
  7. 大白话讲解设计原则及其优缺点

    2024-07-16 18:52:01       17 阅读