一、簡介
1.GY-33是一種基于TCS34725顏色傳感器的顏色識別模塊。TCS34725是一種高精度光學傳感器,能夠檢測紅、綠、藍三個基本色的光譜信息,從而實現對物體顏色的準確識別,該模塊的具體應用場景包括以下幾個方面:
(1)電子設備顏色校準:在電子設備制造過程中,顏色一致性非常重要。使用GY-33模塊可以幫助制造商檢測和校準電子設備的顏色,確保不同設備之間的顏色表現一致。
(2)色彩分析和精確匹配:GY-33模塊在顏色分析和匹配方面有廣泛應用。例如,在印刷行業中,可以使用該模塊來檢測和匹配顏色樣本,從而確保印刷品的準確顏色表現。
(3)機器人視覺系統:GY-33模塊可以用于機器人視覺系統,幫助機器人在環境中對不同顏色的物體進行識別和分類。這在物流、倉儲和自動導航系統中非常有用,機器人可以根據物體的顏色屬性執行相應的任務。
二、所需物料
本實驗使用到了CW32F030C8小藍板、GY-33顏色識別模塊、0.96寸OLED顯示屏,RGB全彩LED模塊、輕觸開關模塊及Keil5開發環境。
CW32F030C8小藍板
GY-33顏色識別模塊 |
RGB全彩LED模塊 |
實物展示
【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的方式。
有簡單的7種顏色識別,單片機不參與數據處理工作,不需要計算RGB值,直接讀取吧 數據即可。需要特別注意的是:
三、核心代碼
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; }
四、實物展示+效果演示
審核編輯:湯梓紅
-
mcu
+關注
關注
146文章
16984瀏覽量
350293 -
模塊
+關注
關注
7文章
2670瀏覽量
47340 -
機器人
+關注
關注
210文章
28191瀏覽量
206505 -
keil5
+關注
關注
6文章
44瀏覽量
20640 -
CW32
+關注
關注
1文章
183瀏覽量
585
原文標題:【CW32】基于CW32的GY-33顏色識別模塊的應用
文章出處:【微信號:武漢芯源半導體,微信公眾號:武漢芯源半導體】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論