实例7:树莓派呼吸灯
实例7:树莓派呼吸灯
实验目的
- 通过背景知识学习,了解digital与analog的区别。
- 通过GPIO对外部LED灯进行呼吸控制,熟悉PWM技术。
实验要求
通过python编程,用GPIO控制LED灯,使之亮度逐渐增大,随后减小,并循环上述过程,实现呼吸效果,周期为4s。
实验知识
1. 查看树莓派GPIO引脚图
pinout
参考链接:树莓派官方4B引脚图的详细资料
2.安装及引入RPi.GPIO库
sudo pip install RPi.GPIO # 命令行pip安装RPi.GPIO
import RPi.GPIO as GPIO # 在Python代码引入RPi.GPIO库
3. RPi.GPIO库的用法
GPIO.setmode(GPIO.BOARD) #初始化GPIO引脚编码方式,需放在代码正式开始处
# GPIO引脚由多种编码方式,比如BCM、wiringPi、BOARD等,方便起见,课程均采用BOARD编码模式
GPIO.setup(12, GPIO.OUT) #初始化GPIO引脚设置,需放在代码正式开始处
GPIO.setup(12, GPIO.IN) #12为引脚号 GPIO.IN或者GPIO.OU为输入输出模式
print(GPIO.input(12)) #GPIO.input查看GPIO输入的电平信号
#GPIO.HIGH为高电平 ,GPIO.LOW为低电平 也可用于条件判断作其他操作
# GPIO.output向端口发送高低电平信号
GPIO.output(12, GPIO.HIGH) # 此处以12号端口为例
GPIO.output(12, GPIO.LOW)
GPIO.cleanup() #在使用完GPIO后要作清理,避免后续引脚被占用
参考链接:Python RPi.GPIO库官方文档
图片2:树莓派LED灯细节图

4.什么是模拟?
LED灯在数字信号0和1的切换下发生亮灭的变化,但是,LED灯在亮和灭之间存在着许多中间状态,比如30%亮度、50%亮度,这些状态应该如何表示呢?这就要提到模拟、数字以及PWM技术了。
模拟信号(Analog)是指用连续变化的物理量表示的信号,分布于自然界的各个角落,如气温、电流、电压的变化。
在模拟电路中,电压和电流可直接用来进行控制对象,比如家庭音箱的音量。简单来说,随着电流的增大,播放音乐的音量也在逐步增大。
5.什么是数字?
数字信号(Digital)是人为的、抽象出来的、在幅度取值上不连续的信号。
比如我们在控制LED灯闪烁时,是通过0和1,也就是高低电平信号来控制LED的亮和灭,只存在两种状态,要么高电平,要么低电平,没有其他中间值。
在计算机中,大小常用有限位的二进制数表示的这种离散的、不连续的信号被称为数字信号。
模拟信号在现实的传输过程中经常会被外界干扰,造成传输信息有偏差,比如打电话时的模糊,老式电视机上的雪花噪点,将模拟信号转化为数字信号则可以解决这个问题。
图片4:使模拟信号数字化的图
6.什么是PWM?
PWM正是一种将模拟信号转换数字信号的技术,它对模拟信号电平进行数字编码。
PWM,全称为Pulse-width modulation,意为脉冲宽度调制,通过对数字信号每一个周期内高电平的占比时长的调节,来使得信号对外的表现为0~1之间的一个中间值。
高电平的占比时常也就是占空比(Duty Cycle),占空比指电路被接通的时间占整个电路工作周期的百分比。
当方波在一个周期内高电平(1)的时长为周期的一半时,低电平(0)的时长也为周期的一半,那么这个周期对外展现出的值就是(1x50% + 0x50%)=0.5
当我们希望LED对外呈现30%的亮度时,只需要让高电平(1)的时间占比为周期的30%,其余70%的时间为低电平(0),那么这个周期对外展现出的值就是(1x30% + 0x70%)=0.3
如此一来,LED灯就呈现出了30%的亮度。
图片5:PWM示意图

7. RPi的GPIO库中PWM的用法
import RPi.GPIO as GPIO # 引入GPIO库
GPIO.setmode(GPIO.BOARD) #初始化GPIO引脚编码方式,需放在代码正式开始处
GPIO.setup(12, GPIO.OUT) #初始化GPIO引脚设置,需放在代码正式开始处
p = GPIO.PWM(channel, frequency) # 创建pwm实例 channel为引脚号 frequency为频率
p.start(dc) # 开始pwm dc为初始占空比(0.0 <= dc <= 100.0)
p.stop() # 停止pwm
p.ChangeFrequency(freq) # 改变频率(Hz)freq
p.ChangeDutyCycle(dc) # 改变占空比(0.0 <= dc <= 100.0)
GPIO.cleanup() # 清理GPIO引脚
参考链接:RPi GPIO库中PWM()函数的详细资料
8.mini pupper学习套件-LED模块的使用
mini pupper学习套件中的LED模块自带板载限流电阻,能够保护LED模块。
接线如下:
| 引脚 | 作用 | 树莓派对应口 |
|---|---|---|
| GND | 接地 | GND口 |
| R | 红灯正极 | PWM口 |
| G | 绿灯正极 | PWM口 |
| B | 蓝灯正极 | PWM口 |
实验步骤
1.硬件连接
- 将灯的任一正极(R/G/B/Y)接入树莓派上的PWM端口(例如33号端口)
树莓派的GPIO中仅有部分为PWM口,你可以通过查看树莓派GPIO的引脚图来确认哪个端口是PWM端。 - 将灯的GND端接入树莓派上的GND端口(例如34号端口)
你可以通过查看树莓派GPIO的引脚图来确认哪个端口是GND端。
2.编写Python程序led_breathe.py
#!/usr/bin/python
# coding:utf-8
# led_breathe.py
# 树莓派GPIO控制外部LED灯呼吸,周期为4秒。
import time
import RPi.GPIO as GPIO# GPIO初始化
LED = 33 # 外部led灯连接的树莓派PWM端口,可根据需要调整
GND = 34 # 接地的端口
period = 4 # 呼吸周期
GPIO.setmode(GPIO.BOARD)
GPIO.setup(LED, GPIO.OUT)
p = GPIO.PWM(LED, 50) # 引脚=LED 频率=50Hz
p.start(0)
print("PWM控制呼吸灯开始,端口号为%d,周期为%d秒。" % (LED, period))
try: # try和except为固定搭配,用于捕捉执行过程中,用户是否按下ctrl+C终止程序while 1:for dc in range(0, 101, 1):p.ChangeDutyCycle(dc)time.sleep(period / 200)for dc in range(100, -1, -1):p.ChangeDutyCycle(dc)time.sleep(period / 200)
except KeyboardInterrupt:pass
p.stop()
GPIO.cleanup()
3.运行程序,观察实验效果
在led_breathe.py的目录下执行以下命令:
sudo python led_breathe.py
应该能观察到用LED灯亮度逐渐增大,随后减小,并循环上述过程,体现了呼吸的效果,周期为4s。
图片3:gif图片 LED呼吸效果

实验总结
经过本知识点的学习和实验操作,你应该能达到以下水平:
| 知识点 | 内容 | 了解 | 熟悉 | 掌握 |
|---|---|---|---|---|
| 模拟与数字 | 模拟与数字的区别 | ✔ | ||
| 树莓派 | 树莓派GPIO中的PWM端口 | ✔ | ||
| PWM | PWM技术的用法 | ✔ | ||
| 硬件 | mini pupper学习套件的LED模块的使用 | ✔ |
版权信息:教材尚未完善,此处预留版权信息处理方式
mini pupper相关内容可访问:https://github.com/mangdangroboticsclub
相关文章:
实例7:树莓派呼吸灯
实例7:树莓派呼吸灯 实验目的 通过背景知识学习,了解digital与analog的区别。通过GPIO对外部LED灯进行呼吸控制,熟悉PWM技术。 实验要求 通过python编程,用GPIO控制LED灯,使之亮度逐渐增大,随后减小&am…...
java 接口 详解
目录 一、概述 1.介绍 : 2.定义 : 二、特点 1.接口成员变量的特点 : 2.接口成员方法的特点 : 3.接口构造方法的特点 : 4.接口创建对象的特点 : 5.接口继承关系的特点 : 三、应用 : 1.情景 : 2.多态 : ①多态的传递性 : ②关于接口的多态参数和多态…...
用 Visual Studio 升级 .NET 项目
现在,你已可以使用 Visual Studio 将所有 .NET 应用程序升级到最新版本的 .NET!这一功能可以从 Visual Studio 扩展包中获取,它会升级你的 .NET Framework 或 .NET Core 网页和桌面应用程序。一些项目类型仍正在开发中并将在不久的未来推出&a…...
JavaWeb中FilterListener的神奇作用
文章目录1,Filter1.1 Filter概述1.2 Filter快速入门1.2.1 开发步骤1.3 Filter执行流程1.4 Filter拦截路径配置1.5 过滤器链1.5.1 概述1.5.2 代码演示1.5.3 问题2,Listener2.1 概述2.2 分类2.3 代码演示最后说一句1,Filter 1.1 Filter概述 F…...
移动端布局
参考链接:抖音-移动端适配 一、移动端布局 flexiblepostcss-pxtorem vue-h5-template 老版本:动态去计算scale,并不影响rem的计算,好处是解决了1px的问题,但是第三方库一般都用dpr为1去做的,这就导致地图或…...
前端无感登录,大文件上传
后端设置token的一个失效时间,前端在token失效后不用重新登录 1,在相应中拦截,判断token返回过期后,调用刷新token的方法 2,后端返回过期的时间,前端判断过期的时间,然后到期后调用对应的方法…...
Spring Boot系列03--自动配置原理
目录1. 相关注解2. 自动配置原理分析3. 自动配置图示Spring Boot的核心优势:自动装配、约定大于配置。 1. 相关注解 ConfigurationProperties(prefix "前缀名")该注解用于自动配置的绑定,可以将application.properties配置中的值注入到 Bean…...
Java多线程(四)---并发编程容器
1.经常使用什么并发容器,为什么?答:Vector、ConcurrentHashMap、HasTable一般软件开发中容器用的最多的就是HashMap、ArrayList,LinkedList ,等等但是在多线程开发中就不能乱用容器,如果使用了未加锁&#…...
Apache Hadoop生态部署-Flume采集节点安装
目录 Apache Hadoop生态-目录汇总-持续更新 一:安装包准备 二:安装与常用配置 2.1:下载解压安装包 2.2:解决guava版本问题 2.3:修改配置 三:修复Taildir问题 3.1:Taildir Source能断点续…...
【OpenFOAM】-算例解析合集
【OpenFOAM】-算例解析合集OlaFlowinterFoamOlaFlow 【OpenFOAM】-olaFlow-算例1- baseWaveFlume 【OpenFOAM】-olaFlow-算例2- breakwater 【OpenFOAM】-olaFlow-算例3- currentWaveFlume 【OpenFOAM】-olaFlow-算例4- irreg45degTank 【OpenFOAM】-olaFlow-算例5- oppositeS…...
数据库|(一)数据库和SQL概述
(一)数据库和SQL概述1.1 数据库的好处1.2 数据库的概念1.3 数据库结构特点1.1 数据库的好处 实现数据持久化使用完整的管理系统统一管理,便于查询 1.2 数据库的概念 DB 数据库(database),存储数据的仓库&…...
【java基础】自定义类
文章目录基本介绍自定义类字段方法构造器main方法基本介绍 什么是类这里就不过多赘述了,这里来介绍关于类的几个名词 类是构造对象的模板或蓝图由类构造对象的过程称为创建类的实例封装就是将数据和行为组合在一个包中,并对对象的使用者隐藏具体的实现…...
7、STM32 FSMC驱动SRAM
本次使用CubeMx配置FSMC驱动SRAM,XM8A51216 IS62WV51216 原理图: 注意:FSMC_A0必须对应外部设备A0引脚 一、FSMC和FMC区别 FSMC:灵活的静态存储控制器 FMC:灵活存储控制器 区别:FSMC只能驱动静态存储控制器(如&…...
七、虚拟机栈
虚拟机栈出现的背景 1.由于跨平台性的设计,Java的指令都是根据栈来设计的,不同平台CPU架构不同,所以不能设计为基于寄存器的。 2.优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同…...
Linux其他常用命令
Linux其他常用命令查找文件find 命令功能非常强大,通常用在特定目录下搜索符合条件的文件如果省略路径,表示在当前文件夹下查找之前学习的通配符,在使用 find 命令时同时可用演练目标1.搜索桌面目录下,文件名包含1的文件find Desk…...
一次性打包学透 Spring
不知从何时开始,Spring 这个词开始频繁地出现在 Java 服务端开发者的日常工作中,很多 Java 开发者从工作的第一天开始就在使用 Spring Framework,甚至有人调侃“不会 Spring 都不好意思自称是个 Java 开发者”。 之所以出现这种局面…...
1080T、2080T、4070T显卡的深度学习性能测试和结论
先说结论: 4070T显卡FP32的训练和推理速度跟3090应该基本类似。但由于显存12G偏低,4070T不太适合如今的深度学习模型训练(新手列外,大部分模型都能训练起来,耗电也相对很低),更适合测试最新的一…...
SpringBoot搭建SpringMVC项目
前言据我的了解,现在不管是大公司或是小公司,如果使用java开发一个web项目,大部分都会选择使用SpringBoot,关于Springboot的好处,就不在这里过多赘述,总之Springboot有一套完整的生态,从项目构建…...
Prescriptive Analytics for Flexible Capacity Management
3 本节根据Netessine等人(2002年)和Bassok等人(1999年)对我们解决的容量规划问题进行了正式描述。考虑一家以pi(I1,…,I)的单价提供I服务的公司。在每个计划周期t∈{1,……...
超简单的待办事项列表管理器todo
什么是 todo ? todo 是一个自托管的 todo web 应用程序,可让您以简单且最少的方式跟踪您的 todo。📝 老苏觉得和之前介绍的 KissLists 比较像 文章传送门:最简单的共享列表服务器KissLists 官方提供了 Demo 演示站点:https://tod…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
