树莓派GPIO开发(二)RGB模块-PWM调节
配置环境
系统:Raspbian11(官方64位)
设备:树莓派CM4
一、PWM简单介绍
全称:Pulse-width modulation,脉冲宽度调制,简单的数模转换方法
1.基本原理
脉冲宽度调制(PWM),是用脉冲信号对模拟信号进行近似的一 种技术,一般变换后脉冲的周期固定,但脉冲的工作周期 (Duty Cycle,即一个周期内高电平的比例)会依所需模拟信号的大小而改变,高电平所占比例越高,拟合的模拟信号的幅度越大。
PWM 技术通过使用高分辨率计数器(调制频率)调制方波的占空比,从而实现对一个模拟信号的电平进行编码。
2.PWM 信号主要有两个参数:
(1)信号的周期长度(Period),通常用频率(Frequency)来描述。 Frequency = 1/ Period 。
(2)工作周期(Duty Cycle),该参数通常用占空比(Duty Ratio) 来描述,占空比就是高电平在一个周期所占的百分比。
3.PWM的优点
最大的优点是从处理器到被控对象之间的所有信号都是数字形式 的,无需再进行数模转换过程;
而且对噪声的抗干扰能力也大大增强,这使得 PWM 在通讯等信号传输行业得到大量应用的主要原因。
4.PWM使用条件
模拟信号能否使用 PWM 进行编码调制,仅依赖带宽,这即意味着只要有足够的带宽,任何模拟信号值均可以采用 PWM 技术进行调制编码,一般而言,负载需要的调制频率要高于 10Hz,在 实际应用中,频率约在 1kHz 到 200kHz 之间。
5.pwm调节电压
假设一个PWM信号,V = +5V,CLK = 13KHz,Duty = 50%,那么它输出的信号就可以看成是一个+2.5V的直流信号,占空比和电压成正比。
二、RGB模块简单介绍

R、G、B三个引脚电压的高低,决定了颜色的成分,而电压的高低由PWM进行控制。树莓派的通用GPIO都可以被设置为 PWM工作方式,普通引脚精度较低专用引脚精度较高,但是我们这里也用不着。(GPIO12、GPIO13、GPIO18、GPIO19可以实现硬件脉宽调制)

这里我用编号为11、13、15三个通用GPIO。

三、代码实现
#-*- coding: utf-8 -*
import RPi.GPIO as GPIO
import time
class RGB_LED(object):
def __init__(self,pin_R,pin_G,pin_B):
self.pins = [pin_R,pin_G,pin_B]
# 设置为输出引脚,初始化低电平,灯灭
for pin in self.pins:
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.LOW)
# 用RPi.GPIO的PWM方法设置三个引脚为pwm对象,频率2000Hz
self.pwm_R = GPIO.PWM(pin_R, 2000)
self.pwm_G = GPIO.PWM(pin_G, 2000)
self.pwm_B = GPIO.PWM(pin_B, 2000)
# 初始占空比为0
self.pwm_R.start(0)
self.pwm_G.start(0)
self.pwm_B.start(0)
# 颜色转为占空比,颜色取值范围是(0,255),占空比取值范围是(0,100),就是 (颜色/255)*100
def color2ratio(self,x,min_color,max_color,min_ratio,max_ratio):
return (x - min_color) * (max_ratio - min_ratio) / (max_color - min_color) + min_ratio
# 颜色设置
def setColor(self,col):
R_val,G_val,B_val = col # 把元组解包,赋值给变量
R =self.color2ratio(R_val, 0, 255, 0, 100)
G =self.color2ratio(G_val, 0, 255, 0, 100)
B =self.color2ratio(B_val, 0, 255, 0, 100)
# 改变占空比,使用RPI.GPIO的方法ChangeDutyCycle()
self.pwm_R.ChangeDutyCycle(R)
self.pwm_G.ChangeDutyCycle(G)
self.pwm_B.ChangeDutyCycle(B)
# 对象销毁
def destroy(self):
self.pwm_R.stop() # 使用stop()方法,把PWM停止
self.pwm_G.stop()
self.pwm_B.stop()
for pin in self.pins:
GPIO.output(pin, GPIO.HIGH) # 把输出引脚全部拉高
GPIO.cleanup() # 引脚清空,结束引脚的占用
if __name__ == "__main__":
# 设置引脚编号模式
GPIO.setmode(GPIO.BOARD)
# 定义三个引脚
pin_R = 11
pin_G = 13
pin_B = 15
# 定义 RGB_LED 对象
m_RGB_LED = RGB_LED(pin_R,pin_G,pin_B)
# 定义显示的颜色(R,G,B)
colors = [(255,0,0),(0,255,0),(0,0,255),(255,255,0),(0,197,204),(192,255,62),(148,0,211),(118,238,0)];
# 循环显示各种颜色
try:
while True:
for col in colors:
# 打印颜色
print(col)
# 设置颜色,使用了方法
m_RGB_LED.setColor(col)
# 延时
time.sleep(3)
except KeyboardInterrupt:
print('\n Ctrl + C QUIT')
finally:
m_RGB_LED.destroy() # 对象销毁
代码我还补充了一些注释,小白应该也能看懂了。
相关推荐:玩转树莓派系列文章
树莓派GPIO开发(二)RGB模块-PWM调节的更多相关文章
- 树莓派GPIO开发(三):蜂鸣器-PWM调节
配置环境 系统:Raspbian11(官方64位) 设备:树莓派CM4 一.写在前面 关于PWM的基本介绍在上一篇博客已经说过了:树莓派GPIO开发(二)RGB模块-PWM调节 在RGB模块中,我们主 ...
- 树莓派GPIO开发(一):激光头传感器模块的使用
配置环境 系统:Raspbian11(64位) 设备:树莓派CM4 一.写在前面 主要为了测试我捡漏买的CM4的拓展版 拓展板子没有焊接引脚,但是预留的接口 手动焊接一下 测试成功 ,说明我捡的这块板 ...
- Python自动化编程-树莓派GPIO编程(二)
树莓派我们编程一般都直接用高效的python,针对于GPIO编程,python也是有这一方面的库的,这里最有名也是最常用的就是RPI.GPIO了.这个库是专门为树莓派GPIO编程所设计的,利用它你可以 ...
- 树莓派GPIO控制RGB彩色LED灯
树莓派GPIO通过PWM来控制RGB彩色LED灯,可以显示任何我们想要的颜色. RGB模块简介 这个RGB彩色LED里其实有3个灯,分别是红灯.绿灯和蓝灯.控制这三个灯分别发出不同强度的光,混合起来就 ...
- STC8H开发(十五): GPIO驱动Ci24R1无线模块
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- STC8H开发(十六): GPIO驱动XL2400无线模块
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- 树莓派进阶之路 (013) - 树莓派2/3 C语言使用PWM
我手里面的是树莓派3,系统是Raspbian官方操作系统,已经安装好了wiringPi. PWM简介:脉宽调制(PWM)是指用微处理器的数字输出来对模拟电路进行控制,是一种对模拟信号电平 ...
- 自己动手实现智能家居之树莓派GPIO简介(Python版)
[前言] 一个热爱技术的人一定向往有一个科技感十足的环境吧,那何不亲自实践一下属于技术人的座右铭:“技术改变世界”. 就让我们一步步动手搭建一个属于自己的“智能家居平台”吧(不要对这个名词抬杠啦,技术 ...
- 基于Asterisk的VoIP开发指南——Asterisk 模块编写指南(1)
原文:基于Asterisk的VoIP开发指南--Asterisk 模块编写指南(1) 1 开源项目概述 Asterisk是一个开源的软件包,通常运行在Linux操作系统平台上.Asterisk可以用三 ...
随机推荐
- 闯祸了,生成环境执行了DDL操作《死磕MySQL系列 十四》
由于业务随着时间不停的改变,起初的表结构设计已经满足不了如今的需求,这时你是不是想那就加字段呗!加字段也是个艺术活,接下来由本文的主人咔咔给你吹. 试想一下这个场景 事务A在执行一个非常大的查询 事务 ...
- Java 内幕新闻第二期深度解读
这是由 Java 官方发布,Oracle JDK 研发 Nipafx 制作的节目,包含 JDK 近期的研发进展和新特性展望和使用,这里加上个人译制的字幕搬运而来.我把 Nipafx 的扩展资料详细研读 ...
- 【刷题-LeetCode】205. Isomorphic Strings
Isomorphic Strings Given two strings *s* and *t*, determine if they are isomorphic. Two strings are ...
- 《手把手教你》系列技巧篇(五十九)-java+ selenium自动化测试 - 截图三剑客 -上篇(详细教程)
1.简介 今天本来是要介绍远程测试的相关内容的,但是宏哥在操作服务器的时候干了件糊涂的事,事情经过是这样的:本来申请好的Windows服务器用来做演示的,可是服务器可能是局域网的,连百度都不能访问,宏 ...
- Cesium中级教程1 - 空间数据可视化(一)
Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 本教程将教读者如何使用Cesium的实体(Entity)API绘 ...
- vue学习11-监听属性
<!DOCTYPE html> <html lang='en'> <head> <meta charset='UTF-8'> <meta http ...
- Shell 脚本循环遍历日志文件中的值进行求和并计算平均值,最大值和最小值
本文为博主原创,转载请注明出处: 最近在进行压测,为了观察并定位服务性能的瓶颈,所以在代码中很多地方加了执行耗时的日志,但这种方式只能观察,却在压测的时候,不太能准确的把握代码中某些方法的性能,所以想 ...
- insert插入日期
7.5.insert插入日期 数字格式化:format select ename,sal from emp: 格式化数字:fromat(数字,'格式') select ename,format(sal ...
- [HNOI2009]双递增序列
不难发现本题贪心是不好做的,可以考虑 \(dp\). 首先的一个想法就是令 \(dp_{i, j, k, l}\) 表示当前选到第 \(i\) 个位置,当前第一个序列选了 \(j\) 个数,当前第一个 ...
- AT [ABC176F] Brave CHAIN
首先可以发现这样一个事实:在每次操作当中,都有三张牌是已经固定的,只有两张牌是不确定的,于是我们可以发下每一次操作的状态可以简单的使用这两张牌来描述,于是可以考虑令 \(dp_{i, j, k}\) ...