2014-5-27 14:43:25 [显示全部楼层]
114772浏览
查看: 114772|回复: 62

[入门教程] Arduino教程 06 炫彩RGB LED「DFR0100」

[复制链接]

单色LED我们就讲到这里了,现在介绍一种新的LED——RGB LED。之所以叫RGB,是因为这个LED是由红(Red)、绿(Green)和蓝(Blue)三色组成。我们电脑的显示器也是由一个个小的红、绿、蓝点组成的。可以通过调整三个LED中每个灯的亮度就能产生不同的颜色。这个项目就是教你通过一个RGB小灯随机产生不同的炫彩颜色。我们可以先感性的看一下,按下图连接硬件并输入代码。

所需元件

1×  5mm RGB LED灯
3×  220欧电阻
Arduino教程 06 炫彩RGB LED「DFR0100」图1

硬件连接

连接之前,先判别RGB是共阴还是共阳,如果不是很清楚的,可以先跳到这个项目的硬件部分介绍。连接时,还需注意一点,引脚的顺序,可参照右边的引脚图。
Arduino教程 06 炫彩RGB LED「DFR0100」图2

输入代码

样例代码5-1:

//项目五 – 炫彩RGB灯
int redPin = 9;
int greenPin = 10;
int bluePin = 11;

void setup(){
     pinMode(redPin, OUTPUT);
     pinMode(greenPin, OUTPUT);
     pinMode(bluePin, OUTPUT);
}

void loop(){
      //R:0-255 G:0-255 B:0-255
      colorRGB(random(0,255),random(0,255),random(0,255));  
delay(1000);
}

void colorRGB(int red, int green, int blue){
            analogWrite(redPin,constrain(red,0,255));
            analogWrite(greenPin,constrain(green,0,255));
analogWrite(bluePin,constrain(blue,0,255));
}

代码下载完成后,我们可以看到LED颜色呈现随机的变化,不只是单一的一种颜色。

代码回顾

来分析一下,其实一个RGB灯,就是我们前面讲的单色LED的结合体,内部集成了三个LED,也就需要用三个数字PWM口来控制。在我们程序开头部分可以看到定义了三个引脚,并设置为输出模式。

最主要的部分,也就是主函数。主函数中调用了一个自己创建的函数colorRGB(),函数有三个传递参数,用于写入Red、Green、Blue的值,也就是0~255的值。

使用函数的好处在于,之后我们想调到某个颜色的时候,只有直接给这三个参数赋值就可以了。不需要重复写analogWrite()函数,使程序变得冗长。

这段函数中,我们比较陌生的就是constrain()和random()这两个函数。
我们上一个项目的课后作业部分提到的两个网站。通过那个方法,能否尝试自己来学习一下这两个函数。

函数格式如下:
Arduino教程 06 炫彩RGB LED「DFR0100」图4
constrain()函数需要3个参数:x、a和b。这里x是一个被约束的数,a是最小值,b是最大值。如果值小于a,则返回a。如果大于b,则返回b。

回到我们的程序,red、green、blue值是被约束数,约束范围在0~255,也就是我们PWM值的范围。它们的值来源于random()函数随机产生。

函数格式如下:
Arduino教程 06 炫彩RGB LED「DFR0100」图3
random()函数用于生成一个随机数,min随机数的最小值,max随机数的最大值。random()函数还有其他用法,可以参看手册。

硬件回顾

RGB灯

RGB灯有4个引脚,R、G、B三个引脚连接到LED灯的一端,还有一个引脚是共用的正极(阳)或者共用的阴极(负)。我们这里选用的是共阴RGB。看下图5-2,就是明白了,展示了三个LED如何华丽蜕变为一个RGB的过程,R、G、B其实就是三个LED的正极,把它们的负极拉到一个公共引脚上了,它们公共引脚是负极,所以称之为共阴RGB。
Arduino教程 06 炫彩RGB LED「DFR0100」图5
RGB灯如何使用呢?如何实现变色呢?

RGB只是简单的把三个颜色的LED灯封装在一个LED中。只要当做三个灯使用就可以了。我们都知道红色、绿色、蓝色是三原色,Arduino通过PWM口对三种颜色明暗的调节,也就analogWrite(value)语句,就能让LED调出任何你想要的颜色。
Arduino教程 06 炫彩RGB LED「DFR0100」图6

表5-1只是罗列了几种典型的颜色,可调的色彩远多于上表所示的,使用PWM可以产生0~255之间的全部颜色,共16777216种颜色(256×256×256)。不妨可以动手尝试一下,设置三个LED的PWM值来,随意切换颜色吧!

红色 绿色 蓝色 颜色
255 0 0 红色
0 255 0 绿色
0 0 255 蓝色
255 255 0 黄色
0 255 255 蓝绿色
255 0 255 紫红色
255 255 255 白色

表 5-1 不同LED的PWM值所组合产生的颜色

共阳RGB与共阴RGB的区别

上面我们还遗留一个问题——共阴与共阳在使用上有什么区别?共阳RGB就是把正极拉到一个公共引脚,其他三个端则是负极。下图是可以看出,外表上共阴共阳没有任何区别。
然而在使用上是有区别的,区别分为以下两点:
(1)接线中的改变,共阳的话,共用端需要接5V,而不是GND,否则LED不能被点亮。
(2)第二点就是,在颜色的调配上,与共阴是完全相反的。
举个例子:共阴RGB显示红色为R-255,G-0,B-0。然而共阳则完全相反,RGB数值是R-0,G-255,B-255。
Arduino教程 06 炫彩RGB LED「DFR0100」图7

课后作业

1、基于我们上面的炫彩RGB项目,改变代码能都做一个沿着彩虹色变化的RGB灯,而不是我们这样随机产生颜色。这里比较困难的应该是颜色的调制,通过改变Red、Blue、Green的值0~255,组合出一个你想要的颜色。

提示:只要在原有代码基础上做修改就可以了,直接调用colorRGB()函数,将函数中3个参数写入所对应颜色的值即可。

2、在作业1的基础上,能否结合我们上面说的呼吸灯,将彩虹色以呼吸灯渐变形式变化。这样的变换会显得更加柔和。

3、Arduino是个开源的平台,从网上寻找一些别人已经写好了的库,不需要自己从头写,难度也比较大,所以我们只需调用别人写好的库,来达到我们想要的效果就可以了。

下面就提供一个DFRobot的RGB LED库文件。你可以尝试直接运行样例代码
https://www.dfrobot.com.cn/images/upload/File/20140618110645l3rgz3.rar

如何加载库?

先把库文件从网站上下载下来,整个压缩包解压到Arduino IDE的libraries文件夹中。

需要注意的是,库文件夹下要直接显示.cpp和.h文件,绝对不可以把这些库文件再套到二级以上目录,这样子就会导致IDE无法识别。
Arduino教程 06 炫彩RGB LED「DFR0100」图8
接下来直接用Arduino IDE运行Example里面的程序就可以了,注意不同代码对应的引脚不同。在代码中改为你连接的引脚就行了。
Arduino教程 06 炫彩RGB LED「DFR0100」图9

DF创客社区版权所有,欢迎转载。
转载请务必标注来源: DF创客社区+作者姓名+原文网址。

RGBLED.rar

2.12 KB, 下载次数: 2224

Kaiii  学徒

发表于 2023-2-21 20:24:44

呼吸灯闪烁,课后作业代码:
  1. //analogWrite()函数支持以下引脚: 3, 5, 6, 9, 10, 11。
  2. int r = 9;
  3. int g = 11;
  4. int b = 10;
  5. void setup() {
  6.   pinMode(r,OUTPUT);
  7.   pinMode(g,OUTPUT);
  8.   pinMode(b,OUTPUT);
  9. }
  10. void loop() {
  11.   Serial.begin(9600);
  12.   colorRGB(random(0,255),random(0,255),random(0,255));
  13.   delay(1000);
  14. }
  15. void colorRGB(int red,int green,int blue){
  16.    fadeIn(1000,5,red,r);
  17.    fadeIn(1000,5,green,g);
  18.    fadeIn(1000,5,blue,b);
  19.    fadeOut(1000,5,red,r);
  20.    fadeOut(1000,5,green,g);
  21.    fadeOut(1000,5,blue,b);
  22. }
  23. void fadeIn(unsigned int time,int incnum,int color,int port){
  24.   for(byte i = 0; i< color; i+= incnum){
  25.      analogWrite(port,constrain(i,0,255));
  26.      delay(time/(255/5));
  27.   }
  28. }
  29. void fadeOut(unsigned int time,int incnum,int color,int port){
  30.   for(int i = color; i > 0; i-= incnum){
  31.      analogWrite(port,constrain(i,0,255));
  32.      delay(time/(255/5));
  33.   }
  34. }
复制代码
回复

使用道具 举报

miner233-  学徒

发表于 2024-3-19 11:10:56

为什么一些 RGB 数值不能正常显示?
比如 rgb(193, 57, 49)
应该是深红色,但显示出来的是蓝色。
使用的是共阴 LED
我已多次确认接线和引脚号没有任何问题
但是,也有一些颜色可以正常显示
比如 rgb(0, 142, 156)
回复

使用道具 举报

Kaiii  学徒

发表于 2023-2-21 20:26:40

Kaiii 发表于 2023-2-21 20:24
呼吸灯闪烁,课后作业代码:

有一点不好的就是 因为数值是增加上去的 所以 颜色的变化 也是 刚开始红橙青  能看到明显的颜色变化 记录一下
回复

使用道具 举报

lvyangyang1314  学徒

发表于 2014-6-10 16:37:13

:hug:
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2014-6-11 10:04:16

回复

使用道具 举报

lvyangyang1314  学徒

发表于 2014-6-11 11:12:28

很有帮助,嘿嘿,谢谢
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2014-6-11 12:57:45

lvyangyang1314 发表于 2014-6-11 11:12
很有帮助,嘿嘿,谢谢

不客气~:D
回复

使用道具 举报

jamabc  学徒

发表于 2014-6-28 22:13:34

买的DFRobot Arduino套件 入门套件 里面附带的Project 5的印刷纸线路板接线是错的,元器件清单里面电阻的数量也是错的。
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2014-6-30 10:18:37

jamabc 发表于 2014-6-28 22:13
买的DFRobot Arduino套件 入门套件 里面附带的Project 5的印刷纸线路板接线是错的,元器件清单里面电阻的数 ...


project5确实存在印刷失误,下次会修改的。如果有任何质量问题,可以和我们销售联系~
回复

使用道具 举报

翻滚的魔方  初级技师

发表于 2014-8-29 08:48:18

如果不加constrain()效果一样吗
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2014-8-29 10:22:53

翻滚的魔方 发表于 2014-8-29 08:48
如果不加constrain()效果一样吗

你的代码是怎么改的呢?
回复

使用道具 举报

翻滚的魔方  初级技师

发表于 2014-8-29 17:16:14

Jane 发表于 2014-8-29 10:22
你的代码是怎么改的呢?

int l1=9,l2=10,l3=11;
void setup()
{
  pinMode(l1,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(l3,OUTPUT);
}

void loop()
{
  bian(random(0,256),random(0,256),random(0,256));
}

void bian(int a,int b,int c)
{
  analogWrite(l1,a);
  analogWrite(l2,b);
  analogWrite(l3,c);
  delay(50);
}
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2014-8-29 17:54:46

翻滚的魔方 发表于 2014-8-29 17:16
int l1=9,l2=10,l3=11;
void setup()
{

恩,这样应该是一样的
回复

使用道具 举报

翻滚的魔方  初级技师

发表于 2014-8-29 20:47:18

Jane 发表于 2014-8-29 17:54
恩,这样应该是一样的

但为什么我做出来灯只有一种颜色
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2014-9-1 10:21:55

翻滚的魔方 发表于 2014-8-29 20:47
但为什么我做出来灯只有一种颜色

不会啊,应该是随机变化的呀,你怎么连接的呀?
回复

使用道具 举报

翻滚的魔方  初级技师

发表于 2014-9-7 14:40:59

Jane 发表于 2014-9-1 10:21
不会啊,应该是随机变化的呀,你怎么连接的呀?

按照教程连接的
回复

使用道具 举报

Raiden  学徒

发表于 2014-11-15 00:34:42

你好,这个程序好像也不是随机产生的,比如我每次给ARDUINO断电再上电(或者按复位按键),重新显示的颜色顺序总是和之前的一样(我的顺序是粉 蓝 紫罗兰 ......),显示的颜色也只是有限的几种呢(并不是16777216种颜色),请问你知道是什么原因吗
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2014-11-17 10:10:49

Raiden 发表于 2014-11-15 00:34
你好,这个程序好像也不是随机产生的,比如我每次给ARDUINO断电再上电(或者按复位按键),重新显示的颜色 ...

颜色数量的话,理论上是这么多的,不过实际有些颜色区别不大,我们肉眼可能就无法区分了。
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2014-11-17 10:29:11

Raiden 发表于 2014-11-15 00:34
你好,这个程序好像也不是随机产生的,比如我每次给ARDUINO断电再上电(或者按复位按键),重新显示的颜色 ...

你说的那个随机数的问题,random()是个伪随机,所以是重复的。如果你想用随机的话,可以用randomSeed(seed)定义一个随机数种子。

具体用法:http://arduino.cc/en/Reference/RandomSeed
回复

使用道具 举报

Raiden  学徒

发表于 2014-11-17 16:27:43

Jane 发表于 2014-11-17 10:29
你说的那个随机数的问题,random()是个伪随机,所以是重复的。如果你想用随机的话,可以用randomSeed(see ...

谢谢你:)
回复

使用道具 举报

Raiden  学徒

发表于 2014-11-17 16:29:27

Jane 发表于 2014-11-17 10:10
颜色数量的话,理论上是这么多的,不过实际有些颜色区别不大,我们肉眼可能就无法区分了。 ...

嗯 因为我没有看到过灰色之类的颜色,所以我就疑惑了。谢谢你:)
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2014-11-17 16:40:45

Raiden 发表于 2014-11-17 16:29
嗯 因为我没有看到过灰色之类的颜色,所以我就疑惑了。谢谢你

恩,灰色和白色估计是很接近了,所以不太能识别出。
回复

使用道具 举报

Mr.why  见习技师

发表于 2015-2-1 19:57:43

  1. void loop()
  2. {
  3.   analogWrite(redLight,random(0,255));
  4.   analogWrite(greenLight,random(0,255));
  5.   analogWrite(blueLight,random(0,255));
  6.   delay(1000);
  7. }
复制代码

回复

使用道具 举报

123下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail