Arduino颜色感应教程–TCS230 TCS3200颜色传感器

在本Arduino教程中,我们将学习如何使用Arduino和TCS230/TCS3200颜色传感器检测颜色。您可以观看以下视频或阅读下面的书面教程了解更多详细信息。

TCS230/TCS3200颜色传感器的工作原理

TCS230借助8 x 8光电二极管阵列感应彩色光。然后使用电流-频率转换器将光电二极管的读数转换成频率与光强度成正比的方波。最后,使用Arduino板,我们可以读取方波输出,并得到颜色的结果。

TCS230 TCS3200颜色传感器工作原理

如果我们仔细观察这个传感器,我们可以看到它是如何检测各种颜色的。光电二极管有三种不同的滤色片。其中16个有红色滤光片,另外16个有绿色滤光片,另外16个有蓝色滤光片,另外16个光电二极管是透明的,没有滤光片。

TCS230 TCS3200颜色传感器光电二极管过滤其工作原理betway

每个16个光电二极管是并联的,所以使用两个控制引脚S2和S3,我们可以选择哪个将被读取。例如,如果我们想要检测红色,我们可以使用16个红色过滤的光电二极管,根据表将两个引脚设置为低逻辑电平。

TCS230颜色传感器频率缩放光电二极管类型表

传感器还有两个控制引脚S0和S1,用于缩放输出频率。频率可缩放为三个不同的预设值,分别为100%、20%或2%。该频率缩放功能允许针对各种频率计数器或微控制器优化传感器的输出。

现在,我们准备继续并将TCS230传感器连接到Arduino板。这是电路图。

Arduino颜色感应教程TSC230 TSC3200颜色传感器电路示意图

您可以从以下链接获取本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);)

现在,如果我们运行串行监视器,我们将开始获得一些值。这些值取决于选定的频率缩放以及周围照明。

TSC230彩色传感器光电二极管光谱响应图

请注意,从传感器数据表中的光电二极管光谱响应图可以看出,由于每种光电二极管类型的灵敏度不同,三个值不同。

然而,现在让我们看看当我们将不同的颜色带到传感器前面时,这些值是如何反应的。例如,如果我们使用红色,初始值会下降,在我的例子中,从70到25。

使用Arduino教程示例感知颜色

现在,如果我们想用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颜色分拣机项目-颜色分拣机

请随时在下面的评论部分提出任何问题,不要忘记查看我收集的Arduino项目bet188me

38关于“Arduino颜色感应教程-TCS230 TCS3200颜色传感器”的思考

  1. 很好的视频,
    我有一个TCS3200,LED引脚在哪里?您的视频显示LED亮起,但您尚未将LED输出连接到此网页上载的图片中的任何内容?
    TCS 230上的LED是如何点亮的?在我的情况下,LED没有点亮,因为它没有连接。谢谢你的答复。

    回复
  2. 嗨,亲爱的德扬·内德尔科夫斯基先生

    我测试了这个例子,它的工作,但我不明白如何映射颜色阀,
    红色25~37至地图0~255
    绿色30~90至地图0~255
    蓝色25~70至地图0~255
    如何选择这些(25~37,30~90,25~70)值
    请帮助我了解如何更改这些值

    非常感谢。

    萨汉卡哈拉

    回复
  3. 你好
    我是否认为这些只是普通的白色led ?我有一个TCS3200来与led已经焊接,但他们太短,我需要它有一个更小的视野。我能把那些发光二极管移开再焊新的吗?

    谢谢,非常有用的网站!!

    回复
  4. 干得好,德扬。谢谢

    我很喜欢了解Arduino的传感器。像你这样的人的慷慨,张贴这样有用的材料,使它更快地学习。

    我希望在阅读您的指南之前我没有购买TCS3200板,否则我肯定会从这里点击亚马逊。

    祝你一切顺利,大卫

    回复
  5. 与你的代码,我得到的值像:

    “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,并连接到所有模拟引脚。指示灯亮着。

    回复
  6. 嗨,亲爱的德扬·内德尔科夫斯基先生
    谢谢你的帖子。但是我不了解S0、S1和输出频率缩放。它显示了什么?在第一个代码中,为什么你要将频率缩放设置为20%?
    谢谢

    回复
    • 频率可缩放为三个不同的预设值,分别为100%、20%或2%。该频率缩放功能允许针对各种频率计数器或微控制器优化传感器的输出。换句话说,根据选择的值,它将产生不同的输出信号。

      回复
  7. 亲爱的德扬先生。
    谢谢你的帖子。但我有一些问题,因为我们的TCS有不同的相对响应度。所以我的结果不会像我喜欢的那样归为0-255。
    你能解释一下你是如何得到每种颜色的间隔的吗,比如R(25;70)。我不知道该怎么做。非常感谢。
    我期待着你的答复。

    回复
  8. 你好

    您能告诉我如何使LED照明的颜色与传感器识别的颜色相同吗?
    而且,无论读取的值是什么,我们说R=255, G = 108, B = 20,把它放在另一个函数中,计算比率?

    谢谢你!

    回复
  9. 如何使tcs3200只检测绿色,而忽略红色和蓝色?因此,如果它检测到绿色,我们必须运行一个电机。

    回复
  10. 你好

    我遇到了和Nguyen Khang一样的困难。我的传感器围绕以下每个传感器
    R:200
    G:350
    B: 450

    当然,我们在一个办公室照明明亮的房间里。您建议如何映射这些值?只需使用比您的范围更大的范围(25-70)?

    顺便说一下,我们用的是arduino Uno。

    回复
  11. 嗨,先生,
    我们被困在校准中。我们需要校准多长时间。传感器无法正确检测颜色。因此,您可以建议如何纠正此问题。

    回复
  12. 你好,我是工程系的另一名学生,我们需要为我们正在制造的机器人选择一种颜色传感器解决方案。
    目前的主要问题是,我们不知道用这种传感器我们能感知多远的颜色,我们只需要感知绿色。
    我们的预算很低,所以我们买不起高质量的传感器,您对arduino兼容传感器的最大vue距离/范围有什么想法?
    谢谢你的指导!

    回复

留言