#申请原创# @21小跑堂
AC7802x开发板是一款十分便于功能移植的开发板,先前曾在其它开发板上实现过以色彩传感器检测色彩的功能,这次将它移植到AC7802x开发板上进行了一下尝试,实践证明实现起来还是比较容易的,其状态构成如图1所示。 图1 整体构成
这里所所用的色彩传感器是TCS34725,它是一款以I2C接口工作的器件,并在功能模块上配置了LED灯以照亮检测目标。 在显示方面,则仍使用0.96寸的彩色LCD显示屏,它与开发板的连接关系为: CLK---PB5 DIN---PB3 RES--PB4 DC ---PB6 CS ---PA8 BLK--- PB7
色彩传感器与开发板的连接关系为: SDA ----PA0 SCL ----PA1
所用引脚输出高低电平的定义为: #defineTCS_SCL_H GPIO_SetPinLevel(GPIOA,GPIO_PIN1, GPIO_LEVEL_HIGH) #defineTCS_SCL_L GPIO_SetPinLevel(GPIOA,GPIO_PIN1, GPIO_LEVEL_LOW) #defineTCS_SDA_H GPIO_SetPinLevel(GPIOA,GPIO_PIN0, GPIO_LEVEL_HIGH) #defineTCS_SDA_L GPIO_SetPinLevel(GPIOA,GPIO_PIN0, GPIO_LEVEL_LOW)
为读取数据所作的相应定义为: #defineTCS_SDA_READ GPIO_GetPinLevel(GPIOA,GPIO_PIN0)
实现输入、输出模式设置的语句定义为: #defineTCS_SDA_IN() GPIO_SetDir(GPIOA, GPIO_PIN0, GPIO_IN) #defineTCS_SDA_OUT() GPIO_SetDir(GPIOA,GPIO_PIN0, GPIO_OUT)
色彩传感器的引脚配置函数为: void TCS34725_I2C_Init()
{
GPIO_SetFunc(GPIOA, GPIO_PIN0,GPIO_FUN0);
GPIO_SetDir(GPIOA, GPIO_PIN0,GPIO_OUT);
GPIO_SetFunc(GPIOA, GPIO_PIN1,GPIO_FUN0);
GPIO_SetDir(GPIOA, GPIO_PIN1,GPIO_OUT);
}
实现I2C发送起始和停止信号的函数为: void TCS34725_I2C_Start()
{
TCS_SDA_OUT();
TCS_SDA_H;
TCS_SCL_H;
delay_us(4);
TCS_SDA_L;
delay_us(4);
TCS_SCL_L;
}
void TCS34725_I2C_Stop()
{
TCS_SDA_OUT();
TCS_SCL_L;
TCS_SDA_L;
delay_us(4);
TCS_SCL_H;
TCS_SDA_H;
delay_us(4);
}
进行字节数据发送与接收的函数为: void TCS34725_I2C_Send_Byte(u8 byte)
{
u8 i;
TCS_SDA_OUT();
TCS_SCL_L;
for(i = 0; i < 8; i++)
{
if(((byte&0x80)>>7)==1)TCS_SDA_H;
else
TCS_SDA_L;
byte <<= 1;
delay_us(2);
TCS_SCL_H;
delay_us(2);
TCS_SCL_L;
delay_us(2);
}
}
u8 TCS34725_I2C_Read_Byte(u8 ack)
{
u8 i,receive = 0;
TCS_SDA_IN();
for(i = 0; i < 8; i++)
{
TCS_SCL_L;
delay_us(2);
TCS_SCL_H;
receive <<= 1;
if(TCS_SDA_READ) receive++;
delay_us(1);
}
if (!ack) TCS34725_I2C_NACK();
else TCS34725_I2C_ACK();
return receive;
}
进行传感器初始化的函数为: 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;
}
为了满足显示的需要,所配置的矩形框绘制函数为: void LCD_DrawRectangle(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2)
{
LCD_DrawLine(x1,y1,x2,y1);
LCD_DrawLine(x1,y1,x1,y2);
LCD_DrawLine(x1,y2,x2,y2);
LCD_DrawLine(x2,y1,x2,y2);
}
所配置的色彩填充函数为: void LCD_ShowBOX(u16 x1,u16 y1,u16 x2,u16 y2,u16 c)
{
int i;
LCD_Address_Set(x1,y1,x2,y2);
for(i=0;i<N;i++)
{
LCD_WR_DATA8(c>>8);
LCD_WR_DATA8(c&0xff);
}
}
进行色彩识别检测的主程序为: int main(void)
{
u8 R,G,B;
u16 g;
InitDelay();
InitDebug();
GPIO_LedInit();
GPIO_KeyInit();
TIMER_PrdInit();
mdelay(200);
LCD_GPIO();
Lcd_Init();
BACK_COLOR=BLACK;
LCD_Clear(BLACK);
LCD_ShowString(30,5,"TCS34725",YELLOW);
LCD_ShowString(20,25,"R:",RED);
LCD_ShowString(52,25,"G:",GREEN);
LCD_ShowString(84,25,"B:",BLUE);
LCD_DrawRectangle(119, 23, 140, 45);
TCS34725_Init();
while (1)
{
TCS34725_GetRawData(&rgb);
RGBtoHSL(&rgb,&hsl);
R=255*rgb.r/rgb.c;
G=255*rgb.g/rgb.c;
B=255*rgb.b/rgb.c;
LCD_ShowNum(20,45,R,3,YELLOW);
LCD_ShowNum(52,45,G,3,YELLOW);
LCD_ShowNum(84,45,B,3,YELLOW);
g=(R>>3)<<11;
g=g+((G>>2)<<5)+(B>>3);
LCD_ShowBOX(120,24,139,44,g);
mdelay(500);
GPIO_ToggleLedPrd();
}
}
经程序的编译与下载,其测试效果图2和图3所示,说明该传感器能完成色彩识别的功能。 图2 测试绿色
图3测试红色
通过这次对AC7802x开发板测评,证明该开发板是一款非常易于上手的开发板,并在功能移植方面也较为顺利,它是一款值得推荐的开发工具。在此再次对活动的组织者及提供产品的厂家表示衷心地感谢!
|