marcusme 发表于 2015-9-10 11:11:56

红外变色小灯

本帖最后由 marcusme 于 2015-9-10 16:47 编辑

【简介】利用MINI遥控器来控制小灯,从1到7分别是红橙黄绿蓝靛紫,8-黑;9-白;0-灰;
file:///C:\Users\DFR\AppData\Local\Temp\msohtmlclip1\01\clip_image002.jpg
【器材】Arduino UNO,LED_RGB小灯,红外遥控器,红外接收器,电阻,面包板,导线若干。



【接线】接线示意图如下

【硬件实现】1. RGB_LEDRGB灯有4个引脚,R、G、B三个引脚连接到LED灯的一端,还有一个引脚是共用的正极(阳)或者共用的阴极(负)。我们这里选用的是共阴RGB。下图展示了三个LED如何华丽蜕变为一个RGB的过程,R、G、B其实就是三个LED的正极,把它们的负极拉到一个公共引脚上了,它们公共引脚是负极,所以称之为共阴RGB。

2. 十种颜色的实现RGB指的是红绿蓝三种原色,我们通过arduino的PWM口对三种原色的明暗进行调节就能实现各种颜色的产生了,下图就是一幅RGB三原色的调和图。

事实上,使用PWM可以产生0~255之间的全部颜色,所以一共能够产生255*255*255=16777216种颜色,当然大多数颜色凭我们的肉眼是很难分辨出来的。而在这里呢,我们只要产生十种颜色,每种颜色的RGB值跨度很大,所以完全不用担心颜色辨识度的问题。以下就是此次我们要用到的颜色和它们的RGB表格:

R值G值B值
红色25500
橙色2551080
黄 色2552550
绿色02550
蓝色00255
靛青色84684
紫色16032240
黑色000
白色255255255
灰色190190190
按照以上的表格给RGB赋值就能得到我们需要的十种颜色了,注:橙色的RGB值跟网上的来源有所差别,是通过试验得到的对于我手上这只RGB小灯最贴切的橙色。3. 红外接收所谓的红外接收管,也就是接收红外光的电子器件。在我们的电视机、空调等家电,遥控小车、遥控飞机等玩具里,它们都需要用到红外接收管。遥控器发射出来的都是红外光,电视机上势必要有红外接收管,才能接收到遥控器发过来的红外信号。其连线图大致如下:
红外遥控器和接收器的使用跟很多元器件是有所不同的,它有着自己的库——IRromote多协议红外遥控库。利用这个库我们可以轻松实现多协议红外遥控编码的发送和接收。本红外远程库由两部分组成:负责发射红外遥控器数据包的IRsend,负责接收和解码红外消息的IRrecv。此红外远程库由两部分组成:负责发射红外遥控器数据包的IRsend,负责接收和解码红外消息的IRrecv。在这里,我们只用到了IRrecv。IRrecv红外接收类函数公共类
[*]IRrecv()
[*]blink13()
[*]decode()
[*]enableIRIn()
[*]resume()
私有类
[*]getRClevel()
[*]decodeNEC()
[*]decodeSony()
[*]decodeSanyo()
[*]decodeMitsubishi()
[*]decodeRC5()
[*]decodeRC6()
[*]decodePanasonic()
[*]decodeJVC()
[*]decodeHash()
[*]compare()
IRsend() 红外发射类公共类
[*]IRsend()
[*]sendRaw()
[*]sendNEC()
[*]sendSony()
[*]sendRC5()
[*]sendRC6()
[*]sendDISH()
[*]sendSharp()
[*]sendPanasonic()
[*]sendJVC()
私有类
[*]enableIROut()
[*]mark()
[*]space()
IDE中也有着对于红外的例子,我们可以直接下载到板子上自己感受:例子
[*]IRrecord
[*]IRrecvDemo
[*]IRrecvDump
[*]IRrelay
[*]IRsendDemo
[*]IRtest
[*]IRtest2
[*]JVCPanasonicSendDemo
在运用中如果我们将IRrecvDemo这个例子下载到板子进行工作,通过串口监测器可以观察到,串口中如果正确接收的话,会出现以FD开头的6位数,并且对于红外遥控器上的每一个按键都有一个专属的红外码值。




【设计思路】1.正如在上一个环节中我所提到的一样,每种颜色都有其对应的RGB值,每一个红外按键也有专属的红外码。所以我们只要告诉arduino,当红外接收管接收到按键的红外码值时,RGB灯以对应的RGB参数值来点亮小灯。这样,我们就能实现用遥控器控制灯光的各种颜色的变换了。
2.流程图:




3.红外码值-按键值-RGB值表:
按键红外码值颜色R值G值B值
10xFD08F7红色25500
20xFD8877橙色2551080
30xFD48B7黄 色2552550
40xFD28D7绿色02550
50xFDA857蓝色00255
60xFD6897靛青色84684
70xFD18E7紫色16032240
80xFD9867黑色000
90xFD58A7白色255255255
00xFD30CF灰色190190190


【程序代码】代码程序如下:#include <IRremote.h>//调用IRremote.h库int RECV_PIN = 11;//定义RECV_PIN变量为11IRrecv irrecv(RECV_PIN);   //设置RECV_PIN(也就是11引脚)为红外接收端decode_results results;//定义results变量为红外结果存放位置long codes=    //该数组用来存放红外遥控器发出的红外码{0xFD30CF,0xFD08F7,   // 0 ,10xFD8877,0xFD48B7,   // 2 ,30xFD28D7,0xFDA857,   // 4 ,50xFD6897,0xFD18E7,   // 6 ,70xFD9867,0xFD58A7,// 8 ,9};int colornumber={ {190,190,190},//0-灰 {255,0,0},//1-红 {255,108,0},//2-橙 {255,255,0},//3-黄
{0,255,0},//4-绿 {0,0,255},//5-蓝 {8,46,84},//6-靛 {160,32,240},//7-紫 {0,0,0},//8-黑 {255,255,255}//90-白};int redPin = 8;int greenPin = 9;int bluePin = 10;void setup(){Serial.begin(9600);   //串口波特率设为9600irrecv.enableIRIn();//启动红外解码pinMode(redPin, OUTPUT);pinMode(greenPin, OUTPUT);pinMode(bluePin, OUTPUT);}void loop(){ if(irrecv.decode(&results)) { for(int i=0;i<=9;i++){if(results.value == codes){colorRGB(colornumber,colornumber,colornumber);Serial.println(i); Serial.print("Red:"); //观察该引脚准确的RGB值Serial.print(colornumber);Serial.print("Green:");//观察该引脚准确的RGB值Serial.print(colornumber);Serial.print("Blue:");//观察该引脚准确的RGB值Serial.println(colornumber);break;} }Serial.println(results.value, HEX);//串口监测器查看红外码irrecv.resume();    //等待接收下一个信号 } }void colorRGB(int red, int green, intblue){analogWrite(redPin,red);analogWrite(greenPin,green);analogWrite(bluePin,blue);
}【代码回顾】运用红外遥控和接收的时候我们必须调用相应的函数库:#include<IRremote.h>,接着设置数字11脚为红外接收端。接着以下两句代码:IRrecv irrecv(RECV_PIN);    decode_results results; 第一句代码是定义接收器的输入管脚里边儿的RECV_PIN就是你想接受红外编码的引脚号(int),可以是任意数字I/O端口,例如D11。而第二句则是会用来接收红外编码的,如果编码接收成功则返回True,如果没有接收则返回False。当编码被成功接收后,有关信息会保存在“results”中。这两个函数就为我们奠定了后面使用其功能的基础。接着我们要定义一个数组用来存放我们所需要的红外码,然后是一个二位的数组用来存放每一个按键所对应颜色的RGB值。接着,我们用数字的8.9.10三个引脚定作为红绿蓝三种颜色的控制引脚。当然,irrecv.enableIRIn()这条代码是必不可少的,我们需要用它来开始红外信号的接收与解码。此时我们已经有了实现功能所需的几乎所有内容了,现在我们还需要利用各种函数来将他们连接起来。主要的循环程序中的代码是核心内容:for(int i=0;i<=9;i++){if(results.value == codes){colorRGB(colornumber,colornumber,colornumber);程序开始后变量i会从0-9一直增加,红外码数组的各个值也会以很快的速度被调用,这个时候接收到的红外码一旦跟数组中的码值一致那么立即开始后续程序:调用我们的RGB显示程序,并且将颜色数组中对应的值作为参数值放进改程序中:void colorRGB(int red, int green, int blue){analogWrite(redPin,red);analogWrite(greenPin,green);analogWrite(bluePin,blue);在这个程序里我们对应的RGB值分别输出到redPin(8脚),greenPinb(9脚),bluePin(10脚),接着RGB灯就会焕发出我们所想要的颜色了。最后在一次红外信号接收以及颜色显示之后,我们跳出之前的循环,继续等待下一个信号的到来。
【效果】视频如下:http://v.youku.com/v_show/id_XMTMzMTQ2Njg0NA==.html



luna 发表于 2015-9-14 10:27:02

教程详细啊~~对需要学习arduino的小伙伴很有帮助{:5_122:}

20060606 发表于 2020-8-21 06:53:18

好创意,赞一个
页: [1]
查看完整版本: 红外变色小灯