Added TCS34725

This commit is contained in:
Tyler Wilcox 2023-02-09 20:35:32 -05:00
parent 37111e1233
commit ee39a623ce
1 changed files with 374 additions and 0 deletions

View File

@ -0,0 +1,374 @@
package com.fairportrobotics.frc.poe.sensors.colorsensors;
import edu.wpi.first.wpilibj.I2C;
/**
*
*/
public class TCS34725 {
/** */
class TCS34725_RGB {
private int r, g, b;
public TCS34725_RGB(int r, int g, int b) {
this.r = r;
this.g = g;
this.b = b;
}
public int getR() {
return this.r;
}
public int getG() {
return this.g;
}
public int getB() {
return this.b;
}
}
/**
* An Enum reprenting the GAIN values for the TCS34725.
*/
public enum TCS34721_GAIN {
/** No gain */
TCS34725_GAIN_1X(0x00),
/** 4x gain */
TCS34725_GAIN_4X(0x01),
/** 16x gain */
TCS34725_GAIN_16X(0x02),
/** 60x gain */
TCS34725_GAIN_60X(0x03);
public final int value;
private TCS34721_GAIN(int i) {
this.value = i;
};
};
/** I2C address **/
public static int TCS34725_ADDRESS = (0x29);
/** Command bit **/
public static int TCS34725_COMMAND_BIT = (0x80);
/** Interrupt Enable register */
public static int TCS34725_ENABLE = (0x00);
/** RGBC Interrupt Enable */
public static int TCS34725_ENABLE_AIEN = (0x10);
/** Wait Enable - Writing 1 activates the wait timer */
public static int TCS34725_ENABLE_WEN = (0x08);
/** RGBC Enable - Writing 1 actives the ADC, 0 disables it */
public static int TCS34725_ENABLE_AEN = (0x02);
/** Power on - Writing 1 activates the internal oscillator, 0 disables it */
public static int TCS34725_ENABLE_PON = (0x01);
/** Integration time */
public static int TCS34725_ATIME = (0x01);
/** Wait time (if TCS34725_ENABLE_WEN is asserted) */
public static int TCS34725_WTIME = (0x03);
/** WLONG0 = 2.4ms WLONG1 = 0.029s */
public static int TCS34725_WTIME_2_4MS = (0xFF);
/** WLONG0 = 204ms WLONG1 = 2.45s */
public static int TCS34725_WTIME_204MS = (0xAB);
/** WLONG0 = 614ms WLONG1 = 7.4s */
public static int TCS34725_WTIME_614MS = (0x00);
/** Clear channel lower interrupt threshold (lower byte) */
public static int TCS34725_AILTL = (0x04);
/** Clear channel lower interrupt threshold (higher byte) */
public static int TCS34725_AILTH = (0x05);
/** Clear channel upper interrupt threshold (lower byte) */
public static int TCS34725_AIHTL = (0x06);
/** Clear channel upper interrupt threshold (higher byte) */
public static int TCS34725_AIHTH = (0x07);
/**
* Persistence register - basic SW filtering mechanism for \
* interrupts
*/
public static int TCS34725_PERS = (0x0C);
/** Every RGBC cycle generates an interrupt */
public static int TCS34725_PERS_NONE = (0b0000);
/**
* 1 clean channel value outside threshold range generates an \
* interrupt
*/
public static int TCS34725_PERS_1_CYCLE = (0b0001);
/**
* 2 clean channel values outside threshold range generates an \
* interrupt
*/
public static int TCS34725_PERS_2_CYCLE = (0b0010);
/**
* 3 clean channel values outside threshold range generates an \
* interrupt
*/
public static int TCS34725_PERS_3_CYCLE = (0b0011);
/**
* 5 clean channel values outside threshold range generates an \
* interrupt
*/
public static int TCS34725_PERS_5_CYCLE = (0b0100);
/**
* 10 clean channel values outside threshold range generates an \
* interrupt
*/
public static int TCS34725_PERS_10_CYCLE = (0b0101);
/**
* 15 clean channel values outside threshold range generates an \
* interrupt
*/
public static int TCS34725_PERS_15_CYCLE = (0b0110);
/**
* 20 clean channel values outside threshold range generates an \
* interrupt
*/
public static int TCS34725_PERS_20_CYCLE = (0b0111);
/**
* 25 clean channel values outside threshold range generates an \
* interrupt
*/
public static int TCS34725_PERS_25_CYCLE = (0b1000);
/**
* 30 clean channel values outside threshold range generates an \
* interrupt
*/
public static int TCS34725_PERS_30_CYCLE = (0b1001);
/**
* 35 clean channel values outside threshold range generates an \
* interrupt
*/
public static int TCS34725_PERS_35_CYCLE = (0b1010);
/**
* 40 clean channel values outside threshold range generates an \
* interrupt
*/
public static int TCS34725_PERS_40_CYCLE = (0b1011);
/**
* 45 clean channel values outside threshold range generates an \
* interrupt
*/
public static int TCS34725_PERS_45_CYCLE = (0b1100);
/**
* 50 clean channel values outside threshold range generates an \
* interrupt
*/
public static int TCS34725_PERS_50_CYCLE = (0b1101);
/**
* 55 clean channel values outside threshold range generates an \
* interrupt
*/
public static int TCS34725_PERS_55_CYCLE = (0b1110);
/**
* 60 clean channel values outside threshold range generates an \
* interrupt
*/
public static int TCS34725_PERS_60_CYCLE = (0b1111);
/** Configuration **/
public static int TCS34725_CONFIG = (0x0D);
/**
* Choose between short and long (12x) wait times via \
* TCS34725_WTIME
*/
public static int TCS34725_CONFIG_WLONG = (0x02);
/** Set the gain level for the sensor */
public static int TCS34725_CONTROL = (0x0F);
/** 0x44 = TCS34721/TCS34725, 0x4D = TCS34723/TCS34727 */
public static int TCS34725_ID = (0x12);
/** Device status **/
public static int TCS34725_STATUS = (0x13);
/** RGBC Clean channel interrupt */
public static int TCS34725_STATUS_AINT = (0x10);
/**
* Indicates that the RGBC channels have completed an integration \
* cycle
*/
public static int TCS34725_STATUS_AVALID = (0x01);
/** Clear channel data low byte */
public static int TCS34725_CDATAL = (0x14);
/** Clear channel data high byte */
public static int TCS34725_CDATAH = (0x15);
/** Red channel data low byte */
public static int TCS34725_RDATAL = (0x16);
/** Red channel data high byte */
public static int TCS34725_RDATAH = (0x17);
/** Green channel data low byte */
public static int TCS34725_GDATAL = (0x18);
/** Green channel data high byte */
public static int TCS34725_GDATAH = (0x19);
/** Blue channel data low byte */
public static int TCS34725_BDATAL = (0x1A);
/** Blue channel data high byte */
public static int TCS34725_BDATAH = (0x1B);
/* Integration time settings for TCS34725
*
* 60-Hz period: 16.67ms, 50-Hz period: 20ms
* 100ms is evenly divisible by 50Hz periods and by 60Hz periods
*/
/** 2.4ms - 1 cycle - Max Count: 1024 */
public static int TCS34725_INTEGRATIONTIME_2_4MS = (0xFF);
/** 24.0ms - 10 cycles - Max Count: 10240 */
public static int TCS34725_INTEGRATIONTIME_24MS = (0xF6);
/** 50.4ms - 21 cycles - Max Count: 21504 */
public static int TCS34725_INTEGRATIONTIME_50MS = (0xEB);
/** 60.0ms - 25 cycles - Max Count: 25700 */
public static int TCS34725_INTEGRATIONTIME_60MS = (0xE7);
/** 100.8ms - 42 cycles - Max Count: 43008 */
public static int TCS34725_INTEGRATIONTIME_101MS = (0xD6);
/** 120.0ms - 50 cycles - Max Count: 51200 */
public static int TCS34725_INTEGRATIONTIME_120MS = (0xCE);
/** 153.6ms - 64 cycles - Max Count: 65535 */
public static int TCS34725_INTEGRATIONTIME_154MS = (0xC0);
/** 180.0ms - 75 cycles - Max Count: 65535 */
public static int TCS34725_INTEGRATIONTIME_180MS = (0xB5);
/** 199.2ms - 83 cycles - Max Count: 65535 */
public static int TCS34725_INTEGRATIONTIME_199MS = (0xAD);
/** 240.0ms - 100 cycles - Max Count: 65535 */
public static int TCS34725_INTEGRATIONTIME_240MS = (0x9C);
/** 300.0ms - 125 cycles - Max Count: 65535 */
public static int TCS34725_INTEGRATIONTIME_300MS = (0x83);
/** 360.0ms - 150 cycles - Max Count: 65535 */
public static int TCS34725_INTEGRATIONTIME_360MS = (0x6A);
/** 400.8ms - 167 cycles - Max Count: 65535 */
public static int TCS34725_INTEGRATIONTIME_401MS = (0x59);
/** 420.0ms - 175 cycles - Max Count: 65535 */
public static int TCS34725_INTEGRATIONTIME_420MS = (0x51);
/** 480.0ms - 200 cycles - Max Count: 65535 */
public static int TCS34725_INTEGRATIONTIME_480MS = (0x38);
/** 499.2ms - 208 cycles - Max Count: 65535 */
public static int TCS34725_INTEGRATIONTIME_499MS = (0x30);
/** 540.0ms - 225 cycles - Max Count: 65535 */
public static int TCS34725_INTEGRATIONTIME_540MS = (0x1F);
/** 600.0ms - 250 cycles - Max Count: 65535 */
public static int TCS34725_INTEGRATIONTIME_600MS = (0x06);
/** 614.4ms - 256 cycles - Max Count: 65535 */
public static int TCS34725_INTEGRATIONTIME_614MS = (0x00);
private I2C i2c_bus;
private boolean isInitialized = false;
private byte integrationTime = 0;
private TCS34721_GAIN gain = TCS34721_GAIN.TCS34725_GAIN_1X;
/**
* Represents a TCS34725 Color sensor.
*/
public TCS34725() {
i2c_bus = new I2C(I2C.Port.kMXP, TCS34725.TCS34725_ADDRESS);
}
/**
* Read the RGB color detected by the sensor.
*
* @return TCS34725_RGB
*/
public TCS34725_RGB getRGB() {
if (!isInitialized)
init();
byte[] buff = new byte[2];
short r, g, b, c;
i2c_bus.read(TCS34725_COMMAND_BIT | TCS34725_CDATAL, 2, buff);
c = bytesToShort(buff);
i2c_bus.read(TCS34725_COMMAND_BIT | TCS34725_RDATAL, 2, buff);
r = bytesToShort(buff);
i2c_bus.read(TCS34725_COMMAND_BIT | TCS34725_GDATAL, 2, buff);
g = bytesToShort(buff);
i2c_bus.read(TCS34725_COMMAND_BIT | TCS34725_BDATAL, 2, buff);
b = bytesToShort(buff);
TCS34725_RGB rgb;
if (c == 0) {
rgb = new TCS34725_RGB(0, 0, 0);
return rgb;
}
rgb = new TCS34725_RGB(r / c * 255, g / c * 255, b / c * 255);
return rgb;
}
/**
* Initializes I2C and configures the sensor
*
* @param addr
* i2c address
*
* @param *theWire
* The Wire object
*
* @return True if initialization was successful, otherwise false.
*/
private boolean init() {
// Read from device to see if it's connected
byte[] buff = new byte[1];
i2c_bus.read(TCS34725_COMMAND_BIT | 0x12, 1, buff);
if ((buff[0] != 0x4d) && (buff[0] != 0x44) && (buff[0] != 0x10)) {
return false;
}
isInitialized = true;
// setGains
setIntegrationTime(integrationTime);
setGain(gain);
enable();
return true;
}
/**
* Enables the device
*/
public void enable() {
i2c_bus.write(TCS34725_COMMAND_BIT | TCS34725_ENABLE, TCS34725_ENABLE_PON);
i2c_bus.write(TCS34725_COMMAND_BIT | TCS34725_ENABLE, TCS34725_ENABLE_PON | TCS34725_ENABLE_AEN);
}
/**
* Disables the device (putting it in lower power sleep mode)
*/
public void disable() {
byte[] buff = new byte[1];
i2c_bus.read(TCS34725_COMMAND_BIT | TCS34725_ENABLE, 1, buff);
i2c_bus.write(TCS34725_COMMAND_BIT | TCS34725_ENABLE, buff[0] & ~(TCS34725_ENABLE_PON | TCS34725_ENABLE_AEN));
}
/**
*
* Sets the integration time for the TC34725
*
* @param time
* Integration Time
*/
public void setIntegrationTime(byte time) {
i2c_bus.write(TCS34725_COMMAND_BIT | TCS34725_ATIME, time);
}
/**
*
* Adjusts the gain on the TCS34725
*
* @param gain
* Gain (sensitivity to light)
*/
public void setGain(TCS34721_GAIN gain) {
i2c_bus.write(TCS34725_COMMAND_BIT | TCS34725_CONTROL, gain.value);
}
private short bytesToShort(byte[] bytes) {
if (bytes.length != 2)
return 0;
return (short) (bytes[0] << 8 | bytes[1] & 0xFF);
}
}