Chris Paola / rgb_sensor_detection

Dependencies:   rgb_sensor_buffer

Dependents:   coffee_capsule_detection

Committer:
bjblazkowicz
Date:
Fri Jul 11 13:48:32 2014 +0000
Revision:
3:4eefc032a319
Parent:
2:c865eac393d2
Now uses the buffered sensor.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bjblazkowicz 0:8a18ceffce1b 1 #include <mbed.h>
bjblazkowicz 0:8a18ceffce1b 2 #include "detection.h"
bjblazkowicz 0:8a18ceffce1b 3
bjblazkowicz 3:4eefc032a319 4 #define RGB_TRESHOLD 0
bjblazkowicz 3:4eefc032a319 5
bjblazkowicz 0:8a18ceffce1b 6 #define COUNT(x) (sizeof(x)/sizeof(x[0]))
bjblazkowicz 3:4eefc032a319 7 //#define DETECTION_DEBUG
bjblazkowicz 0:8a18ceffce1b 8
bjblazkowicz 2:c865eac393d2 9 #ifdef DETECTION_DEBUG
bjblazkowicz 0:8a18ceffce1b 10 extern Serial console;
bjblazkowicz 2:c865eac393d2 11 #endif
bjblazkowicz 0:8a18ceffce1b 12
bjblazkowicz 1:a6c13143b151 13 static const Capsule g_capsules[] = {
bjblazkowicz 0:8a18ceffce1b 14 { "no_capsule", 0, 0, 0 },
bjblazkowicz 3:4eefc032a319 15 { "arpeggio", 182.091796875, 390.759765625, 557.3984375 },
bjblazkowicz 3:4eefc032a319 16 { "decaffeinato_intenso", 265.15234375, 383.55859375, 464.64453125 },
bjblazkowicz 3:4eefc032a319 17 { "livanto", 417.59765625, 551.00390625, 522.685546875 },
bjblazkowicz 3:4eefc032a319 18 { "roma", 159.708984375, 407.90234375, 476.068359375 },
bjblazkowicz 3:4eefc032a319 19 { "rosabaya", 707.041015625, 1193.072265625, 1382.546875 },
bjblazkowicz 3:4eefc032a319 20 { "volluto", 736.615234375, 1041.916015625, 849.5234375 }
bjblazkowicz 0:8a18ceffce1b 21 };
bjblazkowicz 0:8a18ceffce1b 22
bjblazkowicz 1:a6c13143b151 23 RGB_Detection::RGB_Detection(PinName red, PinName green, PinName blue, PinName adc) :
bjblazkowicz 1:a6c13143b151 24 m_rgb(red, green, blue, adc),
bjblazkowicz 1:a6c13143b151 25 m_last_capsule(NULL)
bjblazkowicz 0:8a18ceffce1b 26 {
bjblazkowicz 0:8a18ceffce1b 27 }
bjblazkowicz 0:8a18ceffce1b 28
bjblazkowicz 1:a6c13143b151 29 RGB_Detection::~RGB_Detection()
bjblazkowicz 1:a6c13143b151 30 {
bjblazkowicz 1:a6c13143b151 31 }
bjblazkowicz 1:a6c13143b151 32
bjblazkowicz 1:a6c13143b151 33 int RGB_Detection::match_sample_to_capsule(TRGB& rgb_sample)
bjblazkowicz 0:8a18ceffce1b 34 {
bjblazkowicz 3:4eefc032a319 35 const int magic_threshold = 7000;
bjblazkowicz 0:8a18ceffce1b 36 double min_so_far = 1e20;
bjblazkowicz 0:8a18ceffce1b 37 int best_index = 0;
bjblazkowicz 0:8a18ceffce1b 38
bjblazkowicz 0:8a18ceffce1b 39 for (int j = 1; j < COUNT(g_capsules); j++)
bjblazkowicz 0:8a18ceffce1b 40 {
bjblazkowicz 0:8a18ceffce1b 41 double delta_r = g_capsules[j].r - (rgb_sample.ch.red / RGB_OVERSAMPLING);
bjblazkowicz 0:8a18ceffce1b 42 double delta_g = g_capsules[j].g - (rgb_sample.ch.green / RGB_OVERSAMPLING);
bjblazkowicz 0:8a18ceffce1b 43 double delta_b = g_capsules[j].b - (rgb_sample.ch.blue / RGB_OVERSAMPLING);
bjblazkowicz 0:8a18ceffce1b 44 double d = (delta_r * delta_r + delta_g * delta_g + delta_b * delta_b);
bjblazkowicz 0:8a18ceffce1b 45
bjblazkowicz 0:8a18ceffce1b 46 if (d < min_so_far && d < magic_threshold)
bjblazkowicz 0:8a18ceffce1b 47 {
bjblazkowicz 0:8a18ceffce1b 48 min_so_far = d;
bjblazkowicz 0:8a18ceffce1b 49 best_index = j;
bjblazkowicz 0:8a18ceffce1b 50 }
bjblazkowicz 0:8a18ceffce1b 51 }
bjblazkowicz 0:8a18ceffce1b 52
bjblazkowicz 0:8a18ceffce1b 53 return best_index;
bjblazkowicz 0:8a18ceffce1b 54 }
bjblazkowicz 0:8a18ceffce1b 55
bjblazkowicz 1:a6c13143b151 56 const Capsule* RGB_Detection::read_capsule(void)
bjblazkowicz 0:8a18ceffce1b 57 {
bjblazkowicz 1:a6c13143b151 58 Capsule const *capsule = NULL;
bjblazkowicz 0:8a18ceffce1b 59 bool done = false;
bjblazkowicz 0:8a18ceffce1b 60
bjblazkowicz 0:8a18ceffce1b 61 while (!done)
bjblazkowicz 0:8a18ceffce1b 62 {
bjblazkowicz 0:8a18ceffce1b 63 int histogram[COUNT(g_capsules)] = {0};
bjblazkowicz 3:4eefc032a319 64 int samples_in_buffer = m_rgb.trigger(m_buffer, COUNT(m_buffer), RGB_TRESHOLD);
bjblazkowicz 3:4eefc032a319 65
bjblazkowicz 3:4eefc032a319 66 for (int i = 0; i < samples_in_buffer; i++)
bjblazkowicz 0:8a18ceffce1b 67 {
bjblazkowicz 3:4eefc032a319 68 // console.printf("buffer[%d] = {%i, %i, %i}\r\n", i, m_buffer[i].data[0] / RGB_OVERSAMPLING, m_buffer[i].data[1] / RGB_OVERSAMPLING, m_buffer[i].data[2] / RGB_OVERSAMPLING);
bjblazkowicz 1:a6c13143b151 69 int index = match_sample_to_capsule(m_buffer[i]);
bjblazkowicz 0:8a18ceffce1b 70 histogram[index]++;
bjblazkowicz 0:8a18ceffce1b 71 }
bjblazkowicz 0:8a18ceffce1b 72
bjblazkowicz 0:8a18ceffce1b 73 for (int i = 0; i < COUNT(histogram); i++)
bjblazkowicz 0:8a18ceffce1b 74 {
bjblazkowicz 3:4eefc032a319 75 if (histogram[i] > 45/*RGB_VALUES / 2*/)
bjblazkowicz 0:8a18ceffce1b 76 {
bjblazkowicz 0:8a18ceffce1b 77 capsule = &g_capsules[i];
bjblazkowicz 0:8a18ceffce1b 78 done = true;
bjblazkowicz 0:8a18ceffce1b 79 break;
bjblazkowicz 0:8a18ceffce1b 80 }
bjblazkowicz 1:a6c13143b151 81 }
bjblazkowicz 0:8a18ceffce1b 82
bjblazkowicz 2:c865eac393d2 83 #ifdef DETECTION_DEBUG
bjblazkowicz 1:a6c13143b151 84 console.printf("------------------------\r\n");
bjblazkowicz 1:a6c13143b151 85 for (int i = 0; i < COUNT(histogram); i++)
bjblazkowicz 1:a6c13143b151 86 {
bjblazkowicz 1:a6c13143b151 87 console.printf("%s: %d\r\n", g_capsules[i].name, histogram[i]);
bjblazkowicz 1:a6c13143b151 88 }
bjblazkowicz 1:a6c13143b151 89 console.printf("------------------------\r\n\r\n");
bjblazkowicz 2:c865eac393d2 90 #endif
bjblazkowicz 0:8a18ceffce1b 91 }
bjblazkowicz 0:8a18ceffce1b 92
bjblazkowicz 0:8a18ceffce1b 93 return capsule;
bjblazkowicz 0:8a18ceffce1b 94 }
bjblazkowicz 0:8a18ceffce1b 95
bjblazkowicz 1:a6c13143b151 96 const char* RGB_Detection::run(void)
bjblazkowicz 0:8a18ceffce1b 97 {
bjblazkowicz 1:a6c13143b151 98 Capsule const *this_capsule = read_capsule();
bjblazkowicz 2:c865eac393d2 99
bjblazkowicz 1:a6c13143b151 100 if (m_last_capsule)
bjblazkowicz 0:8a18ceffce1b 101 {
bjblazkowicz 1:a6c13143b151 102 while (this_capsule == m_last_capsule)
bjblazkowicz 0:8a18ceffce1b 103 this_capsule = read_capsule();
bjblazkowicz 1:a6c13143b151 104 }
bjblazkowicz 1:a6c13143b151 105
bjblazkowicz 1:a6c13143b151 106 m_last_capsule = this_capsule;
bjblazkowicz 0:8a18ceffce1b 107
bjblazkowicz 0:8a18ceffce1b 108 return this_capsule->name;
bjblazkowicz 0:8a18ceffce1b 109 }
bjblazkowicz 1:a6c13143b151 110