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:
Fri Jun 27 11:36:15 2014 +0000
Revision:
3:50e1ac3c56db
Parent:
2:4545984e62b6
Child:
5:1fed2b68e661
Added callback support for asynchronous case

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 1:204db97d10c9 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 0:576e43bd193d 30 #define RGB_OVERSAMPLING 128
meriac 0:576e43bd193d 31 #endif/*RGB_OVERSAMPLING*/
meriac 0:576e43bd193d 32
meriac 0:576e43bd193d 33 #ifndef RGB_MAX_ADC_CLK
meriac 0:576e43bd193d 34 #define RGB_MAX_ADC_CLK 12400000UL
meriac 0:576e43bd193d 35 #endif/*RGB_MAX_ADC_CLK*/
meriac 0:576e43bd193d 36
meriac 0:576e43bd193d 37 #define RGB_CHANNELS 4
meriac 0:576e43bd193d 38
meriac 0:576e43bd193d 39 typedef struct
meriac 0:576e43bd193d 40 {
meriac 0:576e43bd193d 41 int red,green,blue;
meriac 0:576e43bd193d 42 } TRGB_Channel;
meriac 0:576e43bd193d 43
meriac 0:576e43bd193d 44 typedef union
meriac 0:576e43bd193d 45 {
meriac 0:576e43bd193d 46 TRGB_Channel ch;
meriac 0:576e43bd193d 47 int data[3];
meriac 0:576e43bd193d 48 } TRGB;
meriac 0:576e43bd193d 49
meriac 3:50e1ac3c56db 50 typedef bool (*TRGB_Callback)(const TRGB &rgb);
meriac 3:50e1ac3c56db 51
meriac 0:576e43bd193d 52 class RGB_Sensor
meriac 0:576e43bd193d 53 {
meriac 0:576e43bd193d 54 public:
meriac 0:576e43bd193d 55 RGB_Sensor(PinName red, PinName green, PinName blue, PinName adc);
meriac 0:576e43bd193d 56 ~RGB_Sensor(void);
meriac 0:576e43bd193d 57 bool capture(TRGB &rgb);
meriac 3:50e1ac3c56db 58 bool capture(const TRGB_Callback callback);
meriac 3:50e1ac3c56db 59 bool wait(void);
meriac 0:576e43bd193d 60 protected:
meriac 3:50e1ac3c56db 61 TRGB_Callback m_callback;
meriac 0:576e43bd193d 62 bool m_done;
meriac 0:576e43bd193d 63 uint8_t m_adc_channel, m_rgb_channel;
meriac 0:576e43bd193d 64 DigitalOut m_red, m_green, m_blue;
meriac 0:576e43bd193d 65 int m_adc_aggregation[RGB_CHANNELS], m_adc_count;
meriac 3:50e1ac3c56db 66 void convert(TRGB &rgb);
meriac 0:576e43bd193d 67 private:
meriac 0:576e43bd193d 68 static void __adc_irq(void);
meriac 0:576e43bd193d 69 void adc_irq(void);
meriac 0:576e43bd193d 70 static RGB_Sensor *m_global;
meriac 0:576e43bd193d 71 };
meriac 0:576e43bd193d 72
meriac 0:576e43bd193d 73 #endif/*__RGB_SENSOR_H__*/