0°

Arduino色彩传感器

在这里,我们将学习如何制作颜色传感器。我的模型包括三个包含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步:创建电路板

Arduino色彩传感器
Arduino色彩传感器

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

Arduino色彩传感器
Arduino色彩传感器
Arduino色彩传感器

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++;
}

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论