在这个Arduino教程中,我们将学习如何使用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 .................................亚马逊/伯格多德/阿里巴巴全球速卖通
- 面包板和跳跃电线.........亚马逊/伯格多德/阿里巴巴全球速卖通
yaboAG娱乐城披露:这些是附属链接。作为一名亚马逊助理,我从合格的购买中获得收入。
TCS230颜色传感器源代码
描述:首先,我们需要定义传感器连接的引脚并定义用于读取频率的变量。在设置部分中,我们需要将四个控制引脚定义为输出和传感器输出作为Arduino输入。在这里,我们还需要设置频率缩放,对于此示例,我将其设置为20%,并启动串行通信以显示串行监视器中的结果。
在回路部分,我们将从阅读红色滤光二极管开始。为此,我们将两个控制引脚S2和S3设置为低逻辑级别。然后使用“pulseIn()”函数,我们将读取输出频率,并将其放入变量“frequency”中。使用serial .print()函数,我们将在串行监视器上打印结果。同样的过程也适用于其他两种颜色,我们只需要调整控制引脚为适当的颜色。
/* Arduino颜色传感教程* * by Dejan Nedelkovski, www.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); // 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(frequency, 25,70,255,0);
70的值映射为0,25 ~ 255的值映射为25。另外两种颜色也是同样的过程。
以下是此示例的最终源代码:
/* Arduino颜色传感教程* * by Dejan Nedelkovski, www.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自动颜色分拣机。
随意询问下面的评论部分中的任何问题,不要忘记看看我收集的Arduino项目足彩网女欧洲杯。
不错的视频,
我有一个TCS3200, LED引脚在哪里?你的视频显示LED是亮的,但是你没有把LED输出连接到这个网页上传的图片上的任何东西?
tcs230上的LED是如何点亮的?在我的情况下,LED不亮,因为它没有连接。感谢回复。
谢谢。在我的情况下,LED通过将电源连接到VCC引脚,LED亮起。您是否尝试将5V连接到模块的LED引脚,您是否可以获得LED亮起?
你好,亲爱的dejan Nedelkovski先生
我测试了这个例子,它的工作,但我不明白如何映射色阀,
红色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)是因为我们想要反转值。
你好。
我认为这些只是普通的白色发光二极管,对吗?我有一个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灯亮着。
你应该把它连接到数字引脚上。
你好,亲爱的dejan Nedelkovski先生
谢谢你的帖子。但我不明白S0,S1和输出频率缩放。它显示了什么?在第一个代码中,为什么将频率缩放设置为20%?
谢谢,
频率可以缩放到三个不同的预设值100%,20%或2%。这种频率缩放功能允许传感器的输出为各种频率计数器或微控制器进行优化。换句话说,取决于所选值,它将产生不同的输出信号。
亲爱的德州先生。
谢谢你的帖子。但我有一些问题,因为我们的TCS具有不同的相对反应性。所以我的结果不会落入0 - 255,因为我喜欢。
你能向我解释你如何获得像你所做的每种颜色的间隔,如r(25; 70)。我无法弄清楚如何得到它。谢谢你!
我期待着您的回复。
以下行用于将25-70至0-255转换为0-255。
//将频率的值重新映射到RGB模式0到255
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厘米。
你好,我不是工程专业的学生,我们需要为我们正在制造的机器人选择一个颜色传感器解决方案。
主要是智商现在,我们不知道我们可以通过这种传感器感测颜色,我们只需要感测绿色。
我们的预算有限,所以我们不能负担高质量的传感器,您对arduino兼容传感器的最大距离/领域有什么想法?
谢谢你的指导!
嘿,传感器范围相对较小,约1cm至3cm。