Arduino颜色传感教程 - TCS230 TCS3200颜色传感器

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

TCS230颜色传感器如何工作


TCS230在8×8的光电二极管的帮助下感测颜色光。然后,使用电流转换器将来自光电二极管的读数被转换成具有与光强度成比例的频率的方波。最后,使用Arduino Board,我们可以读取方波输出并获得颜色的结果。

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颜色感知教程* * by Dejan Nedelkovski, www.HowToMechatronics.bet188官方网站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); // 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); // 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); // Printing the value on the serial monitor Serial.print("B= ");//printing name Serial.print(frequency);//printing RED color frequency Serial.println(" "); delay(100); }

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

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

这里注意到,由于每个光电二极管类型的不同灵敏度,从来自传感器的数据表的光电二极管谱响应图所示,三个值因来自传感器的光电二极管谱响应图而异。

尽管如此,现在让我们看看这些值如何在传感器前面带来不同的颜色时如何做出反应。因此,例如,如果我们带来红​​颜色,初始值会下降,在我的情况下,大约70到大约25。

与Arduino教程示例感应颜色

因此,现在,如果我们希望使用具有0到255的值的RGB模型表示检测到的颜色,我们将使用Map()函数映射或将读数转换为0到255的值。

//将频率的值重对0到255频率的RGB型号= MAP(频率,25,70,255,0);

值70将被映射到0,值为25到255.相同的过程为两种其他颜色进行。

以下是此示例的最终源代码:

/* Arduino颜色感知教程* * by Dejan Nedelkovski, www.HowToMechatronics.bet188官方网站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); }

请注意,颜色并不准确,但它们对简单的项目仍然足够好。bet188me作为我的下一个视频中TCS230颜色传感器的另一个例子,我们将学习如何制作Arduino自动颜色分拣机。

Arduino彩色分拣机项目 - 颜色分选机

随意询问下面的评论部分中的任何问题,不要忘记查看我的Arduino项目集合bet188me

38岁的反应

  1. Shashi.

    不错的视频,
    我有一个TCS3200,LED引脚在哪里?您的视频显示LED点亮,但您已未将LED输出连接到本网页上上传的图片中的任何内容?
    TCS 230的LED如何点亮?在我的情况下,LED不会在未连接时亮起。欣赏回复。

    回复
    • Dejan Nedelkovski.

      谢谢。在我的情况下,LED通过将电源连接到VCC引脚,LED亮起。您是否尝试将5V连接到模块的LED引脚,您是否可以获得LED亮起?

      回复
  2. Sahan Kalhara.

    嗨亲爱的Mr.dejan Nedelkovski

    我测试了这个例子,它是有效的,但我不明白如何映射颜色阀,
    红色25〜37到映射0〜255
    绿色30〜90到地图0〜255
    蓝色25〜70地图0〜255
    如何门(25〜37,30〜90,25〜70)值
    请帮我了解如何更改这些价值

    谢谢
    布尔
    Sahan Kalhara.

    回复
      • XWarrior.

        该公式是(可变,fromlow,从高,散,托管,Tohigh)或(可变,从流,从高,从高,tohigh,tohigh,tolow),因为在编码中是写入频率= map(频率,25,70,255,0);

      • Dejan Nedelkovski.

        这是一个很好的纸条。该公式更像(变量,fromValue1,fromValue2,tovalue1,tovalue2)以及代码行为频率的原因= map(频率,25,70,255,0)是因为我们想要反转值。

  3. FerNava

    你好。
    我假设那些只是普通的白光led,对吗?我有一个TCS3200来与led已经焊接,但他们太短,我需要它有一个较小的视野。我能把那些led去掉然后焊新的吗?

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

    回复
  4. 大卫约旦

    好的工作德国。谢谢。

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

    我现在希望我在读取指南之前我没有购买TCS3200板,或者我肯定会从这里点击到亚马逊。

    所有最好的,大卫

    回复
  5. 施克尔克

    在你的代码中,我得到如下值:

    “r = 245 g = 382 b = 170
    r = -292 g = 382 b = 182
    r = -292 g = 382 b = 187
    r = -292 g = 382 b = 182
    r = -292 g = 382 b = 170
    r = -292 g = -875 b = 193
    r = -282 g = 382 b = 204
    r = -271 g = 217 b = 210
    r = -271 g = 221 b = 216
    R= -184 G= 382 B= -640
    r = -43 g = -2579 b = -11951
    R= -1101 G= -3162 B= -11622
    r = 55 g = -2915 b = -11401

    我不知道那里发生了什么。我有一个较小的arduino并连接全部为模拟引脚。LED正在开启。

    回复
  6. 乐拓an

    嗨亲爱的Mr.dejan Nedelkovski
    谢谢你的帖子。但我不明白S0,S1和输出频率缩放。它显示了什么?在第一个代码中,为什么将频率缩放设置为20%?
    谢谢,

    回复
    • Dejan Nedelkovski.

      频率可以缩放到100%,20%或2%的三种不同的预设值。该频率缩放功能允许传感器的输出优化用于各种频率计数器或微控制器。换句话说,取决于所选值,它将产生不同的输出信号。

      回复
  7. Nguyen Khang.

    亲爱的德州先生。
    谢谢你的帖子。但我有一些问题,因为我们的TCS具有不同的相对反应性。所以我的结果不会落入0 - 255,因为我喜欢。
    你能向我解释你如何获得像你所做的每种颜色的间隔,如r(25; 70)。我无法弄清楚如何得到它。谢谢你!
    我期待着您的回复。

    回复
      • Nguyen Khang.

        我的意思是我们如何知道传感器的范围在25-70之间?因为我的传感器给了我完全不同的数据。

  8. Anas Masood Quddusi.

    嗨,

    你能告诉我如何让LED照亮与传感器识别的颜色相同的颜色吗?
    同样,无论读取的是什么值,比如R=255 G = 108 B = 20,把它放到另一个函数中,计算一个比率?

    谢谢你!

    回复
    • Dejan Nedelkovski.

      嗯,您只需要RGB LED和使用Digital.Write()函数将这些值发送到每个R,G和B引脚。有关更多详细信息,请查看My Arduino RGB教程如何使用带有Arduino的RGB LED。

      回复
  9. Sanath.

    如何制作TCS3200只能检测绿色,忽略红色和蓝色?这样,如果它检测到绿色绿色,我们必须运行电机。

    回复
  10. Wanix.

    您好SIR,您的电路连接与代码不同。关心它可能会混淆其他用户。

    回复
  11. 迪伦佩斯库斯

    你好,

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

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

    我们顺便使用Arduino Uno。

    回复
    • Dejan Nedelkovski.

      嗯,您应该根据您获得的值调整范围。这必须通过手动测试要扫描的每种颜色来完成,并且该乘以乘以获得更准确或平均值的时间。

      回复
  12. Uday

    你好,先生 ,
    我们陷入了校准。我们长期以来,我们必须校准。传感器未正确检测颜色。所以,您可以建议如何纠正问题。

    回复
    • Dejan Nedelkovski.

      嗯,是的,校准是一个问题,因为传感器通常为相同颜色提供各种读数。尝试改变环境闪电,加入更多的光线,所以它可能会更好地工作,或者可能会减少光线。

      回复
  13. 诺亚

    嗨,

    当连接TCS3200时,你可以只使用常规的数字引脚还是需要连接到ARDUINO的PWM端口

    回复
  14. Maris.

    您好,我是工程中的Anot学生,我们需要为我们制作的机器人选择一个颜色传感器解决方案。
    主要是智商现在,我们不知道我们可以通过这种传感器感测颜色,我们只需要感测绿色。
    我们正处于预算,因此我们可以真正负担高质量的传感器,您是否对Arduino兼容传感器的最大距离/领域有任何想法?
    谢谢你的指南!

    回复

发表评论

您的电子邮件地址不会被公开。

推荐

2019年初学者和爱好者的最佳进入级示波器

为初学者和爱好者最好的示波器

推荐

2019年初学者的8个最佳Arduino Starter Kits

初学者的8个最佳Arduino Starter Kits

推荐

用于初学者和爱好者的最佳3D打印机 -  3D打印

初学者和爱好者的最佳3D打印机