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

实验说明
在这个套件中,有一个Keyes DIY电子积木 共阴RGB模块,它采用F10-全彩RGB雾状共阴LED元件。控制时,我们需要将模块R G B连接单片机PWM口,剩下那个管脚接GND(共阳RGB的话剩下那个管脚接VCC)。
实验中,我们通过测试代码,控制RGB模块显示几个常见的颜色。
实验原理

那么什么是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中颜色光的混合比例,可以模拟出所有颜色的灯光。

实验器材
|
|
|
|
|
|---|---|---|---|---|
Raspberry Pi Pico板*1 |
Raspberry Pi Pico扩展板*1 |
keyes DIY电子积木 共阴RGB模块*1 |
防反插4Pin*1 |
MicroUSB线*1 |
接线图

测试代码
代码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中,R G B代表控制模块上 LED对应的红绿蓝3种颜色对应的端口,根据接线图我们接到了GP9 GP10 GP11,设置为9 10 11,后面设置对应高低,设置GRB LED中红绿蓝3个灯是否会亮,设置为高(对应数字口为高电平),对应的颜色就亮。
现在观察代码,这个代码非常简单,只是简单的控制模块上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秒。





