0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于CW32系列MCU的GY-33颜色识别模块设计

武汉芯源半导体 来源:武汉芯源半导体 2023-09-27 13:51 次阅读

一、简介

1.GY-33是一种基于TCS34725颜色传感器的颜色识别模块。TCS34725是一种高精度光学传感器,能够检测红、绿、蓝三个基本色的光谱信息,从而实现对物体颜色的准确识别,该模块的具体应用场景包括以下几个方面:

(1)电子设备颜色校准:在电子设备制造过程中,颜色一致性非常重要。使用GY-33模块可以帮助制造商检测和校准电子设备的颜色,确保不同设备之间的颜色表现一致。

(2)色彩分析和精确匹配:GY-33模块在颜色分析和匹配方面有广泛应用。例如,在印刷行业中,可以使用该模块来检测和匹配颜色样本,从而确保印刷品的准确颜色表现。

(3)机器人视觉系统:GY-33模块可以用于机器人视觉系统,帮助机器人在环境中对不同颜色的物体进行识别和分类。这在物流、仓储和自动导航系统中非常有用,机器人可以根据物体的颜色属性执行相应的任务。

二、所需物料

本实验使用到了CW32F030C8小蓝板、GY-33颜色识别模块、0.96寸OLED显示屏,RGB全彩LED模块、轻触开关模块及Keil5开发环境。

0f9e45be-5cf7-11ee-939d-92fbcf53809c.png

CW32F030C8小蓝板

0fbb42ae-5cf7-11ee-939d-92fbcf53809c.png
GY-33颜色识别模块
0fc88cca-5cf7-11ee-939d-92fbcf53809c.png
RGB全彩LED模块

0fe5ae5e-5cf7-11ee-939d-92fbcf53809c.png

实物展示

【GY-33与单片机连线】:VCC<-->+3.3V

GND<-->GND

DR<-->PA5

CT<-->PA4

【LED与单片机连线】:V<-->+3.3V

R<-->PA0

G<-->PA1

B<-->PA2

【轻触开关与单片机连线】:VCC<-->+3.3V

GND<-->GND

OUT<-->PB9

此模块有两种方式读取数据,即串口UART或者 MCU_IIC,本次实验采用MCU_IIC的方式。

0ff81134-5cf7-11ee-939d-92fbcf53809c.png

100e91e8-5cf7-11ee-939d-92fbcf53809c.png

101da1b0-5cf7-11ee-939d-92fbcf53809c.png

有简单的7种颜色识别,单片机不参与数据处理工作,不需要计算RGB值,直接读取吧 数据即可。需要特别注意的是:

103e020c-5cf7-11ee-939d-92fbcf53809c.png

1052d2ea-5cf7-11ee-939d-92fbcf53809c.png

三、核心代码

main.c:
#include "main.h"
#include "RGB.h"
#include "GTIM.h"
#include "Delay.h"
#include "GY_33.h"
#include "OLED.h"
#include "Key.h"
#include "BTIM.h"


#define LENGTH 3   //读取数据的长度
uint8_t press_flag=0; //按键按下标识
uint8_t data[LENGTH]={0}; //存放读取到的RGB数据
uint8_t color[1]={0};  //存放模块识别到的颜色数据
char *str[]={"blue","dblue","green","black","white","pink","yellow","red"};//模块可以识别到的颜色


int main()
{  
  uint8_t i;  
  OLED_Init();      //OLED显示
  RGB_GPIO_Init();  //RGB灯GPIO初始化
  GTIM2_Init();     //GTIM2初始化配置为PWM输出模式
  I2C_GPIO_Init();  //GY-33模块GPIO初始化
  Key_GPIO_Init();  //按键GPIO初始化
  BTIM_Init();      //BTIM定时器初始化,定时控制按键扫描周期
//  WriteData(GY33_ADDR,Config,0x51);  //启动白平衡,等级亮度为5


  while(1)
  {
    if(press_flag==1)  //若按键标识已打开,代表有按键按下,执行按键功能
    {
      OLED_Clear(); //清屏
      if(ReadData(GY33_ADDR,R,data,LENGTH)) //读取模块检测颜色并进行处理后返回的RGB值
      {
        OLED_ShowString(1,1,"RGB:");
        OLED_ShowNum(1,5,data[0],3);  //R值
        OLED_ShowNum(2,5,data[1],3);  //G值
        OLED_ShowNum(3,5,data[2],3);  //B值
      }
      RGB_Running(data);  //RGB全彩LED灯根据读取到的RGB进行显示
      Delay_ms(100);      //数据读取间隔应不小于100ms
      if(ReadData(GY33_ADDR,Color,color,1))//读取模块检测颜色并进行处理后的颜色信息返回值
      {
        for(i=0;i<8;i++) //8-bits数据,逐位判断
        {
          if((color[0]>>i)==1) //判断哪一位为1
          {
            OLED_ShowString(4,1,"Color:");
            OLED_ShowString(4,7,str[7-i]); //显示对应颜色
            break;
          }
        }
      }
      press_flag=0; //执行完关闭按键标识
    }  
  }
}


void BTIM1_IRQHandler(void)  //BTIM1中断服务函数
{
  static unsigned int cnt = 0;
  
  if(BTIM_GetITStatus(CW_BTIM1,BTIM_IT_OV))  
  {
    if(++cnt>=20)  //20ms定时,执行一次按键扫描
    {
      cnt = 0;
      if(Key_Scan()==1)  //返回值不为0时
        press_flag=1;    //打开按键标识
    }
    BTIM_ClearITPendingBit(CW_BTIM1,BTIM_IT_OV); //清除标志位
  }
}


GY-33.c:
#include "main.h"
#include "Delay.h"
#include "GY_33.h"


void I2C_GPIO_Init(void)   //GY-33颜色识别模块GPIO初始化
{
  __RCC_GPIOA_CLK_ENABLE();
  
  GPIO_InitTypeDef GPIO_InitStruct; 
  GPIO_InitStruct.IT=GPIO_IT_NONE;
  GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_OD;      //开漏输出
  GPIO_InitStruct.Pins=GPIO_PIN_4|GPIO_PIN_5;
  GPIO_InitStruct.Speed=GPIO_SPEED_HIGH;
  GPIO_Init(CW_GPIOA, &GPIO_InitStruct);
  
  SCL(1);
  SDA(1);
}


void I2C_Delay() //I2C延时函数
{
  Delay_us(time);
}


uint8_t I2C_Start(void)  //发送起始信号
{
  SDA(1);
  SCL(1);
  I2C_Delay();
  if(ReadSDA==0) return 0;
  SDA(0);
  I2C_Delay();
  if(ReadSDA==1) return 0;
  SCL(0);
  I2C_Delay();
  
  return 1;
}


void I2C_Stop(void)  //发送停止信号
{
  SDA(0);
  SCL(0);
  I2C_Delay();
  SCL(1);
  I2C_Delay();
  SDA(1);
}


void I2C_SendACK(uint8_t ackbit)  //发送应答
{
  SDA(ackbit);
  SCL(1);
  I2C_Delay();
  SCL(0);
  I2C_Delay();
}


void I2C_SendByte(uint8_t Byte)  //发送1字节(8-bit)的数据
{
  uint8_t i;
  SCL(0);
  for (i = 0; i < 8; i++)
  {
    if(Byte&0x80) SDA(1);
    else SDA(0);
    SCL(1);
    I2C_Delay();
    SCL(0);
    Byte<<=1;
    I2C_Delay();
  }
}


uint8_t I2C_ReceiveByte(void)  //接收1字节(8-bit)的数据
{
  uint8_t data,i;
  SDA(1);
  Delay_us(1);
  for(i=0;i<8;i++)
  {
    SCL(1);
    data<<=1;
    if(ReadSDA==1) data|=0x01;
    I2C_Delay();
    SCL(0);
    I2C_Delay();
  }
  
  return data;
}


uint8_t I2C_WaitAck(void) //等待应答
{
  uint16_t i;
  SDA(1);
  SCL(1);
  while(ReadSDA==1)
  {
    if(++i==500)
      break;
  }
  if(ReadSDA==1)
  {
    SCL(0);
    return 0;
  }
  I2C_Delay();
  SCL(0);
  I2C_Delay();
  
  return 1; 
}


uint8_t WriteData(uint8_t Slave_Addr,uint8_t REG_Addr,uint8_t data)  //写操作
{
  if(I2C_Start()==0) RETURN
  
  I2C_SendByte(Slave_Addr);  
  if(I2C_WaitAck()==0) RETURN
    
  I2C_SendByte(REG_Addr);    
  if(I2C_WaitAck()==0) RETURN                
  
  I2C_SendByte(data);
  if(I2C_WaitAck()==0) RETURN              
  
  I2C_Stop();                    //发送停止信号
  
  return 1;
}


uint8_t ReadData(uint8_t Slave_Addr,uint8_t REG_Addr,uint8_t *data,uint8_t length) //读操作
{  
  if(I2C_Start()==0) RETURN        
    
  I2C_SendByte(Slave_Addr);    
  if(I2C_WaitAck()==0) RETURN        
    
  I2C_SendByte(REG_Addr);            
  if(I2C_WaitAck()==0) RETURN
  
  if(I2C_Start()==0) RETURN
    
  I2C_SendByte(Slave_Addr+1); 
  if(I2C_WaitAck()==0) RETURN                
    
  while(--length)
{
    *data++=I2C_ReceiveByte();
    I2C_SendACK(0);
    Delay_ms(110);
  }
  *data=I2C_ReceiveByte();
  I2C_SendACK(1);
  I2C_Stop();                    //发送停止信号
  
  return 1;              
}

四、实物展示+效果演示

10672204-5cf7-11ee-939d-92fbcf53809c.png

107cf944-5cf7-11ee-939d-92fbcf53809c.png

1097ceae-5cf7-11ee-939d-92fbcf53809c.png

10b52832-5cf7-11ee-939d-92fbcf53809c.png

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16017

    浏览量

    343631
  • 模块
    +关注

    关注

    7

    文章

    2484

    浏览量

    46530
  • 机器人
    +关注

    关注

    206

    文章

    27033

    浏览量

    201409
  • keil5
    +关注

    关注

    6

    文章

    39

    浏览量

    20466
  • CW32
    +关注

    关注

    1

    文章

    122

    浏览量

    225

原文标题:【CW32】基于CW32的GY-33颜色识别模块的应用

文章出处:【微信号:武汉芯源半导体,微信公众号:武汉芯源半导体】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于CW32的MP3播放器设计

    使用武汉芯源半导体CW32系列MCU作为主控一款小巧的MP3。采用CW32L系列低功耗芯片。
    的头像 发表于 09-06 16:45 1380次阅读
    基于<b class='flag-5'>CW32</b>的MP3播放器设计

    请问颜色传感器GY-33 TCS34725和TCS3200有什么区别?

    请教颜色传感器GY-33 TCS34725和TCS3200的具体区别?哪种用于检测透明瓶中液体颜色更好?有没有做过相关实验的朋友,希望大家给出点建议,非常感谢。
    发表于 03-26 07:17

    请问是否有人使用过CJMCU-115或者GY-33颜色传感器?

    请问CJMCU-115或者GY-33传感器的效果如何,是否没有色差?采集到的16位AD值怎么转换成RGB值?全部积分奉上,谢谢大家
    发表于 04-30 08:45

    如何使用串口通信连接GY-33颜色传感器完成对颜色识别

    如何使用串口通信连接GY-33颜色传感器完成对颜色识别
    发表于 01-25 06:08

    CW32 MCU开发资料汇总(手册、工具、固件库)

    32L083_StdPeriph_Lib.zip4、CW32 MCU开发工具:*附件:CW-DAPLINK调试器驱动.zip*附件:CW-DAPLINK使用手册.pdf*附件:
    发表于 07-27 14:47

    CW Programmer CW32系列芯片烧录工具配套软件

    CW Programmer CW32系列芯片的烧录工具配套软件
    发表于 09-15 07:44

    如何基于CW32系列MCU实现VBAT功能

    档介绍了如何基于 CW32 系列 MCU,通过增加简单的外部电路配合软件实现 VBAT 功能,在系统电源掉电后仍能保持 RTC 时钟正常计时,以及如何降低系统功耗,从而延长后备电池的使用寿命。
    发表于 09-15 07:24

    CJMCU-115或者GY-33传感器的效果如何,是否没有色差?

    CJMCU-115或者GY-33传感器的效果如何,是否没有色差?
    发表于 10-17 06:01

    stm32单片机使用串口通信连接GY-33颜色传感器完成对颜色识别并且打印出其颜色和对应的RGB值

    GY_33配套软件,串口助手,USB转TTL1.GY-33介绍及其接线GY-33是一款低成本颜色识别传感器
    发表于 11-30 09:51 9次下载
    stm32单片机使用串口通信连接<b class='flag-5'>GY-33</b><b class='flag-5'>颜色</b>传感器完成对<b class='flag-5'>颜色</b>的<b class='flag-5'>识别</b>并且打印出其<b class='flag-5'>颜色</b>和对应的RGB值

    颜色识别传感器模块概述、特性及使用方法

    GY-33 是一款颜色识别传感器模块。工作电压 3-5V,功耗小,体积小,安装方便,其工作原理是照明 LED 发光,照射到被测物体后,返回光经过滤镜检测 RGB 的比例值,根据 RGB
    发表于 05-24 09:36 1953次阅读

    利用单片机的颜色识别系统设计

    整个系统可以通过单片机控制颜色传感器完成对5种颜色识别,并且在LCD1602显示屏上进行显示,当按下按键的时候,将当下的颜色播报出来。系统内的颜色
    的头像 发表于 09-02 09:25 2538次阅读

    快乐解说MCUCW32的工作电压特性

    快乐解说MCUCW32的工作电压特性
    的头像 发表于 09-18 10:56 288次阅读

    SM07-GY-33颜色检测模块说明书

    适用于SM07-GY-33颜色检测模块
    发表于 08-08 16:55 0次下载

    基于CW32的RC522刷卡模块的应用

    基于CW32的RC522刷卡模块的应用
    的头像 发表于 11-02 14:53 537次阅读
    基于<b class='flag-5'>CW32</b>的RC522刷卡<b class='flag-5'>模块</b>的应用

    基于CW32的物联网应用

    CW32】基于CW32的物联网应用
    的头像 发表于 11-02 15:55 335次阅读
    基于<b class='flag-5'>CW32</b>的物联网应用