基于单片机的TCS230颜色识别物品分类设计

基于单片机的TCS230颜色识别物品分类设计


文章目录

    • 基于单片机的TCS230颜色识别物品分类设计
  • 前言
  • 一、TCS230模块简介
    • 1. TCS230颜色识别原理
      • 1.1 TCS230颜色识别原理
      • 1.2 颜色识别原理
      • 1.3 白平衡和颜色识别原理
      • 1.4 RGB颜色值获取
    • 2. 应用中需要注意的事项
  • 二、硬件设计
    • 1.硬件准备
    • 2.硬件连接
  • 三、软件设计
    • 1.appdemo.c文件
      • 1.1 app_demo函数
      • 1.2 save_one_color函数
  • 实验现象
  • 联系作者


前言

本教程将向大家介绍如何使用TCS230颜色识别模块进行物品分类设计,使用的硬件资源主要有:STM32F103/STM32F407控制器、TCS230颜色识别模块、按键模块、SG90舵机模块、TFTLCD触摸屏模块等。实现的功能是:系统运行后,进入白平衡校准,需提前一张白色卡纸(不透光)放在传感器1-2cm位置,蜂鸣器发出提示音。开始存储筛选的颜色,此时LCD会显示RGB颜色数值,并根据数值识别红、绿、蓝及其它颜色,选择要识别的颜色后按KEY0键保存,蜂鸣器发出提示音结束。进入颜色识别,当用保存的颜色色卡放置在传感器前,舵机开启一次选择物品,当其它颜色则无操作。整个过程LCD会显示识别的颜色及RGB值。通过本教程的学习,让大家能快速上手STM32单片机应用开发。


一、TCS230模块简介

TCS230是美国TAOS公司生产的一种可编程彩色光到频率的转换器。该传感器具有分辨率高、可编程的颜色选择与输出定标、单电源供电等特点。它把可配置的硅光电二极管与电流频率转换器集成在一个单一的CMOS电路上,同时在单一芯片上还集成了红绿蓝(RGB)三中滤光器,是业界第一个有数字兼容接口的RGB彩色传感器。TCS230的输出信号是数字量,可驱动标准的TTL或CMOS逻辑输入,因此可直接与微处理器或其它逻辑电路相连接。由于输出的是数字量,并且能够实现每个彩色信道10位以上的转换精度,因此不再需要A/D转换电路,使得电路变得更简单。模块管脚图如下:
基于单片机的TCS230颜色识别物品分类设计_第1张图片
基于单片机的TCS230颜色识别物品分类设计_第2张图片
TCS230模块管脚功能如下:
S0、S1:用于选择输出比例因子或电源关断模式;
S2、S3:用于选择滤波器的类型;
OE:频率输出使能引脚,可以控制输出的状态,当有多个芯片引脚共用微处理器的输入引脚时,也可以作为片选信号;
OUT:频率输出引脚;
GND、VCC:电源引脚;

传感器工作时,通过两个可编程的引脚来动态选择所需要的滤波器。该传感器的典型输出频率范围从2Hz~500KHz,用户还可以通过两个可编程引脚来选择100%、20%或2%的输出比例因子,或电源关断模式。输出比例因子使传感器的输出能够适应不同的测量范围,提供了它的适应能力。例如,当使用低速的频率计数器时,就可以选择小的定标值,使TCS230的输出频率和计数器相匹配。
从功能图可知:当入射光投射到TCS230上时,通过光电二极管控制引脚S2、S3的不同组合,可以选择不同的滤波器;经过电流到频率转换器后输出不同频率的方波(占空比是50%),不同的颜色和光强对应不同频率的方波;还可以通过输出定标控制引脚S0、S1选择不同的输出比例因子,对输出频率范围进行调整,以适应不同的需求。S0、S1及S2、S3的可用组合如下:

基于单片机的TCS230颜色识别物品分类设计_第3张图片

1. TCS230颜色识别原理

1.1 TCS230颜色识别原理

通常所看到的物体的颜色,实际上是物体表面吸收了照射到它上面的白光(日光)中的一部分有色成分,而反射出的另一部分有色光在人眼中的反应。白色是由各种频率的可见光混合在一起构成的,也就是说白光中包含着各种颜色的色光(如红R、黄Y、绿G、青V、蓝B、紫P)。根据三原色理论可知,各种颜色是由不同比例的三原色(红、绿、蓝)混合而成的。

1.2 颜色识别原理

由上面的三原色感应原理可知,如果知道构成各种颜色的三原色的值,就能够知道所测试物体的颜色。对于TCS230来说,当选定一个颜色滤波器时,它只允许某种特定的原色通过,阻止其它原色的通过。例如:当选择红色滤波器时,入射光中只有红色可以通过,蓝色和绿色都被阻止,这样就可以得到红色光的光强;同理,选择其它的滤波器,就可以得到蓝色光和绿色光的光强。通过这三个值,就可以分析投射到TCS230传感器上的光的颜色。

1.3 白平衡和颜色识别原理

白平衡就是告诉系统什么是白色。从理论上讲,白色是由等量的红色、绿色和蓝色混合而成的。但实际上,白色中的三原色并不完全相等,并且对于TCS230的光传感器来说,它对这三种基本色的敏感性是不相同的,导致TCS230的RGB输出并不相等,因此在测试前必须进行白平衡调试,使得TCS230对所检测的“白色”中的三原色是相等的。进行白平衡调整是为后续的颜色识别作准备。在本装置中,白平衡调整的具体步骤和方法如下:将空的试管放置在传感器的上方,试管的上方放置一个白色的光源,使入射光能够穿过试管照射到TCS230上。根据前面所介绍的方法,依次选通红色、绿色和蓝色滤波器,分别测得红色、绿色和蓝色的值,然后就可以计算出需要的三个调整参数。

1.4 RGB颜色值获取

当用TCS230识别颜色时,就用这三个参数对所测试颜色的R、G、B进行调整。这里有两种方法来计算调整参数:
①依次选通三种颜色的滤波器,然后对TCS230的输出脉冲依次进行计数。当计数到255时停止计数,分别计算每个通道所用的时间。这些时间对应于实际测试时TCS230每种滤波器所采用的时间基准,在这段时间内所测得的脉冲数就是所对应的R、G和B的值。
②设置定时器为一个固定时间(例如10ms),然后选通三种颜色的滤波器,计算这段时间内TCS230的输出脉冲数,计算出一个比例因子,通过这个比例因子可以把这些脉冲数变为255。在实际测试时,使用同样的时间进行计数,把测得的脉冲数再乘以求得的比例因子,然后就可以得到所对应的RGB值。

2. 应用中需要注意的事项

①颜色识别时要避免外界光线的干扰,否则会影响颜色识别的结果,最好把传感器、光源等放置在一个密闭、无反射的箱子中进行测试;
②对光源没有特殊的要求,但是光源发出的光要尽量集中,否则会造成传感器之间的相互干扰;
③当第一次使用TCS230时,或TCS230识别模块重启、更换光源等情况时,都需要进行白平衡调整。

二、硬件设计

1.硬件准备

本实验所需要的硬件资源如下:
①STM32F103或STM32F407开发板1个(自带TFTLCD触摸屏)
②SG90舵机模块1个
③USB线1条(用于供电和程序下载)
④TCS230模块1个
⑤杜邦线若干

2.硬件连接

接线说明:
TCS230颜色识别模块–>单片机IO
S0–>PC8
S1–>PC9
OE–>GND
GND–>GND
S3–>PC11
S2–>PC10
OUT–>PC7
VCC–>5V

	  按键模块-->单片机IO
	  KEY0-->PE4

	  SG90舵机模块-->单片机IO
	  橙色(信号线)-->PB6
	  红色(电源正)-->5V
	  褐色(电源负)-->GND
	  
	  TFTLCD彩屏-->单片机IO
	  固定TFTLCD接口

基于单片机的TCS230颜色识别物品分类设计_第4张图片

三、软件设计

本实验程序工程如下所示:
基于单片机的TCS230颜色识别物品分类设计_第5张图片
Tcs230.c是TCS230模块驱动代码,pwm.c是舵机控制代码,tftlcd.c是触摸屏驱动代码,appdemo.c是项目整个综合应用代码。我们仅对appdemo.c相关代码进行讲解,其它代码看项目工程文件。

1.appdemo.c文件

appdemo.c文件代码较多,实现了整个项目的逻辑控制。我们选择几个重要的函数讲解。

1.1 app_demo函数

app_demo函数代码如下::

//TCS230颜色识别系统
void app_demo(void)
{
	u8 j=0;
	u16 RGB_Color=0;
	
	KEY_Init();
	BEEP_Init();
	TFTLCD_Init();//LCD初始化
	tcs230_gpio_init();
	My_EXTI_Init();
	
	FRONT_COLOR=WHITE;
	LCD_ShowFontHZ(10, 10,"嗨小易制作");
	LCD_ShowString(10,40,tftlcd_data.width,tftlcd_data.height,16,"TCS230");
	LCD_ShowString(10,60,tftlcd_data.width,tftlcd_data.height,16,"-->white balance");
	
	//白平衡校准
	delay_ms(1000);
	white_balance();
	BEEP=1;//提示音
	delay_ms(300);
	BEEP=0;
	
	//保存一次颜色,用于后续颜色对比
	save_one_color();
	
	TIM4_CH1_PWM_Init(20000-1,83);//周期20ms
	
	while(1)
	{
		read_rgb_color_data();
		//显示RGB颜色数据
		LCD_ShowxNum(10+4*8,40,color.rgb_dat[0],3,16,0);
		LCD_ShowxNum(10+6*8,60,color.rgb_dat[1],3,16,0);
		LCD_ShowxNum(10+5*8,80,color.rgb_dat[2],3,16,0);
		//转换成屏幕的16位颜色值
		RGB_Color = 0x0000;
		RGB_Color |=(unsigned long) color.rgb_dat[0]*1000/8225<<11;		
		RGB_Color |=(unsigned long) color.rgb_dat[1]*1000/4047<<5;	  
		RGB_Color |=(unsigned long) color.rgb_dat[2]*1000/8225;
		LCD_Fill(10,120,200,250,RGB_Color);
		
		//显示识别颜色
		j=color_check(color.rgb_dat[0],color.rgb_dat[1],color.rgb_dat[2]);
		switch(j)
		{
			case COL_RED: 
				LCD_ShowString(180,10,tftlcd_data.width,tftlcd_data.height,24,"RED  ");
				break;
			case COL_GREEN: 
				LCD_ShowString(180,10,tftlcd_data.width,tftlcd_data.height,24,"GREEN");
				break;
			case COL_BLUE: 
				LCD_ShowString(180,10,tftlcd_data.width,tftlcd_data.height,24,"BLUE ");
				break;
			case COL_OTHER: 
				LCD_ShowString(180,10,tftlcd_data.width,tftlcd_data.height,24,"OTHER");
				break;
		}
		//颜色匹配控制舵机
		if(color.save_color==j)
		{
			steer_control(1);
			delay_ms(500);
			steer_control(0);
			j=0;	
		}			
	}
}

该函数先调用相应外设资源初始化程序,如TFTLCD、TCS230等,然后调用white_balance函数进行白平衡调整,调整结束后蜂鸣器发出提示音,接着调用save_one_color函数进行存储物品选择的颜色。然后调用PWM初始化函数对舵机进行配置。最后进入while循环,不断读取RGB值,并通过算法将RGB值换算为彩屏16位颜色值并将转换好的实际颜色显示在屏幕上。然后将获取的RGB数值进行颜色比对,并返回对应的RGB颜色标志,根据颜色检测返回标志在彩屏上显示。判断检测的颜色是否和起初存储物品颜色一致,如果一致则控制舵机转动。

1.2 save_one_color函数

save_one_color函数代码如下:

//保存一次颜色,用于后续颜色对比
void save_one_color(void)
{
	u8 key=0;
	u8 i=0;
	u8 j=0;
	u16 RGB_Color=0;
	
	LCD_Clear(BACK_COLOR);
	LCD_ShowFontHZ(10, 10,"嗨小易制作");
	LCD_ShowString(10,40,tftlcd_data.width,tftlcd_data.height,16,"Red:");
	LCD_ShowString(10,60,tftlcd_data.width,tftlcd_data.height,16,"Green:");
	LCD_ShowString(10,80,tftlcd_data.width,tftlcd_data.height,16,"Blue:");
	
	while(1)
	{
		key=KEY_Scan(0);
		if(key==KEY0_PRESS)
		{
			color.save_color=j;
			BEEP=1;//提示音
			delay_ms(300);
			BEEP=0;
			break;	
		}
		//获取RGB颜色值
		read_rgb_color_data();
		//显示RGB颜色数据
		LCD_ShowxNum(10+4*8,40,color.rgb_dat[0],3,16,0);
		LCD_ShowxNum(10+6*8,60,color.rgb_dat[1],3,16,0);
		LCD_ShowxNum(10+5*8,80,color.rgb_dat[2],3,16,0);	
		//转换成屏幕的16位颜色值
		RGB_Color = 0x0000;
		RGB_Color |=(unsigned long) color.rgb_dat[0]*1000/8225<<11;		
		RGB_Color |=(unsigned long) color.rgb_dat[1]*1000/4047<<5;	  
		RGB_Color |=(unsigned long) color.rgb_dat[2]*1000/8225;
		LCD_Fill(10,120,200,250,RGB_Color);
		
		//显示识别颜色
		j=color_check(color.rgb_dat[0],color.rgb_dat[1],color.rgb_dat[2]);
		switch(j)
		{
			case COL_RED: 
				LCD_ShowString(180,10,tftlcd_data.width,tftlcd_data.height,24,"RED  ");
				break;
			case COL_GREEN: 
				LCD_ShowString(180,10,tftlcd_data.width,tftlcd_data.height,24,"GREEN");
				break;
			case COL_BLUE: 
				LCD_ShowString(180,10,tftlcd_data.width,tftlcd_data.height,24,"BLUE ");
				break;
			case COL_OTHER: 
				LCD_ShowString(180,10,tftlcd_data.width,tftlcd_data.height,24,"OTHER");
				break;
		}			
	}
}

该函数的实现比较简单,主要将获取到的RGB数据通过算法转换为LCD的16位彩屏颜色数值并显示,然后检测按键是否按下,按键KEY0按下则保存检测的颜色数值用于后续物品颜色比对。

实验现象

首先将硬件连接好,程序下载成功后,实验现象如下:系统运行后,进入白平衡校准,需提前一张白色卡纸(不透光)放在传感器1-2cm位置,蜂鸣器发出提示音。开始存储筛选的颜色,此时LCD会显示RGB颜色数值,并根据数值识别红、绿、蓝及其它颜色,选择要识别的颜色后按KEY0键保存,蜂鸣器发出提示音结束。进入颜色识别,当用保存的颜色色卡放置在传感器前,舵机开启一次选择物品,当其它颜色则无操作。整个过程LCD会显示识别的颜色及RGB值。
①准备白平衡校准
基于单片机的TCS230颜色识别物品分类设计_第6张图片
基于单片机的TCS230颜色识别物品分类设计_第7张图片
②物品颜色取样,然后识别到该颜色则控制舵机旋转
基于单片机的TCS230颜色识别物品分类设计_第8张图片
③其他颜色显示,颜色与取样颜色不对,则舵机无动作
基于单片机的TCS230颜色识别物品分类设计_第9张图片

联系作者

作者B站链接:https://space.bilibili.com/444388619
可提供手把手教学服务,资料获取请联系作者QQ:3443792007
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

你可能感兴趣的:(单片机,嵌入式硬件,c语言,stm32,51单片机)