Basic functions for Gravitech's i2c color sensor
Dependencies: mbed
Dependents: R5 2016 Robotics Team 1
ColorSensor.cpp@1:b4139bd2715f, 2016-04-09 (annotated)
- Committer:
- Hypna
- Date:
- Sat Apr 09 11:01:08 2016 +0000
- Revision:
- 1:b4139bd2715f
- Parent:
- 0:42c0a779b199
did things
Who changed what in which revision?
User | Revision | Line number | New 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 | 1:b4139bd2715f | 4 | ColorSensor::ColorSensor(PinName sda, PinName scl) : i2c(sda, scl) |
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 | 1:b4139bd2715f | 10 | //intial gain is 4x, scaler 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 | } |