HAMAMATSU's I2C color sensor S11059

Dependents:   test_S11059

Files at this revision

API Documentation at this revision

Comitter:
Rhyme
Date:
Fri May 12 02:10:35 2017 +0000
Commit message:
commit before publishing

Changed in this revision

S11059.cpp Show annotated file Show diff for this revision Revisions of this file
S11059.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/S11059.cpp	Fri May 12 02:10:35 2017 +0000
@@ -0,0 +1,263 @@
+/*
+ * HAMAMATSU Color Senosr S11059
+ *
+ */
+ #include "mbed.h"
+ #include "S11059.h"
+ 
+ /* S11059 Register Address */
+ #define REG_CONTROL       0x00
+ #define REG_TIMING_DATA   0x01
+ #define REG_TIMING_MSB    0x01
+ #define REG_TIMING_LSB    0x02
+ #define REG_R_DATA        0x03
+ #define REG_R_MSB         0x03
+ #define REG_R_LSB         0x04
+ #define REG_G_DATA        0x05
+ #define REG_G_MSB         0x05
+ #define REG_G_LSB         0x06
+ #define REG_B_DATA        0x07
+ #define REG_B_MSB         0x07
+ #define REG_B_LSB         0x08
+ #define REG_IR_DATA       0x09
+ #define REG_IR_MSB        0x09
+ #define REG_IR_LSB        0x0A
+ 
+ /* register bits */
+ /* REG_CONTROL (00) */
+ // bit[7] ADC Reset 0:normal 1:reset
+ #define BIT_ADC_RESET     0x80
+ // bit[6] Sleep function 0:normal 1:standby
+ #define BIT_SLEEP_MODE    0x40
+ // bit[5] Sleeep function monitor bit
+ #define BIT_SLEEP_MONITOR 0x20
+ // bit[4] (reserved)
+ // bit[3] Gain select 0:Low Gain 1:High Gain
+ #define BIT_HIGH_GAIN     0x08
+ // bit[2] Ingegration mode 0:Fixed 1:Manual
+ #define BIT_INT_MANUAL    0x02
+ // bit[1:0] Integration Time
+ #define BIT_INT_LEN0      0x00 /*  87.5 us */
+ #define BIT_INT_LEN1      0x01 /*   1.4 ms */
+ #define BIT_INT_LEN2      0x02 /*  22.4 ms */
+ #define BIT_INT_LEN3      0x03 /* 179.2 ms */
+
+/* constructor and destructor */
+ 
+ S11059::S11059(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr<<1) {
+    // activate the peripheral
+}
+
+S11059::~S11059() { }
+
+float S11059::getR(void)  // return float value of Red
+{
+    uint16_t r_data ;
+    float data ;
+    getRData(&r_data) ;
+    data = (float)r_data / 65535.0 ;
+    return(data) ;    
+}
+
+float S11059::getG(void)  // return float value of Green
+{
+    uint16_t g_data ;
+    float data ;
+    getGData(&g_data) ;
+    data = (float)g_data / 65535.0 ;
+    return(data) ;
+}
+
+float S11059::getB(void)  // return float value of Blue
+{
+    uint16_t b_data ;
+    float data ;
+    getBData(&b_data) ;
+    data = (float)b_data / 65535.0 ;
+    return(data) ;
+}
+
+float S11059::getIR(void)  // return float value of Infrared
+{
+    uint16_t ir_data ;
+    float data ;
+    getIRData(&ir_data) ;
+    data = (float)ir_data / 65535.0 ;
+    return(data) ;
+}
+
+void S11059::getRData(uint16_t *rdata) 
+{
+    uint8_t data[2] ;
+    readRegs(REG_R_DATA, data, 2) ;
+    *rdata = (data[0]<<8) | data[1] ;
+}
+
+void S11059::getGData(uint16_t *gdata) 
+{
+    uint8_t data[2] ;
+    readRegs(REG_G_DATA, data, 2) ;
+    *gdata = (data[0]<<8) | data[1] ;
+}
+
+void S11059::getBData(uint16_t *bdata) 
+{
+    uint8_t data[2] ;
+    readRegs(REG_B_DATA, data, 2) ;
+    *bdata = (data[0]<<8) | data[1] ;
+}
+
+void S11059::getIRData(uint16_t *irdata) 
+{
+    uint8_t data[2] ;
+    readRegs(REG_IR_DATA, data, 2) ;
+    *irdata = (data[0]<<8) | data[1] ;
+}
+
+void S11059::getAllData(uint16_t *data) 
+{
+    uint8_t raw_data[8] ;
+    readRegs(REG_R_DATA, raw_data, 8) ;
+    data[0] = (raw_data[0] << 8) | raw_data[1] ;
+    data[1] = (raw_data[2] << 8) | raw_data[3] ;
+    data[2] = (raw_data[4] << 8) | raw_data[5] ;
+    data[3] = (raw_data[6] << 8) | raw_data[7] ;
+}
+
+uint8_t S11059::getControl(void) 
+{
+    uint8_t data[1] ;
+    readRegs(REG_CONTROL, data, 1) ;
+    return(data[0]) ;
+}
+
+void S11059::setControl(uint8_t ctrlValue) 
+{
+    uint8_t data[2] ;
+    data[0] = REG_CONTROL ;
+    data[1] = ctrlValue ;
+    writeRegs(data, 2) ;
+}
+
+uint16_t S11059::getTiming(void) 
+{
+    uint8_t data[2] ;
+    uint16_t timing ;
+    readRegs(REG_TIMING_DATA, data, 2) ;
+    timing = (data[0] << 8) | data[1] ;
+    return(timing) ;
+}
+
+void S11059::setTiming(uint16_t timingValue) 
+{
+    uint8_t data[3] ;
+    data[0] = REG_TIMING_DATA ;
+    data[1] = (timingValue >> 8) & 0xFF ;
+    data[2] = timingValue & 0xFF ;
+    writeRegs(data, 3) ;
+}
+
+void S11059::setADCReset(int mode) 
+{
+    uint8_t data[2] ;
+    data[0] = REG_CONTROL ;
+    readRegs(data[0], &data[1], 1) ;
+    if (mode == 0) {
+        data[1] ^= BIT_ADC_RESET  ; 
+    } else {
+        data[1] |= BIT_ADC_RESET ; /* 0x80 */
+    }
+    writeRegs(data, 2) ;
+}
+
+int  S11059::getADCReset(void) 
+{
+    uint8_t data[1] ;
+    int result = 0 ;
+    readRegs(REG_CONTROL, data, 1) ;
+    if (data[0] & BIT_ADC_RESET) {
+        result = 1 ;
+    }
+    return(result) ;
+}
+
+void S11059::setSleepMode(int mode) 
+{   
+    uint8_t data[2] ;
+    data[0] = REG_CONTROL ;
+    readRegs(data[0], &data[1], 1) ;
+    if (mode == 0) {
+        data[1] ^= BIT_SLEEP_MODE ;
+    } else {
+        data[1] |= BIT_SLEEP_MODE ;
+    }
+    writeRegs(data, 2) ;    
+}
+
+int  S11059::getSleepMode(void) 
+{
+    uint8_t data[1] ;
+    int result = 0 ;
+    readRegs(REG_CONTROL, data, 1) ;
+    if (data[0] & BIT_SLEEP_MODE) {
+        result = 1 ;
+    }
+    return(result) ;  
+}
+
+void S11059::setGain(int mode) 
+{
+    uint8_t data[2] ;
+    data[0] = REG_CONTROL ;
+    readRegs(data[0], &data[1], 1) ;
+    if (mode == 0) {
+        data[1] ^= BIT_HIGH_GAIN ;
+    } else {
+        data[1] |= BIT_HIGH_GAIN ;
+    }
+}
+
+int  S11059::getGain(void) 
+{
+    uint8_t data[1] ;
+    int result = 0 ;
+    readRegs(REG_CONTROL, data, 1) ;
+    if (data[0] & BIT_HIGH_GAIN) {
+        result = 1 ;
+    }
+    return(result) ; 
+}
+
+void S11059::setIntegralMode(int mode) 
+{
+    uint8_t data[2] ;
+    data[0] = REG_CONTROL ;
+    readRegs(data[0], &data[1], 1) ;
+    if (mode == 0) {
+        data[1] ^= BIT_INT_MANUAL ;
+    } else {
+        data[1] |= BIT_INT_MANUAL ;
+    }
+}
+
+int  S11059::getIntegralMode(void) 
+{
+    uint8_t data[1] ;
+    int result = 0 ;
+    readRegs(REG_CONTROL, data, 1) ;
+    if (data[0] & BIT_INT_MANUAL) {
+        result = 1 ;
+    }
+    return(result) ; 
+}
+
+void S11059::readRegs(int addr, uint8_t * data, int len) {
+    char t[1] = {addr};
+    m_i2c.write(m_addr, t, 1, true);
+    m_i2c.read(m_addr, (char *)data, len);
+}
+
+void S11059::writeRegs(uint8_t * data, int len) {
+    m_i2c.write(m_addr, (char *)data, len);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/S11059.h	Fri May 12 02:10:35 2017 +0000
@@ -0,0 +1,217 @@
+#ifndef _S11059_H_
+#define _S11059_H_
+#include "mbed.h"
+/**
+ * S11059 HAMAMATSU
+ * @note RGBUr Color Sensor with I2C Interface
+ * @note I2C 7bit address: 0x2A
+ *
+ */
+ /**
+@code
+#include "mbed.h"
+#include "S11059.h"
+
+#define MSU_S11059_ADDRESS 0x2A
+
+#define PIN_SCL  PTE1
+#define PIN_SDA  PTE0
+
+int main(void) 
+{
+    uint16_t uR, uG, uB, uIR ;
+    uint8_t ctrl ;
+    int test_loop = 10 ;
+    int interval = 100 ;
+    S11059 *s11059 = new S11059(PIN_SDA, PIN_SCL, MSU_S11059_ADDRESS) ;
+    
+    for (int i = 0 ; i < test_loop ; i++ ) {
+        ctrl = 0x89 ; // ADC reset, High Gain, integration time 1.4ms 
+        s11059->setControl(ctrl) ;
+        ctrl = 0x09 ; // Release ADC reset, High Gain, integration time 1.4ms 
+        s11059->setControl(ctrl) ; // start measure 
+        wait(0.02) ;
+        s11059->getRData(&uR) ;
+        s11059->getGData(&uG) ;
+        s11059->getBData(&uB) ;
+        s11059->getIRData(&uIR) ;
+        printf("S11059 R[%d], G[%d], B[%d], IR[%d]\n", uR, uG, uB, uIR) ;
+        wait_ms(interval) ;
+    }
+    delete s11059 ;
+    while(1) { } 
+}
+@endcode
+ */
+
+class S11059
+{
+public:
+ /**
+ *  constructor
+ *
+ * @param sda SDA pin
+ * @param scl SCL pin
+ * @param addr address of the I2C peripheral
+ */
+ S11059(PinName sda, PinName scl, int addr) ;
+ 
+ ~S11059() ;
+
+ /*
+  * some member functions here (yet to be written)
+  */
+/**
+ * Get measured Red Value as float [0..1]
+ * @returns the value of Red as float
+ */
+float    getR(void) ; // return float value of Red
+
+/**
+ * Get measured Green Value as float [0..1]
+ * @returns the value of Green as float
+ */
+float    getG(void) ; // return float value of Green
+
+/**
+ * Get measured Blue Value as float [0..1]
+ * @returns the value of Blue as float
+ */
+float    getB(void) ; // return float value of Blue
+
+/**
+ * Get measured Infrared Value as float [0..1]
+ * @returns the value of Infrared as float
+ */
+float    getIR(void) ; // return float value of Infrared
+
+/**
+ * Get measured value of Red
+ * @param rdata unsigned 16bit data of Red
+ */
+void     getRData(uint16_t *rdata) ;
+
+/**
+ * Get measured value of Green
+ * @param rdata unsigned 16bit data of Green
+ */
+void     getGData(uint16_t *gdata) ;
+
+/**
+ * Get measured value of Blue
+ * @param rdata unsigned 16bit data of Blue
+ */
+void     getBData(uint16_t *bdata) ;
+
+/**
+ * Get measured value of Infrared
+ * @param rdata unsigned 16bit data of Infrared
+ */
+void     getIRData(uint16_t *irdata) ;
+
+/**
+ * Get measured values of Red, Green, Blue and Infrared at once
+ * @param 4 unsigned 16bit data data[0]:Red, data[1]:Green, data[2]:Blue, data[3]:Infrared
+ */
+void     getAllData(uint16_t *data) ; /* pass uint16_t data[4] */
+
+ /**
+ * Get value of the Control Register
+ * @returns the value of Control Register at address 0x00
+ * @note bit[7] ADC Reset 1:reset 0:start
+ * @note bit[6] Sleep function 1:sleep 0:active
+ * @note bit[5] Sleep monitor 
+ * @note bit[4] (reserved)
+ * @note bit[3] Gain 1:High Gain 0:Low Gain
+ * @note bit[2] Integration mode 1:manual 0:fixed
+ * @note bit[1:0] Integration time
+ * @note (00)87.5us (01)1.4ms (10)22.4ms (11)179.2ms 
+ *
+ */
+uint8_t  getControl(void) ;
+
+/**
+ * Set value to the Control Register
+ * @param ctrlValue value to assing to the Control Register at address 0x00
+ */
+void     setControl(uint8_t ctrlValue) ;
+
+/**
+ * Get value of the Manual Timing Register at address 0x01-0x02
+ * @returns 16bit value of Manual Timing Register
+ * @note This value matters only in Manual Mode (bit[2] == 1)
+ * @note In manual mode the integration time is
+ * @note length specified by bit[1:0] of Control Register (address 0x00)
+ * @note multiplied by the value of address 0x01-0x02
+ * @note if the value of 0x01-0x02 is N
+ * @note and according to the bit[1:0] of Control Register
+ * @note Integration time length is calculated as
+ * @note (00) 175   * N us
+ * @note (01)   2.8 * N ms
+ * @note (10)  44.8 * N ms
+ * @note (11) 358.4 * N ms
+ */ 
+uint16_t getTiming(void) ;
+
+/** 
+ * Set value to the Manual Timing Register at address 0x01-0x02
+ * @param timingValue 16bit timing value MSB to 0x01 LSB to 0x02
+ */
+void     setTiming(uint16_t timingValue) ;
+
+/**
+ * Set/clear ADC Reset bit in the Control Register
+ * @param mode 1:reset 0:start
+ */
+void     setADCReset(int mode) ;
+
+/**
+ * Get value of the ADC Reset bit (bit[7]) in the Control Register
+ * @returns the ADC Reset bit (bit[7])
+ */
+int      getADCReset(void) ;
+
+/**
+ * Set value to the sleep function bit (bit[6]) in the Control Register
+ * @param mode bit value 1:sleep 0:active
+ */
+void     setSleepMode(int mode) ;
+
+/**
+ * Get value of the sleep function bit (bit[6]) in the Control Register
+ * @returns bit value of sleep function bit (bit[6])
+ */
+int      getSleepMode(void) ;
+
+/**
+ * Set value to the gain bit (bit[3]) in the Control Register
+ * @param mode bit value to assign 1:High Gain 0:Low Gain
+ */
+void     setGain(int mode) ;
+
+/**
+ * Get value of the gain bit (bit[3]) in the Control Register
+ * @returns the bit value of gain bit (bit[3]) 
+ */
+int      getGain(void) ;
+
+/**
+ * Set value to Integration mode bit (bit[2]) of the Control Register
+ * @param mode bit value to assign 1:Manual Mode 0:Fixed Time Mode
+ */
+void     setIntegralMode(int mode) ;
+
+/**
+ * Get value of Integration mode bit (bit[2]) of the Control Register
+ * @returns the bit value of Integration mode bit (bit[2])
+ */
+int      getIntegralMode(void) ;
+  
+private:
+  I2C m_i2c;
+  int m_addr;
+  void readRegs(int addr, uint8_t * data, int len);
+  void writeRegs(uint8_t * data, int len);
+} ;
+
+#endif /* _S11059_H_ */
\ No newline at end of file