在这篇文章中,我们将构建一个电路,它可以检测颜色并触发各自指定的继电器。本课题使用TCS3200颜色传感器和Arduino板完成。
TCS3200的颜色感应
如果你还没有读过前一篇文章,请浏览一下我们讨论过的使用TCS3200的颜色感应基础知识
建议的项目可能是有用的,如果你想要一个电路采取的行动基于颜色。基于颜色检测的技术在各个工业领域有着广泛的应用。
这个项目将让我们了解如何编程颜色传感器来检测不同的颜色并触发继电器。
我们将考虑主要颜色:这个项目的红色,绿色和蓝色。该项目可以区分这三种颜色并触发继电器,每个颜色的继电器。
TCS3200可以检测任意数量的颜色,但是为了保持项目的可理解性和程序代码的简单性,我们只专注于原色。
线路图:
以上示意图用于接地arduino和TCS3200颜色传感器。
继电器连接:
用9V适配器为Arduino供电,至少500mA。晶体管用作继电器的放大器,因为Arduino的GPIO引脚不能提供足够的继电器。
二极管1N4007将吸收来自继电器线圈的高压尖峰,保护半导体部件的其余部分。
硬件就到这里。
现在让我们看看如何上传代码并根据您的要求校准传感器。
颜色灵敏度可以从模块到模块的变化,环境光可以急剧改变色彩灵敏度。
所有TCS3200传感器在制造时都有一些变化,您必须测量您目前拥有的传感器的颜色参数,以便可以在代码中使用这些参数来更准确地检测颜色。
要校准并优化传感器的读数,请执行以下步骤:
步骤1:上传以下代码和完成的硬件设置。
// --------由r.girish开发的程序------- // const int s0 = 4;const int s1 = 5;const int s2 = 6;const int s3 = 7;康全= 8;int频率1 = 0;int surford2 = 0;int surford3 = 0;int状态=低;int state1 =低; int state2 = HIGH; void setup() { Serial.begin(9600); pinMode(s0, OUTPUT); pinMode(s1, OUTPUT); pinMode(s2, OUTPUT); pinMode(s3, OUTPUT); pinMode(out, INPUT); //----Scaling Frequency 20%-----// digitalWrite(s0, state2); digitalWrite(s1, state1); //-----------------------------// } void loop() { //-----Sensing RED colour-----// digitalWrite(s2, state1); digitalWrite(s3, state1); frequency1 = pulseIn(out, state); Serial.print("RED = "); Serial.print(frequency1); Serial.print(" |"); delay(100); //------Sensing Green colour----// digitalWrite(s2, state2); digitalWrite(s3, state2); frequency2 = pulseIn(out, state); Serial.print(" Green = "); Serial.print(frequency2); Serial.print(" |"); delay(100); //------Sensing Blue colour----// digitalWrite(s2, state1); digitalWrite(s3, state2); frequency3 = pulseIn(out, state); Serial.print(" Blue = "); Serial.println(frequency3); delay(100); Serial.println("-----------------------------"); delay(400); } //---------Program Developed by R.GIRISH---------//
第二步:打开串行显示器,你会发现颜色参数如下:
带上彩色物体(彩色纸是优选的)红色,蓝色和绿色。
第3步:
•将红色纸放置在靠近TCS3200传感器的位置。
•在放置红色纸张时,请注意R,G,B读数(所有三种颜色)。
•同样记下绿色和蓝色纸的R,G,B读数。
•注意:当你将三种颜色中的任何一种放在TCS3200前时,记下每一种颜色纸的所有红色、蓝色和绿色读数,你需要在主测色程序中输入这些读数。
第4步:读取步骤5并将主要的主要代码(颜色检测程序)上传
// -----由r.girish开发的程序----- // const int red_relay = 9;const int green_relay = 10;const int blue_relay = 11;const int s0 = 4;const int s1 = 5;const int s2 = 6;const int s3 = 7;康全= 8;int var = 25;int红色= 0; int green = 0; int blue = 0; int state = LOW; int state1 = LOW; int state2 = HIGH; //-----------Enter Values--------// //For RED Colour: int Rx1 = 92; int Gx1 = 240; int Bx1 = 53; //For GREEN Colour: int Rx2 = 228; int Gx2 = 163; int Bx2 = 64; //For BLUE Colour: int Rx3 = 300; int Gx3 = 144; int Bx3 = 45; //----------------------------// void setup() { Serial.begin(9600); pinMode(Red_relay, OUTPUT); pinMode(Green_relay, OUTPUT); pinMode(Blue_relay, OUTPUT); digitalWrite(Red_relay, LOW); digitalWrite(Green_relay, LOW); digitalWrite(Blue_relay, LOW); pinMode(s0, OUTPUT); pinMode(s1, OUTPUT); pinMode(s2, OUTPUT); pinMode(s3, OUTPUT); pinMode(out, INPUT); //----Scaling Frequency 20%-----// digitalWrite(s0, state2); digitalWrite(s1, state1); //-----------------------------// } void loop() { int redH1 = Rx1 + var; int redL1 = Rx1 - var; int redH2 = Rx2 + var; int redL2 = Rx2 - var; int redH3 = Rx3 + var; int redL3 = Rx3 - var; int blueH1 = Bx1 + var; int blueL1 = Bx1 - var; int blueH2 = Bx2 + var; int blueL2 = Bx2 - var; int blueH3 = Bx3 + var; int blueL3 = Bx3 - var; int greenH1 = Gx1 + var; int greenL1 = Gx1 - var; int greenH2 = Gx2 + var; int greenL2 = Gx2 - var; int greenH3 = Gx3 + var; int greenL3 = Gx3 - var; //-----Sensing RED colour-----// digitalWrite(s2, state1); digitalWrite(s3, state1); red = pulseIn(out, state); delay(100); //------Sensing Green colour----// digitalWrite(s2, state2); digitalWrite(s3, state2); green = pulseIn(out, state); ; delay(100); //------Sensing Blue colour----// digitalWrite(s2, state1); digitalWrite(s3, state2); blue = pulseIn(out, state); delay(400); if(red <= redH1 && red >= redL1) { if(green <= greenH1 && green >= greenL1) { if(blue <= blueH1 && blue >= blueL1) { Serial.println("Detected Colour: RED"); Serial.println(""); digitalWrite(Red_relay, HIGH); delay(1000); } } } if(red <= redH2 && red >= redL2) { if(green <= greenH2 && green >= greenL2) { if(blue <= blueH2 && blue >= blueL2) { Serial.println("Detected Colour: Green"); Serial.println(""); digitalWrite(Green_relay, HIGH); delay(1000); } } } if(red <= redH3 && red >= redL3) { if(green <= greenH3 && green >= greenL3) { if(blue <= blueH3 && blue >= blueL3) { Serial.println("Detected Colour: Blue"); Serial.println(""); digitalWrite(Blue_relay, HIGH); delay(1000); } } } } //------Program Developed by R.GIRISH--------//
第5步:在上面的代码中,用你最近记下的值替换值:
//-- -- -- -- 输入值 -- -- --// // 红色:int Rx1 = 92;int Gx1 = 240;int Bx1 = 53;//For GREEN color: int Rx2 = 228;int Gx2 = 163;int Bx2 = 64;//为蓝色颜色:int Rx3 = 300;int Gx3 = 144;int Bx3 = 45;//-- -- -- -- -- -- -- -- -- -- -- //
当你把红色的纸放在传感器上时,你会得到三个读数,例如R = 56 | G = 78 | B = 38。
将值56,78,38放置如下:
/ /为红色:
int rx1 = 56;
int gx1 = 78;
int bx1 = 38;
同样,对于其他两种颜色,并上传代码。
第6步:
•打开串行监视器,并将任何三种颜色放在传感器前面。
•您将在串行显示器上看到颜色检测;同时,相应的颜色继电器被激活。
•按下Arduino板上的复位按钮,解除继电器。
注1:校准后,如果放置红色、绿色、蓝色物体/纸的颜色稍有不同的阴影/色调,电路可能无法检测颜色。换句话说,你必须使用完全相同颜色的物体/纸来检测颜色和触发继电器。
注2:环境灯可能会影响颜色检测,如此,请在传感器附近保持一致的光线,同时校准,也在检测颜色时。
作者的原型:
如果您对此项目有任何疑问,请在评论部分表达,您可能会收到快速回复。