在本教程中,我们将学习如何使用Arduino和TCS230 / TCS3200颜色传感器检测颜色。你可以观看下面的视频或阅读下面的书面教程了解更多细节。
TCS230颜色传感器如何工作
TCS230在8×8的光电二极管的帮助下感测颜色光。然后,使用电流转换器将来自光电二极管的读数被转换成具有与光强度成比例的频率的方波。最后,使用Arduino Board,我们可以读取方波输出并获得颜色的结果。
如果我们仔细看一下传感器,我们可以看到它是如何检测各种颜色的。光电二极管有三个不同的彩色滤光片。其中16个有红色滤光片,另外16个有绿色滤光片,另外16个有蓝色滤光片,另外16个光敏二极管没有滤光片。
每个16个光电二极管是并联的,因此使用两个控制引脚S2和S3我们可以选择哪个将被读取。例如,如果我们想检测红色,我们可以使用16个红色滤光二极管,根据表设置两个引脚到低逻辑电平。
该传感器还有两个控制引脚,S0和S1,用于缩放输出频率。频率可缩放到100%、20%或2%三种不同的预设值。这个频率缩放功能允许传感器的输出被优化为各种频率计数器或微控制器。
现在我们已准备好继续,并将TCS230传感器连接到Arduino板。这是电路原理图。
您可以从下面的链接获取此Arduino教程所需的组件:
- TCS230 TCS3200颜色传感器......亚马逊/伯格多德/阿里巴巴全球速卖通
- Arduino Board .................................亚马逊/伯格多德/阿里巴巴全球速卖通
- 面包板和跳线.........亚马逊/伯格多德/阿里巴巴全球速卖通
必威外围提钱披露:这些是附属链接。作为一名亚马逊助理,我的收入来自符合条件的购买。
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); }
现在,如果我们运行串行监视器,我们将开始获得一些值。这些值取决于所选的频率缩放,以及周围的照明。
注意,由于每种光电二极管类型的灵敏度不同,三个值不同,从传感器数据表的光电二极管光谱响应率图可以看到。
然而,现在让我们看看当我们将不同的颜色放在传感器前时,这些值是如何反应的。例如,如果我们使用红色,初始值会下降,在我的例子中,从70左右下降到25左右。
因此,现在,如果我们希望使用具有0到255的值的RGB模型表示检测到的颜色,我们将使用Map()函数映射或将读数转换为0到255的值。
//将频率值重绘为0到255的RGB模型frequency = map(frequency, 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项目bet188me。
不错的视频,
我有一个TCS3200, LED引脚在哪里?你的视频显示LED是亮的,但你没有把LED输出连接到网页上上传的图片中的任何东西?
TCS 230上的LED灯是如何亮起来的?在我的情况下,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)值如何选通
请帮助我了解如何更改这些值
谢谢你!
布尔
Sahan kalhara
你好呀。您是否尝试使用以下函数进行映射值:地图(变量,从流,从高,散,托管,到高)?
该公式是(可变,fromlow,从高,散,托管,Tohigh)或(可变,从流,从高,从高,tohigh,tohigh,tolow),因为在编码中是写入频率= map(频率,25,70,255,0);
这是一个很好的纸条。该公式更像(变量,fromValue1,fromValue2,tovalue1,tovalue2)以及代码行为频率的原因= map(频率,25,70,255,0)是因为我们想要反转值。
你好。
我假设那些只是普通的白光led,对吗?我有一个TCS3200来与led已经焊接,但他们太短,我需要它有一个较小的视野。我能把那些led去掉然后焊新的吗?
谢谢,非常有用的网站!!
是的,是常规LED,您应该能够更换它们。
好德扬。谢谢。
我真的很喜欢了解Arduino的传感器。像你这样慷慨的人,张贴这样有用的材料让学习变得更快。
我希望我在阅读指南之前没有买TCS3200公告板,否则我肯定会从这里点击到亚马逊。
所有最好的,大卫
谢谢!
在你的代码中,我得到如下值:
“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灯亮着。
你应该把它连接到数字引脚上。
你好,亲爱的德扬·内德尔科夫斯基先生
谢谢你的帖子。但我不明白S0,S1和输出频率缩放。它显示了什么?在第一个代码中,为什么将频率缩放设置为20%?
谢谢,
频率可缩放到100%、20%或2%三种不同的预设值。这个频率缩放功能允许传感器的输出被优化为各种频率计数器或微控制器。换句话说,取决于所选值,它将产生不同的输出信号。
亲爱的德州先生。
谢谢你的帖子。但我有一些问题,因为我们的TCS具有不同的相对反应性。所以我的结果不会落入0 - 255,因为我喜欢。
你能向我解释你如何获得像你所做的每种颜色的间隔,如r(25; 70)。我无法弄清楚如何得到它。谢谢你!
我期待着您的回复。
以下行用于将25-70至0-255转换为0-255。
//重构频率的值为0到255的RGB模型
frequency = map(frequency, 25,70,255,0);
我的意思是我们如何知道传感器的范围在25-70之间?因为我的传感器给了我完全不同的数据。
你好,
你能告诉我如何让LED和传感器识别的颜色一样亮吗?
同样,无论读取的是什么值,比如R=255 G = 108 B = 20,把它放到另一个函数中,计算一个比率?
谢谢你!
嗯,您只需要RGB LED和使用Digital.Write()函数将这些值发送到每个R,G和B引脚。有关更多详细信息,请查看My Arduino RGB教程如何使用带有Arduino的RGB LED。
如何制作TCS3200只能检测绿色,忽略红色和蓝色?这样,如果它检测到绿色绿色,我们必须运行电机。
我们只需要在读取绿色时考虑传感器的值,并使用它们来设置电机运行。
您好SIR,您的电路连接与代码不同。关心它可能会混淆其他用户。
谢谢你的评论,你是对的。S0应转到PIN编号4,S1到PIN编号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厘米。
你好,我不是工程专业的学生,我们需要为我们正在制造的机器人选择颜色传感器的解决方案。
主要是智商现在,我们不知道我们可以通过这种传感器感测颜色,我们只需要感测绿色。
我们在预算,所以我们不能真正负担高质量的传感器,你有任何想法的最大距离/领域的vue arduino兼容传感器?
谢谢你们的向导!
嘿,传感器范围相对较小,约1cm至3cm。