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:
Wed Jul 09 10:27:38 2014 +0000
Revision:
10:b95dfd2d6d4d
Parent:
9:7bd80f4a965e
Added RGB_MASK declararation

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 10:b95dfd2d6d4d 25 #define RGB_MASK 0xFFF
meriac 10:b95dfd2d6d4d 26
meriac 2:4545984e62b6 27 #ifndef RGB_LED_ON
meriac 2:4545984e62b6 28 #define RGB_LED_ON true
meriac 2:4545984e62b6 29 #endif/*RGB_LED_ON*/
meriac 2:4545984e62b6 30
meriac 0:576e43bd193d 31 #ifndef RGB_OVERSAMPLING
meriac 8:88acb970df76 32 #define RGB_OVERSAMPLING 32
meriac 0:576e43bd193d 33 #endif/*RGB_OVERSAMPLING*/
meriac 0:576e43bd193d 34
meriac 9:7bd80f4a965e 35 #ifndef RGB_SENSOR_IGNORE
meriac 9:7bd80f4a965e 36 #define RGB_SENSOR_IGNORE (RGB_OVERSAMPLING/2)
meriac 9:7bd80f4a965e 37 #endif/*RGB_SENSOR_IGNORE*/
meriac 9:7bd80f4a965e 38
meriac 9:7bd80f4a965e 39
meriac 0:576e43bd193d 40 #ifndef RGB_MAX_ADC_CLK
meriac 8:88acb970df76 41 #define RGB_MAX_ADC_CLK 6000000UL
meriac 0:576e43bd193d 42 #endif/*RGB_MAX_ADC_CLK*/
meriac 0:576e43bd193d 43
meriac 0:576e43bd193d 44 #define RGB_CHANNELS 4
meriac 0:576e43bd193d 45
meriac 0:576e43bd193d 46 typedef struct
meriac 0:576e43bd193d 47 {
meriac 0:576e43bd193d 48 int red,green,blue;
meriac 0:576e43bd193d 49 } TRGB_Channel;
meriac 0:576e43bd193d 50
meriac 0:576e43bd193d 51 typedef union
meriac 0:576e43bd193d 52 {
meriac 0:576e43bd193d 53 TRGB_Channel ch;
meriac 0:576e43bd193d 54 int data[3];
meriac 0:576e43bd193d 55 } TRGB;
meriac 0:576e43bd193d 56
meriac 3:50e1ac3c56db 57 typedef bool (*TRGB_Callback)(const TRGB &rgb);
meriac 3:50e1ac3c56db 58
meriac 0:576e43bd193d 59 class RGB_Sensor
meriac 0:576e43bd193d 60 {
meriac 0:576e43bd193d 61 public:
meriac 0:576e43bd193d 62 RGB_Sensor(PinName red, PinName green, PinName blue, PinName adc);
meriac 0:576e43bd193d 63 ~RGB_Sensor(void);
meriac 0:576e43bd193d 64 bool capture(TRGB &rgb);
meriac 3:50e1ac3c56db 65 bool capture(const TRGB_Callback callback);
meriac 3:50e1ac3c56db 66 bool wait(void);
meriac 0:576e43bd193d 67 protected:
meriac 3:50e1ac3c56db 68 TRGB_Callback m_callback;
meriac 0:576e43bd193d 69 bool m_done;
meriac 0:576e43bd193d 70 uint8_t m_adc_channel, m_rgb_channel;
meriac 0:576e43bd193d 71 DigitalOut m_red, m_green, m_blue;
meriac 5:1fed2b68e661 72 int m_adc_filter[RGB_CHANNELS][2], m_adc_filter_pos;
meriac 0:576e43bd193d 73 int m_adc_aggregation[RGB_CHANNELS], m_adc_count;
meriac 3:50e1ac3c56db 74 void convert(TRGB &rgb);
meriac 5:1fed2b68e661 75 int filter(int sample);
meriac 0:576e43bd193d 76 private:
meriac 0:576e43bd193d 77 static void __adc_irq(void);
meriac 0:576e43bd193d 78 void adc_irq(void);
meriac 0:576e43bd193d 79 static RGB_Sensor *m_global;
meriac 0:576e43bd193d 80 };
meriac 0:576e43bd193d 81
meriac 0:576e43bd193d 82 #endif/*__RGB_SENSOR_H__*/