在这里,我们将学习如何制作颜色传感器。我的模型包括三个包含LED的纸板隔层 – 一个红色,一个蓝色和一个绿色 – 以及一个OP550B光电晶体管。LED在纯色卡片上同时发光。光电晶体管连接到Arduino Uno,它将每种颜色的测量反射光的相对量转换成RGB分量,RGB分量用于点亮与LED相同颜色的RGB LED。
目录
第1步:材料
*红色LED
*绿色LED
*蓝色LED
* RGB LED
* 3光电晶体管 – 我使用OP550B,但也可以使用其他颜色。
* 6个220欧姆电阻器
* 3个10k欧姆电阻器
*纸板或其他分隔器用于分离LED
*面包板或电路板和焊接材料
*电线
* Arduino和USB线
*电脑
*电工胶带
*各种颜色的卡片 – 我使用索引卡覆盖在不同颜色的电工胶带。
第2步:创建电路板


第3步:制作防光盒和卡片



A.切割足够大的纸板条,形成一个封闭3个LED和光电晶体管的盒子
B.将外盒连接到电路板上。我用热胶枪来做这件事,但粘土或其他不透明的,可延展的物质对于保持光线更有效。
C.切两条与外盒高度相同的薄纸板条,长度足以紧贴盒子内部。
D.将这些连接到盒子内以分离三个LED /晶体管对。我用白色电工胶带将内条的两侧和底部粘贴到盒子的内侧。
E.用电工胶带覆盖电路板底部,以防止外部光线穿过电路板上的孔。
F.将RGB LED封装在防电材料(如电气胶带)中,以防止其干扰测量(参见图表)。
G.用电工胶带盖住盒子的两侧,以减少外界光线的干扰。
H.切出几个足够大的索引卡正方形以覆盖盒子。用单色电工胶带覆盖每一面。
第4步:编写代码
这是我的Arduino代码。您需要根据房间内的光线校准常数值 – 注释掉loop()方法的指示部分,并记下它为不同颜色的卡片显示的RGB值。将这些RGB值存储在脚本开头的ICOLOR const int []中。如果您在对盒子进行防光处理方面做得很好,那么相同的RGB值应该适用于不同级别的背景光。
/ **在Arduino上运行颜色传感器
*启动程序,同时显示白卡。当RGB LED熄灭时,
*切换(快速)到黑卡。RGB LED闪烁白色后,表示准备就绪。
* /
//引脚标识符
int blue = A2;
int green = A1;
int red = A0;
int redOut = 9;
int greenOut = 10;
int blueOut = 11;
//counts the number of loops - used to time events
int count = 0;
//stores the current RGB input
int out[3];
//ICOLOR = 来自晶体管的RGB输入,即该颜色。
//COLOR = RGB输出使RGB LED显示颜色
int IWHITE[3] = {175,48,455}; int WHITE[3] = {224,226,243};
int IBLACK[3] = {42,5,20}; int OFF[3] = {0,0,0};
int IRED[3] = {145,15,38}; int RED[3] = {200,0,0};
int IYELLOW[3] = {175,40,60}; int YELLOW[3] = {255,150,0};
int IMAGENTA[3] = {150,16,83}; int MAGENTA[3] = {200,0,200};
int IBLUE[3] = {57,7,160}; int BLUE[3] = {0,0,200};
int IGREEN[3] = {41,6,50}; int GREEN[3] = {0,200,0};
int NONE[3];
//〔0〕这些是min,〔1〕是最大值
int redConvert[2];
int greenConvert[2];
int blueConvert[2];
//读取当前颜色
int* readColor(){
int ret[3];
ret[0] = analogRead(red);
ret[1] = analogRead(green);
ret[2] = analogRead(blue);
return ret;
}
//检查COLL1中的每个元素是否在DEV内。
//ReFielk中的相应元素
boolean inRange(int color1[], int refColor[], int dev){
return (abs(color1[0] - refColor[0]) <= dev) &&
abs(color1[1] - refColor[1]) <= dev &&
abs(color1[2] - refColor[2]) <= dev;
}
//设置RGB LED颜色
void setColor(int color[]){
analogWrite(redOut, color[0]);
analogWrite(greenOut, color[1]);
analogWrite(blueOut, color[2]);
}
//确定黑色和白色的值
void calibrate(){
setColor(RED);
delay(500);
setColor(GREEN);
delay(500);
setColor(BLUE);
delay(500);
setColor(WHITE);
int redSum = 0;
int greenSum = 0;
int blueSum = 0;
for(int i = 1; i <= 5; i++){
redSum += analogRead(red);
greenSum += analogRead(green);
blueSum += analogRead(blue);
delay(333);
}
int whiteCal[3] = {redSum/5,greenSum/5,blueSum/5};
redSum = blueSum = greenSum = 0;
setColor(OFF);
Serial.print("white Cal (RGB): ");
Serial.print(whiteCal[0]);
Serial.print(" ");
Serial.print(whiteCal[1]);
Serial.print(" ");
Serial.println(whiteCal[2]);
Serial.println("insert black card");
while(inRange(readColor(),whiteCal,50)){
delay(1000);
Serial.print("red green blue: ");
Serial.print(analogRead(red));
Serial.print(" ");
Serial.print(analogRead(green));
Serial.print(" ");
Serial.println(analogRead(blue));
//setColor(out);
}
Serial.println("new card detected - I hope it's black");
delay(5000);
for(int i = 1; i <= 5; i++){
redSum += analogRead(red);
greenSum += analogRead(green);
blueSum += analogRead(blue);
delay(100);
}
int blackCal[3] = {redSum/5,greenSum/5,blueSum/5};
Serial.print("black Cal (RGB): ");
Serial.print(blackCal[0]);
Serial.print(" ");
Serial.print(blackCal[1]);
Serial.print(" ");
Serial.println(blackCal[2]);
//计算转换函数
redConvert[0] = blackCal[0];
redConvert[1] = whiteCal[0];
greenConvert[0] = blackCal[1];
greenConvert[1] = whiteCal[1];
blueConvert[0] = blackCal[2];
blueConvert[1] = whiteCal[2];
}
//运行校准例程,然后将光变白
//起动回路
void setup(){
Serial.begin(9600);
calibrate();
setColor(WHITE);
delay(1000);
}
void loop(){
//以新的值读取
out[0] = analogRead(red);//0-1024
out[1] = analogRead(green);
out[2] = analogRead(blue);
//更新RGB LED和打印输出较少
if(count % 5000 == 0){
Serial.print("red green blue: ");
Serial.print(out[0]);
Serial.print(" ");
Serial.print(out[1]);
Serial.print(" ");
Serial.println(out[2]);
//注释此循环的其余部分以显示值而不使用RGB LED。
if(inRange(out,IWHITE,10)){
Serial.println("White!");
setColor(WHITE);
}
else if(inRange(out,IRED,10)){
Serial.println("Red!");
setColor(RED);
}
else if(inRange(out,IBLUE,10)){
Serial.println("Blue!");
setColor(BLUE);
}
else if(inRange(out,IYELLOW,10)){
Serial.println("Yellow!");
setColor(YELLOW);
}
else if(inRange(out,IMAGENTA,10)){
Serial.println("Magenta!");
setColor(MAGENTA);
}
else if(inRange(out,IGREEN,10)){
Serial.println("Green!");
setColor(GREEN);
}
else setColor(OFF);
}
count++;
}