欢迎来到军工软件开发人才培养基地——学到牛牛

颜色传感器原理以及应用讲解

时间:2024-05-06 07:01:10 来源:学到牛牛

颜色传感器的工作原理基于物体反射光线的颜色差异。当物体被照射光源时,其表面会反射出一定比例的光线,这些光线的波长和强度与物体本身的颜色有关。颜色传感器利用这些特性,通过光敏元件和信号处理器将光信号转换为电信号,并进行分析和识别。

 

颜色传感器通常由光源、滤光片、光敏元件、信号处理器等组成。光源照射在物体上,物体反射出来的光经过滤光片后进入光敏元件中,产生相应的电信号。这些电信号经过放大、滤波、数字化等处理后,可以得到物体的颜色信息。

 

 

参数表

 

 

颜色传感器采用的是内置APDS9960传感器,是一款集成ALS、红外LED和接近检测器的光学模块和环境亮度感测(ALS,Ambient Light Sensing)的环境亮度传感器,使用双光二极管来近似0.01lux照度近似人眼的视觉反应,带有上限和下限阈值的可编程中断功能,高达16位分辨率,即使在深色玻璃后也能高灵活运作。

 

原理图:

 

 

示例代码:

#include "SoftWire.h"

#include "Adafruit_APDS9960.h"

 

SoftWire sw(6,7);   //sda,scl

Adafruit_APDS9960 apds=Adafruit_APDS9960(sw);

 

#define RED   1

#define GREEN 2

#define BLUE  3

#define WHITE 4

 

int R_F = 13000;

int G_F = 19000;

int B_F = 25000;

int r_f = 768;

int g_f = 1024;

int b_f = 1280;

 

void setup() {

  // put your setup code here, to run once:

  Serial.begin(9600);

 

  if(!apds.begin()){

    Serial.println("failed to initialize device! Please check your wiring.");

  }

  else Serial.println("Device initialized!");

 

  //enable color sensign mode

  apds.enableColor(true);

 

  delay(500);

}

 

int colorDetect()

{

  uint16_t r, g, b, c;

  int t;

  //wait for color data to be ready

  while(!apds.colorDataReady()){

    delay(5);

  }

  apds.getColorData(&r, &g, &b, &c);

 

  r = map(r, r_f, R_F, 0, 255);  

  g = map(g, g_f, G_F, 0, 255);

  b = map(b, b_f, B_F, 0, 255);

  

  //Find the largest value in R, G, B. For example, the maximum is R means that the object is Red

  if (r > g)

    t = RED;

  else

    t = GREEN;

  if (t == GREEN && g < b)

    t = BLUE;

  if (t == RED && r < b)

    t = BLUE;

 

  //Returns the color only if the RGB value is greater than 30, otherwise returns 0

  if(t == BLUE && b > 50)

  {

    Serial.println("Blue");

    return t;

  }

  else if(t == GREEN && g > 50)

  {

    Serial.println("Green");

    return t;

  }

  else if(t == RED && r > 50)

  {

    Serial.println("Red");

    return t;

  }

  else 

    return 0;

  return 0;

}

 

void loop() {

  colorDetect();

  delay(200);

}

 

串口打印: