一、项目概述
本项目通过结合带屏12指神探与传感器扩展板,成功实现了颜色识别功能。项目中,传感器扩展板负责捕捉环境中的颜色信息,并将数据传输至带屏12指神探进行处理。带屏12指神探内置高性能处理器,通过运行专门设计的软件判断,对接收到的颜色数据进行分析,识别出具体的颜色。
在设计上,我们采用了基于颜色空间的识别判断,通过对比传感器数据与预设的颜色阈值,精确判断颜色种类。一旦颜色被识别,带屏12指神探便会在其自带的屏幕上绘制一个圆形色块,以直观展示识别结果。同时,屏幕上还会显示颜色的名称,方便用户了解识别到的具体颜色,再通过PC端软件的终端打印出相关的值,其中这个值就包括颜色名,包含颜色的阀值。
二、设计思路
设计思路主要围绕颜色识别的核心任务展开。首先,通过传感器扩展板上的颜色传感器捕获环境中的颜色信息,将颜色信息通过IIC传递给12指神探的RP2040。然后,通过LTR-381RGB-01传感器识别出具体的颜色。最后,将识别结果通过扩展板传递到12指神探上的显示屏展示出来。
在设计时,我采用了基于颜色的识别方法。通过比较传感器捕获的颜色信息与预设的颜色阈值,确定最接近的颜色。这种方法简单有效,能够在较短的时间内完成颜色识别任务。
三、硬件IIC介绍
介绍一下IIC功能:
I2C总线物理连接:
I2C总线引脚定义
SDA (I2C数据引脚)
CLK (I2C数据引脚)
I2C总线物理连接如图所示,SDA和CLK连接线上连有两个上拉电阻,当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低。
当然,在这个12指神探与扩展板上,通过查看图纸,并没有看到IIC上有上拉电阻,都NC掉了。
下面的图是颜色传感器连接示意图。
四、软件设计思路
12指神探主控通过扩展板的传感器,识别颜色任务的整个处理流程。首先,初始化传感器和显示屏,设置相关参数。然后,进入颜色识别循环,不断读取传感器数据。接着,对读取到的数据进行处理,识别出颜色。最后,将识别结果通过显示屏展示出来,并等待下一次循环。
五、硬件介绍
硬件框图主要包括传感器扩展板、带屏12指神探和连接两者的通信接口。传感器扩展板上集成了颜色传感器和其它传感器,通过通信接口与带屏12指神探连接。带屏12指神探负责提供数据处理和显示功能。
在硬件搭建过程中,我选择了高灵敏度的颜色传感器,以确保能够准确捕获环境颜色信息。同时,保证数据传输的稳定性和实时性。
六、实现的功能及图片展示
通过本项目的实施,我们成功实现了颜色识别的功能。在实际测试中,系统能够准确识别出白、绿、蓝、黄、红、紫色等颜色,并在显示屏上实时显示识别结果。
从图片中可以看出,系统对不同颜色的识别结果准确无误,显示界面清晰易读。
白色:
蓝色:
绿色:
红色:
黄色:
紫色:
七:核心代码展示:
light.getColorData(RED, red);
light.getColorData(GREEN, green);
light.getColorData(BLUE, blue);
light.getLux(gain, integrationTime, green, lux);
inclos = ColorCount(red, green, blue);
colod = changeColorRGB(inclos);
tft.fillCircle(120, 120, 100, colod);
via=inclos;
if(via ==0)
{
Serial.print(" color: ");
Serial.print(" White ");
Serial.println(colod);
ShowColors(via);
via=0;
}
if(via ==1)
{
Serial.print(" color: ");
Serial.print(" Red ");
Serial.println(colod);
Serial.print(" color: ");
ShowColors(via);
via=0;
}
if(via ==2)
{
Serial.print(" color: ");
Serial.print(" Green ");
Serial.println(colod);
Serial.print(" color: ");
ShowColors(via);
via=0;
}
if(via ==3)
{
Serial.print(" color: ");
Serial.print(" Blue ");
Serial.println(colod);
Serial.print(" color: ");
ShowColors(via);
via=0;
}
if(via ==4)
{
Serial.print(" color: ");
Serial.print(" Yellow ");
Serial.println(colod);
Serial.print(" color: ");
ShowColors(via);
via=0;
}
if(via ==5)
{
Serial.print(" color: ");
Serial.print(" Pink ");
Serial.println(colod);
Serial.print(" color: ");
ShowColors(via);
via=0;
}
if(via ==6)
{
Serial.print(" color: ");
Serial.print(" Cyan ");
Serial.println(colod);
Serial.print(" color: ");
ShowColors(via);
via=0;
}
//从识别到的颜色转换成颜色的数值
int changeColorRGB(int color)
{
if (color == 0)
{
return tft.color565(255, 255, 255); // White
}
else if (color == 1)
{
return tft.color565(255, 0, 0); // Red
}
else if (color == 2)
{
return tft.color565(0, 255, 0); // Green
}
else if (color == 3)
{
return tft.color565(0, 0, 255); // Blue
}
else if (color == 4)
{
return tft.color565(255, 255, 0); // Yellow
}
else if (color == 5)
{
return tft.color565(255, 0, 255); // Pink
}
else if (color == 6)
{
return tft.color565(0, 255, 255); // Cyan
}
else
{
// 如果color不是0到6之间的值,返回一个表示错误的颜色值或0
return 0;
}
}
void ShowColors(int colour)
{
String strcolor;
if (colour == 0)
{
strcolor = "White";
}
else if (colour == 1)
{
strcolor = " Red ";
}
else if (colour == 2)
{
strcolor = "Green";
}
else if (colour == 3)
{
strcolor = "Blue";
}
else if (colour == 4)
{
strcolor = "Yellow";
}
else if (colour == 5)
{
strcolor = "Pink";
}
else if (colour == 6)
{
strcolor = "Cyan";
}
else
{
// 如果colour不是0到6之间的值,可以设置strcolor为默认值或空字符串
strcolor = "Unknown";
}