GETTING CLOSER

Dependencies:   NeoStrip_mod VCNL4020_1 mbed

Committer:
ghostaudio
Date:
Fri May 30 16:42:55 2014 +0000
Revision:
0:5db0fea04a3d
Child:
1:49431e431e68
GETTING CLOSER

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ghostaudio 0:5db0fea04a3d 1 #include "mbed.h"
ghostaudio 0:5db0fea04a3d 2 #include "VCNL40x0.h"
ghostaudio 0:5db0fea04a3d 3 #include "NeoStrip.h"
ghostaudio 0:5db0fea04a3d 4 #define NumPixels 4
ghostaudio 0:5db0fea04a3d 5
ghostaudio 0:5db0fea04a3d 6 I2C i2c(p28, p27);
ghostaudio 0:5db0fea04a3d 7 DigitalOut mled0(LED1);
ghostaudio 0:5db0fea04a3d 8 DigitalOut mled1(LED2);
ghostaudio 0:5db0fea04a3d 9 DigitalOut mled2(LED3);
ghostaudio 0:5db0fea04a3d 10 DigitalOut mled3(LED4);
ghostaudio 0:5db0fea04a3d 11 Serial pc(USBTX, USBRX);
ghostaudio 0:5db0fea04a3d 12 DigitalOut reset(p29);
ghostaudio 0:5db0fea04a3d 13 NeoStrip strip(p26, NumPixels);
ghostaudio 0:5db0fea04a3d 14 DigitalIn interrupt (p25);
ghostaudio 0:5db0fea04a3d 15
ghostaudio 0:5db0fea04a3d 16 const uint8_t MUX = 0xE0; // 11100000
ghostaudio 0:5db0fea04a3d 17 const uint8_t VCNL4020 = 0x26;
ghostaudio 0:5db0fea04a3d 18 unsigned int sensors[4];
ghostaudio 0:5db0fea04a3d 19 char _send[3];
ghostaudio 0:5db0fea04a3d 20 char _receive[2];
ghostaudio 0:5db0fea04a3d 21 char port[2];
ghostaudio 0:5db0fea04a3d 22 const uint8_t chan0 = 0x01;
ghostaudio 0:5db0fea04a3d 23 const uint8_t chan1 = 0x02;
ghostaudio 0:5db0fea04a3d 24 const uint8_t chan2 = 0x04;
ghostaudio 0:5db0fea04a3d 25 const uint8_t chan3 = 0x08;
ghostaudio 0:5db0fea04a3d 26 const uint8_t chan[] = {chan0,chan1,chan2,chan3};
ghostaudio 0:5db0fea04a3d 27 int mleds[] = {0,0,0,0};
ghostaudio 0:5db0fea04a3d 28
ghostaudio 0:5db0fea04a3d 29 void ReadOne(uint8_t channel);
ghostaudio 0:5db0fea04a3d 30 void Setup(void);
ghostaudio 0:5db0fea04a3d 31 void Setmleds(void);
ghostaudio 0:5db0fea04a3d 32 void SwitchChannel(uint8_t chan);
ghostaudio 0:5db0fea04a3d 33 void ReadAllSensors(void);
ghostaudio 0:5db0fea04a3d 34 void Setmleds(void);
ghostaudio 0:5db0fea04a3d 35 void SetProximityRate (unsigned char ProximityRate);
ghostaudio 0:5db0fea04a3d 36 void SetCommandRegister (unsigned char Command);
ghostaudio 0:5db0fea04a3d 37 void ReadCommandRegister (unsigned char *Command);
ghostaudio 0:5db0fea04a3d 38 void SetCurrent (unsigned char Current);
ghostaudio 0:5db0fea04a3d 39 void ReadCurrent (unsigned char *Current);
ghostaudio 0:5db0fea04a3d 40 void ReadProxiValue (unsigned int *ProxiValue);
ghostaudio 0:5db0fea04a3d 41 void SetProximityRate (unsigned char ProximityRate);
ghostaudio 0:5db0fea04a3d 42 void ReadProxiOnDemand (unsigned int *ProxiValue);
ghostaudio 0:5db0fea04a3d 43 void SetupAll(void);
ghostaudio 0:5db0fea04a3d 44
ghostaudio 0:5db0fea04a3d 45 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ghostaudio 0:5db0fea04a3d 46
ghostaudio 0:5db0fea04a3d 47 int main() {
ghostaudio 0:5db0fea04a3d 48
ghostaudio 0:5db0fea04a3d 49 //SwitchChannel(chan1); // set channel
ghostaudio 0:5db0fea04a3d 50 //wait_ms(50);
ghostaudio 0:5db0fea04a3d 51 //Setup();
ghostaudio 0:5db0fea04a3d 52 SetupAll();
ghostaudio 0:5db0fea04a3d 53
ghostaudio 0:5db0fea04a3d 54 while (1) {
ghostaudio 0:5db0fea04a3d 55
ghostaudio 0:5db0fea04a3d 56 ReadAllSensors();
ghostaudio 0:5db0fea04a3d 57 //ReadOne(chan1);
ghostaudio 0:5db0fea04a3d 58 }
ghostaudio 0:5db0fea04a3d 59 }
ghostaudio 0:5db0fea04a3d 60
ghostaudio 0:5db0fea04a3d 61 void ReadOne(uint8_t channel){
ghostaudio 0:5db0fea04a3d 62
ghostaudio 0:5db0fea04a3d 63 unsigned int sensor = 0;
ghostaudio 0:5db0fea04a3d 64 SwitchChannel(channel); // set channel
ghostaudio 0:5db0fea04a3d 65 mleds[0] = 1; // LED on
ghostaudio 0:5db0fea04a3d 66 Setmleds();
ghostaudio 0:5db0fea04a3d 67 ReadProxiOnDemand(&sensor); // read prox value on demand
ghostaudio 0:5db0fea04a3d 68 mleds[0] = 0; // LED off
ghostaudio 0:5db0fea04a3d 69 Setmleds();
ghostaudio 0:5db0fea04a3d 70 pc.printf("\r %i \n", sensor);
ghostaudio 0:5db0fea04a3d 71 }
ghostaudio 0:5db0fea04a3d 72 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ghostaudio 0:5db0fea04a3d 73 void SetupAll(void){
ghostaudio 0:5db0fea04a3d 74
ghostaudio 0:5db0fea04a3d 75 SwitchChannel(chan0); // set channel
ghostaudio 0:5db0fea04a3d 76 wait_ms(20);
ghostaudio 0:5db0fea04a3d 77 Setup();
ghostaudio 0:5db0fea04a3d 78 SwitchChannel(chan1); // set channel
ghostaudio 0:5db0fea04a3d 79 wait_ms(20);
ghostaudio 0:5db0fea04a3d 80 Setup();
ghostaudio 0:5db0fea04a3d 81 SwitchChannel(chan2); // set channel
ghostaudio 0:5db0fea04a3d 82 wait_ms(20);
ghostaudio 0:5db0fea04a3d 83 Setup();
ghostaudio 0:5db0fea04a3d 84 SwitchChannel(chan3); // set channel
ghostaudio 0:5db0fea04a3d 85 wait_ms(20);
ghostaudio 0:5db0fea04a3d 86 Setup();
ghostaudio 0:5db0fea04a3d 87 pc.printf("\r setup ok \n ");
ghostaudio 0:5db0fea04a3d 88 }
ghostaudio 0:5db0fea04a3d 89
ghostaudio 0:5db0fea04a3d 90
ghostaudio 0:5db0fea04a3d 91 void Setup(void) {
ghostaudio 0:5db0fea04a3d 92 unsigned char Current=0;
ghostaudio 0:5db0fea04a3d 93
ghostaudio 0:5db0fea04a3d 94 pc.baud(115200);
ghostaudio 0:5db0fea04a3d 95 SetCurrent(20); // Set current to 200mA
ghostaudio 0:5db0fea04a3d 96 ReadCurrent(&Current);
ghostaudio 0:5db0fea04a3d 97 pc.printf("\n IR LED Current: %d\n", Current);
ghostaudio 0:5db0fea04a3d 98 SetCommandRegister (COMMAND_ALL_DISABLE); // ready for prox rate change
ghostaudio 0:5db0fea04a3d 99 SetProximityRate (PROX_MEASUREMENT_RATE_31); // 31 measurements/s
ghostaudio 0:5db0fea04a3d 100 SetCommandRegister (COMMAND_PROX_ENABLE | COMMAND_SELFTIMED_MODE_ENABLE);
ghostaudio 0:5db0fea04a3d 101 pc.printf("\r done\n");
ghostaudio 0:5db0fea04a3d 102 wait(0.2);
ghostaudio 0:5db0fea04a3d 103 }
ghostaudio 0:5db0fea04a3d 104
ghostaudio 0:5db0fea04a3d 105 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ghostaudio 0:5db0fea04a3d 106
ghostaudio 0:5db0fea04a3d 107 void Setmleds(void){
ghostaudio 0:5db0fea04a3d 108 mled0 = mleds[0];
ghostaudio 0:5db0fea04a3d 109 mled1 = mleds[1];
ghostaudio 0:5db0fea04a3d 110 mled2 = mleds[2];
ghostaudio 0:5db0fea04a3d 111 mled3 = mleds[3];
ghostaudio 0:5db0fea04a3d 112 }
ghostaudio 0:5db0fea04a3d 113
ghostaudio 0:5db0fea04a3d 114 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ghostaudio 0:5db0fea04a3d 115
ghostaudio 0:5db0fea04a3d 116 void SwitchChannel(uint8_t chan){
ghostaudio 0:5db0fea04a3d 117 reset = 0;
ghostaudio 0:5db0fea04a3d 118 wait_ms(10);
ghostaudio 0:5db0fea04a3d 119 reset = 1;
ghostaudio 0:5db0fea04a3d 120 wait_ms(10);
ghostaudio 0:5db0fea04a3d 121 port[0] = chan;
ghostaudio 0:5db0fea04a3d 122 i2c.write(MUX,port, 1);
ghostaudio 0:5db0fea04a3d 123 }
ghostaudio 0:5db0fea04a3d 124
ghostaudio 0:5db0fea04a3d 125 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ghostaudio 0:5db0fea04a3d 126
ghostaudio 0:5db0fea04a3d 127 void ReadAllSensors(void){
ghostaudio 0:5db0fea04a3d 128
ghostaudio 0:5db0fea04a3d 129 for (int i = 0; i < 4; i++){
ghostaudio 0:5db0fea04a3d 130
ghostaudio 0:5db0fea04a3d 131 unsigned int sensor = 0;
ghostaudio 0:5db0fea04a3d 132
ghostaudio 0:5db0fea04a3d 133 SwitchChannel(chan[i]); // set channel
ghostaudio 0:5db0fea04a3d 134 mleds[i] = 1; // LED on
ghostaudio 0:5db0fea04a3d 135 Setmleds();
ghostaudio 0:5db0fea04a3d 136 ReadProxiOnDemand(&sensor); // read prox value on demand
ghostaudio 0:5db0fea04a3d 137 wait_ms(10);
ghostaudio 0:5db0fea04a3d 138 mleds[i] = 0; // LED off
ghostaudio 0:5db0fea04a3d 139 Setmleds();
ghostaudio 0:5db0fea04a3d 140 sensors[i] = sensor;
ghostaudio 0:5db0fea04a3d 141 pc.printf("\r %i ", sensors[i]);
ghostaudio 0:5db0fea04a3d 142 }
ghostaudio 0:5db0fea04a3d 143
ghostaudio 0:5db0fea04a3d 144 pc.printf("\r \n ");
ghostaudio 0:5db0fea04a3d 145 wait(0.001);
ghostaudio 0:5db0fea04a3d 146 }
ghostaudio 0:5db0fea04a3d 147
ghostaudio 0:5db0fea04a3d 148 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ghostaudio 0:5db0fea04a3d 149
ghostaudio 0:5db0fea04a3d 150 void SetCommandRegister (unsigned char Command) {
ghostaudio 0:5db0fea04a3d 151
ghostaudio 0:5db0fea04a3d 152 //unsigned char send[2];
ghostaudio 0:5db0fea04a3d 153
ghostaudio 0:5db0fea04a3d 154 _send[0] = REGISTER_COMMAND; // VCNL40x0 Configuration reister
ghostaudio 0:5db0fea04a3d 155 _send[1] = Command;
ghostaudio 0:5db0fea04a3d 156 i2c.write(VCNL4020,_send, 2); // Write 2 bytes on I2C
ghostaudio 0:5db0fea04a3d 157 }
ghostaudio 0:5db0fea04a3d 158
ghostaudio 0:5db0fea04a3d 159 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ghostaudio 0:5db0fea04a3d 160
ghostaudio 0:5db0fea04a3d 161 void ReadCommandRegister (unsigned char *Command) {
ghostaudio 0:5db0fea04a3d 162
ghostaudio 0:5db0fea04a3d 163 //unsigned char send[2];
ghostaudio 0:5db0fea04a3d 164 //unsigned char receive[2];
ghostaudio 0:5db0fea04a3d 165
ghostaudio 0:5db0fea04a3d 166 _send[0] = REGISTER_COMMAND; // VCNL40x0 Configuration register
ghostaudio 0:5db0fea04a3d 167 i2c.write(VCNL4020,_send, 1); // Write 1 byte on I2C
ghostaudio 0:5db0fea04a3d 168 i2c.read(VCNL4020+1,_receive, 1); // Read 1 byte on I2C
ghostaudio 0:5db0fea04a3d 169
ghostaudio 0:5db0fea04a3d 170 *Command = (unsigned char)(_receive[0]);
ghostaudio 0:5db0fea04a3d 171 }
ghostaudio 0:5db0fea04a3d 172
ghostaudio 0:5db0fea04a3d 173 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ghostaudio 0:5db0fea04a3d 174
ghostaudio 0:5db0fea04a3d 175 void SetCurrent (unsigned char Current) {
ghostaudio 0:5db0fea04a3d 176
ghostaudio 0:5db0fea04a3d 177 _send[0] = REGISTER_PROX_CURRENT; // VCNL40x0 IR LED Current register
ghostaudio 0:5db0fea04a3d 178 _send[1] = Current;
ghostaudio 0:5db0fea04a3d 179 i2c.write(VCNL4020,_send, 2); // Write 2 bytes on I2C
ghostaudio 0:5db0fea04a3d 180
ghostaudio 0:5db0fea04a3d 181 }
ghostaudio 0:5db0fea04a3d 182
ghostaudio 0:5db0fea04a3d 183 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ghostaudio 0:5db0fea04a3d 184
ghostaudio 0:5db0fea04a3d 185 void ReadCurrent (unsigned char *Current) {
ghostaudio 0:5db0fea04a3d 186
ghostaudio 0:5db0fea04a3d 187 _send[0] = REGISTER_PROX_CURRENT; // VCNL40x0 IR LED current register
ghostaudio 0:5db0fea04a3d 188 i2c.write(VCNL4020,_send, 1); // Write 1 byte on I2C
ghostaudio 0:5db0fea04a3d 189 i2c.read(VCNL4020+1,_receive, 1); // Read 1 byte on I2C
ghostaudio 0:5db0fea04a3d 190
ghostaudio 0:5db0fea04a3d 191 *Current = (unsigned char)(_receive[0]);
ghostaudio 0:5db0fea04a3d 192 }
ghostaudio 0:5db0fea04a3d 193
ghostaudio 0:5db0fea04a3d 194 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ghostaudio 0:5db0fea04a3d 195
ghostaudio 0:5db0fea04a3d 196 void ReadProxiValue (unsigned int *ProxiValue) {
ghostaudio 0:5db0fea04a3d 197
ghostaudio 0:5db0fea04a3d 198 _send[0] = REGISTER_PROX_VALUE; // VCNL40x0 Proximity Value register
ghostaudio 0:5db0fea04a3d 199 i2c.write(VCNL4020, _send, 1); // Write 1 byte on I2C
ghostaudio 0:5db0fea04a3d 200 i2c.read(VCNL4020+1, _receive, 2); // Read 2 bytes on I2C
ghostaudio 0:5db0fea04a3d 201 *ProxiValue = ((unsigned int)_receive[0] << 8 | (unsigned char)_receive[1]);
ghostaudio 0:5db0fea04a3d 202 }
ghostaudio 0:5db0fea04a3d 203
ghostaudio 0:5db0fea04a3d 204 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ghostaudio 0:5db0fea04a3d 205
ghostaudio 0:5db0fea04a3d 206 void SetProximityRate (unsigned char ProximityRate) {
ghostaudio 0:5db0fea04a3d 207
ghostaudio 0:5db0fea04a3d 208 _send[0] = REGISTER_PROX_RATE; // VCNL40x0 Proximity rate register
ghostaudio 0:5db0fea04a3d 209 _send[1] = ProximityRate;
ghostaudio 0:5db0fea04a3d 210 i2c.write(VCNL4020,_send, 2); // Write 2 bytes on I2C
ghostaudio 0:5db0fea04a3d 211 }
ghostaudio 0:5db0fea04a3d 212
ghostaudio 0:5db0fea04a3d 213 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ghostaudio 0:5db0fea04a3d 214
ghostaudio 0:5db0fea04a3d 215 void ReadProxiOnDemand (unsigned int *ProxiValue) {
ghostaudio 0:5db0fea04a3d 216
ghostaudio 0:5db0fea04a3d 217 unsigned char Command=0;
ghostaudio 0:5db0fea04a3d 218
ghostaudio 0:5db0fea04a3d 219 // enable prox value on demand
ghostaudio 0:5db0fea04a3d 220 SetCommandRegister (COMMAND_PROX_ENABLE | COMMAND_PROX_ON_DEMAND);
ghostaudio 0:5db0fea04a3d 221
ghostaudio 0:5db0fea04a3d 222 // wait on prox data ready bit
ghostaudio 0:5db0fea04a3d 223 do {
ghostaudio 0:5db0fea04a3d 224 ReadCommandRegister (&Command); // read command register
ghostaudio 0:5db0fea04a3d 225 } while (!(Command & COMMAND_MASK_PROX_DATA_READY));
ghostaudio 0:5db0fea04a3d 226
ghostaudio 0:5db0fea04a3d 227 ReadProxiValue (ProxiValue); // read prox value
ghostaudio 0:5db0fea04a3d 228
ghostaudio 0:5db0fea04a3d 229 SetCommandRegister (COMMAND_ALL_DISABLE); // stop prox value on demand
ghostaudio 0:5db0fea04a3d 230
ghostaudio 0:5db0fea04a3d 231 }