当前位置: 首页 > news >正文

RaspberyPi 4B RPi库编程

RaspberyPi 4B RPi库编程

  • Raspberry PI 4B 引脚图
  • RPi.GPIO模块简述
  • RPi.GPIO模块示例
    • output输出
    • input 输入
    • PWM模块
    • 阻塞等待
    • 事件回调
  • 运行环境

Raspberry PI 4B 引脚图

在这里插入图片描述
在这里插入图片描述
树莓派实验室

RPi.GPIO模块简述

在这里插入图片描述

导入模块:

  • import RPi.GPIO as GPIO

  • 或检查是否导入成功
    try:
    import RPi.GPIO as GPIO
    except RuntimeError:
    print(“Error importing RPi.GPIO! This is probably because you need superuser privileges. You can achieve this by using ‘sudo’ to run your script”)

  • 调用示例:

    • GPIO.getmode()
    • GPIO.setmode(GPIO.BCM)
    • GPIO.setup(4, GPIO.OUT)
    • GPIO.setup(4, GPIO.IN, GPIO.PUD_UP, False)
    • GPIO.cleanup(4) or GPIO.cleanup()

模块函数:

  • getmode():

    • 功能:返回当前GPIO引脚编号方式
    • 返回值:BOARD 或 BCM
  • setmode(new_mode):

    • 功能:设置GPIO引脚编号方式
    • 参数:BOARD 或 BCM
  • setup(chanlist, direction, pull_up_down=20, initial=None):

    • 功能:设置GPIO
    • 参数:
      • chanlist : GPIO编号,列表方式可以设置多个引脚如,leds=[17, 27, 22]
      • direction: GPIO方向,OUT输出,IN输入
      • pull_up_down:上下拉,PUD_OFF禁止,PUD_DOWN使能下拉,PUD_UP使能上拉。(仅输入模式可用!)
      • initial:初始状态 False或True
  • cleanup(chanlist=None):

    • 功能:清除GPIO设置
    • 参数:
      • chanlist:可选,不填写或None清除所有GPIO设置。填入一个GPIO编号或列表清除指定的1个或列表定义的多个GPIO设置。
  • input(channel):

    • 功能:读取指定GPIO的电平状态(GPIO必须设置为IN模式)
    • 参数:
      • channel :引脚编号
    • 返回:IO电平状态值
  • output(channel, value):

    • 功能:写入指定GPIO的电平值
    • 参数:
      • channel :引脚编号
      • value: LOW 或 HIGH
  • gpio_function(channel):

    • 功能:获取GPIO当前功能模式
    • 返回:当前功能模式(IN/OUT/SERIAL/SPI/I2C/HARD_PWM)其中一个的值,注意返回的是对应功能的数值!
    • 参数:
      • channel :引脚编号
  • wait_for_edge(channel, edge, bouncetime=None, timeout=None):

    • 功能:阻塞等待(注意调用之后会一直阻塞在这里后面的代码不会继续执行,直到触发条件发生或设置的超时时间到才会继续执行后面的代码)
    • 参数:
      • channel :引脚编号
      • edge:触发沿,RISING上升沿,FALLING下降沿,BOTH双沿
      • bouncetime:去抖时间,单位毫秒
      • timeout: 等待超时时间,单位毫秒
  • add_event_detect(channel, edge, callback=None, bouncetime=None):

    • 功能:添加事件探测(非阻塞方式,条件满足触发调用callback函数)
    • 参数:
      • channel :引脚编号
      • edge:触发沿,RISING上升沿,FALLING下降沿,BOTH双沿
      • bouncetime:去抖时间,单位毫秒
  • event_detected(channel):

    • 功能:删除事件检测,如果自上次查询该指定通道(channel) 以来,有边缘信号(edge)(即引脚电平的上升沿 RISING 或下降沿 FALLING)发生,则该函数返回 True。如果没有边缘信号发生,则返回 False。
    • 参数:
      • channel :引脚编号
  • add_event_callback(channel, callback):

    • 功能:添加事件回调函数(一个事件可以添加多个回调函数)
    • 参数:
      • channel :引脚编号
      • callback:回调函数
  • remove_event_detect(channel):

    • 功能:移除后台事件检测
    • 参数:
      • channel :引脚编号
  • sleep(…):

    • 功能:延时,很少用一般用time模块的sleep函数
    • 参数:
      • seconds: 延时时间,单位秒。
  • setwarnings(value):

    • 功能:设置使能或禁止警告
    • 参数:
      • value: False禁止,True使能

模块属性:

  • BOARD:GPIO引脚BOARD编码方式

  • BCM:GPIO引脚BCM编码方式

  • RISING:中断上升沿触发

  • FALLING:中断下降沿触发

  • BOTH:中断双沿(上升沿/下降沿)触发

  • OUT:GPIO输出模式

  • IN:GPIO输入模式

  • PUD_OFF:禁止上下拉

  • PUD_DOWN:使能下拉

  • PUD_UP:使能上拉

  • LOW:GPIO低电平

  • HIGH:GPIO高电平

  • SERIAL:串口接口

  • SPI:SPI接口

  • I2C:I2C接口

  • HARD_PWM:硬件PWM

  • RPI_INFO:版本信息

  • RPI_REVISION:修订版本

  • UNKNOWN:未知

  • VERSION:版本

  • 模块PWM类

    • PWM(channel, frequency):
      • 功能: 创建PWM实例
      • 返回:PWM实例
      • 参数:
        • channel :引脚编号
        • frequency :PWM频率值,单位Hz
    • ChangeDutyCycle(self, dc):
      • 功能:改变占空比
      • 参数:
        • dc: 占空比,取值范围0~100
    • ChangeFrequency(self, frequency):
      • 功能:改变PWM频率
      • 参数:
        • frequency:PWM频率值,单位Hz
    • start(self, dc):
      • 功能:启动PWM
      • 参数:
        • dc: 占空比,取值范围0~100
    • stop(self)
      • 功能:停止PWM输出

RPi.GPIO模块示例

output输出

控制RGB三色灯

import RPi.GPIO as GPIO
import timeLEDR = 17
LEDG = 27
LEDB = 22GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
#GPIO.setmode(GPIO.BOARD)GPIO.setup(LEDR, GPIO.OUT, initial=False)
GPIO.setup(LEDG, GPIO.OUT, initial=False)
GPIO.setup(LEDB, GPIO.OUT, initial=False)GPIO.output(LEDR, GPIO.LOW)
GPIO.output(LEDG, GPIO.HIGH)
GPIO.output(LEDB, GPIO.LOW)
time.sleep(2.5)GPIO.output(LEDR, GPIO.LOW)
GPIO.output(LEDG, GPIO.LOW)
GPIO.output(LEDB, GPIO.HIGH)
time.sleep(2.5)GPIO.cleanup(LEDS)
# 或 GPIO.cleanup()

列表方式控制多个GPIO

import RPi.GPIO as GPIO
import timeLEDS = [17, 27, 22]GPIO.setmode(GPIO.BCM)
GPIO.setup(LEDS, GPIO.OUT, initial=True)GPIO.output(LEDS, GPIO.LOW)
GPIO.output(LEDS, (GPIO.HIGH, GPIO.LOW, GPIO.LOW))time.sleep(5)#GPIO.cleanup()
GPIO.cleanup(LEDS)

input 输入

import RPi.GPIO as GPIO
import timeKEY1 = 20
KEY2 = 21LED1 = 17
LED2 = 27GPIO.setmode(GPIO.BCM)GPIO.setup(KEY1, GPIO.IN, GPIO.PUD_UP)
GPIO.setup(KEY2, GPIO.IN, GPIO.PUD_UP)print(GPIO.gpio_function(KEY1))
print(GPIO.gpio_function(LED1))GPIO.setup(LED1, GPIO.OUT)
GPIO.setup(LED2, GPIO.OUT)while True:k1 = GPIO.input(KEY1)k2 = GPIO.input(KEY2)GPIO.output(LED1, k1)GPIO.output(LED2, k2)time.sleep(0.1)

PWM模块

import RPi.GPIO as GPIO
import timeGPIO.setmode(GPIO.BOARD)
GPIO.setup(15,GPIO.OUT, initial=True)pwm = GPIO.PWM(15, 1000)pwm.start(0) # 0~100
pwm.ChangeFrequency(2000) # frequency* (in Hz).
time.sleep(1)pwm.ChangeDutyCycle(25) # duty-cycle (which must be between 0 and 100) given by *dc*.
time.sleep(1)
pwm.ChangeDutyCycle(50)
time.sleep(1)
pwm.ChangeDutyCycle(75)
time.sleep(1)pwm.stop()
GPIO.cleanup()

阻塞等待

阻塞等待一直等待

import RPi.GPIO as GPIO
import timeGPIO.setmode(GPIO.BCM)GPIO.setup(20, GPIO.IN, GPIO.PUD_UP)print('Waitting .....')
GPIO.wait_for_edge(20, GPIO.RISING)
print('Rising Edge Come.')#GPIO.wait_for_edge(20, GPIO.FALLING)
#print('Falling Edge Come.')#GPIO.wait_for_edge(20, GPIO.BOTH)
#print('Both Edge Come.')while True:print('running ...')time.sleep(1)GPIO.cleanup(20)

阻塞等待-增加去抖时间

import RPi.GPIO as GPIO
import timeGPIO.setmode(GPIO.BCM)GPIO.setup(20, GPIO.IN, GPIO.PUD_UP)print('wait for edge...')
GPIO.wait_for_edge(20, GPIO.FALLING, bouncetime=200)
print("wait end.")while True:print("Running...")time.sleep(2.5)

阻塞等待-设置超时

import RPi.GPIO as GPIO
import timeGPIO.setmode(GPIO.BCM)
GPIO.setup(20, GPIO.IN, GPIO.PUD_UP)print('wait for edge...')
GPIO.wait_for_edge(20, GPIO.RISING, bouncetime=200, timeout=5000)
print('wait end.')while True:print('Running...')time.sleep(1)

事件回调

import RPi.GPIO as GPIO
import timeGPIO.setmode(GPIO.BCM)
GPIO.setup(20, GPIO.IN, GPIO.PUD_UP)def callback_one(channel):print('Callback One')def callback_two(channel):print('Callback Two')GPIO.add_event_detect(20, GPIO.FALLING)
GPIO.add_event_callback(20, callback_one)
GPIO.add_event_callback(20, callback_two)while True:print(' Running...')time.sleep(1)
GPIO.cleanup()

事件检测-双沿触发-判断GPIO电平值

import RPi.GPIO as GPIO
import timeGPIO.setmode(GPIO.BCM)
GPIO.setup(20, GPIO.IN, GPIO.PUD_UP)def callback_one(channel):val = GPIO.input(channel)print('callback_one value:' , val)def callback_two(channel):val = GPIO.input(channel)print('callback_two value:' , val)GPIO.add_event_detect(20, GPIO.BOTH, bouncetime=100)GPIO.add_event_callback(20, callback_one)
GPIO.add_event_callback(20, callback_two)while True:print('Running...')time.sleep(3)GPIO.event_detected(20)
GPIO.cleanup()

运行环境

在这里插入图片描述
在这里插入图片描述


文章转载自:

http://wapsxhyk.hnkkf.cn
http://Udk0bJix.hnkkf.cn
http://qS1pDfyz.hnkkf.cn
http://jVjVuIlm.hnkkf.cn
http://Xnxv1qLy.hnkkf.cn
http://zJcrVTeh.hnkkf.cn
http://Hp9Yi093.hnkkf.cn
http://HthXTzdD.hnkkf.cn
http://c5p8MWP8.hnkkf.cn
http://QHDP45uR.hnkkf.cn
http://5dhOK9du.hnkkf.cn
http://2NWv7kRg.hnkkf.cn
http://iWoJ7JqR.hnkkf.cn
http://fkaiBPMU.hnkkf.cn
http://XbM6QQrs.hnkkf.cn
http://ZfvhgnvT.hnkkf.cn
http://pO8QxBBO.hnkkf.cn
http://L2XraGAt.hnkkf.cn
http://Ap9k7iXX.hnkkf.cn
http://xsvNgXBj.hnkkf.cn
http://FY5ci5Rm.hnkkf.cn
http://qKJk8YGn.hnkkf.cn
http://lftN3tD2.hnkkf.cn
http://HsOE5VKq.hnkkf.cn
http://20R6c477.hnkkf.cn
http://SSlPNDcQ.hnkkf.cn
http://fonS0KkM.hnkkf.cn
http://yRzQ7Yzz.hnkkf.cn
http://7RUB7LpI.hnkkf.cn
http://CMwoFC4G.hnkkf.cn
http://www.dtcms.com/a/379359.html

相关文章:

  • Spring Boot 3 整合 RustFS 实现分布式文件存储
  • P8456 「SWTR-8」地地铁铁 题解
  • 获Gartner®认可!锐捷入选2025年Gartner园区网络基础设施管理与运营软件市场指南
  • 告别环境地狱!Java生态“AI原生”解决方案入驻 GitCode​
  • 【leetcode】322. 零钱兑换
  • 数据清洗:缺失值、异常值与重复数据处理全解析
  • 审计过程中常见的文档缺失问题如何避免
  • 图像投影(透视)变换
  • Spring Cloud Gateway:下一代API网关的深度解析与实战指南
  • springboot 启动流程及 ConfigurationClassPostProcessor解析
  • git中rebase和merge的区别
  • 66-python中的文件操作
  • 【PostgreSQL内核学习 —— (SeqScan算子)】
  • 资源图分配算法
  • SpringBoot 中单独一个类中运行main方法报错:找不到或无法加载主类
  • 2025全球VC均热板竞争格局与核心供应链分析
  • 用“折叠与展开”动态管理超长上下文:一种 Token 高效的外部存储操作机制
  • 深度解析指纹模块选型与落地实践
  • 从用户体验到交易闭环的全程保障!互联网行业可观测性体系建设白皮书发布
  • grafana启用未签名插件
  • MySQL 数据类型与运算符详解
  • 编程实战:类C语法的编译型脚本解释器(五)变量表
  • 原生js拖拽
  • 数据结构--Map和Set
  • P1122 最大子树和
  • 【3DV 进阶-3】Hunyuan3D2.1 训练代码详细理解之-Flow matching 训练 loss 详解
  • Python写算法基础
  • 数据结构 优先级队列(堆)
  • FunASR GPU 环境 Docker 构建完整教程(基于 CUDA 11.8)
  • 探讨:线程循环与激活(C++11)