RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于CW32系列MCU的GY-33顏色識別模塊設(shè)計

jf_qE49KoVBr8 ? 來源:武漢芯源半導(dǎo)體 ? 2023-09-27 13:51 ? 次閱讀

一、簡介

1.GY-33是一種基于TCS34725顏色傳感器的顏色識別模塊。TCS34725是一種高精度光學(xué)傳感器,能夠檢測紅、綠、藍(lán)三個基本色的光譜信息,從而實(shí)現(xiàn)對物體顏色的準(zhǔn)確識別,該模塊的具體應(yīng)用場景包括以下幾個方面:

(1)電子設(shè)備顏色校準(zhǔn):在電子設(shè)備制造過程中,顏色一致性非常重要。使用GY-33模塊可以幫助制造商檢測和校準(zhǔn)電子設(shè)備的顏色,確保不同設(shè)備之間的顏色表現(xiàn)一致。

(2)色彩分析和精確匹配:GY-33模塊在顏色分析和匹配方面有廣泛應(yīng)用。例如,在印刷行業(yè)中,可以使用該模塊來檢測和匹配顏色樣本,從而確保印刷品的準(zhǔn)確顏色表現(xiàn)。

(3)機(jī)器人視覺系統(tǒng):GY-33模塊可以用于機(jī)器人視覺系統(tǒng),幫助機(jī)器人在環(huán)境中對不同顏色的物體進(jìn)行識別和分類。這在物流、倉儲和自動導(dǎo)航系統(tǒng)中非常有用,機(jī)器人可以根據(jù)物體的顏色屬性執(zhí)行相應(yīng)的任務(wù)。

二、所需物料

本實(shí)驗(yàn)使用到了CW32F030C8小藍(lán)板、GY-33顏色識別模塊、0.96寸OLED顯示屏,RGB全彩LED模塊、輕觸開關(guān)模塊及Keil5開發(fā)環(huán)境。

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

CW32F030C8小藍(lán)板

0fbb42ae-5cf7-11ee-939d-92fbcf53809c.png
GY-33顏色識別模塊
0fc88cca-5cf7-11ee-939d-92fbcf53809c.png
RGB全彩LED模塊

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

實(shí)物展示

【GY-33與單片機(jī)連線】:VCC<-->+3.3V

GND<-->GND

DR<-->PA5

CT<-->PA4

【LED與單片機(jī)連線】:V<-->+3.3V

R<-->PA0

G<-->PA1

B<-->PA2

【輕觸開關(guān)與單片機(jī)連線】:VCC<-->+3.3V

GND<-->GND

OUT<-->PB9

此模塊有兩種方式讀取數(shù)據(jù),即串口UART或者 MCU_IIC,本次實(shí)驗(yàn)采用MCU_IIC的方式。

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

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

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

有簡單的7種顏色識別,單片機(jī)不參與數(shù)據(jù)處理工作,不需要計算RGB值,直接讀取吧 數(shù)據(jù)即可。需要特別注意的是:

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   //讀取數(shù)據(jù)的長度
uint8_t press_flag=0; //按鍵按下標(biāo)識
uint8_t data[LENGTH]={0}; //存放讀取到的RGB數(shù)據(jù)
uint8_t color[1]={0};  //存放模塊識別到的顏色數(shù)據(jù)
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)  //若按鍵標(biāo)識已打開,代表有按鍵按下,執(zhí)行按鍵功能
    {
      OLED_Clear(); //清屏
      if(ReadData(GY33_ADDR,R,data,LENGTH)) //讀取模塊檢測顏色并進(jìn)行處理后返回的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燈根據(jù)讀取到的RGB進(jìn)行顯示
      Delay_ms(100);      //數(shù)據(jù)讀取間隔應(yīng)不小于100ms
      if(ReadData(GY33_ADDR,Color,color,1))//讀取模塊檢測顏色并進(jìn)行處理后的顏色信息返回值
      {
        for(i=0;i<8;i++) //8-bits數(shù)據(jù),逐位判斷
        {
          if((color[0]>>i)==1) //判斷哪一位為1
          {
            OLED_ShowString(4,1,"Color:");
            OLED_ShowString(4,7,str[7-i]); //顯示對應(yīng)顏色
            break;
          }
        }
      }
      press_flag=0; //執(zhí)行完關(guān)閉按鍵標(biāo)識
    }  
  }
}


void BTIM1_IRQHandler(void)  //BTIM1中斷服務(wù)函數(shù)
{
  static unsigned int cnt = 0;
  
  if(BTIM_GetITStatus(CW_BTIM1,BTIM_IT_OV))  
  {
    if(++cnt>=20)  //20ms定時,執(zhí)行一次按鍵掃描
    {
      cnt = 0;
      if(Key_Scan()==1)  //返回值不為0時
        press_flag=1;    //打開按鍵標(biāo)識
    }
    BTIM_ClearITPendingBit(CW_BTIM1,BTIM_IT_OV); //清除標(biāo)志位
  }
}


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延時函數(shù)
{
  Delay_us(time);
}


uint8_t I2C_Start(void)  //發(fā)送起始信號
{
  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)  //發(fā)送停止信號
{
  SDA(0);
  SCL(0);
  I2C_Delay();
  SCL(1);
  I2C_Delay();
  SDA(1);
}


void I2C_SendACK(uint8_t ackbit)  //發(fā)送應(yīng)答
{
  SDA(ackbit);
  SCL(1);
  I2C_Delay();
  SCL(0);
  I2C_Delay();
}


void I2C_SendByte(uint8_t Byte)  //發(fā)送1字節(jié)(8-bit)的數(shù)據(jù)
{
  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字節(jié)(8-bit)的數(shù)據(jù)
{
  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) //等待應(yīng)答
{
  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();                    //發(fā)送停止信號
  
  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();                    //發(fā)送停止信號
  
  return 1;              
}

四、實(shí)物展示+效果演示

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

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

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

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

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17123

    瀏覽量

    350975
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2695

    瀏覽量

    47431
  • 機(jī)器人
    +關(guān)注

    關(guān)注

    211

    文章

    28379

    瀏覽量

    206912
  • keil5
    +關(guān)注

    關(guān)注

    6

    文章

    44

    瀏覽量

    20661
  • CW32
    +關(guān)注

    關(guān)注

    1

    文章

    203

    瀏覽量

    626

原文標(biāo)題:【CW32】基于CW32的GY-33顏色識別模塊的應(yīng)用

文章出處:【微信號:武漢芯源半導(dǎo)體,微信公眾號:武漢芯源半導(dǎo)體】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    基于CW32的MP3播放器設(shè)計

    使用武漢芯源半導(dǎo)體CW32系列MCU作為主控一款小巧的MP3。采用CW32L系列低功耗芯片。
    的頭像 發(fā)表于 09-06 16:45 ?1971次閱讀
    基于<b class='flag-5'>CW32</b>的MP3播放器設(shè)計

    請問顏色傳感器GY-33 TCS34725和TCS3200有什么區(qū)別?

    請教顏色傳感器GY-33 TCS34725和TCS3200的具體區(qū)別?哪種用于檢測透明瓶中液體顏色更好?有沒有做過相關(guān)實(shí)驗(yàn)的朋友,希望大家給出點(diǎn)建議,非常感謝。
    發(fā)表于 03-26 07:17

    請問是否有人使用過CJMCU-115或者GY-33顏色傳感器?

    請問CJMCU-115或者GY-33傳感器的效果如何,是否沒有色差?采集到的16位AD值怎么轉(zhuǎn)換成RGB值?全部積分奉上,謝謝大家
    發(fā)表于 04-30 08:45

    如何使用串口通信連接GY-33顏色傳感器完成對顏色識別?

    如何使用串口通信連接GY-33顏色傳感器完成對顏色識別?
    發(fā)表于 01-25 06:08

    CW32 MCU開發(fā)資料匯總(手冊、工具、固件庫)

    32L083_StdPeriph_Lib.zip4、CW32 MCU開發(fā)工具:*附件:CW-DAPLINK調(diào)試器驅(qū)動.zip*附件:CW-DAPLINK使用手冊.pdf*附件:
    發(fā)表于 07-27 14:47

    CW Programmer CW32系列芯片燒錄工具配套軟件

    CW Programmer CW32系列芯片的燒錄工具配套軟件
    發(fā)表于 09-15 07:44

    如何基于CW32系列MCU實(shí)現(xiàn)VBAT功能

    檔介紹了如何基于 CW32 系列 MCU,通過增加簡單的外部電路配合軟件實(shí)現(xiàn) VBAT 功能,在系統(tǒng)電源掉電后仍能保持 RTC 時鐘正常計時,以及如何降低系統(tǒng)功耗,從而延長后備電池的使用壽命。
    發(fā)表于 09-15 07:24

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

    CJMCU-115或者GY-33傳感器的效果如何,是否沒有色差?
    發(fā)表于 10-17 06:01

    stm32單片機(jī)使用串口通信連接GY-33顏色傳感器完成對顏色識別并且打印出其顏色和對應(yīng)的RGB值

    ,GY_33配套軟件,串口助手,USB轉(zhuǎn)TTL1.GY-33介紹及其接線GY-33是一款低成本顏色識別傳感器
    發(fā)表于 11-30 09:51 ?9次下載
    stm32單片機(jī)使用串口通信連接<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>和對應(yīng)的RGB值

    顏色識別傳感器模塊概述、特性及使用方法

    GY-33 是一款顏色識別傳感器模塊。工作電壓 3-5V,功耗小,體積小,安裝方便,其工作原理是照明 LED 發(fā)光,照射到被測物體后,返回光經(jīng)過濾鏡檢測 RGB 的比例值,根據(jù) RGB
    發(fā)表于 05-24 09:36 ?2521次閱讀

    利用單片機(jī)的顏色識別系統(tǒng)設(shè)計

    整個系統(tǒng)可以通過單片機(jī)控制顏色傳感器完成對5種顏色識別,并且在LCD1602顯示屏上進(jìn)行顯示,當(dāng)按下按鍵的時候,將當(dāng)下的顏色播報出來。系統(tǒng)內(nèi)的顏色
    的頭像 發(fā)表于 09-02 09:25 ?3305次閱讀

    快樂解說MCUCW32的工作電壓特性

    快樂解說MCUCW32的工作電壓特性
    的頭像 發(fā)表于 09-18 10:56 ?591次閱讀

    SM07-GY-33顏色檢測模塊說明書

    適用于SM07-GY-33顏色檢測模塊
    發(fā)表于 08-08 16:55 ?0次下載

    基于CW32的RC522刷卡模塊的應(yīng)用

    基于CW32的RC522刷卡模塊的應(yīng)用
    的頭像 發(fā)表于 11-02 14:53 ?1107次閱讀
    基于<b class='flag-5'>CW32</b>的RC522刷卡<b class='flag-5'>模塊</b>的應(yīng)用

    基于CW32的物聯(lián)網(wǎng)應(yīng)用

    CW32】基于CW32的物聯(lián)網(wǎng)應(yīng)用
    的頭像 發(fā)表于 11-02 15:55 ?782次閱讀
    基于<b class='flag-5'>CW32</b>的物聯(lián)網(wǎng)應(yīng)用
    RM新时代网站-首页