Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 0:5842d74d28fb, committed 2019-01-11
- Comitter:
 - TakumiToda
 - Date:
 - Fri Jan 11 08:01:13 2019 +0000
 - Commit message:
 - S11059
 
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 Jan 11 08:01:13 2019 +0000
@@ -0,0 +1,262 @@
+/*
+ * 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 Jan 11 08:01:13 2019 +0000
@@ -0,0 +1,181 @@
+#ifndef _S11059_H_
+#define _S11059_H_
+#include "mbed.h"
+/**
+ * S11059 HAMAMATSU
+ * @note RGBUr Color Sensor with I2C Interface
+ * @note I2C 7bit address: 0x2A
+ *
+ */
+
+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_ */