The MBED firmware used on the Chipin sorter, developed over 12 weeks for a 3rd year university systems project. Chipin is a token sorter, it sorts tokens by colours and dispenses them to order through an online booking system and card reader. This program interfaces with an FPGA, PC and LCD screen to control the sorter. The sorter has an operation mode where it can process orders when a card is entered into the machine. There is also a maintenance mode where the device responds to maintenance instructions such as 'dispense all'. More information at http://www.ionsystems.uk/

Dependencies:   MCP23017 TCS3472_I2C WattBob_TextLCD mbed-rtos mbed

Committer:
IonSystems
Date:
Fri Dec 05 09:53:04 2014 +0000
Revision:
28:bdf2bf56f97b
Parent:
24:8868101d01d0
Commened main

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IonSystems 6:e64796f1f384 1 #include "mbed.h"
IonSystems 6:e64796f1f384 2 #include "TCS3472_I2C.h"
IonSystems 6:e64796f1f384 3 #include "Colour.h"
IonSystems 24:8868101d01d0 4 /* TCS3472_I2C
IonSystems 24:8868101d01d0 5 * A MBED library specifically made for the TCS3472 RGB Colour Sensor.
IonSystems 24:8868101d01d0 6 */
IonSystems 6:e64796f1f384 7 TCS3472_I2C rgb_sensor(p28,p27); //p28 =sda, p27=scl
IonSystems 6:e64796f1f384 8
IonSystems 24:8868101d01d0 9 int rgb_readings[100][4]; //A 2D array to store 100 values of each colour.
IonSystems 24:8868101d01d0 10 int rgb_average[4] = {0,0,0,0}; //An array to store the average colour values calculated.
IonSystems 24:8868101d01d0 11 double rMax = 9244; //The maximum possible value of red, from the colour sensor.
IonSystems 24:8868101d01d0 12 double gMax = 3194; //The maximum possible value of red, from the colour sensor.
IonSystems 24:8868101d01d0 13 double bMax = 3590; //The maximum possible value of red, from the colour sensor.
IonSystems 24:8868101d01d0 14
IonSystems 24:8868101d01d0 15 int tubeSize = 20; //The upper software limit for the number of chips that can be stored in each tube.
IonSystems 24:8868101d01d0 16
IonSystems 24:8868101d01d0 17 /* Threshold values for each colour are defined below.
IonSystems 24:8868101d01d0 18 * Threshold values for none (nothing above the sensor) are also stored,
IonSystems 24:8868101d01d0 19 * so that we know when there are no chips in the hopper.
IonSystems 24:8868101d01d0 20 * This allows us to stop sorting when there are no chips in the hopper,
IonSystems 24:8868101d01d0 21 * and differenciate between nothing there and an invalid token colour above the sensor.
IonSystems 24:8868101d01d0 22 */
IonSystems 24:8868101d01d0 23 int redLT [3] = {308,84,162}; //The lower threshold value for red.
IonSystems 24:8868101d01d0 24 int redUT [3]= {400,144,204}; //The upper threshold value for red.
IonSystems 24:8868101d01d0 25
IonSystems 24:8868101d01d0 26 int greenLT [3] = {91,180,142}; //The lower threshold value for green.
IonSystems 24:8868101d01d0 27 int greenUT [3]= {132,220,184}; //The upper threshold value for green.
IonSystems 24:8868101d01d0 28
IonSystems 24:8868101d01d0 29 int blueLT [3]= {79,95,117}; //The lower threshold value for blue.
IonSystems 24:8868101d01d0 30 int blueUT [3]= {117,139,157}; //The upper threshold value for blue.
IonSystems 23:f9e7e64784be 31
IonSystems 24:8868101d01d0 32 int noneLT [3] = {0,0,0}; //The lower threshold value for none.
IonSystems 24:8868101d01d0 33 int noneUT [3] = {80,80,80}; //The upper threshold value for none.
IonSystems 6:e64796f1f384 34
IonSystems 24:8868101d01d0 35 void initColourSensor() //Intialise the colour sensor.
IonSystems 23:f9e7e64784be 36 {
IonSystems 24:8868101d01d0 37 rgb_sensor.enablePowerAndRGBC(); //Enable the internal oscillator and 2-channel ADC
IonSystems 24:8868101d01d0 38 rgb_sensor.setIntegrationTime(100); //Set integration time to 100. Longer integration time increases sensitivity for low-light.
IonSystems 6:e64796f1f384 39 }
IonSystems 24:8868101d01d0 40 /* readColourSensor()
IonSystems 24:8868101d01d0 41 * Takes 100 readings of all 4 colour values and takes an average of the 100 values.
IonSystems 24:8868101d01d0 42 * The average is used to allow the chip to settle on the colour sensor.
IonSystems 24:8868101d01d0 43 *
IonSystems 24:8868101d01d0 44 */
IonSystems 23:f9e7e64784be 45 Colour readColourSensor()
IonSystems 24:8868101d01d0 46 { //Take 100 Colour readings
IonSystems 24:8868101d01d0 47 for(int i = 0; i < 100; i++) {
IonSystems 23:f9e7e64784be 48 rgb_sensor.getAllColors(rgb_readings[i]);
IonSystems 24:8868101d01d0 49 Thread::wait(1);
IonSystems 23:f9e7e64784be 50 }
IonSystems 24:8868101d01d0 51
IonSystems 24:8868101d01d0 52 //Add the 100 values together for each colour
IonSystems 24:8868101d01d0 53 for(int i = 0; i < 100; i++) {
IonSystems 23:f9e7e64784be 54 for(int j = 0; j < 4; j++) {
IonSystems 23:f9e7e64784be 55 rgb_average[j] += rgb_readings[i][j];
IonSystems 5:644bca33c1ca 56 }
IonSystems 23:f9e7e64784be 57 }
IonSystems 24:8868101d01d0 58
IonSystems 24:8868101d01d0 59 //Divide the four summated values by 100 to get the four averages (one for each colour).
IonSystems 23:f9e7e64784be 60 for(int i = 0; i < 4; i++) {
IonSystems 24:8868101d01d0 61 rgb_average[i] = rgb_average[i] / 100;
IonSystems 23:f9e7e64784be 62 }
IonSystems 24:8868101d01d0 63
IonSystems 24:8868101d01d0 64 //Scale the red, green and blue values bwetween 0 and 255.
IonSystems 23:f9e7e64784be 65 double redd = (rgb_average[1] /gMax) * 255;
IonSystems 23:f9e7e64784be 66 double greend = (rgb_average[2] /bMax) * 255;
IonSystems 23:f9e7e64784be 67 double blued = (rgb_average[0] /rMax) * 255;
IonSystems 24:8868101d01d0 68
IonSystems 24:8868101d01d0 69 //Convert the values from doubles to integers.
IonSystems 23:f9e7e64784be 70 int red = redd;
IonSystems 23:f9e7e64784be 71 int green = greend;
IonSystems 23:f9e7e64784be 72 int blue = blued;
IonSystems 23:f9e7e64784be 73
IonSystems 24:8868101d01d0 74 //Create boolean arrays to check threshold values.
IonSystems 23:f9e7e64784be 75 bool redWithinThreshold[4] = {0,0,0,0};
IonSystems 23:f9e7e64784be 76 bool greenWithinThreshold[4]= {0,0,0,0};
IonSystems 23:f9e7e64784be 77 bool blueWithinThreshold[4]= {0,0,0,0};
IonSystems 24:8868101d01d0 78
IonSystems 23:f9e7e64784be 79 //Set red Thresholds
IonSystems 23:f9e7e64784be 80 redWithinThreshold[0] = (red >= redLT[0]) && (red <= redUT[0]);
IonSystems 23:f9e7e64784be 81 greenWithinThreshold[0] = (green >= redLT[1]) && (green <= redUT[1]);
IonSystems 23:f9e7e64784be 82 blueWithinThreshold[0] = (blue >= redLT[2]) && (blue <= redUT[2]);
IonSystems 24:8868101d01d0 83
IonSystems 23:f9e7e64784be 84 //Set green Thresholds
IonSystems 23:f9e7e64784be 85 redWithinThreshold[1] = (red >= greenLT[0]) && (red <= greenUT[0]);
IonSystems 23:f9e7e64784be 86 greenWithinThreshold[1] = (green >= greenLT[1]) && (green <= greenUT[1]);
IonSystems 23:f9e7e64784be 87 blueWithinThreshold[1] = (blue >= greenLT[2]) && (blue <= greenUT[2]);
IonSystems 24:8868101d01d0 88
IonSystems 23:f9e7e64784be 89 //Set blue Thresholds
IonSystems 23:f9e7e64784be 90 redWithinThreshold[2] = (red >= blueLT[0]) && (red <= blueUT[0]);
IonSystems 23:f9e7e64784be 91 greenWithinThreshold[2] = (green >= blueLT[1]) && (green <= blueUT[1]);
IonSystems 24:8868101d01d0 92 blueWithinThreshold[2] = (blue >= blueLT[2]) && (blue <= blueUT[2]);
IonSystems 24:8868101d01d0 93
IonSystems 23:f9e7e64784be 94 //Set none Thresholds
IonSystems 23:f9e7e64784be 95 redWithinThreshold[3] = (red >= noneLT[0]) && (red <= noneUT[0]);
IonSystems 23:f9e7e64784be 96 greenWithinThreshold[3] = (green >= noneLT[1]) && (green <= noneUT[1]);
IonSystems 24:8868101d01d0 97 blueWithinThreshold[3] = (blue >= noneLT[2]) && (blue <= noneUT[2]);
IonSystems 24:8868101d01d0 98
IonSystems 24:8868101d01d0 99 //Check the threshold values to find out what colour is on the sensor.
IonSystems 23:f9e7e64784be 100 if(redWithinThreshold[0] && greenWithinThreshold[0] && blueWithinThreshold[0]) {
IonSystems 23:f9e7e64784be 101 return RED;
IonSystems 23:f9e7e64784be 102 } else if(redWithinThreshold[1] && greenWithinThreshold[1] && blueWithinThreshold[1]) {
IonSystems 23:f9e7e64784be 103 return GREEN;
IonSystems 23:f9e7e64784be 104 } else if(redWithinThreshold[2] && greenWithinThreshold[2] && blueWithinThreshold[2]) {
IonSystems 23:f9e7e64784be 105 return BLUE;
IonSystems 23:f9e7e64784be 106 } else if(redWithinThreshold[3] && greenWithinThreshold[3] && blueWithinThreshold[3]) {
IonSystems 23:f9e7e64784be 107 return NONE;
IonSystems 23:f9e7e64784be 108 } else {
IonSystems 23:f9e7e64784be 109 return BIN;
IonSystems 23:f9e7e64784be 110 }
IonSystems 23:f9e7e64784be 111
IonSystems 5:644bca33c1ca 112 }
IonSystems 5:644bca33c1ca 113
IonSystems 13:0661d658d9d1 114
IonSystems 23:f9e7e64784be 115