jinglixixi 发表于 2023-1-16 17:13

[ LKS32MC037E开发板评测 ]+彩色LCD屏与色彩识别指示器

本帖最后由 jinglixixi 于 2023-1-16 17:16 编辑

LKS32MC037E开发板是专为电机驱动而设计的,但这不妨碍它在其它方面的应用。尽管LKS32MC037E的引脚资源不很多,程序存储空间也只有32K,然而它还是能够完成一定的功能设计的。这里就介绍一种可以进行色彩识别和样本标识的作品,其器件构成如图1所示。图1 器件构成
其中,为标识样本的色彩值,所采用的显示屏为彩色LCD屏,其几何尺寸为0.96寸,显示分辨率为160*80像素点,其实现的显示效果如图2所示。图2LCD屏显示效果
LCD屏与开发板的连接关系如下:SCL---P14SDA---P16RST---P04DC ---P05CS ---P06BL ---P07
相关引脚输出高低电平的语句定义为:#define OLED_SCLK_Set()   GPIO_WriteBit(GPIO1, GPIO_Pin_4,1)   //CLK#define OLED_SCLK_Clr()   GPIO_WriteBit(GPIO1, GPIO_Pin_4,0)#define OLED_SDIN_Set()   GPIO_WriteBit(GPIO1, GPIO_Pin_6,1)   //DIN#define OLED_SDIN_Clr()   GPIO_WriteBit(GPIO1, GPIO_Pin_6,0)#define OLED_RST_Set()    GPIO_WriteBit(GPIO0, GPIO_Pin_4,1)   //RES#define OLED_RST_Clr()    GPIO_WriteBit(GPIO0, GPIO_Pin_4,0)#define OLED_DC_Set()   GPIO_WriteBit(GPIO0, GPIO_Pin_5,1)   //DC#define OLED_DC_Clr()   GPIO_WriteBit(GPIO0, GPIO_Pin_5,0)#define OLED_CS_Set()   GPIO_WriteBit(GPIO0, GPIO_Pin_6,1)   //CS#define OLED_CS_Clr()   GPIO_WriteBit(GPIO0, GPIO_Pin_6,0)#define OLED_BLK_Set()    GPIO_WriteBit(GPIO0, GPIO_Pin_7,1)   //BLK#define OLED_BLK_Clr()    GPIO_WriteBit(GPIO0, GPIO_Pin_7,0)

对应的引脚功能配置函数是:void LCD_APP(void)
{
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_Pin =GPIO_Pin_6;
    GPIO_InitStruct.GPIO_PuPd =GPIO_PuPd_UP;
    GPIO_Init(GPIO1, &GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_Pin =GPIO_Pin_4;
    GPIO_InitStruct.GPIO_PuPd =GPIO_PuPd_UP;
    GPIO_Init(GPIO1, &GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_Pin =GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
    GPIO_InitStruct.GPIO_PuPd =GPIO_PuPd_UP;
    GPIO_Init(GPIO0, &GPIO_InitStruct);
}

实现SPI方式方式字节数据的函数为:void LCD_Writ_Bus(u8 dat)
{
    u8 i;
    OLED_CS_Clr();
    for(i=0;i<8;i++)
    {
      OLED_SCLK_Clr();
      if(dat&0x80)
      {
                         OLED_SDIN_Set();
      }
      else
      {
             OLED_SDIN_Clr();
      }
      OLED_SCLK_Set();
      dat<<=1;
    }
    OLED_CS_Set();
}

以指定色彩清除屏幕的函数是:void LCD_Clear(u16 Color)
{
    u16 i,j;
    LCD_Address_Set(0,0,LCD_W-1,LCD_H-1);
    for(i=0;i<LCD_W;i++)
    {
       for (j=0;j<LCD_H;j++)
       {
          LCD_WR_DATA(Color);
       }
    }
}

实现图2所示效果的主程序为:int main(void) {
    SoftDelay(50000);
    __disable_irq();
    Hardware_init();
    sys_init();
    __enable_irq();
    OLED_BLK_Set();
    Lcd_Init();
    LCD_Clear(RED);
    BACK_COLOR=RED;
    LCD_ShowString(40,10,"LKS32MC037E",YELLOW);
    LCD_ShowString(40,30,"LCD Test",YELLOW);
    LCD_ShowString(40,55,"jinglixixi",YELLOW);
    while (1);
}

为了进行色彩的识别与标识,所用的色彩传感器为TCS34725,它是一款I2C接口的器件。在测试时,发现其一直无法正常工作,这时才想到是功率底板的问题。

由图3可知,P0.4、P0.5、P0.6是被反电动势检测线路所占用的。图3反电动势检测线路

此外,P0.7是被电压检测线路占用的,见图4所示。图4电压检测线路

这样就需要重新规划引脚的使用,并脱离开功率底板的约束。最终分配给TCS34725与开发板相连接的引脚关系为:P06 ---SCLP08---SDA

为此,TCS34725的引脚功能配置函数为:void TCS34725_I2C_Init()
{
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_Pin =   GPIO_Pin_6|GPIO_Pin_8;
    GPIO_InitStruct.GPIO_PuPd =GPIO_PuPd_UP;
    GPIO_Init(GPIO0, &GPIO_InitStruct);
}

设置数据引脚为输入、输出模式的函数分别为:void TCS_SDA_IN()
{
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStruct.GPIO_Pin =GPIO_Pin_8;
    GPIO_InitStruct.GPIO_PuPd =GPIO_PuPd_UP;
    GPIO_Init(GPIO0, &GPIO_InitStruct);
}

void TCS_SDA_OUT()
{
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_Pin =GPIO_Pin_8;
    GPIO_InitStruct.GPIO_PuPd =GPIO_PuPd_UP;
    GPIO_Init(GPIO0, &GPIO_InitStruct);
}

TCS34725的初始化函数为:u8 TCS34725_Init(void)
{
      u8 id=0;
      TCS34725_I2C_Init();
      TCS34725_Read(TCS34725_ID, &id, 1);
      if(id==0x4D | id==0x44)
      {
                TCS34725_SetIntegrationTime(TCS34725_INTEGRATIONTIME_50MS);
                TCS34725_SetGain(TCS34725_GAIN_1X);
                TCS34725_Enable();
                return 1;
      }
      return 0;
}

其实现色彩识别的函数为:u8 TCS34725_GetRawData(COLOR_RGBC *rgbc)
{
      u8 status = TCS34725_STATUS_AVALID;
      TCS34725_Read(TCS34725_STATUS, &status, 1);
      if(status & TCS34725_STATUS_AVALID)
      {
                rgbc->c = TCS34725_GetChannelData(TCS34725_CDATAL);      
                rgbc->r = TCS34725_GetChannelData(TCS34725_RDATAL);      
                rgbc->g = TCS34725_GetChannelData(TCS34725_GDATAL);      
                rgbc->b = TCS34725_GetChannelData(TCS34725_BDATAL);
                return 1;
      }
      return 0;
}

在OLLED屏的配合下,TCS34725终于有检测结果了,见图5和图6所示。图5 检测电路
图6检测结果
此时,再将LCD屏显示与TCS34725传感器结合起来就可以得到色彩标识的功效,见图7所示。图7 色彩标识效果
实现图7所示效果的主程序为:int main(void) {
    u16 rv,gv,bv,fv;
    SoftDelay(50000);
    __disable_irq();
    Hardware_init();
    sys_init();
    LCD_APP();
    Lcd_Init();
    LCD_Clear(BLACK);
    LCD_ShowString(20,10,"LKS32MC037E",RED);
    LCD_ShowString(20,30,"R:G:B:",YELLOW);
    LCD_color(RED);
    LCD_box(109,29,130,50);
    TCS34725_Init();
    TCS34725_GetRawData(&rgb);
    while(1)
    {
                TCS34725_GetRawData(&rgb);
                rv=rgb.r*255/rgb.c;
                gv=rgb.g*255/rgb.c;
                bv=rgb.b*255/rgb.c;
                LCD_ShowNum(0,50,rv,4,YELLOW);
                LCD_ShowNum(32,50,gv,4,YELLOW);
                LCD_ShowNum(64,50,bv,4,YELLOW);
                fv=((rv>>3)<<11)+((gv>>2)<<5)+(bv>>3);
                LCD_color(fv);
                SoftDelay(500000);
      }
}

此外,对其它色彩的识别效果如图8至图10所示。图8 识别蓝色
图9 识别粉色
图10 识别浅绿色

至此,LKS32MC037E开发板的测评目标就完成了,整体来说效果还是较为理想的。在此再次对活动的组织者和凌鸥创芯的产品表示感谢!

weifeng90 发表于 2023-1-16 22:52

LKS32MC037E输出的直接是RGB值吗?

jinglixixi 发表于 2023-1-17 12:26

weifeng90 发表于 2023-1-16 22:52
LKS32MC037E输出的直接是RGB值吗?

TCS34725彩色传感器输出的是RGB值

麻花油条 发表于 2023-1-18 14:48

灵敏度还是不错的

比神乐 发表于 2023-2-11 15:29

我也买了一个TCS34725颜色传感器,商家给的代码是arduino例程,我根本看不懂。
我从网上下载了一个STM32的例程,可是读出的数据不准。
jinglixixi大神,能分享一下你的代码吗?谢谢!
我的邮箱chenbingjy@sina.com。
还有,我看你识别颜色的时候还用手摁着,必须要这样吗?
我的那个一接上电就放光。

jinglixixi 发表于 2023-2-11 22:40

比神乐 发表于 2023-2-11 15:29
我也买了一个TCS34725颜色传感器,商家给的代码是arduino例程,我根本看不懂。
我从网上下载了一个STM32的 ...

之所以用手摁着是因为在使用时最好在传感器与检测物前有个支架来固定其相对位置,此外由于是靠反射光来检测物体的色彩亮度对识别的结果有一定的影响,要调整好一定的距离。
至于一接上电就放光,是因为已启动了补光的LED,由于其色彩变黄对识别色彩会有一定的影响,可酌情将其挡上。
arduino例程没啥参考意义,我用的也是STM32例程。

jinglixixi 发表于 2023-2-11 22:49

比神乐 发表于 2023-2-11 15:29
我也买了一个TCS34725颜色传感器,商家给的代码是arduino例程,我根本看不懂。
我从网上下载了一个STM32的 ...

也可查看:
色彩识别与样本色彩显示器(含程序)
https://bbs.21ic.com/icview-3275564-1-1.html

比神乐 发表于 2023-2-12 09:41

jinglixixi 发表于 2023-2-11 22:40
之所以用手摁着是因为在使用时最好在传感器与检测物前有个支架来固定其相对位置,此外由于是靠反射光来检 ...

谢谢!

数据采集存储 发表于 2023-2-14 10:47

那个屏幕是在哪里买的?看上去很漂亮。

jinglixixi 发表于 2023-2-14 12:56

数据采集存储 发表于 2023-2-14 10:47
那个屏幕是在哪里买的?看上去很漂亮。

某宝0.96寸LCD彩屏

chenqianqian 发表于 2023-2-15 09:57

就是RGB传感器吗?这个测量精度咋样呢?

jinglixixi 发表于 2023-2-15 12:45

chenqianqian 发表于 2023-2-15 09:57
就是RGB传感器吗?这个测量精度咋样呢?

还行,比前期的色彩传感器功能要强。

便携手到老 发表于 2023-2-16 13:36

这个彩屏接口还是不错的,不知道在哪里可以买开发板。

jinglixixi 发表于 2023-2-17 10:11

便携手到老 发表于 2023-2-16 13:36
这个彩屏接口还是不错的,不知道在哪里可以买开发板。

开发板是活动申请的,可以到某宝看看有没有。
页: [1]
查看完整版本: [ LKS32MC037E开发板评测 ]+彩色LCD屏与色彩识别指示器