Median filtered & triggered + buffered RGB readings

Dependencies:   mbed rgb_sensor_buffer

Committer:
meriac
Date:
Thu Jul 03 16:54:13 2014 +0000
Revision:
0:c41a5885f681
Child:
2:f72e7a4d7395
Example for RGB sensor code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
meriac 0:c41a5885f681 1 /* Discrete RGB color sensor
meriac 0:c41a5885f681 2 *
meriac 0:c41a5885f681 3 * - uses single-channel light-dependent resistor (via ADC)
meriac 0:c41a5885f681 4 * and a RGB LED.
meriac 0:c41a5885f681 5 * - compensates background light
meriac 0:c41a5885f681 6 *
meriac 0:c41a5885f681 7 * Copyright (c) 2014 ARM Limited
meriac 0:c41a5885f681 8 *
meriac 0:c41a5885f681 9 * Licensed under the Apache License, Version 2.0 (the "License");
meriac 0:c41a5885f681 10 * you may not use this file except in compliance with the License.
meriac 0:c41a5885f681 11 * You may obtain a copy of the License at
meriac 0:c41a5885f681 12 *
meriac 0:c41a5885f681 13 * http://www.apache.org/licenses/LICENSE-2.0
meriac 0:c41a5885f681 14 *
meriac 0:c41a5885f681 15 * Unless required by applicable law or agreed to in writing, software
meriac 0:c41a5885f681 16 * distributed under the License is distributed on an "AS IS" BASIS,
meriac 0:c41a5885f681 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
meriac 0:c41a5885f681 18 * See the License for the specific language governing permissions and
meriac 0:c41a5885f681 19 * limitations under the License.
meriac 0:c41a5885f681 20 */
meriac 0:c41a5885f681 21
meriac 0:c41a5885f681 22 #include <mbed.h>
meriac 0:c41a5885f681 23 #include "rgb_sensor_buffer.h"
meriac 0:c41a5885f681 24
meriac 0:c41a5885f681 25 #define RGB_TRESHOLD 200
meriac 0:c41a5885f681 26 #define COUNT(x) (sizeof(x)/sizeof(x[0]))
meriac 0:c41a5885f681 27 #define RGB_VALUES 512
meriac 0:c41a5885f681 28
meriac 0:c41a5885f681 29 /* serial console */
meriac 0:c41a5885f681 30 static TRGB g_buffer[RGB_VALUES];
meriac 0:c41a5885f681 31 static int g_median[RGB_VALUES];
meriac 0:c41a5885f681 32 static Serial console(USBTX, USBRX);
meriac 0:c41a5885f681 33
meriac 0:c41a5885f681 34 #ifdef DEBUG
meriac 0:c41a5885f681 35 static void rgb_print(const TRGB &color)
meriac 0:c41a5885f681 36 {
meriac 0:c41a5885f681 37 int i;
meriac 0:c41a5885f681 38
meriac 0:c41a5885f681 39 console.printf("\t[");
meriac 0:c41a5885f681 40 for(i=0; i<COUNT(color.data); i++)
meriac 0:c41a5885f681 41 console.printf("%s%4i", i?",":"", color.data[i] / RGB_OVERSAMPLING);
meriac 0:c41a5885f681 42 console.printf("]");
meriac 0:c41a5885f681 43 }
meriac 0:c41a5885f681 44 #endif/*DEBUG*/
meriac 0:c41a5885f681 45
meriac 0:c41a5885f681 46 static int median_compare(const void* a, const void *b)
meriac 0:c41a5885f681 47 {
meriac 0:c41a5885f681 48 return *((int*)a) - *((int*)b);
meriac 0:c41a5885f681 49 }
meriac 0:c41a5885f681 50
meriac 0:c41a5885f681 51 static bool median(TRGB &color, int count)
meriac 0:c41a5885f681 52 {
meriac 0:c41a5885f681 53 int channel, i;
meriac 0:c41a5885f681 54
meriac 0:c41a5885f681 55 if(count<=0)
meriac 0:c41a5885f681 56 return false;
meriac 0:c41a5885f681 57
meriac 0:c41a5885f681 58 /* sort all three RGB channels to get median */
meriac 0:c41a5885f681 59 for(channel=0; channel<3; channel++)
meriac 0:c41a5885f681 60 {
meriac 0:c41a5885f681 61 for(i=0; i<count; i++)
meriac 0:c41a5885f681 62 g_median[i] = g_buffer[i].data[channel];
meriac 0:c41a5885f681 63
meriac 0:c41a5885f681 64 qsort(&g_median, count, sizeof(g_median[0]), &median_compare);
meriac 0:c41a5885f681 65
meriac 0:c41a5885f681 66 color.data[channel] = g_median[count/2];
meriac 0:c41a5885f681 67 }
meriac 0:c41a5885f681 68
meriac 0:c41a5885f681 69 return true;
meriac 0:c41a5885f681 70 }
meriac 0:c41a5885f681 71
meriac 0:c41a5885f681 72
meriac 0:c41a5885f681 73 int main() {
meriac 0:c41a5885f681 74 int res, i;
meriac 0:c41a5885f681 75 TRGB color;
meriac 0:c41a5885f681 76
meriac 0:c41a5885f681 77 console.baud(115200);
meriac 0:c41a5885f681 78
meriac 0:c41a5885f681 79 /* R,G,B pins and ADC for light dependent resistor */
meriac 0:c41a5885f681 80 RGB_SensorBuffer rgb(p23,p24,p25,p20);
meriac 0:c41a5885f681 81
meriac 0:c41a5885f681 82 /* needed for time measurement */
meriac 0:c41a5885f681 83 Timer timer;
meriac 0:c41a5885f681 84
meriac 0:c41a5885f681 85 while(1) {
meriac 0:c41a5885f681 86
meriac 0:c41a5885f681 87 /* start four channel RGB conversion */
meriac 0:c41a5885f681 88 timer.reset();
meriac 0:c41a5885f681 89 timer.start();
meriac 0:c41a5885f681 90
meriac 0:c41a5885f681 91 res = rgb.trigger(g_buffer, COUNT(g_buffer), RGB_TRESHOLD);
meriac 0:c41a5885f681 92
meriac 0:c41a5885f681 93 /* stop time measurement */
meriac 0:c41a5885f681 94 timer.stop();
meriac 0:c41a5885f681 95
meriac 0:c41a5885f681 96 if(res<=0)
meriac 0:c41a5885f681 97 {
meriac 0:c41a5885f681 98 console.printf("// failed to capture RGB values (%i)\r\n", res);
meriac 0:c41a5885f681 99 while(1);
meriac 0:c41a5885f681 100 }
meriac 0:c41a5885f681 101
meriac 0:c41a5885f681 102 /* calculate RGB median */
meriac 0:c41a5885f681 103 median(color, res);
meriac 0:c41a5885f681 104 /* print normalized median */
meriac 0:c41a5885f681 105 i = (color.ch.red + color.ch.green + color.ch.blue);
meriac 0:c41a5885f681 106 console.printf("\t[%4i,%4i,%4i,%5i], // %i values in %ims (%i/s)\n\r",
meriac 0:c41a5885f681 107 (color.ch.red * 0xFFF)/i,
meriac 0:c41a5885f681 108 (color.ch.green * 0xFFF)/i,
meriac 0:c41a5885f681 109 (color.ch.blue * 0xFFF)/i,
meriac 0:c41a5885f681 110 i/RGB_OVERSAMPLING,
meriac 0:c41a5885f681 111 res,
meriac 0:c41a5885f681 112 timer.read_ms(),
meriac 0:c41a5885f681 113 (res*1000UL)/timer.read_ms()
meriac 0:c41a5885f681 114 );
meriac 0:c41a5885f681 115
meriac 0:c41a5885f681 116 #ifdef DEBUG
meriac 0:c41a5885f681 117 console.printf("\r\nvar test = [\r\n",
meriac 0:c41a5885f681 118 res,
meriac 0:c41a5885f681 119 timer.read_ms(),
meriac 0:c41a5885f681 120 (res*1000UL)/timer.read_ms());
meriac 0:c41a5885f681 121
meriac 0:c41a5885f681 122 for(i=0; i<res; i++)
meriac 0:c41a5885f681 123 {
meriac 0:c41a5885f681 124 rgb_print(g_buffer[i]);
meriac 0:c41a5885f681 125 console.printf(i<(res-1) ? ",\r\n":"];\r\n\r\n");
meriac 0:c41a5885f681 126 }
meriac 0:c41a5885f681 127 #endif/*DEBUG*/
meriac 0:c41a5885f681 128
meriac 0:c41a5885f681 129 }
meriac 0:c41a5885f681 130 }