在本教程中,我们将学习如何使用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颜色传感器......亚马逊/伯格多德/aliexpress.
- Arduino Board .................................亚马逊/伯格多德/aliexpress.
- 面包板和跳线.........亚马逊/伯格多德/aliexpress.
yaboAG娱乐城披露:这些是附属链接。作为一名亚马逊助理,我的收入来自符合条件的购买。
TCS230颜色传感器源代码
描述:首先,我们需要定义传感器连接的引脚并定义用于读取频率的变量。在设置部分中,我们需要将四个控制引脚定义为输出和传感器输出作为Arduino输入。在这里,我们还需要设置频率缩放,对于此示例,我将其设置为20%,并启动串行通信以显示串行监视器中的结果。
在循环部分中,我们将从读取红色滤波的光电二极管开始。为此,我们将将两个控制引脚S2和S3设置为低逻辑电平。然后使用“Pulsein()”功能,我们将读取输出频率并将其放入变量“频率”中。使用Serial.print()函数,我们将在串行监视器上打印结果。相同的程序用于另外两种颜色,我们只需要调整控制引脚以用于适当的颜色。
/ * Arduino颜色传感教程* *由Dejan Nedelkovski,www.www.kuaixg.com亚搏手机版官方下载 * * / #define s0 4 #define s1 5 #define s2 6 #define s3 7 #define sensorout 8 int频率= 0;void setup(){pinmode(s0,输出);PINMODE(S1,输出);PINMODE(S2,输出);PINMODE(S3,输出);Pinmode(传感器,输入);//将频率缩放设置为20%DigitWwrite(S0,高);DigitalWrite(S1,低);Serial.Begin(9600);void循环(){//设置红色滤波的光电二极管读取DigiteWrite(S2,低); 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型号= MAP(频率,25,70,255,0);
将70的值映射为0,将25的值映射为255。其他两种颜色的处理过程是一样的。
以下是此示例的最终源代码:
/ * Arduino颜色传感教程* *由Dejan Nedelkovski,www.www.kuaixg.com亚搏手机版官方下载 * * / #define s0 4 #define s1 5 #define s2 6 #define s3 7 #define sensorout 8 int频率= 0;void setup(){pinmode(s0,输出);PINMODE(S1,输出);PINMODE(S2,输出);PINMODE(S3,输出);Pinmode(传感器,输入);//将频率缩放设置为20%DigitWwrite(S0,高);DigitalWrite(S1,低);Serial.Begin(9600);void循环(){//设置红色滤波的光电二极管读取DigiteWrite(S2,低); 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自动颜色分拣机。
随意询问下面的评论部分中的任何问题,不要忘记看看我收集的Arduino项目足彩网女欧洲杯。
不错的视频,
我有一个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的权利吗?我有一个已经焊接的LED随附的TCS3200,但它们太短,我需要它有一个较小的视野。我可以删除那些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)方法返回PIN 8低电平的时间。它不会返回输出频率。
但是,此示例是它提供了使用TCS3200的良好方法。
https://www.arduino.cc/en/Reference.PulseIn
你好,
这个传感器能测量多远?
最大范围?
范围非常小,大约1 - 3厘米。
你好,我不是工程专业的学生,我们需要为我们正在制造的机器人选择颜色传感器的解决方案。
主要是智商现在,我们不知道我们可以通过这种传感器感测颜色,我们只需要感测绿色。
我们在预算,所以我们不能真正负担高质量的传感器,你有任何想法的最大距离/领域的vue arduino兼容传感器?
谢谢你们的向导!
嘿,传感器范围相对较小,约1cm至3cm。