实验的效果是 6个RGB彩色流水灯依次点亮,颜色变化依次为:红色-绿色-蓝色-白色-黄色-青色,如下图。
有个实验的小视频,也可以看下效果:
Arduino uno R3 开发板:1
杜邦线:10
RGB彩色流水灯模块:1
在 树莓派GPIO控制RGB彩色LED灯 中,介绍了RGB彩色流水灯的原理以及点亮一个LED灯的方法。本篇文章,我们用代码实现依次点亮LED灯,在点亮的同时,改变RGB的输出值,就可以改变RGB灯显示的颜色,从而实现彩色的流水灯。
硬件使用了一个RGB彩色流水灯模块,模块上集成了8个共阳RGB彩色LED灯,使用时只需要将模块上的引脚接到Arduino uno R3开发板上即可,不用自己连接电阻,方便了使用。要注意的是,由于我杜邦线不够,所以就只是用了模块上的6个RGB灯。如果你要控制8个RGB灯,你应该修改我使用的代码。
Arduino控制RGB彩色灯就需要使用PWM输出,本文使用analogWrite函数来产生PWM。脉宽调制(PWM)是一种用数字手段获得模拟结果的技术。数字控制用于产生方波,信号在只能在开与关之间切换。这种开关模式通过改变高电平持续时间与低电平持续时间比值,可以模拟在开(5伏)和关闭(0伏)之间的任一模拟电压。高电平持续时间称为为脉冲宽度。为了获得不同的模拟值,可以改变或调整脉冲宽度。
analogWrite(pin, val)命令 :其中pin是引脚的编号,在uno R3上只能使用3,5,6,9,10,11这几个引脚;val是0~255的整数值,对应电压从0到+5V,不同的值对应不同的占空比,通过控制占空比从而模拟出不同的模拟电压值,实现PWM控制。不同的值对应的占空比如下:
产生PWM的示例代码:
int pin = 11; //可以选择3,5,6,9,10,11 void setup() { pinMode(pin, OUTPUT); } void loop() { analogWrite(pin, 127); delay(500); }
这种方式产生的方波周期大概是2ms左右(490Hz),占空比位50%,产生方波不需要占用额外的cpu命令时间。
RGB彩色流水灯模块的引脚与UNO的连接对应关系如下:
RGB LED ———— Arduino UNO R3
R ————9
G ———— 11
B ————10
VCC —— 5V
D0————2
D1————3
D2 ———— 4
D3 ———— 5
D4 ———— 6
D5 ———— 7
点亮6个RGB彩色流水灯的代码如下,颜色变化顺序为:红色-绿色-蓝色-白色-黄色-青色
/* * 作者:科技爱好者博客 * 时间:2017年6月11日12:46:41 * IDE版本号:1.8.2 * 发布地址:http://blog.lxx1.com * 作用:共阳RGB流水灯循环点亮 */ //定义RGB灯颜色控制引脚 int R=9; int G=11; int B=10; int t=1000; //延时时间控制 void setup() { // put your setup code here, to run once: for(int i=2;i<8;i++){ pinMode(i,OUTPUT); } pinMode(R,OUTPUT); pinMode(G,OUTPUT); pinMode(B,OUTPUT); } void loop() { // put your main code here, to run repeatedly: //从左到右点亮RGB流水灯 for(int i=2;i<7;i++){ digitalWrite(i,0); color(i); digitalWrite(1,1); } //从右到左熄灭RGB流水灯 for(int i=7;i>2;i--){ digitalWrite(i,0); color(i); digitalWrite(i,1); } } //颜色控制函数 void setColor(int r,int g,int b){ analogWrite(R,255-r); analogWrite(G,255-g); analogWrite(B,255-b); } //选择要显示的颜色 void color(int c){ switch(c){ case 2: setColor(255, 0, 0); // 红色灯全亮,蓝灯,绿灯全暗(红色) delay(t); break; case 3: setColor(0, 255, 0); // 绿色灯全亮,红灯,蓝灯全暗(绿色) delay(t); break; case 4: setColor(0, 0, 255); // 蓝色灯全亮,红灯,绿灯全暗(蓝色) delay(t); break; case 5: setColor(255, 255, 255); // 红灯,绿灯,蓝灯全亮(白色) delay(t); break; case 6: setColor(255, 255, 0); // 红灯,绿灯全亮,蓝灯全暗(黄色) delay(t); break; case 7: setColor(0, 255, 255); // 绿灯,蓝灯全亮,红灯全暗(青色) delay(t); break; } }