当前位置:网站首页>【TCS3200 颜色传感器与 Arduino 实现颜色识别】
【TCS3200 颜色传感器与 Arduino 实现颜色识别】
2022-08-02 03:29:00 【WENJIE科技】
TCS3200 颜色传感器与 Arduino 实现颜色识别
前言
颜色传感器是一种简单易用的设备,可用于识别物体的颜色,并在检测到颜色后触发适当的动作。这种类型的传感器为工业环境中的分拣和包装提供了简单的解决方案,而工业中使用昂贵的传感器,TCS3200 等经济型传感器可用于要求不高的 DIY 应用。因此,在本文中,我们考虑将TCS3200 颜色传感器与 Arduino 连接,在此过程中,您将了解该传感器的详细信息及其工作原理。
TCS3200 颜色传感器引脚
TCS3200 颜色传感器模块有 8 个引脚;它们是 VCC、OUT、S3、S2、S1、S0、OUT、0E 和 GND。这个传感器模块的所有引脚都是数字的,除了 VCC 和地。TCS3200 颜色传感器的引脚如下所示:VCC==》是颜色传感器的电源引脚,可以连接到电源的 5V 或 3.3V。
S0 和 S1==》S0 和 S1 引脚可用于选择传感器的输出频率缩放百分比。通过配置这些引脚,可以将其设置为 2%、20% 或 100% 缩放。
S2 和 S3==》S2 和 S3 引脚可用于选择传感器的颜色阵列。通过一个接一个地选择正确的颜色阵列,该传感器可以识别一种颜色。
OE==》这是颜色传感器模块的输出启用或禁用引脚。该引脚在模块板上被下拉以通过向该引脚提供高脉冲来禁用传感器。
OUT==》这是传感器的输出引脚,当传感器检测到特定颜色时,该引脚上的输出脉冲频率会发生变化,通过检测脉冲宽度的变化我们可以确定颜色。
GND==》是颜色传感器模块的接地引脚,它应该连接到 Arduino 的接地引脚。
颜色传感器模块如何工作?
颜色传感器使用非常基本的光原理来识别颜色。您会看到白色由三种原色组成,即红色、绿色和蓝色,每种颜色都有不同的波长。当光落在表面上时,根据材料的特性,它会被吸收或反射。反射光被我们的眼睛接收到,因此我们可以看到颜色。现在让我们看看 TCS3200 颜色传感器是如何工作的,如上图所示,我们有颜色传感器,我们向传感器模块的 S0 和 S1 引脚提供高低信号,将传感器设置为 20%频率缩放。这意味着传感器将以 200 KHz 的频率运行。在此模式下,传感器的占空比将保持在 50%,但传感器的输出频率会根据颜色值而变化。
S2 和 S3 引脚用于选择光电二极管阵列,正如您在图中所见,对于传感器可见的每种颜色,我们将一个一个地设置为红色绿色和蓝色过滤器的阵列。如果传感器检测到的颜色与所选的传感器阵列相匹配,传感器的输出频率将增加,对于任何其他情况,输出频率基本保持不变,或者您可以看到输出频率的微小变化。有关更多详细信息,您可以查看TCS3200 颜色传感器IC 的数据表。正如我们之前提到的,S0、S1、S2 和 S3 引脚用于配置下表中的传感器,我们刚刚对此进行了描述。
S0 和 S1 设置输出频率比例因子:
S2 和 S3 设置内部过滤器类型:
TCS3200 颜色传感器模块组成
这是一种便宜且易于使用的传感器,可用于许多不同的应用。该传感器识别颜色并将结果以数字格式输出。TCS3200 颜色传感器的零件标记如下所示。在传感器的核心,您可以找到 TS3200 颜色传感器 IC,它非常便宜且易于使用,由 TAOS(Texas Advanced Optoelectronic Solutions Inc)设计和开发。还有四个白色 LED,这些 LED 会在模块上电时亮起。这些 LED 点亮传感器需要感应的物体。除此之外,板上还有一个滤波电容、一个去耦电容和一些电阻。该模块的工作电压为 2.7V 至 5.5V。
关于颜色传感器 TCS3200 的常见问题
颜色传感器检测什么?
颜色传感器可以分别检测接收到的红色、蓝色和绿色的光强度,从而可以确定目标物体的颜色。
颜色传感器中有多少个引脚?
它由彩色滤光片、光电二极管阵列、电流频率转换器和最终方波输出组成,可直接提供给微控制器。TSC3200 颜色传感器 IC 是一款采用 SOC 封装的 8 引脚 IC。下图显示了 Colou Sensor IC 的引脚图。
颜色传感器在黑暗中工作吗?
是的,它可以在黑暗中工作,因为它有四个明亮的白色 LED。颜色传感器可以区分颜色或测量反射光的强度,非常适合线路跟踪。通过发出自己的光,传感器甚至可以在绝对黑暗的情况下工作,以确定表面的颜色或亮度。
颜色传感器的主要部件有哪些?
颜色传感器包含一个用于照亮表面的白光发射器。三个滤光片,在 580 nm、540 nm 和 450 nm 处具有波长灵敏度,分别测量红色、绿色和蓝色的波长。
TCS3200颜色传感器模块电路图
TCS3200 颜色传感器的电路图如下所示,非常简单易懂。
在原理图中,您可以看到电路中心的 TCS3200 IC,由于 IC 的输出引脚具有低阻抗,因此与 IC 串联了一个 1K 电阻。此外,您可以看到有 4 个 LED 和一个 330R 限流电阻。您还可以看到两个 10K 上拉电阻正在上拉 IC 的 S0 和 S1 引脚。板上有一个10uF的滤波电容和一个100nf的去耦电容。除此之外,我们还有两个 0 欧姆电阻作为跨接链接。
Arduino UNO 与 TCS3200 颜色传感器 - 连接图
现在我们已经完全了解了 TCS3200 颜色传感器的工作原理,我们可以将所有必需的电线连接到 Arduino 并编写代码以从传感器中获取所有数据。TCS3200与Arduino的连接图如下所示-
将 TCS3200 传感器与 Arduino 连接非常简单。为了与传感器通信,除了 Arduino 的五个 GPIO 引脚外,我们不需要任何其他东西,这就是我们使用 Arduino 的 GPIO 8、7、6、5、4 引脚的原因。最后,为传感器供电,我们使用了 Arduino 板的 5V 和接地引脚。
TCS3200 颜色传感器模块Arduino 代码
处理来自 TCS3200 传感器的数据的代码非常简单易懂。我们只需要定义传感器与 Arduino 连接的引脚。一旦我们这样做,我们将设置传感器的不同模式,如设备数据表中所述。如果一切正常,传感器将以脉冲的形式输出颜色数据。我们将使用 Arduino 的pulsein()函数来测量脉冲持续时间并确定颜色。
我们将通过定义传感器来初始化我们的代码,我们将通过该传感器配置传感器并处理来自传感器的数据。
/* * Sensor Pin S0 -> Arduino Pin D8 * Sensor Pin S1 -> Arduino Pin D7 * Sensor Pin S2 -> Arduino Pin D6 * Sensor Pin S3 -> Arduino Pin D5 * Sensor Pin OUT -> Arduino Pin D4 */
#define S0_PIN 8
#define S1_PIN 7
#define S2_PIN 6
#define S3_PIN 5
#define OUT_PIN 4
接下来,我们有我们的setup()函数。在设置函数中,我们将 S0、S1、S2 和 S3 引脚设置为输出, 将 OUT_Pin 设置为输入。
// Set the S0, S1, S2, S3 Pins as Output
pinMode(S0_PIN, OUTPUT);
pinMode(S1_PIN, OUTPUT);
pinMode(S2_PIN, OUTPUT);
pinMode(S3_PIN, OUTPUT);
//Set OUT_PIN as Input
pinMode(OUT_PIN, INPUT);
接下来在设置函数中,我们将S0 引脚设置为高电平,将S1 引脚设置为低电平,这会将比例因子缩放为数据表推荐的 20%。我们还启用了 UART 进行调试。
// Set Pulse Width scaling to 20%
digitalWrite(S0_PIN, HIGH);
digitalWrite(S1_PIN, LOW);
// Enable UART for Debugging
Serial.begin(9600);
接下来,我们有我们的循环功能;在循环函数中,我们声明了三个名为r、g和b的局部变量。这些变量将保存传感器给出的 RGB 值。之后,我们制作了三个函数来处理红色、绿色和蓝色值。并将这些值存储在 r、g 和 b 变量中。我们还添加了一些 200 毫秒的延迟,让传感器有时间处理数据。数据采集过程完成后,我们在串行监视器窗口中打印值。我们还有三个if 语句具有三个魔法值。这些值是在将物体多次放在传感器前面并对输出值进行平均后选择的。如果此值与传感器的输出值匹配,那么您将在串行监视器窗口中获得该颜色的名称。
void loop()
{
int r, g, b;
r = process_red_value();
delay(200);
g = process_green_value();
delay(200);
b = process_blue_value();
delay(200);
Serial.print("r = ");
Serial.print(r);
Serial.print(" ");
Serial.print("g = ");
Serial.print(g);
Serial.print(" ");
Serial.print("b = ");
Serial.print(b);
Serial.print(" ");
Serial.println();
if (r < 42)
{
Serial.println("Colour Pink");
}
else if (g < 63)
{
Serial.println("Colour Green");
}
else if (r < 64)
{
Serial.println("Colour Red");
}
}
这标志着我们的循环函数的结束,现在让我们谈谈处理来自传感器的输出数据并以整数格式返回值的函数。这三个功能完全相同;唯一的区别是传感器的S2和S3引脚是如何配置的。要处理红色,S2 和 S3 引脚都应为低电平。要处理绿色,S2 和 S3 引脚应为高电平。并且要处理蓝色 S2 应该低,S3 应该高。正如我们之前提到的,pulseIn()函数用于确定传感器的脉冲宽度。该函数以毫秒为单位返回值,我们只是在串行监视器窗口中打印该值。
int process_red_value()
{
digitalWrite(S2_PIN, LOW);
digitalWrite(S3_PIN, LOW);
int pulse_length = pulseIn(OUT_PIN, LOW);
return pulse_length;
}
int process_green_value()
{
digitalWrite(S2_PIN, HIGH);
digitalWrite(S3_PIN, HIGH);
int pulse_length = pulseIn(OUT_PIN, LOW);
return pulse_length;
}
int process_blue_value()
{
digitalWrite(S2_PIN, LOW);
digitalWrite(S3_PIN, HIGH);
int pulse_length = pulseIn(OUT_PIN, LOW);
return pulse_length;
}
这标志着我们的代码部分的结束,我们可以移动到代码的另一部分。
TCS3200 颜色传感器模块的工作
下面的 gif 显示了 使用 Arduino 的 TCS3200 颜色传感器的硬件电路。在 GIF 的左侧,我们有我们的 Arduino,它根据上一节中显示的原理图与传感器连接。现在我们要做的是在传感器前面放置一个红色、绿色和蓝色的物体,然后观察串行监视器以检查传感器是否可以识别颜色。
完整代码
/* Sensor Pin S0 -> Arduino Pin D8 Sensor Pin S1 -> Arduino Pin D7 Sensor Pin S2 -> Arduino Pin D6 Sensor Pin S3 -> Arduino Pin D5 Sensor Pin OUT -> Arduino Pin D4 */
#define S0_PIN 5
#define S1_PIN 4
#define S2_PIN 7
#define S3_PIN 6
#define OUT_PIN 8
void setup()
{
// Set the S0, S1, S2, S3 Pins as Output
pinMode(S0_PIN, OUTPUT);
pinMode(S1_PIN, OUTPUT);
pinMode(S2_PIN, OUTPUT);
pinMode(S3_PIN, OUTPUT);
//Set OUT_PIN as Input
pinMode(OUT_PIN, INPUT);
// Set Pulse Width scaling to 20%
digitalWrite(S0_PIN, HIGH);
digitalWrite(S1_PIN, LOW);
// Enabl UART for Debugging
Serial.begin(9600);
}
void loop()
{
int r, g, b;
r = process_red_value();
delay(200);
g = process_green_value();
delay(200);
b = process_blue_value();
delay(200);
Serial.print("r = ");
Serial.print(r);
Serial.print(" ");
Serial.print("g = ");
Serial.print(g);
Serial.print(" ");
Serial.print("b = ");
Serial.print(b);
Serial.print(" ");
Serial.println();
if (r < 42)
{
Serial.println("Colour Pink");
}
else if (g < 63)
{
Serial.println("Colour Green");
}
else if (r < 64)
{
Serial.println("Colour Red");
}
}
int process_red_value()
{
digitalWrite(S2_PIN, LOW);
digitalWrite(S3_PIN, LOW);
int pulse_length = pulseIn(OUT_PIN, LOW);
return pulse_length;
}
int process_green_value()
{
digitalWrite(S2_PIN, HIGH);
digitalWrite(S3_PIN, HIGH);
int pulse_length = pulseIn(OUT_PIN, LOW);
return pulse_length;
}
int process_blue_value()
{
digitalWrite(S2_PIN, LOW);
digitalWrite(S3_PIN, HIGH);
int pulse_length = pulseIn(OUT_PIN, LOW);
return pulse_length;
}
边栏推荐
猜你喜欢
Go 程序太大了,能要个延迟初始化不?
对账、结账、错账更正方法、划线更正法、红字更正法、补充登记法
TimeSformer视频理解框架:视频理解中的Transformer
Kotlin - 标准函数(with、run和apply)
备战金九银十:Android 高级架构师的学习路线及面试题分享
张量乘积—实验作业
Temporal action localization in untrimmed videos via Multi-stage CNNs SCNN论文阅读笔记
【一句话攻略】彻底理解JS中的回调(Callback)函数
修复APP的BUG,热修复的知识点和大厂的相关资料汇总
2022年中高级 Android 大厂面试秘籍,为你保驾护航金九银十,直通大厂
随机推荐
[Spark]-RDD详解之变量&操作
目标检测(一):R-CNN系列
C# 常用方法记录
同时安装VirtualBox和VMware,虚拟机如何上网
十大实用的办公工具网站,可以解决你日常100%的问题
Solve the problem that the 5+APP real machine test cannot access the background (same local area network)
redo log与binlog间的破事
借贷记账法下的账户结构、借贷记账法的记账规则、借贷记账法下的账户对应关系与会计分录
Spark MLlib特征处理 之 StringIndexer、IndexToString使用说明以及源码剖析
Gradle源码解析:生命周期的三个阶段
保证接口数据安全的10种方案
SATA M2 SSD 无法安装系统的解决方法
MVC,MVP和MVVM架构解析
如何在 Scala 中科学地操作 collection(一):集合类型与操作
Spark数据读取和创建
laravel-admin 线上访问项目,一直重定向到登录页面
Acwing:哈夫曼树(详解)
Nest 的实现原理?理解了 reflect metadata 就懂了
关于我的大创、论文~
Larave 自定义公共函数以及引入使用