在本Arduino教程中,我们将学习如何使用Arduino和TCS230/TCS3200颜色传感器检测颜色。您可以观看以下视频或阅读下面的书面教程了解更多详细信息。
TCS230/TCS3200颜色传感器的工作原理
TCS230借助8 x 8光电二极管阵列感应彩色光。然后使用电流-频率转换器将光电二极管的读数转换成频率与光强度成正比的方波。最后,使用Arduino板,我们可以读取方波输出,并得到颜色的结果。
如果我们仔细观察这个传感器,我们可以看到它是如何检测各种颜色的。光电二极管有三种不同的滤色片。其中16个有红色滤光片,另外16个有绿色滤光片,另外16个有蓝色滤光片,另外16个光电二极管是透明的,没有滤光片。
每个16个光电二极管是并联的,所以使用两个控制引脚S2和S3,我们可以选择哪个将被读取。例如,如果我们想要检测红色,我们可以使用16个红色过滤的光电二极管,根据表将两个引脚设置为低逻辑电平。
传感器还有两个控制引脚S0和S1,用于缩放输出频率。频率可缩放为三个不同的预设值,分别为100%、20%或2%。该频率缩放功能允许针对各种频率计数器或微控制器优化传感器的输出。
现在,我们准备继续并将TCS230传感器连接到Arduino板。这是电路图。
您可以从以下链接获取本Arduino教程所需的组件:
- TCS230 TCS3200颜色传感器……。亚马逊/邦古德/阿里巴巴全球速卖通
- Arduino董事会……………………………亚马逊/邦古德/阿里巴巴全球速卖通
- 面包板和跳线.........亚马逊/邦古德/阿里巴巴全球速卖通
必威外围提钱披露:这些是附属链接。作为一名亚马逊员工,我通过符合条件的购买赚取收入。
TCS230颜色传感器源代码
说明:首先,我们需要定义传感器连接的引脚,并定义一个用于读取频率的变量。在设置部分,我们需要将四个控制引脚定义为输出,将传感器输出定义为Arduino输入。这里我们还需要设置频率缩放,在本例中,我将其设置为20%,并启动串行通信以在串行监视器中显示结果。
在回路部分,我们将开始读取红色滤波光电二极管。为此,我们将把两个控制引脚S2和S3设置为低逻辑电平。然后使用“pulseIn()”函数,我们将读取输出频率,并将其放入变量“frequency”中。使用serial .print()函数,我们将在串行监视器上打印结果。同样的程序适用于其他两种颜色,我们只需要调整适当的颜色的控制销。
/*Arduino颜色感应教程**由Dejan Nedelkovski编写,www.HowToMechatronics.com*bet188官方网站*/#定义S04#定义S1 5#定义S2 6#定义S37#定义传感器输出8整数频率=0;void setup(){pinMode(S0,输出);pinMode(S1,输出);pinMode(S2,输出);pinMode(S3,输出);pinMode(传感器输出,输入);//将频率缩放设置为20%数字写入(S0,高);数字写入(S1,低);串行。开始(9600);}void loop(){//将红色滤波光电二极管设置为读-数字写入(S2,低);数字写入(S3,低);//读取输出频率频率=脉冲信号(sensorOut,低);//在串行监视器串行上打印值。打印(“R=”;//打印名称串行。打印(频率);//打印红色频率串行。打印(“”);延迟(100);//设置绿色滤波光电二极管为读取数字写入(S2,高);数字写入(S3,高);//读取输出频率频率=脉冲信号(sensorOut,低);//在串行监视器串行上打印值。打印(“G=”;//打印名称串行。打印(频率);//打印红色频率串行。打印(“”);延迟(100);//设置蓝色滤波光电二极管为读取数字写入(S2,低);数字写入(S3,高);//读取输出频率=脉冲信号(传感器输出,低);//在串行监视器串行上打印值。打印(“B=”;//打印名称串行。打印(频率);//打印红色频率串行。打印项次(“”;延迟(100);)
现在,如果我们运行串行监视器,我们将开始获得一些值。这些值取决于选定的频率缩放以及周围照明。
请注意,从传感器数据表中的光电二极管光谱响应图可以看出,由于每种光电二极管类型的灵敏度不同,三个值不同。
然而,现在让我们看看当我们将不同的颜色带到传感器前面时,这些值是如何反应的。例如,如果我们使用红色,初始值会下降,在我的例子中,从70到25。
现在,如果我们想用RGB模型表示检测到的颜色,它的值从0到255,我们将使用map()函数将读数映射或转换为0到255的值。
//将频率值重新映射到RGB模型,即0到255频率=映射(频率,25,70255,0);
值70将映射为0,值25映射为255。其他两种颜色也采用相同的程序。
以下是此示例的最终源代码:
/* Arduino Color Sensing Tutorial * * by Dejan Nedelkovski, www.bet188官方网站HowToMechatronics.com * */ / #define S0 4 #define S1 5 #define S2 6 #define S3 7 #define sensorOut 8 int frequency = 0;void setup() {pinMode(S0, OUTPUT);pinMode (S1、输出);pinMode (S2、输出);pinMode (S3、输出);pinMode (sensorOut、输入);//设置频率缩放到20% digitalWrite(S0,HIGH);digitalWrite (S1、低);Serial.begin (9600);} void loop(){//设置红色滤波光电二极管被读取digitalWrite(S2,LOW); digitalWrite(S3,LOW); // Reading the output frequency frequency = pulseIn(sensorOut, LOW); //Remaping the value of the frequency to the RGB Model of 0 to 255 frequency = map(frequency, 25,72,255,0); // Printing the value on the serial monitor Serial.print("R= ");//printing name Serial.print(frequency);//printing RED color frequency Serial.print(" "); delay(100); // Setting Green filtered photodiodes to be read digitalWrite(S2,HIGH); digitalWrite(S3,HIGH); // Reading the output frequency frequency = pulseIn(sensorOut, LOW); //Remaping the value of the frequency to the RGB Model of 0 to 255 frequency = map(frequency, 30,90,255,0); // Printing the value on the serial monitor Serial.print("G= ");//printing name Serial.print(frequency);//printing RED color frequency Serial.print(" "); delay(100); // Setting Blue filtered photodiodes to be read digitalWrite(S2,LOW); digitalWrite(S3,HIGH); // Reading the output frequency frequency = pulseIn(sensorOut, LOW); //Remaping the value of the frequency to the RGB Model of 0 to 255 frequency = map(frequency, 25,70,255,0); // Printing the value on the serial monitor Serial.print("B= ");//printing name Serial.print(frequency);//printing RED color frequency Serial.println(" "); delay(100); }
请注意,颜色没有那么精确,但对于简单的项目来说仍然足够好。作为TCS230颜色传感器的另一个例子,在我的下一个视频中,我们将学习如何制作Arduino自动颜色分拣机。bet188me
请随时在下面的评论部分提出任何问题,不要忘记查看我收集的Arduino项目bet188me.
很好的视频,
我有一个TCS3200,LED引脚在哪里?您的视频显示LED亮起,但您尚未将LED输出连接到此网页上载的图片中的任何内容?
TCS 230上的LED是如何点亮的?在我的情况下,LED没有点亮,因为它没有连接。谢谢你的答复。
谢谢在我的例子中,只需将电源连接到VCC引脚,LED就会亮起来。您是否尝试将5V电压连接到模块的LED引脚,LED是否亮起?
嗨,亲爱的德扬·内德尔科夫斯基先生
我测试了这个例子,它的工作,但我不明白如何映射颜色阀,
红色25~37至地图0~255
绿色30~90至地图0~255
蓝色25~70至地图0~255
如何选择这些(25~37,30~90,25~70)值
请帮助我了解如何更改这些值
非常感谢。
溴
萨汉卡哈拉
你好。是否尝试使用以下函数映射值:map(变量、从低、从高、到低、到高)?
公式为(变量,从低到高,从高到低,从高到高)或(变量,从低到高,从高到高,从高到低),因为编码中的写入频率=映射(频率,25,70255,0);
这是一个很好的注释。公式更像(变量,fromValue1,fromValue2,toValue1,toValue2),代码行之所以是frequency=map(frequency,25,70255,0),是因为我们想要反转这些值。
你好
我是否认为这些只是普通的白色led ?我有一个TCS3200来与led已经焊接,但他们太短,我需要它有一个更小的视野。我能把那些发光二极管移开再焊新的吗?
谢谢,非常有用的网站!!
是的,这些是常规LED,您应该能够更换它们。
干得好,德扬。谢谢
我很喜欢了解Arduino的传感器。像你这样的人的慷慨,张贴这样有用的材料,使它更快地学习。
我希望在阅读您的指南之前我没有购买TCS3200板,否则我肯定会从这里点击亚马逊。
祝你一切顺利,大卫
非常感谢。
与你的代码,我得到的值像:
“R=245g=382b=170
R=-292g=382b=182
R=-292g=382b=187
R=-292g=382b=182
R=-292g=382b=170
R=-292g=-875b=193
R=-282G=382B=204
R=-271 G=217 B=210
R=-271 G=221 B=216
R= -184 g = 382 b = -640
R=-43G=-2579B=-11951
R= -1101 g = -3162 b = -11622
R=55g=-2915b=-11401
”
我不知道那里发生了什么事。我有一个较小的arduino,并连接到所有模拟引脚。指示灯亮着。
你应该把它连接到数字引脚上。
嗨,亲爱的德扬·内德尔科夫斯基先生
谢谢你的帖子。但是我不了解S0、S1和输出频率缩放。它显示了什么?在第一个代码中,为什么你要将频率缩放设置为20%?
谢谢
频率可缩放为三个不同的预设值,分别为100%、20%或2%。该频率缩放功能允许针对各种频率计数器或微控制器优化传感器的输出。换句话说,根据选择的值,它将产生不同的输出信号。
亲爱的德扬先生。
谢谢你的帖子。但我有一些问题,因为我们的TCS有不同的相对响应度。所以我的结果不会像我喜欢的那样归为0-255。
你能解释一下你是如何得到每种颜色的间隔的吗,比如R(25;70)。我不知道该怎么做。非常感谢。
我期待着你的答复。
下一行用于将范围从25-70转换为0-255。
//将频率值重新映射到0到255的RGB模型
频率=映射(频率,25,70255,0);
我的意思是我们怎么知道传感器的范围在25-70之间?因为我的传感器给了我完全不同的数据。
你好
您能告诉我如何使LED照明的颜色与传感器识别的颜色相同吗?
而且,无论读取的值是什么,我们说R=255, G = 108, B = 20,把它放在另一个函数中,计算比率?
谢谢你!
好的,您只需要和RGB led,并使用digital.Write()函数将这些值发送到每个R、G和B引脚。有关如何将RGB led与Arduino一起使用的详细信息,请查看我的Arduino RGB教程。
如何使tcs3200只检测绿色,而忽略红色和蓝色?因此,如果它检测到绿色,我们必须运行一个电机。
我们只需要在读取绿色时考虑传感器的值,并使用它们来设置电机运行。
您好,先生,您的电路连接与代码不同。只是担心可能会混淆其他用户。
谢谢你的评论,你是对的。S0应该连接到引脚4,S1连接到引脚5。
你好
我遇到了和Nguyen Khang一样的困难。我的传感器围绕以下每个传感器
R:200
G:350
B: 450
当然,我们在一个办公室照明明亮的房间里。您建议如何映射这些值?只需使用比您的范围更大的范围(25-70)?
顺便说一下,我们用的是arduino Uno。
嗯,是的,你应该根据你得到的值来调整范围。这必须通过手动测试你想要扫描的每种颜色来完成,并乘以次数以获得更准确或平均值。
嗨,先生,
我们被困在校准中。我们需要校准多长时间。传感器无法正确检测颜色。因此,您可以建议如何纠正此问题。
嗯,是的,校准是一个问题,因为传感器经常给出同一颜色的不同读数。尝试改变闪电的环境,在周围增加一些光线,这样它可能会工作得更好,或者减少光线。
你好
连接TCS3200时可以使用普通的数字引脚还是需要连接到ARDUINO的PWM端口
是的,你可以使用普通的数码管脚。
嗨,你能解释一下如何校准颜色传感器吗?
它有点难以校准,因为它是一个低质量的传感器。
你好
谢谢你的指导。这个传感器能在阳光下检测颜色吗?
嗯,我想是的,它应该能够在阳光下检测颜色。
在已编写的代码中,pulseIn(sensorOut,LOW)方法返回引脚8低的时间。它不返回输出频率。
但是,这个例子是错误的,因为它提供了一个使用TCS3200的好方法。
https://www.arduino.cc/en/Reference.PulseIn
你好
这个传感器能测量多远?
最大射程?
范围很小,大约1厘米到3厘米。
你好,我是工程系的另一名学生,我们需要为我们正在制造的机器人选择一种颜色传感器解决方案。
目前的主要问题是,我们不知道用这种传感器我们能感知多远的颜色,我们只需要感知绿色。
我们的预算很低,所以我们买不起高质量的传感器,您对arduino兼容传感器的最大vue距离/范围有什么想法?
谢谢你的指导!
嘿,传感器的范围相对较小,大约1厘米到3厘米。