实验十 插件RGB模块调节LED颜色

实验十 插件RGB模块调节LED颜色#

img

实验说明

在这个套件中,有一个Keyes DIY电子积木 共阴RGB模块,它采用F10-全彩RGB雾状共阴LED元件。控制时,我们需要将模块R G B连接单片机PWM口,剩下那个管脚接GND(共阳RGB的话剩下那个管脚接VCC)。

实验中,我们通过测试代码,控制RGB模块显示几个常见的颜色。

实验原理

image-20260421184259622

那么什么是PWM呢?PWM是使用数字手段来控制模拟输出的一种手段。使用数字控制产生占空比不同的方波(一个不停在高电平与低电平之间切换的信号)来控制模拟输出。一般来说端口的输入电压只有两个0V与3.3V,也就是低电平和高电平。如果想要改变灯的亮度怎么办呢个?有同学说串联电阻,对,这个方法是正确的。但是,如果想要得到不同的亮度,且在不同亮度之间来回变动怎么办呢?不可能不停地切换电阻吧。这种情况下就需要使用PWM了,那它是怎么控制的呢?

数字端口电压输出只有LOW与HIGH两个,对应的就是0V与3.3V的电压输出,可以把LOW定义为0,HIGH定义为1,1秒内让单片机输出500个0或者1的信号。如果这500个全部为1,那就是完整的3.3V,如果全部为0,那就是0V。如果010101010101这样输出,刚好一半,端口输出的平均电压就为1.65V了。这个和放映电影是一个道理,咱们所看的电影并不是完全连续的,它其实是每秒输出25张图片。在这种情况下,人的肉眼是分辨不出来的,看上去就是连续的了。PWM也是同样的道理,如果想要不同的电压,就控制0与1的输出比例控制就可以了。当然这和真实的连续输出还是有差别的,单位时间内输出的0,1信号越多,控制的就越精确。

那么我们这个实验就是要通过调节3个PWM值,控制LED元件显示红光、绿光和蓝光的比例,从而控制RGB模块上LED显示不同颜色灯光。当设置的PWM值越大,对应显示的颜色比例越重。理论上来说,通过调节这3中颜色光的混合比例,可以模拟出所有颜色的灯光。

img

实验器材

img

img

img

img

img

Raspberry Pi Pico板*1

Raspberry Pi Pico扩展板*1

keyes DIY电子积木 共阴RGB模块*1

防反插4Pin*1

MicroUSB线*1

接线图

img

测试代码

代码1:

/* 

 * Keyes Starter Kit for Raspberry Pi Pico

 * lesson 10.1

 * rgb_1

*/

int redPin = 9; //定义红色接GP9

int greenPin = 10; //定义绿色接GP10

int bluePin = 11; //定义蓝色接GP11

void setup(){

 //输出口都设置为输出模式

 pinMode(redPin, OUTPUT);

 pinMode(greenPin, OUTPUT);

 pinMode(bluePin, OUTPUT);

}

 

void loop(){

 //红色

 digitalWrite(redPin,HIGH);

 digitalWrite(greenPin,LOW);

 digitalWrite(bluePin,LOW);

 delay(1000);

 //绿色

 digitalWrite(redPin,LOW);

 digitalWrite(greenPin,HIGH);

 digitalWrite(bluePin,LOW);

 delay(1000);

 //蓝色

 digitalWrite(redPin,LOW);

 digitalWrite(greenPin,LOW);

 digitalWrite(bluePin,HIGH);

 delay(1000);

 

}

代码2:

/* 

 * Keyes Starter Kit for Raspberry Pi Pico

 * lesson 10.2

 * rgb_2

*/

int redPin = 9; //定义红色接GP9

int greenPin = 10; //定义绿色接GP10

int bluePin = 11; //定义蓝色接GP11

void setup() {

 pinMode(redPin, OUTPUT);

 pinMode(greenPin, OUTPUT);

 pinMode(bluePin, OUTPUT);

}

void loop() {

 //红色(255, 0, 0)

 analogWrite(9, 255);

 analogWrite(10, 0);

 analogWrite(11, 0);

 delay(1000);

 //橙色(255, 97, 0)

 analogWrite(9, 255);

 analogWrite(10, 97);

 analogWrite(11, 0);

 delay(1000);

 //黄色(255, 255, 0)

 analogWrite(9, 255);

 analogWrite(10, 255);

 analogWrite(11, 0);

 delay(1000);

 //绿色(0, 255, 0)

 analogWrite(9, 0);

 analogWrite(10, 255);

 analogWrite(11, 0);

 delay(1000);

 //蓝色(0, 0, 255)

 analogWrite(9, 0);

 analogWrite(10, 0);

 analogWrite(11, 255);

 delay(1000);

 //青色(0, 255, 255)

 analogWrite(9, 0);

 analogWrite(10, 255);

 analogWrite(11, 255);

 delay(1000);

 //紫色(160, 32, 240)

 analogWrite(9, 160);

 analogWrite(10, 32);

 analogWrite(11, 240);

 delay(1000);

 

}

代码说明

代码1说明:

  1. 代码1中,R G B代表控制模块上 LED对应的红绿蓝3种颜色对应的端口,根据接线图我们接到了GP9 GP10 GP11,设置为9 10 11,后面设置对应高低,设置GRB LED中红绿蓝3个灯是否会亮,设置为高(对应数字口为高电平),对应的颜色就亮。

  2. 现在观察代码,这个代码非常简单,只是简单的控制模块上RGB LED显示红色1秒、

绿色1秒、蓝色1秒,循环交替。

代码2说明:

1.代码2中,我们使用到了PWM输出,根据接线图我们接到了GP9 GP10 GP11,设置为9 10 11。后面设置数据代表设置模块上LED 红绿蓝颜色的比例,设置的数据越大(对应的PWM值越大),设置该颜色的比例越大。(注意:pico的PWM输出正常为0~65535,这里我们使用arduino IDE调到了0~255)。

2.实验中我们通过设置对应数值,调节RGB LED上红绿蓝颜色比例,从而控制RGB LED显示对应颜色。所以理论上来说可以设置的颜色有256256256种(详细可参考下面常用RGB颜色表)。

常用RGB颜色表

R

G

B

R

G

B

R

G

B

黑色

0

0

0

黄色

255

255

0

浅灰蓝色

176

224

230

象牙黑

41

36

33

香蕉色

227

207

87

品蓝

65

105

225

灰色

192

192

192

镉黄

255

153

18

石板蓝

106

90

205

冷灰

128

138

135

dougello

235

124

85

天蓝

135

206

235

石板灰

112

128

105

forum gold

255

227

132

暖灰色

128

128

105

金黄色

255

215

0

青色

0

255

255

黄花色

218

165

105

绿土

56

94

15

白色

255

255

255

瓜色

227

168

105

靛青

8

46

84

古董白

250

235

215

橙色

255

97

0

碧绿色

127

255

212

天蓝色

240

255

255

镉橙

255

97

3

青绿色

64

224

208

白烟

245

245

245

胡萝卜色

237

145

33

绿色

0

255

0

白杏仁

255

235

205

桔黄

255

128

0

黄绿色

127

255

0

cornsilk

255

248

220

淡黄色

245

222

179

钴绿色

61

145

64

蛋壳色

252

230

201

翠绿色

0

201

87

花白

255

250

240

棕色

128

24

24

森林绿

34

139

34

gainsboro

220

220

220

米色

163

148

128

草地绿

124

252

0

ghostWhite

248

248

255

锻浓黄土色

138

54

15

酸橙绿

50

205

50

蜜露橙

240

255

240

锻棕土色

135

51

36

薄荷色

189

252

201

象牙白

250

255

240

巧克力色

210

105

30

草绿色

107

124

35

亚麻色

250

240

230

肉色

255

125

64

暗绿色

48

128

20

navajoWhite

255

222

173

黄褐色

240

230

140

海绿色

46

139

87

old lace

253

245

230

玫瑰红

188

143

143

嫩绿色

0

255

127

海贝壳色

255

245

238

肖贡土色

199

97

20

雪白

255

250

250

标土棕

115

74

18

紫色

160

32

240

乌贼墨棕

94

38

18

紫罗蓝色

138

43

226

红色

255

0

0

赫色

160

82

45

jasoa

160

102

211

砖红

156

102

31

马棕色

139

69

19

湖紫色

153

51

250

镉红

227

23

13

沙棕色

244

164

96

淡紫色

218

112

214

珊瑚色

255

127

80

棕褐色

210

180

140

梅红色

221

160

221

耐火砖红

178

34

34

印度红

176

23

31

蓝色

0

0

255

栗色

176

48

96

钴色

61

89

171

粉红

255

192

203

dodger blue

30

144

255

草莓色

135

38

87

jackie blue

11

23

70

橙红色

250

128

114

锰蓝

3

168

158

蕃茄红

255

99

71

深蓝色

25

25

112

桔红

255

69

0

孔雀蓝

51

161

201

深红色

255

0

255

土耳其玉色

0

199

140

测试结果

上传测试代码1成功,上电后,模块上RGB LED循环显示红绿蓝3种颜色,间隔时间为1秒。上传测试代码2成功,上电后,模块上RGB LED显示红橙黄绿蓝青紫白7种颜色,循环不止,间隔时间为1秒。

img