Basic functions for Gravitech's i2c color sensor

Dependencies:   mbed

Dependents:   R5 2016 Robotics Team 1

Committer:
Hypna
Date:
Sun Mar 20 23:28:40 2016 +0000
Revision:
0:42c0a779b199
Child:
1:b4139bd2715f
initial upload

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Hypna 0:42c0a779b199 1 #include "ColorSensor.h"
Hypna 0:42c0a779b199 2
Hypna 0:42c0a779b199 3 //sda and scl are for your i2c pins
Hypna 0:42c0a779b199 4 ColorSensor::ColorSensor(PinName sda, PinName scl) : i2c(sda, scl), gain(4), scale(1)
Hypna 0:42c0a779b199 5 {
Hypna 0:42c0a779b199 6 //power on device and ADCs
Hypna 0:42c0a779b199 7 i2c.write(ADDR, CTRL, 1);
Hypna 0:42c0a779b199 8 i2c.write(ADDR, CTRL_INIT, 1);
Hypna 0:42c0a779b199 9
Hypna 0:42c0a779b199 10 //intial gain is 4x, scale is 1x
Hypna 0:42c0a779b199 11 i2c.write(ADDR, GAIN, 1);
Hypna 0:42c0a779b199 12 i2c.write(ADDR, GAIN_INIT, 1);
Hypna 0:42c0a779b199 13 }
Hypna 0:42c0a779b199 14
Hypna 0:42c0a779b199 15 //returns red value
Hypna 0:42c0a779b199 16 int ColorSensor::getR()
Hypna 0:42c0a779b199 17 {
Hypna 0:42c0a779b199 18 int red;
Hypna 0:42c0a779b199 19 char data;
Hypna 0:42c0a779b199 20
Hypna 0:42c0a779b199 21 i2c.write(ADDR, RED_LO, 1);
Hypna 0:42c0a779b199 22 i2c.read(ADDR, &data, 1);
Hypna 0:42c0a779b199 23 red = data;
Hypna 0:42c0a779b199 24 i2c.write(ADDR, RED_HI, 1);
Hypna 0:42c0a779b199 25 i2c.read(ADDR, &data, 1);
Hypna 0:42c0a779b199 26 red += 256*data;
Hypna 0:42c0a779b199 27
Hypna 0:42c0a779b199 28 return red;
Hypna 0:42c0a779b199 29 }
Hypna 0:42c0a779b199 30
Hypna 0:42c0a779b199 31 //returns green value
Hypna 0:42c0a779b199 32 int ColorSensor::getG()
Hypna 0:42c0a779b199 33 {
Hypna 0:42c0a779b199 34 int grn;
Hypna 0:42c0a779b199 35 char data;
Hypna 0:42c0a779b199 36
Hypna 0:42c0a779b199 37 i2c.write(ADDR, GRN_LO, 1);
Hypna 0:42c0a779b199 38 i2c.read(ADDR, &data, 1);
Hypna 0:42c0a779b199 39 grn = data;
Hypna 0:42c0a779b199 40 i2c.write(ADDR, GRN_HI, 1);
Hypna 0:42c0a779b199 41 i2c.read(ADDR, &data, 1);
Hypna 0:42c0a779b199 42 grn += 256*data;
Hypna 0:42c0a779b199 43
Hypna 0:42c0a779b199 44 return grn;
Hypna 0:42c0a779b199 45 }
Hypna 0:42c0a779b199 46
Hypna 0:42c0a779b199 47 //returns blue value
Hypna 0:42c0a779b199 48 int ColorSensor::getB()
Hypna 0:42c0a779b199 49 {
Hypna 0:42c0a779b199 50 int blu;
Hypna 0:42c0a779b199 51 char data;
Hypna 0:42c0a779b199 52
Hypna 0:42c0a779b199 53 i2c.write(ADDR, BLU_LO, 1);
Hypna 0:42c0a779b199 54 i2c.read(ADDR, &data, 1);
Hypna 0:42c0a779b199 55 blu = data;
Hypna 0:42c0a779b199 56 i2c.write(ADDR, BLU_HI, 1);
Hypna 0:42c0a779b199 57 i2c.read(ADDR, &data, 1);
Hypna 0:42c0a779b199 58 blu += 256*data;
Hypna 0:42c0a779b199 59
Hypna 0:42c0a779b199 60 return blu;
Hypna 0:42c0a779b199 61 }
Hypna 0:42c0a779b199 62
Hypna 0:42c0a779b199 63 //returns clear value
Hypna 0:42c0a779b199 64 int ColorSensor::getC()
Hypna 0:42c0a779b199 65 {
Hypna 0:42c0a779b199 66 int clr;
Hypna 0:42c0a779b199 67 char data;
Hypna 0:42c0a779b199 68
Hypna 0:42c0a779b199 69 i2c.write(ADDR, CLR_LO, 1);
Hypna 0:42c0a779b199 70 i2c.read(ADDR, &data, 1);
Hypna 0:42c0a779b199 71 clr = data;
Hypna 0:42c0a779b199 72 i2c.write(ADDR, CLR_HI, 1);
Hypna 0:42c0a779b199 73 i2c.read(ADDR, &data, 1);
Hypna 0:42c0a779b199 74 clr += 256*data;
Hypna 0:42c0a779b199 75
Hypna 0:42c0a779b199 76 return clr;
Hypna 0:42c0a779b199 77 }
Hypna 0:42c0a779b199 78
Hypna 0:42c0a779b199 79 //sets ADC gain
Hypna 0:42c0a779b199 80 //valid values 1, 4, 16, 64
Hypna 0:42c0a779b199 81 void ColorSensor::setGain(int g)
Hypna 0:42c0a779b199 82 {
Hypna 0:42c0a779b199 83 char newGain;
Hypna 0:42c0a779b199 84
Hypna 0:42c0a779b199 85 switch(g)
Hypna 0:42c0a779b199 86 {
Hypna 0:42c0a779b199 87 case 1: newGain = 0x00;
Hypna 0:42c0a779b199 88 break;
Hypna 0:42c0a779b199 89 case 4: newGain = 0x10;
Hypna 0:42c0a779b199 90 break;
Hypna 0:42c0a779b199 91 case 16: newGain = 0x20;
Hypna 0:42c0a779b199 92 break;
Hypna 0:42c0a779b199 93 case 64: newGain = 0x30;
Hypna 0:42c0a779b199 94 break;
Hypna 0:42c0a779b199 95 default: return;
Hypna 0:42c0a779b199 96 }
Hypna 0:42c0a779b199 97
Hypna 0:42c0a779b199 98 gain = g;
Hypna 0:42c0a779b199 99
Hypna 0:42c0a779b199 100 switch(scale)
Hypna 0:42c0a779b199 101 {
Hypna 0:42c0a779b199 102 case 1: newGain += 0x00;
Hypna 0:42c0a779b199 103 break;
Hypna 0:42c0a779b199 104 case 2: newGain += 0x01;
Hypna 0:42c0a779b199 105 break;
Hypna 0:42c0a779b199 106 case 4: newGain += 0x02;
Hypna 0:42c0a779b199 107 break;
Hypna 0:42c0a779b199 108 case 8: newGain += 0x03;
Hypna 0:42c0a779b199 109 break;
Hypna 0:42c0a779b199 110 case 16: newGain += 0x04;
Hypna 0:42c0a779b199 111 break;
Hypna 0:42c0a779b199 112 case 32: newGain += 0x05;
Hypna 0:42c0a779b199 113 break;
Hypna 0:42c0a779b199 114 case 64: newGain += 0x06;
Hypna 0:42c0a779b199 115 }
Hypna 0:42c0a779b199 116
Hypna 0:42c0a779b199 117 i2c.write(ADDR, GAIN, 1);
Hypna 0:42c0a779b199 118 i2c.write(ADDR, &newGain, 1);
Hypna 0:42c0a779b199 119 }
Hypna 0:42c0a779b199 120
Hypna 0:42c0a779b199 121 //sets divides ADC sensitivity by scaler
Hypna 0:42c0a779b199 122 //valid values 1, 2, 4, 8, 16, 32, 64
Hypna 0:42c0a779b199 123 void ColorSensor::setScaler(int s)
Hypna 0:42c0a779b199 124 {
Hypna 0:42c0a779b199 125 char newGain;
Hypna 0:42c0a779b199 126
Hypna 0:42c0a779b199 127 switch(s)
Hypna 0:42c0a779b199 128 {
Hypna 0:42c0a779b199 129 case 1: newGain = 0x00;
Hypna 0:42c0a779b199 130 break;
Hypna 0:42c0a779b199 131 case 2: newGain = 0x01;
Hypna 0:42c0a779b199 132 break;
Hypna 0:42c0a779b199 133 case 4: newGain = 0x02;
Hypna 0:42c0a779b199 134 break;
Hypna 0:42c0a779b199 135 case 8: newGain = 0x03;
Hypna 0:42c0a779b199 136 break;
Hypna 0:42c0a779b199 137 case 16: newGain = 0x04;
Hypna 0:42c0a779b199 138 break;
Hypna 0:42c0a779b199 139 case 32: newGain = 0x05;
Hypna 0:42c0a779b199 140 break;
Hypna 0:42c0a779b199 141 case 64: newGain = 0x06;
Hypna 0:42c0a779b199 142 break;
Hypna 0:42c0a779b199 143 default: return;
Hypna 0:42c0a779b199 144 }
Hypna 0:42c0a779b199 145
Hypna 0:42c0a779b199 146 scale = s;
Hypna 0:42c0a779b199 147
Hypna 0:42c0a779b199 148 switch(gain)
Hypna 0:42c0a779b199 149 {
Hypna 0:42c0a779b199 150 case 1: newGain += 0x00;
Hypna 0:42c0a779b199 151 break;
Hypna 0:42c0a779b199 152 case 4: newGain += 0x10;
Hypna 0:42c0a779b199 153 break;
Hypna 0:42c0a779b199 154 case 16: newGain += 0x20;
Hypna 0:42c0a779b199 155 break;
Hypna 0:42c0a779b199 156 case 64: newGain += 0x30;
Hypna 0:42c0a779b199 157 }
Hypna 0:42c0a779b199 158
Hypna 0:42c0a779b199 159 i2c.write(ADDR, GAIN, 1);
Hypna 0:42c0a779b199 160 i2c.write(ADDR, &newGain, 1);
Hypna 0:42c0a779b199 161 }