|
|

楼主 |
发表于 2019-7-22 11:33:16
|
显示全部楼层
- /*
- 【Arduino】66种传感器模块系列实验(64)
- 实验六十四: TCS3200D颜色识别传感器(可编程彩色光频识别转换器模块)
- */
- #include <TimerOne.h>//申明库文件
- //把TCS3200颜色识别传感器各控制引脚连到Arduino数字端口
- #define S0 6 //物体表面的反射光越强,TCS3200内置震荡器产生的方波频率越高,
- #define S1 5 //SO和S1的组合决定输出信号频率比例因子,比例因子为2%
- //比例因子为TCS3200传感器OUT引脚输出信号频率与其内置振荡器频率之比
- #define S2 4 //S2和S3的组合决定让红、绿、蓝,哪种光线通过滤波器
- #define S3 3
- #define OUT 2 //TCS3200颜色传感器输出信号
- //在中断函数中纪录TCS3200输出信号的脉冲个数
- int g_count = 0; // 计算与反射光相对应TCS3200颜色传感器输出信号的脉冲数
- int g_array[3]; // 存储RGB值
- int g_flag = 0; // 滤波器模式选择顺序标志
- float g_SF[3]; // 从TCS3200输出信号的脉冲数转换为RGB标准值的RGB比例因子
- //初始化TSC3200各控制引脚的输入输出模式
- //设置TCS3200的内置振荡器方波频率与其输出信号频率的比例因子为2%
- void TSC_Init()
- {
- pinMode(S0, OUTPUT);
- pinMode(S1, OUTPUT);
- pinMode(S2, OUTPUT);
- pinMode(S3, OUTPUT);
- pinMode(OUT, INPUT);
- digitalWrite(S0, LOW);
- digitalWrite(S1, HIGH);
- }
- //选择滤波器模式,决定让红、绿、蓝,哪种光线通过滤波器
- void TSC_FilterColor(int Level01, int Level02)
- {
- if(Level01 != 0)
- Level01 = HIGH;
- if(Level02 != 0)
- Level02 = HIGH;
- digitalWrite(S2, Level01);
- digitalWrite(S3, Level02);
- }
- //中断函数,计算TCS3200输出信号的脉冲波
- void TSC_Count()
- {
- g_count ++ ;
- }
- //定时器中断函数,每1S中断后,把该时间内的红、绿、蓝三种光线通过滤波器时,
- //TCS3200输出信号脉冲个数分别存储到数组g_array[3]的相应元素变量中
- void TSC_Callback()
- {
- switch(g_flag)
- {
- case 0:
- Serial.println("->WB Start");
- TSC_WB(LOW, LOW); //选择让红色光线通过滤波器的模式
- break;
- case 1:
- Serial.print("->Frequency R=");
- Serial.println(g_count); //打印1s内的红光通过滤波器时,TCS3200输出的脉冲个数
- g_array[0] = g_count; //存储1S内的红光通过滤波器时,TCS3200输出的脉冲个数
- TSC_WB(HIGH, HIGH); //选择让绿色光线通过滤波器的模式
- break;
- case 2:
- Serial.print("->Frequency G=");
- Serial.println(g_count); //打印1S内的绿光通过滤波器时,TCS3200输出的脉冲个数
- g_array[1] = g_count; //存储1S内的绿光通过滤波器时,TCS3200输出的脉冲个数
- TSC_WB(LOW, HIGH); //选择让蓝色光线通过滤波器的模式
- break;
- case 3:
- Serial.print("->Frequency B=");
- Serial.println(g_count); //打印1s内的蓝光通过滤波器时,TCS3200输出的脉冲个数
- Serial.println("->WB End");
- g_array[2] = g_count; //存储1s内的蓝光通过滤波器时,TCS3200输出的脉冲个数
- TSC_WB(HIGH, LOW); //选择无滤波器的模式
- break;
- default:
- g_count = 0; //计数值清零
- break;
- }
- }
- //设置反射光中红、绿、蓝三色光分别通过滤波器时如何处理数据的标志
- //该函数被TSC_Callback()调用
- void TSC_WB(int Level0, int Level1) //White Balance
- {
- g_count = 0; //计数值清零
- g_flag ++; //输出信号计数标志
- TSC_FilterColor(Level0, Level1); //滤波器模式
- Timer1.setPeriod(1000000); // 设置输出信号脉冲计数时长1s
- }
- //初始化
- void setup()
- {
- TSC_Init();
- Serial.begin(9600); //启动串口通信
- Timer1.initialize(); // defaulte is 1s缺省是1秒
- Timer1.attachInterrupt(TSC_Callback); //设置定时器1的中断,中断调用函数为TSC_Callbace()
- //设置TCS3200输出信号的上跳沿触发中断,中断调用函数为TSC_Count()
- attachInterrupt(0, TSC_Count, RISING);
- delay(4000); //延时4s,以等待被测物体红、绿、蓝三色在1s内的TCS3200输出信号脉冲计数
- //通过白平衡测试,计算得到白色物体RGB值255与1s内三色光脉冲数的RGB比例因子
- for(int i=0; i<3; i++)
- Serial.println(g_array[i]);
- g_SF[0] = 255.0/ g_array[0]; //红色光比例因子
- g_SF[1] = 255.0/ g_array[1] ; //绿色光比例因子
- g_SF[2] = 255.0/ g_array[2] ; //蓝色光比例因子
- //打印白平衡后的红、绿、蓝三色的RGB比例因子
- Serial.println(g_SF[0]);
- Serial.println(g_SF[1]);
- Serial.println(g_SF[2]);
- }
- //红、绿、蓝三色光分别对应的1s内TCS3200输出脉冲数乘以相应的比例因子就是RGB标准值
- //打印被测物体的RGB值
- void loop()
- {
- g_flag = 0;//每获得一次被测物体的RGB颜色值时需要4s
- for(int i=0; i<3; i++) //打印被测物体的RGB值
- Serial.println(int(g_array[i] * g_SF[i]));
- delay(4000);
- }
复制代码 |
|