使用颜色传感器
文章目录
- 使用颜色传感器
- 前言
- 一、原理
- 二、实现代码
- 现象

前言
TCS3200颜色传感器是一个全彩色检测器,包括一块TAOS TCS3200RGB感应芯片和4个白光LED灯,TCS3200可以在一定范围内检测和测量几乎所有的可见光。适用于色度计测量和应用领域。如彩色印刷、医疗诊断、计算机彩色监器校准、油漆、纺织品、化妆品、印刷材料的过程控制。
一、原理
通常看到的物体颜色实际上是物体表面吸收白光(阳光)的一部分有色成分,反射的另一部分有色光在人眼中的反应。白色是由各种频率的可见光组成的,也就是说,白光含有各种颜色的如红色)R、黄Y、绿G、青V、蓝B、紫P)。德国物理学家赫姆霍兹(Helinholtz)根据三原色理论,各种颜色由不同比例的三原色(红、绿、蓝)混合而成。
从上述三原色感应原理可以看出,如果你知道构成各种颜色的三原色值,你就可以知道被测物体的颜色。对于TCS3200D 在选择颜色滤波器时,它只允许特定的原色通过,以防止其它原色通过。例如,当选择红色滤波器时,只有红色可以通过,蓝色和绿色可以阻止,从而获得红色光的光强;同样,选择其他滤波器可以获得蓝色和绿色光的光强。通过这三个光强值,可以分析反射TCS3200传感器上的光色。 TCS3200D传感器有红、绿、蓝、清除四种滤光器,可通过其引脚S2和S选择滤波器模式,如下图所示。 TCS3200D当被测物体反射光的红、绿、蓝三色光通过相应的滤波器到达具有可编程色光到电信号频率的转换器时TAOS TCS3200RGB当感应芯片时,其内置振荡器输出方波,方波频率与感应光强成比例,光越强,内置振荡器方波频率越高。TCS3200传感器OUT其输出信号的频率也与内置振荡器的频率成比例,其比率因子可以依靠其引脚S0和S1的高低电平来选择,如下图。 我把这个测试实验TCS3200传感器OUT引脚输出信号频率与内置振荡器频率比因子设置为2%,但如何通过输出频率比因子OUT引脚输出信号频率转换被测物体由三原色光强组成RGB颜色值?还需要白平衡校正才能得到RGB比例因子! 白平衡校正方法是将白色物体放置在:TCS在3200色传感器下,两者相距10mm左右传感器上的四个白光LED灯,用STM32控制器定时器设置固定时间1s,然后选择三原色滤波器,使被测物体的反射光分别通过滤波器,计算1s时间内三色光对应的TCS3200传感器OUT输出信号脉冲数(单位时间脉冲数包含输出信号的频率信息),然后通过正比算式获得白色物体RGB值255和三色光脉冲的比例因子。通过白平衡校正获得的白平衡校正RGB比例因子对应于红、绿、蓝三色光的其他颜色对象TCS3200输出信号1s内脉冲数乘以R、G、B比例因子可以转换被测物体RGB标准值了。
二、实现代码
main.c
#include "stm32f10x.h" #include "sys.h" #include "usart.h" #include "delay.h" #include "led.h" #include "key.h" #include "exti.h" #include "timer.h" #include "lcd1602.h" #include "tcs3200.h" #include "stdio.h" #include "stmflash.h" #include "beep.h" float R=0,G=0,B=0; u16 Rgena,Ggena,Bgena; 16 Ramount,Gamount,Bamount;
u16 amount;
u16 d[3];
u16 s;
u16 y;
u8 red_flag;
u8 white_flag=0;
//显示函数
//读初值
void dcz()
{
STMFLASH_Read(0x08004000,(u16*)d,3);
Rgena=d[0];
Ggena=d[1];
Bgena=d[2];
}
int main()
{
delay_init(); //延时函数初始化
SystemInit();
EXTIX_Init(); //外部中断初始化
LCD1602_Init(); //1602初始
KEY_Init();
BEEP_Init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
tcs3200_init(1,1);
dcz();
while(1)
{
s=KEY0;
if(s==0)
{
white_flag=1;
whitebalance(); //白平衡
}
if(KEY1==0)
{
red_flag=1;
}
delay_ms(50);
R=tcs3200_RED();
G=tcs3200_GREEN();
B=tcs3200_BLUE();
printf("r:%f g;%f b;%f \r\n",R,G,B);
if(red_flag==1)
{
if((170<R&&R<200)&&(70<G&&G<95)&&(100<B&&B<130))
{
BEEP=1;
LCD1602_Show_Str(10,0,"Red");
}else
{
BEEP=0;
LCD1602_Show_Str(10,0," ");
}
}
}
}
tcs3200.c
#include "tcs3200.h"
#include "exti.h"
#include "delay.h"
#include "tcs3200.h"
#include "stmflash.h"
void tcs3200_init(u8 s0,u8 s1)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PB端口时钟
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
// GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
S0=s0;
S1=s1;
}
/******************************************* * * 白平衡 * *******************************************/
void whitebalance(void)
{
u16 x[3];
EXTIX_Init(); //外部中断初始化
S2=0;S3=0;//红色通道
amount=0; //开始计数
delay_ms(10);
Rgena = amount; //求出红色因子
amount=0;
x[0]=Rgena;
// STMFLASH_Write(0x08004000,(u16*)x[0],1);
// 0x08000000
//----------------------------------
S2=1;S3=1;//绿色通道
amount=0;
delay_ms(10);
Ggena = amount; //求出绿色因子
amount=0;
x[1]=Ggena;
// STMFLASH_Write(0x08004100,(u16*)x1[0],1);
//----------------------------------
S2=0;S3=1;//蓝色通道
amount=0;
delay_ms(10);
Bgena = amount; //求出蓝色因子
amount=0;
x[2]=Bgena;
STMFLASH_Write(0x08004000,(u16*)x,3);
S2=1;S3=0;//关闭通道
}
u16 tcs3200_RED(void)
{
S2=0;S3=0;
amount=0;
delay_ms(10);
Ramount=(u32) amount*255/Rgena; //取R值
if(Ramount>255) Ramount = 255;
return Ramount;
// amount=0;
}
u16 tcs3200_GREEN(void)
{
S2=1;S3=1;
amount=0;
delay_ms(10);
Gamount=(u32) amount*255/Ggena; //取G值
if(Gamount>255) Gamount = 255;
return Gamount;
// amount=0;
}
u16 tcs3200_BLUE(void)
{
S2=0;S3=1;
amount=0;
delay_ms(10);
Bamount=(u32) amount*255/Bgena;//去B值
if(Bamount>255) Bamount = 255;
return Bamount;
// amount=0;
}
//void aj(void)
//{
// Rgena=255;
// Ggena=255;
// Bgena=255;
//}
tsc3200.h
#ifndef __TCS3200_H
#define __TCS3200_H
#include "sys.h"
extern u16 amount;
extern u16 Rgena,Ggena,Bgena;
extern u16 Ramount,Gamount,Bamount;
#define S0 PBout(10)
#define S1 PBout(12)
#define S2 PBout(14)
#define S3 PBout(13)
#define OUT PBin(15)
void tcs3200_init(u8 s0,u8 s1);
void whitebalance(void);
void aj(void);
u16 tcs3200_RED(void);
u16 tcs3200_GREEN(void);
u16 tcs3200_BLUE(void);
#endif
现象
可以通过串口看到颜色识别的状态。