一、簡(jiǎn)介
1.GY-33是一種基于TCS34725顏色傳感器的顏色識(shí)別模塊。TCS34725是一種高精度光學(xué)傳感器,能夠檢測(cè)紅、綠、藍(lán)三個(gè)基本色的光譜信息,從而實(shí)現(xiàn)對(duì)物體顏色的準(zhǔn)確識(shí)別,該模塊的具體應(yīng)用場(chǎng)景包括以下幾個(gè)方面:
(1)電子設(shè)備顏色校準(zhǔn):在電子設(shè)備制造過(guò)程中,顏色一致性非常重要。使用GY-33模塊可以幫助制造商檢測(cè)和校準(zhǔn)電子設(shè)備的顏色,確保不同設(shè)備之間的顏色表現(xiàn)一致。
(2)色彩分析和精確匹配:GY-33模塊在顏色分析和匹配方面有廣泛應(yīng)用。例如,在印刷行業(yè)中,可以使用該模塊來(lái)檢測(cè)和匹配顏色樣本,從而確保印刷品的準(zhǔn)確顏色表現(xiàn)。
(3)機(jī)器人視覺(jué)系統(tǒng):GY-33模塊可以用于機(jī)器人視覺(jué)系統(tǒng),幫助機(jī)器人在環(huán)境中對(duì)不同顏色的物體進(jìn)行識(shí)別和分類。這在物流、倉(cāng)儲(chǔ)和自動(dòng)導(dǎo)航系統(tǒng)中非常有用,機(jī)器人可以根據(jù)物體的顏色屬性執(zhí)行相應(yīng)的任務(wù)。
二、所需物料
本實(shí)驗(yàn)使用到了CW32F030C8小藍(lán)板、GY-33顏色識(shí)別模塊、0.96寸OLED顯示屏,RGB全彩LED模塊、輕觸開(kāi)關(guān)模塊及Keil5開(kāi)發(fā)環(huán)境。

CW32F030C8小藍(lán)板
![]() GY-33顏色識(shí)別模塊 |
![]() RGB全彩LED模塊 |

實(shí)物展示
【GY-33與單片機(jī)連線】:VCC<-->+3.3V
GND<-->GND
DR<-->PA5
CT<-->PA4
【LED與單片機(jī)連線】:V<-->+3.3V
R<-->PA0
G<-->PA1
B<-->PA2
【輕觸開(kāi)關(guān)與單片機(jī)連線】:VCC<-->+3.3V
GND<-->GND
OUT<-->PB9
此模塊有兩種方式讀取數(shù)據(jù),即串口UART或者 MCU_IIC,本次實(shí)驗(yàn)采用MCU_IIC的方式。



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


三、核心代碼
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ù)的長(zhǎng)度 uint8_t press_flag=0; //按鍵按下標(biāo)識(shí) uint8_t data[LENGTH]={0}; //存放讀取到的RGB數(shù)據(jù) uint8_t color[1]={0}; //存放模塊識(shí)別到的顏色數(shù)據(jù) char *str[]={"blue","dblue","green","black","white","pink","yellow","red"};//模塊可以識(shí)別到的顏色 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定時(shí)器初始化,定時(shí)控制按鍵掃描周期 // WriteData(GY33_ADDR,Config,0x51); //啟動(dòng)白平衡,等級(jí)亮度為5 while(1) { if(press_flag==1) //若按鍵標(biāo)識(shí)已打開(kāi),代表有按鍵按下,執(zhí)行按鍵功能 { OLED_Clear(); //清屏 if(ReadData(GY33_ADDR,R,data,LENGTH)) //讀取模塊檢測(cè)顏色并進(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))//讀取模塊檢測(cè)顏色并進(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]); //顯示對(duì)應(yīng)顏色 break; } } } press_flag=0; //執(zhí)行完關(guān)閉按鍵標(biāo)識(shí) } } } void BTIM1_IRQHandler(void) //BTIM1中斷服務(wù)函數(shù) { static unsigned int cnt = 0; if(BTIM_GetITStatus(CW_BTIM1,BTIM_IT_OV)) { if(++cnt>=20) //20ms定時(shí),執(zhí)行一次按鍵掃描 { cnt = 0; if(Key_Scan()==1) //返回值不為0時(shí) press_flag=1; //打開(kāi)按鍵標(biāo)識(shí) } 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顏色識(shí)別模塊GPIO初始化 { __RCC_GPIOA_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.IT=GPIO_IT_NONE; GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_OD; //開(kāi)漏輸出 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í)函數(shù) { Delay_us(time); } uint8_t I2C_Start(void) //發(fā)送起始信號(hào) { 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ā)送停止信號(hào) { 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) //寫(xiě)操作 { 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ā)送停止信號(hào) 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ā)送停止信號(hào) return 1; }
四、實(shí)物展示+效果演示




審核編輯:湯梓紅
-
mcu
+關(guān)注
關(guān)注
147文章
18786瀏覽量
392986 -
模塊
+關(guān)注
關(guān)注
7文章
2829瀏覽量
53130 -
機(jī)器人
+關(guān)注
關(guān)注
213文章
30899瀏覽量
221170 -
keil5
+關(guān)注
關(guān)注
7文章
48瀏覽量
21375 -
CW32
+關(guān)注
關(guān)注
1文章
299瀏覽量
1743
原文標(biāo)題:【CW32】基于CW32的GY-33顏色識(shí)別模塊的應(yīng)用
文章出處:【微信號(hào):武漢芯源半導(dǎo)體,微信公眾號(hào):武漢芯源半導(dǎo)體】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
CW32 MCU用什么IDE開(kāi)發(fā)?
請(qǐng)問(wèn)顏色傳感器GY-33 TCS34725和TCS3200有什么區(qū)別?
請(qǐng)問(wèn)是否有人使用過(guò)CJMCU-115或者GY-33的顏色傳感器?
CW32 MCU開(kāi)發(fā)資料匯總(手冊(cè)、工具、固件庫(kù))
如何基于CW32系列MCU實(shí)現(xiàn)VBAT功能
stm32單片機(jī)使用串口通信連接GY-33顏色傳感器完成對(duì)顏色的識(shí)別并且打印出其顏色和對(duì)應(yīng)的RGB值
基于CW32系列MCU的GY-33顏色識(shí)別模塊設(shè)計(jì)


評(píng)論