Robot team project
Dependencies: QEI Motordriver ros_lib_melodic
sensor/Sensor.cpp
- Committer:
- florine_van
- Date:
- 2019-10-22
- Revision:
- 5:8ef79eebbc97
- Parent:
- 4:cb50c6fa340b
File content as of revision 5:8ef79eebbc97:
#include"mbed.h" #include <ros.h> #include "Sensor.h" /////////////////////////////////////////////////////////////////// // Constructor /////////////////////////////////////////////////////////////////// Sensor::Sensor(PinName sda, PinName scl, PinName shdn) : i2c(sda, scl), SHDN(shdn) { addr = DEFAULT_DEVICE_ADDRESS << 1; // At the beginning, turn off the device turnOff(); wait_ms(0.5); } /////////////////////////////////////////////////////////////////// // Public methods /////////////////////////////////////////////////////////////////// int Sensor::init() { // Turn on the device turnOn(); char reset; // check to see has it be Initialised already reset = readByte(0x016); if (reset==1) { // Mandatory settings : private registers setRegister(0x0207, 0x01); setRegister(0x0208, 0x01); setRegister(0x0096, 0x00); setRegister(0x0097, 0xfd); setRegister(0x00e3, 0x01); setRegister(0x00e4, 0x03); setRegister(0x00e5, 0x02); setRegister(0x00e6, 0x01); setRegister(0x00e7, 0x03); setRegister(0x00f5, 0x02); setRegister(0x00d9, 0x05); setRegister(0x00db, 0xce); setRegister(0x00dc, 0x03); setRegister(0x00dd, 0xf8); setRegister(0x009f, 0x00); setRegister(0x00a3, 0x3c); setRegister(0x00b7, 0x00); setRegister(0x00bb, 0x3c); setRegister(0x00b2, 0x09); setRegister(0x00ca, 0x09); setRegister(0x0198, 0x01); setRegister(0x01b0, 0x17); setRegister(0x01ad, 0x00); setRegister(0x00ff, 0x05); setRegister(0x0100, 0x05); setRegister(0x0199, 0x05); setRegister(0x01a6, 0x1b); setRegister(0x01ac, 0x3e); setRegister(0x01a7, 0x1f); setRegister(0x0030, 0x00); setRegister(SYSTEM_FRESH_OUT_OF_RESET, 0x00); //change fresh out of set status to 0 } else { return -1; } return 0; } void Sensor::changeAddress(char address) { setRegister(I2C_SLAVE_DEVICE_ADDRESS, address); addr = address << 1; } float Sensor::read() { int range; // Start range measurement startRange(); // Poll the VL6180 till new sample ready pollRange(); // Read range result range = readRange(); if (range < 255) { isObstacle = true; } else { isObstacle = false; } // Clear the interrupt on VL6180 clearInterrupts(); // Display result return range; } void Sensor::turnOff() { SHDN = 0; } void Sensor::turnOn() { SHDN = 1; } bool Sensor::getIsObstacle() { return isObstacle; } /////////////////////////////////////////////////////////////////// // Private methods /////////////////////////////////////////////////////////////////// void Sensor::startRange() { writeByte(0x018,0x01); } void Sensor::pollRange() { char status; char range_status; // check the status status = readByte(RESULT_INTERRUPT_STATUS_GPIO); range_status = status & 0x07; // wait for new measurement ready status while (range_status != 0x00) { status = readByte(RESULT_INTERRUPT_STATUS_GPIO); range_status = status & 0x07; } } float Sensor::readRange() { float range; range = readByte(RESULT_RANGE_VAL); return (float)range; } void Sensor::clearInterrupts() { writeByte(0x015,0x07); } /////////////////////////////////////////////////////////////////// // Update a VL6180X register /////////////////////////////////////////////////////////////////// void Sensor::setRegister(wchar_t reg, char data) { writeByte(reg, data); } /////////////////////////////////////////////////////////////////// // Split 16-bit register address into two bytes and write // the address + data via I²C /////////////////////////////////////////////////////////////////// void Sensor::writeByte(wchar_t reg, char data) { char data_write[3]; data_write[0] = (reg >> 8) & 0xFF;; // MSB of register address data_write[1] = reg & 0xFF; // LSB of register address data_write[2] = data & 0xFF; i2c.write(addr, data_write, 3); } /////////////////////////////////////////////////////////////////// // Split 16-bit register address into two bytes and write // required register address to VL6180 and read the data back /////////////////////////////////////////////////////////////////// char Sensor::readByte(wchar_t reg) { char data_write[2]; char data_read[1]; data_write[0] = (reg >> 8) & 0xFF; // MSB of register address data_write[1] = reg & 0xFF; // LSB of register address i2c.write(addr, data_write, 2); i2c.read(addr, data_read, 1); return data_read[0]; }