From e9da4719fb64edcca87180c043e67839079a1a6d Mon Sep 17 00:00:00 2001 From: Nandkishor Date: Fri, 10 Oct 2014 16:19:44 +0000 Subject: [PATCH] tsl2561: light to digital sensor tsl2561 Signed-off-by: Nandkishor Signed-off-by: Brendan Le Foll --- docs/images/grovetsl2561.jpeg | Bin 0 -> 22834 bytes examples/CMakeLists.txt | 3 + examples/tsl2561.cxx | 65 +++++++++ src/tsl2561/CMakeLists.txt | 5 + src/tsl2561/jsupm_tsl2561.i | 8 ++ src/tsl2561/pyupm_tsl2561.i | 13 ++ src/tsl2561/tsl2561.cxx | 242 ++++++++++++++++++++++++++++++++++ src/tsl2561/tsl2561.h | 167 +++++++++++++++++++++++ 8 files changed, 503 insertions(+) create mode 100755 docs/images/grovetsl2561.jpeg create mode 100755 examples/tsl2561.cxx create mode 100644 src/tsl2561/CMakeLists.txt create mode 100644 src/tsl2561/jsupm_tsl2561.i create mode 100644 src/tsl2561/pyupm_tsl2561.i create mode 100755 src/tsl2561/tsl2561.cxx create mode 100755 src/tsl2561/tsl2561.h diff --git a/docs/images/grovetsl2561.jpeg b/docs/images/grovetsl2561.jpeg new file mode 100755 index 0000000000000000000000000000000000000000..04891f30f837607a8ae077086c04ece5a136c7c8 GIT binary patch literal 22834 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 + * Copyright (c) 2014 Intel Corporation. + * + * LIGHT-TO-DIGITAL CONVERTER [TAOS-TSL2561] + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +#include +#include "tsl2561.h" + +int main (int argc, char **argv) +{ + mraa_result_t error = MRAA_SUCCESS; + upm::TSL2561 *sensor = NULL; + int calculatedLux = 0; + int loopCount = 100; + +//! [Interesting] + if (argc < 2) { + printf("Provide loop count \n"); + } else { + loopCount = atoi(argv[1]); + } + sensor = new upm::TSL2561(); + //sensor = new upm::TSL2561(0, TSL2561_Address, GAIN_16X, INTEGRATION_TIME2_402MS); + //sensor = new upm::TSL2561(0, TSL2561_Address, GAIN_16X, INTEGRATION_TIME1_101MS); + //sensor = new upm::TSL2561(0, TSL2561_Address, GAIN_16X, INTEGRATION_TIME0_13MS); + //sensor = new upm::TSL2561(0, TSL2561_Address, GAIN_0X, INTEGRATION_TIME2_402MS); + + for(int i=0; i< loopCount; i++){ + error = sensor->getLux(calculatedLux); + if (error != MRAA_SUCCESS) { + fprintf(stderr, "Error: on i2c bus address setup in i2cReadReg()\n"); + return error; + } + + fprintf(stdout, "Lux = %d\n", calculatedLux); + } + +//! [Interesting] + + delete(sensor); + + return (0); +} diff --git a/src/tsl2561/CMakeLists.txt b/src/tsl2561/CMakeLists.txt new file mode 100644 index 00000000..9434da3a --- /dev/null +++ b/src/tsl2561/CMakeLists.txt @@ -0,0 +1,5 @@ +set (libname "tsl2561") +set (libdescription "upm tsl2561") +set (module_src ${libname}.cxx) +set (module_h ${libname}.h) +upm_module_init() diff --git a/src/tsl2561/jsupm_tsl2561.i b/src/tsl2561/jsupm_tsl2561.i new file mode 100644 index 00000000..e5403d13 --- /dev/null +++ b/src/tsl2561/jsupm_tsl2561.i @@ -0,0 +1,8 @@ +%module jsupm_tsl2561 +%include "../upm.i" + +%{ + #include "tsl2561.h" +%} + +%include "tsl2561.h" diff --git a/src/tsl2561/pyupm_tsl2561.i b/src/tsl2561/pyupm_tsl2561.i new file mode 100644 index 00000000..c9404914 --- /dev/null +++ b/src/tsl2561/pyupm_tsl2561.i @@ -0,0 +1,13 @@ +%module pyupm_tsl2561 +%include "../upm.i" + +%feature("autodoc", "3"); + +#ifdef DOXYGEN +%include "tsl2561_doc.i" +#endif + +%include "tsl2561.h" +%{ + #include "tsl2561.h" +%} diff --git a/src/tsl2561/tsl2561.cxx b/src/tsl2561/tsl2561.cxx new file mode 100755 index 00000000..46e6dbf8 --- /dev/null +++ b/src/tsl2561/tsl2561.cxx @@ -0,0 +1,242 @@ +/* + * Author: Nandkishor Sonar + * Copyright (c) 2014 Intel Corporation. + * + * LIGHT-TO-DIGITAL CONVERTER [TAOS-TSL2561] + * Inspiration and lux calculation formulas from data sheet + * URL: http://www.adafruit.com/datasheets/TSL2561.pdf + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +#include +#include "tsl2561.h" + +using namespace upm; + + +TSL2561::TSL2561(int bus, uint8_t devAddr, uint8_t gain, uint8_t integrationTime) { + m_controlAddr = devAddr; + m_bus = bus; + m_gain = gain ; + m_integrationTime = integrationTime; + + m_name = "TSL2561- Digital Light Sensor"; + + m_i2ControlCtx = mraa_i2c_init(m_bus); + + mraa_result_t error = mraa_i2c_address(m_i2ControlCtx, m_controlAddr); + if (error != MRAA_SUCCESS) { + fprintf(stderr, "Messed up i2c bus in TSL2561()\n"); + return; + } + + // POWER UP. + error = i2cWriteReg(REGISTER_Control,CONTROL_POWERON); + if (error != MRAA_SUCCESS) { + fprintf(stderr, "Error: Unable to power up - Ensure TSL2561 is connected to I2C\n"); + return; + } + // Power on Settling time + usleep(1000); + + // Gain & Integration time . + error = i2cWriteReg(REGISTER_Timing, m_gain | m_integrationTime); + if (error != MRAA_SUCCESS) { + fprintf(stderr, "Error: Unable to set gain/time - Ensure TSL2561 is connected to I2C\n"); + return; + } + + // Set interrupt threshold to default. + error = i2cWriteReg(REGISTER_Interrupt,0x00); + if (error != MRAA_SUCCESS) { + fprintf(stderr, "Error: Unable to interrupt threshold - Ensure TSL2561 is connected to I2C\n"); + return; + } +} + +TSL2561::~TSL2561() { + // POWER DOWN + i2cWriteReg(REGISTER_Control,CONTROL_POWEROFF); + + // Stop I2C bus + mraa_i2c_stop(m_i2ControlCtx); +} + +mraa_result_t +TSL2561::getLux(int &lux) +{ + mraa_result_t error = MRAA_SUCCESS; + uint16_t rawLuxCh0; + uint16_t rawLuxCh1; + uint8_t ch0_low, ch0_high, ch1_low, ch1_high; + + error = i2cReadReg(REGISTER_Channal0L, ch0_low); + if (error != MRAA_SUCCESS) { + fprintf(stderr, "Error: Unable to read channel0L in getRawLux()\n"); + return error; + } + + error = i2cReadReg(REGISTER_Channal0H, ch0_high); + if (error != MRAA_SUCCESS) { + fprintf(stderr, "Error: Unable to read channel0H in getRawLux()\n"); + return error; + } + + rawLuxCh0 = ch0_high*256+ch0_low; + + error= i2cReadReg(REGISTER_Channal1L, ch1_low); + if (error != MRAA_SUCCESS) { + fprintf(stderr, "Error: Unable to read channel1L in getRawLux()\n"); + return error; + } + + error = i2cReadReg(REGISTER_Channal1H, ch1_high); + if (error != MRAA_SUCCESS) { + fprintf(stderr, "Error: Unable to read channel1H in getRawLux()\n"); + return error; + } + + rawLuxCh1 = ch1_high*256+ch1_low; + + uint64_t scale = 0; + + switch (m_integrationTime) + { + case 0: // 13.7 msec + scale = LUX_CHSCALE_TINT0; + break; + case 1: // 101 msec + scale = LUX_CHSCALE_TINT1; + break; + default: // assume no scaling + scale = (1 << LUX_CHSCALE); + break; + } + + // scale if gain is NOT 16X + if (!m_gain) scale = scale << 4; + + uint64_t channel1 = 0; + uint64_t channel0 = 0; + // scale the channel values + channel0 = (rawLuxCh0 * scale) >> LUX_CHSCALE; + channel1 = (rawLuxCh1 * scale) >> LUX_CHSCALE; + + // find the ratio of the channel values (Channel1/Channel0) + // protect against divide by zero + unsigned long ratio1 = 0; + if (channel0 != 0) ratio1 = (channel1 << (LUX_RATIOSCALE+1)) / channel0; + + // round the ratio value + unsigned long ratio = (ratio1 + 1) >> 1; + + unsigned int b, m; + + // CS package + // Check if ratio <= eachBreak ? + if ((ratio >= 0) && (ratio <= LUX_K1C)) + {b=LUX_B1C; m=LUX_M1C;} + else if (ratio <= LUX_K2C) + {b=LUX_B2C; m=LUX_M2C;} + else if (ratio <= LUX_K3C) + {b=LUX_B3C; m=LUX_M3C;} + else if (ratio <= LUX_K4C) + {b=LUX_B4C; m=LUX_M4C;} + else if (ratio <= LUX_K5C) + {b=LUX_B5C; m=LUX_M5C;} + else if (ratio <= LUX_K6C) + {b=LUX_B6C; m=LUX_M6C;} + else if (ratio <= LUX_K7C) + {b=LUX_B7C; m=LUX_M7C;} + else if (ratio > LUX_K8C) + {b=LUX_B8C; m=LUX_M8C;} + + uint64_t tempLux = 0; + tempLux = ((channel0 * b) - (channel1 * m)); + // do not allow negative lux value + if (tempLux < 0) tempLux = 0; + + // round lsb (2^(LUX_SCALE-1)) + tempLux += (1 << (LUX_SCALE-1)); + + // strip off fractional portion + lux = tempLux >> LUX_SCALE; + + return error; +} + + +mraa_result_t +TSL2561::i2cWriteReg (uint8_t reg, uint8_t value) { + mraa_result_t error = MRAA_SUCCESS; + + // Start transmission to device + error = mraa_i2c_address (m_i2ControlCtx, m_controlAddr); + if (error != MRAA_SUCCESS) { + fprintf(stderr, "Error: on i2c bus address setup in i2cWriteReg()\n"); + return error; + } + // Write register to I2C + error = mraa_i2c_write_byte (m_i2ControlCtx, reg); + if (error != MRAA_SUCCESS) { + fprintf(stderr, "Error: on i2c bus write reg in i2cWriteReg()\n"); + return error; + } + + // Write value to I2C + error = mraa_i2c_write_byte (m_i2ControlCtx, value); + if (error != MRAA_SUCCESS) { + fprintf(stderr, "Error: on i2c bus write value in i2cWriteReg()\n"); + return error; + } + + usleep(100000); + + return error; +} + +mraa_result_t +TSL2561::i2cReadReg(uint8_t reg, uint8_t &data) { + mraa_result_t error = MRAA_SUCCESS; + + // Start transmission to device + error = mraa_i2c_address(m_i2ControlCtx, m_controlAddr); + + if (error != MRAA_SUCCESS) { + fprintf(stderr, "Error: on i2c bus address setup in i2cReadReg()\n"); + return error; + } + + // Send address of register to be read. + error = mraa_i2c_write_byte(m_i2ControlCtx, reg); + if (error != MRAA_SUCCESS) { + fprintf(stderr, "Error: on i2c bus write in i2cReadReg()\n"); + return error; + } + + // Read byte. + data = mraa_i2c_read_byte(m_i2ControlCtx); + + usleep(10000); + + return error; +} diff --git a/src/tsl2561/tsl2561.h b/src/tsl2561/tsl2561.h new file mode 100755 index 00000000..274a81e3 --- /dev/null +++ b/src/tsl2561/tsl2561.h @@ -0,0 +1,167 @@ +/* + * Author: Nandkishor Sonar + * Copyright (c) 2014 Intel Corporation. + * + * * LIGHT-TO-DIGITAL CONVERTER [TAOS-TSL2561] + * Inspiration and lux calculation formulas from data sheet + * URL: http://www.adafruit.com/datasheets/TSL2561.pdf + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#pragma once + +#include +#include +#include + +#define TSL2561_Address (0x29) //Device address + +// Integration time +#define INTEGRATION_TIME0_13MS (0x00) // 13.7ms +#define INTEGRATION_TIME1_101MS (0x01) // 101ms +#define INTEGRATION_TIME2_402MS (0x02) // 402ms + +// Integration time +#define GAIN_0X (0x00) // No gain - Low +#define GAIN_16X (0x10) // 16x gain - High + +// Power control bits +#define CONTROL_POWERON (0x03) // ON +#define CONTROL_POWEROFF (0x00) // OFF + +// TSL2561 registers +#define REGISTER_Control (0x80) +#define REGISTER_Timing (0x81) +#define REGISTER_Interrupt (0x86) +#define REGISTER_Channal0L (0x8C) +#define REGISTER_Channal0H (0x8D) +#define REGISTER_Channal1L (0x8E) +#define REGISTER_Channal1H (0x8F) + +// Lux calculations differ slightly for CS package +#define LUX_SCALE (14) // Scale by 2^14 +#define LUX_RATIOSCALE (9) // Scale ratio by 2^9 +#define LUX_CHSCALE (10) // Scale channel values by 2^10 +#define LUX_CHSCALE_TINT0 (0x7517) // 322/11 * 2^TSL2561_LUX_CHSCALE +#define LUX_CHSCALE_TINT1 (0x0FE7) // 322/81 * 2^TSL2561_LUX_CHSCALE + +// CS package Coefficients +#define LUX_K1C (0x0043) // 0.130 * 2^RATIO_SCALE +#define LUX_B1C (0x0204) // 0.0315 * 2^LUX_SCALE +#define LUX_M1C (0x01ad) // 0.0262 * 2^LUX_SCALE +#define LUX_K2C (0x0085) // 0.260 * 2^RATIO_SCALE +#define LUX_B2C (0x0228) // 0.0337 * 2^LUX_SCALE +#define LUX_M2C (0x02c1) // 0.0430 * 2^LUX_SCALE +#define LUX_K3C (0x00c8) // 0.390 * 2^RATIO_SCALE +#define LUX_B3C (0x0253) // 0.0363 * 2^LUX_SCALE +#define LUX_M3C (0x0363) // 0.0529 * 2^LUX_SCALE +#define LUX_K4C (0x010a) // 0.520 * 2^RATIO_SCALE +#define LUX_B4C (0x0282) // 0.0392 * 2^LUX_SCALE +#define LUX_M4C (0x03df) // 0.0605 * 2^LUX_SCALE +#define LUX_K5C (0x014d) // 0.65 * 2^RATIO_SCALE +#define LUX_B5C (0x0177) // 0.0229 * 2^LUX_SCALE +#define LUX_M5C (0x01dd) // 0.0291 * 2^LUX_SCALE +#define LUX_K6C (0x019a) // 0.80 * 2^RATIO_SCALE +#define LUX_B6C (0x0101) // 0.0157 * 2^LUX_SCALE +#define LUX_M6C (0x0127) // 0.0180 * 2^LUX_SCALE +#define LUX_K7C (0x029a) // 1.3 * 2^RATIO_SCALE +#define LUX_B7C (0x0037) // 0.00338 * 2^LUX_SCALE +#define LUX_M7C (0x002b) // 0.00260 * 2^LUX_SCALE +#define LUX_K8C (0x029a) // 1.3 * 2^RATIO_SCALE +#define LUX_B8C (0x0000) // 0.000 * 2^LUX_SCALE +#define LUX_M8C (0x0000) // 0.000 * 2^LUX_SCALE + + +namespace upm { + +/** + * @brief TSL2561 Digital Light Sensor library + * @defgroup tsl2561 libupm-tsl2561 + */ + +/** + * @brief C++ API for TSL2561 chip (Digital Light Sensor library) + * + * The LIGHT-TO-DIGITAL CONVERTER [TAOS-TSL2561] + * (http://www.adafruit.com/datasheets/TSL2561.pdf) + * The TSL2560 and TSL2561 are light-to-digital converters that transform light + * intensity to a digital signal output capable of direct I2C (TSL2561). + * + * @ingroup tsl2561 + * @snippet tsl2561.cxx Interesting + * @image html grovetsl2561.jpeg + */ +class TSL2561{ + public: + /** + * Instanciates a TSL2561 object + * + * @param bus number of used bus + * @param devAddr address of used i2c device + */ + TSL2561(int bus=0, uint8_t devAddr=TSL2561_Address, uint8_t gain=GAIN_0X, uint8_t integrationTime=INTEGRATION_TIME1_101MS); + + /** + * GY65 object destructor to power down TSL2561 and close i2c connection. + */ + ~TSL2561(); + + /** + * Get calculated lux reading from TSL2561 + * + * @param lux - place holder to receive calculated lux value from TSL2561 + * + * Return mraa_result_t + */ + mraa_result_t getLux(int &lux); + + private: + /** + * Write to TSL2561 register + * + * @param reg addess to write + * @param value to write + * + * Return mraa_result_t + */ + mraa_result_t i2cWriteReg(uint8_t reg, uint8_t value); + + /** + * Read from TSL2561 register + * + * @param reg addess to read + * @param data byte read from the register + * + * Return mraa_result_t + */ + mraa_result_t i2cReadReg(uint8_t reg, uint8_t &data); + + int m_bus; + std::string m_name; + int m_controlAddr; + mraa_i2c_context m_i2ControlCtx; + + uint8_t m_gain; + uint8_t m_integrationTime; +}; + +} +