Skip to main content

Grove - I2C 颜色传感器

该模块基于具有数字输出 I2C 的颜色传感器 TCS3414CS。基于 8*2 滤波光电二极管阵列和 16 位模数转换器,您可以测量环境光的颜色色度或物体的颜色。在 16 个光电二极管中,4 个具有红色滤波器,4 个具有绿色滤波器,4 个具有蓝色滤波器,4 个没有滤波器(透明)。通过同步输入引脚,外部脉冲光源可以提供精确的同步转换控制。

note

请注意,最新版本 V2.0 已将 IC 替换为 TCS3472,旧库也已更新。如果您使用的是 V2.0 版本,请使用新库

特性

  • Grove 兼容接口
  • 16 位数字输出,支持 I2C
  • SYNC 输入将积分周期同步到调制光源
  • 工作温度范围 -40°C 至 85°C
  • 可编程中断功能,具有用户定义的上下阈值设置
  • 符合 RoHS 标准
tip

有关 Grove 模块的更多详细信息,请参阅 Grove 系统

规格参数

参数数值/范围
PCB 尺寸2.0 cm * 4.0 cm
接口2.0mm 间距排针
VCC3.3 - 6.0 V
I2C 速度400 kHz

支持的平台

ArduinoRaspberry Pi
caution

上述提到的支持平台表示该模块的软件或理论兼容性。在大多数情况下,我们只为 Arduino 平台提供软件库或代码示例。无法为所有可能的 MCU 平台提供软件库/演示代码。因此,用户必须编写自己的软件库。

入门指南

以下文档帮助用户开始使用 Grove。

硬件连接

Grove 产品具有生态系统,所有产品都具有相同的连接器,可以插入 Grove Base Shield。将此模块连接到 Base Shield 的 I2C 端口。但是,您也可以通过跳线将 Grove - I2C 颜色传感器连接到 Arduino,而无需 Base Shield。

Arduino UNOGrove - I2C 颜色传感器
5VVCC
GNDGND
SDASDA
SCLSCL

软件安装

下载 Arduino 并安装 Arduino 驱动程序

Seeeduino/Arduino 入门指南

演示

该模块可用于检测光源的颜色或物体的颜色。当用于检测光源颜色时,应关闭 LED 开关,光源应直接照射传感器。当用于检测物体颜色时,应打开 LED,并将物体紧贴外壳顶部。感测物体颜色的原理是反射感测理论。如下图所示。

颜色传感器库

我们创建了一个库来帮助您快速开始使用 Seeeduino/Arduino,在本节中我们将向您展示如何设置库。

设置

  1. 从 Grove_I2C_Color_Sensor github 页面下载库代码的 zip 文件。如果您使用的是最新版本 V2.0(IC 是 TCS3472),请使用这个新库
  2. 将下载的文件解压到您的 …/arduino/libraries。
  3. 将解压的文件夹重命名为 "Color_Sensor"
  4. 启动 Arduino IDE(如果已打开则重新启动)。

函数说明

这是库中最重要/最有用的函数,我们邀请您自己查看 .h 和 .cpp 文件以查看所有可用函数。

通过库函数读取 RGB 数据

readRGB(int *red, int *green, int *blue)

  • red: 保存 R 值的变量地址。
  • green: 保存 G 值的变量地址。
  • blue: 保存 B 值的变量地址。
void loop()
{
int red, green, blue;
GroveColorSensor colorSensor;
colorSensor.ledStatus = 1; // When turn on the color sensor LED, ledStatus = 1; When turn off the color sensor LED, ledStatus = 0.
while(1)
{
colorSensor.readRGB(&red, &green, &blue); //Read RGB values to variables.
delay(300);
Serial.print("The RGB value are: RGB( ");
Serial.print(red,DEC);
Serial.print(", ");
Serial.print(green,DEC);
Serial.print(", ");
Serial.print(blue,DEC);
Serial.println(" )");
colorSensor.clearInterrupt();
}
}

颜色传感器示例/应用

此示例展示如何使用 Grove - I2C 颜色传感器的功能,并使用可链接 RGB LED Grove 显示检测到的颜色。

note

如果您之前没有将 Grove-可链接 RGB LED 库 下载到您的 Arduino IDE,请先下载并设置库。

  • 打开 File->Examples->Color_Sensor->example->ColorSensorWithRGB-LED 示例以获取完整示例,或将下面的代码复制并粘贴到新的 Arduino 草图中。

说明:此示例可以测量环境光的颜色色度或物体的颜色,并通过可链接 RGB LED Grove 显示检测到的颜色。

您也可以使用其他显示模块来显示 Grove - I2C 颜色传感器检测到的颜色。

#include <Wire.h>
#include <GroveColorSensor.h>
#include <ChainableLED.h>

#define CLK_PIN 7
#define DATA_PIN 8
#define NUM_LEDS 1 //The number of Chainable RGB LED

ChainableLED leds(CLK_PIN, DATA_PIN, NUM_LEDS);

void setup()
{
Serial.begin(9600);
Wire.begin();
}

void loop()
{
int red, green, blue;
GroveColorSensor colorSensor;
colorSensor.ledStatus = 1; // When turn on the color sensor LED, ledStatus = 1; When turn off the color sensor LED, ledStatus = 0.
while(1)
{
colorSensor.readRGB(&red, &green, &blue); //Read RGB values to variables.
delay(300);
Serial.print("The RGB value are: RGB( ");
Serial.print(red,DEC);
Serial.print(", ");
Serial.print(green,DEC);
Serial.print(", ");
Serial.print(blue,DEC);
Serial.println(" )");
colorSensor.clearInterrupt();
for(int i = 0; i<NUM_LEDS; i++)
{
leds.setColorRGB(i, red, green, blue);
}
}
}
  • 将代码上传到开发板。
  • 然后 Grove_-_Chainable_RGB_LED 将显示检测到的颜色。

与 Raspberry Pi 一起使用

硬件

  • 步骤 1. 本项目中使用的物品:
Raspberry piGrove Base Hat for RasPiGrove-I2C_Color_Sensor

pir

pir

pir

立即购买立即购买立即购买
  • 步骤 2. 将 Grove Base Hat 插入 Raspberry。
  • 步骤 3. 将 Grove-I2C_Color 连接到 Base Hat 的 I2C 端口。
  • 步骤 4. 通过 USB 线缆将 Raspberry Pi 连接到 PC。

pir

软件

note

如果您使用的是 Raspberry Pi with Raspberrypi OS >= Bullseye,您必须仅使用 Python3 运行此命令行。

  • 步骤 1. 按照 Setting Software 配置开发环境。
  • 步骤 2. 进入相关的虚拟环境。
source ~/grove_env/env/bin/activate
cd ~/grove_env/grove.py/grove
  • 步骤 3. 执行以下命令运行代码。

  • 以下是检查 grove_i2c_color_sensor_v2.py 代码。

less grove_i2c_color_sensor_v2.py
import time
from grove.i2c import Bus


_CMD = 0x80
_AUTO = 0x20

_ENABLE = 0x00
_ATIME = 0x01
_WTIME = 0x03
_AILT = 0x04
_AIHT = 0x06
_PERS = 0x0C
_CONFIG = 0x0D
_CONTROL = 0x0F
_ID = 0x12
_STATUS = 0x13
_CDATA = 0x14
_RDATA = 0x16
_GDATA = 0x18
_BDATA = 0x1A

_AIEN = 0x10
_WEN = 0x08
_AEN = 0x02
_PON = 0x01

_GAINS = (1, 4, 16, 60)


class GroveI2cColorSensorV2:
"""Driver for Grove I2C Color Sensor (TCS34725)"""

def __init__(self, bus=1, address=0x29):
self.address = address
self.bus = Bus(bus)

self.awake = False

if self.id not in (0x44, 0x4D):
raise ValueError('Not find a Grove I2C Color Sensor V2')

self.set_integration_time(24)
self.set_gain(4)

def wakeup(self):
enable = self._read_byte(_ENABLE)
self._write_byte(_ENABLE, enable | _PON | _AEN)
time.sleep(0.0024)

self.awake = True

def sleep(self):
enable = self._read_byte(_ENABLE)
self._write_byte(_ENABLE, enable & ~_PON)

self.awake = False

def is_awake(self):
return self._read_byte(_ENABLE) & _PON

def set_wait_time(self, t):
pass

@property
def id(self):
return self._read_byte(_ID)

@property
def integration_time(self):
steps = 256 - self._read_byte(_ATIME)
return steps * 2.4

def set_integration_time(self, t):
"""Set the integration time of the sensor"""
if t < 2.4:
t = 2.4
elif t > 614.4:
t = 614.4

steps = int(t / 2.4)
self._integration_time = steps * 2.4
self._write_byte(_ATIME, 256 - steps)

@property
def gain(self):
"""The gain control. Should be 1, 4, 16, or 60.
"""
return _GAINS[self._read_byte(_CONTROL)]

def set_gain(self, gain):
if gain in _GAINS:
self._write_byte(_CONTROL, _GAINS.index(gain))

@property
def raw(self):
"""Read RGBC registers
return 16 bits red, green, blue and clear data
"""

if not self.awake:
self.wakeup()

while not self._valid():
time.sleep(0.0024)

data = tuple(self._read_word(reg) for reg in (_RDATA, _GDATA, _BDATA, _CDATA))
return data

@property
def rgb(self):
"""Read the RGB color detected by the sensor. Returns a 3-tuple of
red, green, blue component values as bytes (0-255).
"""
r, g, b, clear = self.raw
if clear:
r = int(255 * r / clear)
g = int(255 * g / clear)
b = int(255 * b / clear)
else:
r, g, b = 0, 0, 0
return r, g, b

def _valid(self):
"""Check if RGBC is valid"""
return self._read_byte(_STATUS) & 0x01

def _read_byte(self, address):
command = _CMD | address
return self.bus.read_byte_data(self.address, command)

def _read_word(self, address):
command = _CMD | _AUTO | address
return self.bus.read_word_data(self.address, command)

def _write_byte(self, address, data):
command = _CMD | address
self.bus.write_byte_data(self.address, command, data)

def _write_word(self, address, data):
command = _CMD | _AUTO | address
data = [(data >> 8) & 0xFF, data & 0xFF]
self.bus.write_i2c_block_data(self.address, command, data)


Grove = GroveI2cColorSensorV2


def main():
sensor = GroveI2cColorSensorV2()

print('Raw data of red-filtered, green-filtered, blue-filtered and unfiltered photodiodes')
while True:
# r, g, b = sensor.rgb
r, g, b, clear = sensor.raw
print((r, g, b, clear))
time.sleep(1.0)

if __name__ == '__main__':
main()
  • 运行此代码

python grove_i2c_color_sensor_v2.py

如果一切顺利,您将看到以下现象。😄

pir

其他参考

该模块基于颜色传感器 TCS3414CS。TCS3414CS 数字颜色传感器从四个通道返回数据:红色(R)、绿色(G)、蓝色(B) 和透明(C)(无滤波)。来自红、绿、蓝通道 (RGB) 的响应可用于确定特定光源的色度坐标 (x, y)。这些标准由国际照明委员会 (CIE) 制定。CIE 是关注颜色和颜色测量的主要国际组织。为了使用 TCS3414CS 获取给定物体的颜色,我们必须首先将传感器响应 (RGB) 映射到 CIE 三刺激值 (XYZ)。然后需要计算色度坐标 (x, y)。

色度计算过程概述

进行转换的方程式:

转换方程式

  • 当我们获得坐标 (x, y) 时,请参考下图以获得推荐的颜色。

常见问题

Q1: 如何理解命令?例如,REG_GREEN_LOW = 0xD0

A1: 从附图中,您可以看到命令中包含的内容。使用字节协议命令时,必须是 0x80+ADDRESS 的形式。例如,REG_TIMING( 01h ) = 0x81 对于字节和块读取,命令应该是 0xC0+ADDRESS,REG_GREEN_LOW( 10h ) = 0xD0。

Grove-I2C Color Sensor Eagle File V1.2

Grove-I2C Color Sensor Eagle File V2.0

资源


技术支持与产品讨论

可升级为工业传感器

通过 SenseCAP S2110 控制器S2100 数据记录器,您可以轻松将 Grove 转换为 LoRaWAN® 传感器。Seeed 不仅帮助您进行原型设计,还为您提供了使用 SenseCAP 系列坚固的工业传感器扩展项目的可能性。

IP66 外壳、蓝牙配置、与全球 LoRaWAN® 网络的兼容性、内置 19 Ah 电池以及来自 APP 的强大支持使 SenseCAP S210x 成为工业应用的最佳选择。该系列包括土壤湿度、空气温湿度、光照强度、CO2、EC 和 8 合 1 气象站传感器。为您下一个成功的工业项目尝试最新的 SenseCAP S210x。

Loading Comments...