[活动专区] 【杰发科技AC7802x测评】+色彩识别仪

[复制链接]
2112|19
 楼主| jinglixixi 发表于 2023-8-1 19:28 | 显示全部楼层 |阅读模式
#申请原创# @21小跑堂

AC7802x开发板是一款十分便于功能移植的开发板,先前曾在其它开发板上实现过以色彩传感器检测色彩的功能,这次将它移植到AC7802x开发板上进行了一下尝试,实践证明实现起来还是比较容易的,其状态构成如图1所示。
1.jpg
1 整体构成

这里所所用的色彩传感器是TCS34725,它是一款以I2C接口工作的器件,并在功能模块上配置了LED灯以照亮检测目标。
在显示方面,则仍使用0.96寸的彩色LCD显示屏,它与开发板的连接关系为:
CLK---PB5
DIN---PB3
RES--PB4
DC ---PB6
CS ---PA8
BLK--- PB7

色彩传感器与开发板的连接关系为:
SDA ----PA0
SCL ----PA1

所用引脚输出高低电平的定义为:
#defineTCS_SCL_H       GPIO_SetPinLevel(GPIOA,GPIO_PIN1, GPIO_LEVEL_HIGH)
#defineTCS_SCL_L       GPIO_SetPinLevel(GPIOA,GPIO_PIN1, GPIO_LEVEL_LOW)
#defineTCS_SDA_H       GPIO_SetPinLevel(GPIOA,GPIO_PIN0, GPIO_LEVEL_HIGH)
#defineTCS_SDA_L       GPIO_SetPinLevel(GPIOA,GPIO_PIN0, GPIO_LEVEL_LOW)

为读取数据所作的相应定义为:
#defineTCS_SDA_READ    GPIO_GetPinLevel(GPIOA,GPIO_PIN0)

实现输入、输出模式设置的语句定义为:
#defineTCS_SDA_IN()     GPIO_SetDir(GPIOA, GPIO_PIN0, GPIO_IN)
#defineTCS_SDA_OUT()   GPIO_SetDir(GPIOA,GPIO_PIN0, GPIO_OUT)

色彩传感器的引脚配置函数为:
  1. void TCS34725_I2C_Init()
  2. {
  3.           GPIO_SetFunc(GPIOA, GPIO_PIN0,GPIO_FUN0);
  4.           GPIO_SetDir(GPIOA, GPIO_PIN0,GPIO_OUT);
  5.           GPIO_SetFunc(GPIOA, GPIO_PIN1,GPIO_FUN0);
  6.           GPIO_SetDir(GPIOA, GPIO_PIN1,GPIO_OUT);
  7. }

实现I2C发送起始和停止信号的函数为:
  1. void TCS34725_I2C_Start()
  2. {
  3.         TCS_SDA_OUT();
  4.         TCS_SDA_H;
  5.         TCS_SCL_H;
  6.         delay_us(4);
  7.         TCS_SDA_L;
  8.         delay_us(4);
  9.         TCS_SCL_L;
  10. }

  11. void TCS34725_I2C_Stop()
  12. {
  13.         TCS_SDA_OUT();
  14.         TCS_SCL_L;
  15.         TCS_SDA_L;
  16.         delay_us(4);
  17.         TCS_SCL_H;
  18.         TCS_SDA_H;
  19.         delay_us(4);
  20. }

进行字节数据发送与接收的函数为:
  1. void TCS34725_I2C_Send_Byte(u8 byte)
  2. {
  3.         u8 i;
  4.         TCS_SDA_OUT();
  5.         TCS_SCL_L;
  6.         for(i = 0; i < 8; i++)
  7.         {
  8.                 if(((byte&0x80)>>7)==1)TCS_SDA_H;
  9.                 else
  10.                         TCS_SDA_L;
  11.                 byte <<= 1;
  12.                 delay_us(2);
  13.                 TCS_SCL_H;
  14.                 delay_us(2);
  15.                 TCS_SCL_L;
  16.                 delay_us(2);
  17.         }
  18. }

  19. u8 TCS34725_I2C_Read_Byte(u8 ack)
  20. {
  21.         u8 i,receive = 0;
  22.         TCS_SDA_IN();
  23.         for(i = 0; i < 8; i++)
  24.         {
  25.                 TCS_SCL_L;
  26.                 delay_us(2);
  27.                 TCS_SCL_H;
  28.                 receive <<= 1;
  29.                 if(TCS_SDA_READ) receive++;
  30.                 delay_us(1);
  31.         }
  32.         if (!ack) TCS34725_I2C_NACK();
  33.         else TCS34725_I2C_ACK();
  34.         return receive;
  35. }

进行传感器初始化的函数为:
  1. u8 TCS34725_Init(void)
  2. {
  3.         u8 id=0;
  4.         TCS34725_I2C_Init();
  5.         TCS34725_Read(TCS34725_ID, &id, 1);
  6.         if(id==0x4D | id==0x44)
  7.         {
  8.                         TCS34725_SetIntegrationTime(TCS34725_INTEGRATIONTIME_50MS);
  9.                         TCS34725_SetGain(TCS34725_GAIN_1X);
  10.                         TCS34725_Enable();
  11.                         return 1;
  12.                 }
  13.         return 0;
  14. }

读取色彩检测值的函数为:
  1. u8 TCS34725_GetRawData(COLOR_RGBC *rgbc)
  2. {
  3.         u8 status = TCS34725_STATUS_AVALID;
  4.        
  5.         TCS34725_Read(TCS34725_STATUS, &status, 1);
  6.        
  7.         if(status & TCS34725_STATUS_AVALID)
  8.         {
  9.                 rgbc->c = TCS34725_GetChannelData(TCS34725_CDATAL);       
  10.                 rgbc->r = TCS34725_GetChannelData(TCS34725_RDATAL);       
  11.                 rgbc->g = TCS34725_GetChannelData(TCS34725_GDATAL);       
  12.                 rgbc->b = TCS34725_GetChannelData(TCS34725_BDATAL);
  13.                 return 1;
  14.         }
  15.         return 0;
  16. }

为了满足显示的需要,所配置的矩形框绘制函数为:
  1. void LCD_DrawRectangle(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2)
  2. {
  3.         LCD_DrawLine(x1,y1,x2,y1);
  4.         LCD_DrawLine(x1,y1,x1,y2);
  5.         LCD_DrawLine(x1,y2,x2,y2);
  6.         LCD_DrawLine(x2,y1,x2,y2);
  7. }

所配置的色彩填充函数为:
  1. void LCD_ShowBOX(u16 x1,u16 y1,u16 x2,u16 y2,u16 c)
  2. {
  3.       int i;
  4.       LCD_Address_Set(x1,y1,x2,y2);
  5.       for(i=0;i<N;i++)
  6.       {
  7.             LCD_WR_DATA8(c>>8);
  8.             LCD_WR_DATA8(c&0xff);
  9.       }
  10. }

进行色彩识别检测的主程序为:
  1. int main(void)
  2. {
  3.         u8 R,G,B;
  4.         u16 g;
  5.         InitDelay();
  6.     InitDebug();
  7.     GPIO_LedInit();
  8.     GPIO_KeyInit();
  9.     TIMER_PrdInit();
  10.         mdelay(200);
  11.         LCD_GPIO();
  12.         Lcd_Init();
  13.     BACK_COLOR=BLACK;
  14.         LCD_Clear(BLACK);
  15.     LCD_ShowString(30,5,"TCS34725",YELLOW);
  16.         LCD_ShowString(20,25,"R:",RED);
  17.         LCD_ShowString(52,25,"G:",GREEN);
  18.         LCD_ShowString(84,25,"B:",BLUE);
  19.         LCD_DrawRectangle(119, 23, 140, 45);
  20.         TCS34725_Init();
  21.         while (1)
  22.     {
  23.                   TCS34725_GetRawData(&rgb);
  24.                   RGBtoHSL(&rgb,&hsl);
  25.                   R=255*rgb.r/rgb.c;
  26.                   G=255*rgb.g/rgb.c;
  27.                   B=255*rgb.b/rgb.c;
  28.                   LCD_ShowNum(20,45,R,3,YELLOW);
  29.                   LCD_ShowNum(52,45,G,3,YELLOW);
  30.                   LCD_ShowNum(84,45,B,3,YELLOW);
  31.                   g=(R>>3)<<11;
  32.                   g=g+((G>>2)<<5)+(B>>3);  
  33.                   LCD_ShowBOX(120,24,139,44,g);
  34.                   mdelay(500);
  35.           GPIO_ToggleLedPrd();
  36.     }
  37. }

经程序的编译与下载,其测试效果图2和图3所示,说明该传感器能完成色彩识别的功能。
2.jpg
2 测试绿色

3.jpg
图3测试红色

通过这次对AC7802x开发板测评,证明该开发板是一款非常易于上手的开发板,并在功能移植方面也较为顺利,它是一款值得推荐的开发工具。在此再次对活动的组织者及提供产品的厂家表示衷心地感谢!

kkzz 发表于 2023-8-3 22:09 | 显示全部楼层
TCS34725的测量距离取决于环境光照条件和所采用的物体表面
mmbs 发表于 2023-8-3 22:15 | 显示全部楼层
测量距离应保持在几毫米到几厘米的范围内,以获得准确的测量结果。
tabmone 发表于 2023-8-3 22:23 | 显示全部楼层
在使用之前,确保正确连接传感器的SCL和SDA引脚,并按照规定的通信协议进行初始化和配置。
eefas 发表于 2023-8-3 22:32 | 显示全部楼层
避免直射强光以及防止传感器表面有反光或遮挡物。
burgessmaggie 发表于 2023-8-3 22:41 | 显示全部楼层
可以通过使用已知色温的颜色标准来完成,根据测量值和标准值之间的差异进行校准。
xiaoyaodz 发表于 2023-8-3 22:49 | 显示全部楼层
TCS34725对环境光非常敏感,因此在使用传感器时要注意环境光的影响。
macpherson 发表于 2023-8-3 22:58 | 显示全部楼层
可以使用传感器提供的滤光片来减少环境光的影响。
chenci2013 发表于 2023-8-4 14:22 | 显示全部楼层
为了获得准确的颜色测量结果,可以对TCS34725进行色温校准。
usysm 发表于 2023-8-4 14:29 | 显示全部楼层
TCS34725可以检测的光照强度范围为0到10000Lux,需要根据实际应用场景调整光照强度范围。
belindagraham 发表于 2023-8-4 14:43 | 显示全部楼层
TCS34725输出RGB原始数据,需要进行适当的解析和校准才能获得具体的颜色数值。
earlmax 发表于 2023-8-4 14:51 | 显示全部楼层
TCS34725的测量结果可能会受到周围环境光的影响。在进行颜色测量时,尽量避免直接照射强光源,或者采取适当的环境光抑制措施。
eefas 发表于 2023-8-4 15:00 | 显示全部楼层
TCS34725在不同温度下会出现温度漂移现象,需要在代码中对温度漂移进行补偿,以保证光照强度的准确性。
tifmill 发表于 2023-8-4 15:10 | 显示全部楼层
在使用TCS34725时,还需要注意防止光照干扰、避免光照强度过高等问题,以保证传感器的正常工作。
phoenixwhite 发表于 2023-8-4 15:19 | 显示全部楼层
TCS34725测量的颜色数据以原始的红、绿、蓝和透明度值(可选)形式返回。根据应用需求,可能需要对这些原始数据进行解析和转换,以获取实际的颜色值。
 楼主| jinglixixi 发表于 2023-8-4 15:22 | 显示全部楼层
哈哈,大家都积累了许多的使用经验,说明这个传感器还是不错的。
kkzz 发表于 2023-8-4 15:27 | 显示全部楼层
可能需要对TCS34725的测量结果进行进一步的数据处理、滤波、校正或应用特定的算法。
earlmax 发表于 2023-8-4 15:37 | 显示全部楼层
为了减小温度的影响,可以通过使用传感器提供的温度传感功能进行温度补偿。
mattlincoln 发表于 2023-8-4 15:45 | 显示全部楼层
TCS34725是一种数字颜色传感器,用于检测环境中的颜色和光线。
pangb 发表于 2023-8-27 10:34 | 显示全部楼层
可以使用传感器提供的滤光片来减少环境光的影响。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部