GETTING CLOSER
Dependencies: NeoStrip_mod VCNL4020_1 mbed
Diff: main.cpp
- Revision:
- 0:5db0fea04a3d
- Child:
- 1:49431e431e68
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri May 30 16:42:55 2014 +0000 @@ -0,0 +1,231 @@ +#include "mbed.h" +#include "VCNL40x0.h" +#include "NeoStrip.h" +#define NumPixels 4 + +I2C i2c(p28, p27); +DigitalOut mled0(LED1); +DigitalOut mled1(LED2); +DigitalOut mled2(LED3); +DigitalOut mled3(LED4); +Serial pc(USBTX, USBRX); +DigitalOut reset(p29); +NeoStrip strip(p26, NumPixels); +DigitalIn interrupt (p25); + +const uint8_t MUX = 0xE0; // 11100000 +const uint8_t VCNL4020 = 0x26; +unsigned int sensors[4]; +char _send[3]; +char _receive[2]; +char port[2]; +const uint8_t chan0 = 0x01; +const uint8_t chan1 = 0x02; +const uint8_t chan2 = 0x04; +const uint8_t chan3 = 0x08; +const uint8_t chan[] = {chan0,chan1,chan2,chan3}; +int mleds[] = {0,0,0,0}; + +void ReadOne(uint8_t channel); +void Setup(void); +void Setmleds(void); +void SwitchChannel(uint8_t chan); +void ReadAllSensors(void); +void Setmleds(void); +void SetProximityRate (unsigned char ProximityRate); +void SetCommandRegister (unsigned char Command); +void ReadCommandRegister (unsigned char *Command); +void SetCurrent (unsigned char Current); +void ReadCurrent (unsigned char *Current); +void ReadProxiValue (unsigned int *ProxiValue); +void SetProximityRate (unsigned char ProximityRate); +void ReadProxiOnDemand (unsigned int *ProxiValue); +void SetupAll(void); + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +int main() { + + //SwitchChannel(chan1); // set channel + //wait_ms(50); + //Setup(); + SetupAll(); + + while (1) { + + ReadAllSensors(); + //ReadOne(chan1); + } +} + +void ReadOne(uint8_t channel){ + + unsigned int sensor = 0; + SwitchChannel(channel); // set channel + mleds[0] = 1; // LED on + Setmleds(); + ReadProxiOnDemand(&sensor); // read prox value on demand + mleds[0] = 0; // LED off + Setmleds(); + pc.printf("\r %i \n", sensor); +} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void SetupAll(void){ + + SwitchChannel(chan0); // set channel + wait_ms(20); + Setup(); + SwitchChannel(chan1); // set channel + wait_ms(20); + Setup(); + SwitchChannel(chan2); // set channel + wait_ms(20); + Setup(); + SwitchChannel(chan3); // set channel + wait_ms(20); + Setup(); + pc.printf("\r setup ok \n "); + } + + +void Setup(void) { + unsigned char Current=0; + + pc.baud(115200); + SetCurrent(20); // Set current to 200mA + ReadCurrent(&Current); + pc.printf("\n IR LED Current: %d\n", Current); + SetCommandRegister (COMMAND_ALL_DISABLE); // ready for prox rate change + SetProximityRate (PROX_MEASUREMENT_RATE_31); // 31 measurements/s + SetCommandRegister (COMMAND_PROX_ENABLE | COMMAND_SELFTIMED_MODE_ENABLE); + pc.printf("\r done\n"); + wait(0.2); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void Setmleds(void){ + mled0 = mleds[0]; + mled1 = mleds[1]; + mled2 = mleds[2]; + mled3 = mleds[3]; + } + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void SwitchChannel(uint8_t chan){ + reset = 0; + wait_ms(10); + reset = 1; + wait_ms(10); + port[0] = chan; + i2c.write(MUX,port, 1); + } + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void ReadAllSensors(void){ + + for (int i = 0; i < 4; i++){ + + unsigned int sensor = 0; + + SwitchChannel(chan[i]); // set channel + mleds[i] = 1; // LED on + Setmleds(); + ReadProxiOnDemand(&sensor); // read prox value on demand + wait_ms(10); + mleds[i] = 0; // LED off + Setmleds(); + sensors[i] = sensor; + pc.printf("\r %i ", sensors[i]); + } + + pc.printf("\r \n "); + wait(0.001); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void SetCommandRegister (unsigned char Command) { + + //unsigned char send[2]; + + _send[0] = REGISTER_COMMAND; // VCNL40x0 Configuration reister + _send[1] = Command; + i2c.write(VCNL4020,_send, 2); // Write 2 bytes on I2C +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void ReadCommandRegister (unsigned char *Command) { + + //unsigned char send[2]; + //unsigned char receive[2]; + + _send[0] = REGISTER_COMMAND; // VCNL40x0 Configuration register + i2c.write(VCNL4020,_send, 1); // Write 1 byte on I2C + i2c.read(VCNL4020+1,_receive, 1); // Read 1 byte on I2C + + *Command = (unsigned char)(_receive[0]); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void SetCurrent (unsigned char Current) { + + _send[0] = REGISTER_PROX_CURRENT; // VCNL40x0 IR LED Current register + _send[1] = Current; + i2c.write(VCNL4020,_send, 2); // Write 2 bytes on I2C + +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void ReadCurrent (unsigned char *Current) { + + _send[0] = REGISTER_PROX_CURRENT; // VCNL40x0 IR LED current register + i2c.write(VCNL4020,_send, 1); // Write 1 byte on I2C + i2c.read(VCNL4020+1,_receive, 1); // Read 1 byte on I2C + + *Current = (unsigned char)(_receive[0]); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void ReadProxiValue (unsigned int *ProxiValue) { + + _send[0] = REGISTER_PROX_VALUE; // VCNL40x0 Proximity Value register + i2c.write(VCNL4020, _send, 1); // Write 1 byte on I2C + i2c.read(VCNL4020+1, _receive, 2); // Read 2 bytes on I2C + *ProxiValue = ((unsigned int)_receive[0] << 8 | (unsigned char)_receive[1]); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void SetProximityRate (unsigned char ProximityRate) { + + _send[0] = REGISTER_PROX_RATE; // VCNL40x0 Proximity rate register + _send[1] = ProximityRate; + i2c.write(VCNL4020,_send, 2); // Write 2 bytes on I2C +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void ReadProxiOnDemand (unsigned int *ProxiValue) { + + unsigned char Command=0; + + // enable prox value on demand + SetCommandRegister (COMMAND_PROX_ENABLE | COMMAND_PROX_ON_DEMAND); + + // wait on prox data ready bit + do { + ReadCommandRegister (&Command); // read command register + } while (!(Command & COMMAND_MASK_PROX_DATA_READY)); + + ReadProxiValue (ProxiValue); // read prox value + + SetCommandRegister (COMMAND_ALL_DISABLE); // stop prox value on demand + +} \ No newline at end of file