Discrete RGB colour sensor using a colour LED flashing at high speed and a monochrome LDR (light dependent resistor) for detecting the colour via ADC conversion. The library implements interrupt driven ADC conversion at high speed (370 RGB readings per second, 128 times oversampling per channelfor noise reduction). The detection can optionally run in background.

Dependents:   rgb_sensor_buffer discrete_rgb_color_sensor_example

Committer:
meriac
Date:
Thu Jul 03 17:24:41 2014 +0000
Revision:
9:7bd80f4a965e
Parent:
8:88acb970df76
Child:
10:b95dfd2d6d4d
Allowing to ignore values at the beginning of each block to ignore rise times low pass.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
meriac 1:204db97d10c9 1 /* Discrete RGB color sensor
meriac 1:204db97d10c9 2 *
meriac 1:204db97d10c9 3 * - uses single-channel light-dependent resistor (via ADC)
meriac 1:204db97d10c9 4 * and a RGB LED.
meriac 1:204db97d10c9 5 * - compensates background light
meriac 1:204db97d10c9 6 *
meriac 1:204db97d10c9 7 * Copyright (c) 2014 ARM Limited
meriac 1:204db97d10c9 8 *
meriac 1:204db97d10c9 9 * Licensed under the Apache License, Version 2.0 (the "License");
meriac 1:204db97d10c9 10 * you may not use this file except in compliance with the License.
meriac 1:204db97d10c9 11 * You may obtain a copy of the License at
meriac 1:204db97d10c9 12 *
meriac 1:204db97d10c9 13 * http://www.apache.org/licenses/LICENSE-2.0
meriac 1:204db97d10c9 14 *
meriac 1:204db97d10c9 15 * Unless required by applicable law or agreed to in writing, software
meriac 1:204db97d10c9 16 * distributed under the License is distributed on an "AS IS" BASIS,
meriac 1:204db97d10c9 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
meriac 1:204db97d10c9 18 * See the License for the specific language governing permissions and
meriac 1:204db97d10c9 19 * limitations under the License.
meriac 1:204db97d10c9 20 */
meriac 1:204db97d10c9 21
meriac 8:88acb970df76 22 #ifndef __RGB_SENSOR_H__
meriac 0:576e43bd193d 23 #define __RGB_SENSOR_H__
meriac 0:576e43bd193d 24
meriac 2:4545984e62b6 25 #ifndef RGB_LED_ON
meriac 2:4545984e62b6 26 #define RGB_LED_ON true
meriac 2:4545984e62b6 27 #endif/*RGB_LED_ON*/
meriac 2:4545984e62b6 28
meriac 0:576e43bd193d 29 #ifndef RGB_OVERSAMPLING
meriac 8:88acb970df76 30 #define RGB_OVERSAMPLING 32
meriac 0:576e43bd193d 31 #endif/*RGB_OVERSAMPLING*/
meriac 0:576e43bd193d 32
meriac 9:7bd80f4a965e 33 #ifndef RGB_SENSOR_IGNORE
meriac 9:7bd80f4a965e 34 #define RGB_SENSOR_IGNORE (RGB_OVERSAMPLING/2)
meriac 9:7bd80f4a965e 35 #endif/*RGB_SENSOR_IGNORE*/
meriac 9:7bd80f4a965e 36
meriac 9:7bd80f4a965e 37
meriac 0:576e43bd193d 38 #ifndef RGB_MAX_ADC_CLK
meriac 8:88acb970df76 39 #define RGB_MAX_ADC_CLK 6000000UL
meriac 0:576e43bd193d 40 #endif/*RGB_MAX_ADC_CLK*/
meriac 0:576e43bd193d 41
meriac 0:576e43bd193d 42 #define RGB_CHANNELS 4
meriac 0:576e43bd193d 43
meriac 0:576e43bd193d 44 typedef struct
meriac 0:576e43bd193d 45 {
meriac 0:576e43bd193d 46 int red,green,blue;
meriac 0:576e43bd193d 47 } TRGB_Channel;
meriac 0:576e43bd193d 48
meriac 0:576e43bd193d 49 typedef union
meriac 0:576e43bd193d 50 {
meriac 0:576e43bd193d 51 TRGB_Channel ch;
meriac 0:576e43bd193d 52 int data[3];
meriac 0:576e43bd193d 53 } TRGB;
meriac 0:576e43bd193d 54
meriac 3:50e1ac3c56db 55 typedef bool (*TRGB_Callback)(const TRGB &rgb);
meriac 3:50e1ac3c56db 56
meriac 0:576e43bd193d 57 class RGB_Sensor
meriac 0:576e43bd193d 58 {
meriac 0:576e43bd193d 59 public:
meriac 0:576e43bd193d 60 RGB_Sensor(PinName red, PinName green, PinName blue, PinName adc);
meriac 0:576e43bd193d 61 ~RGB_Sensor(void);
meriac 0:576e43bd193d 62 bool capture(TRGB &rgb);
meriac 3:50e1ac3c56db 63 bool capture(const TRGB_Callback callback);
meriac 3:50e1ac3c56db 64 bool wait(void);
meriac 0:576e43bd193d 65 protected:
meriac 3:50e1ac3c56db 66 TRGB_Callback m_callback;
meriac 0:576e43bd193d 67 bool m_done;
meriac 0:576e43bd193d 68 uint8_t m_adc_channel, m_rgb_channel;
meriac 0:576e43bd193d 69 DigitalOut m_red, m_green, m_blue;
meriac 5:1fed2b68e661 70 int m_adc_filter[RGB_CHANNELS][2], m_adc_filter_pos;
meriac 0:576e43bd193d 71 int m_adc_aggregation[RGB_CHANNELS], m_adc_count;
meriac 3:50e1ac3c56db 72 void convert(TRGB &rgb);
meriac 5:1fed2b68e661 73 int filter(int sample);
meriac 0:576e43bd193d 74 private:
meriac 0:576e43bd193d 75 static void __adc_irq(void);
meriac 0:576e43bd193d 76 void adc_irq(void);
meriac 0:576e43bd193d 77 static RGB_Sensor *m_global;
meriac 0:576e43bd193d 78 };
meriac 0:576e43bd193d 79
meriac 0:576e43bd193d 80 #endif/*__RGB_SENSOR_H__*/