package lejos.nxt.addon; import lejos.nxt.I2CPort; import lejos.nxt.I2CSensor; /* * WARNING: THIS CLASS IS SHARED BETWEEN THE classes AND pccomms PROJECTS. * DO NOT EDIT THE VERSION IN pccomms AS IT WILL BE OVERWRITTEN WHEN THE PROJECT IS BUILT. */ /** * Supports Mindsensors DIST-Nx series of Optical Distance Sensor.<br> * This sensor is used for greater precision than the Ultrasonic Sensor.<br> * * @author Michael Smith <mdsmitty@gmail.com> * <br><br>Lum, Many thanks for helping me test this class. * */ public class OpticalDistanceSensor extends I2CSensor{ private byte[] buf = new byte[2]; //Registers private final static int COMMAND = 0x41; private final static int DIST_DATA_LSB = 0x42; private final static int DIST_DATA_MSB = 0x43; private final static int VOLT_DATA_LSB = 0x44; private final static int VOLT_DATA_MSB = 0x45; private final static int SENSOR_MOD_TYPE = 0x50; private final static int CURVE = 0x51; private final static int DIST_MIN_DATA_LSB = 0x52; private final static int DIST_MIN_DATA_MSB = 0x53; private final static int DIST_MAX_DATA_LSB = 0x54; private final static int DIST_MAX_DATA_MSB = 0x55; private final static int VOLT_DATA_POINT_LSB = 0x52; private final static int VOLT_DATA_POINT_MSB = 0x53; private final static int DIST_DATA_POINT_LSB = 0x54; private final static int DIST_DATA_POINT_MSB = 0x55; //Sensor Modules public final static byte GP2D12 = 0x31; /** * DIST-Nx-Short */ public final static byte GP2D120 = 0x32; /** * DIST-Nx-Medium */ public final static byte GP2YA21 = 0x33; /** * DIST-Nx-Long */ public final static byte GP2YA02 = 0x34; /** * Custom sensor */ public final static byte CUSTOM = 0x35; //Commands private final static byte DE_ENERGIZED = 0x44; private final static byte ENERGIZED = 0x45; private final static byte ARPA_ON = 0x4E; private final static byte ARPA_OFF = 0x4F; //(default) /** * * @param port NXT sensor port 1-4 */ public OpticalDistanceSensor(I2CPort port){ super(port); powerOn(); } /** * This only needs the be run if you are changing the sensor. * @param module changes the sensor module attached the he board. * */ public void setSensorModule(byte module){ sendData(COMMAND, module); } /** * Returns the distance from the object in millimeters. * This returns the same value as getDistLSB. * @return int */ public int getDistance(){ return getDistLSB(); } /** * Turns the sensor module on. <br> * Power is turned on by the constuctor method. * */ public void powerOn(){ sendData(COMMAND, ENERGIZED); } /** * Turns power to the sensor module off. * */ public void powerOff(){ sendData(COMMAND, DE_ENERGIZED); } /** * Enables (ADPA) Auto Detecting Parallel Architecture. <br> * Once you have enabled it you dont have to enable again. * */ public void setAPDAOn() { sendData(COMMAND, ARPA_ON); } /** * Disables (ADPA) Auto Detecting Parallel Architecture.<br> * Disabled by default. * */ public void setAPDAOff() { sendData(COMMAND, ARPA_OFF); } /** * Returns the current distance in millimeters for the LSB. * @return int */ public int getDistLSB(){ return readDISTNX(DIST_DATA_LSB, 2); } /** * Returns the current distance in millimeters for MSB. * @return int */ public int getDistMSB(){ return readDISTNX(DIST_DATA_MSB, 2); } /** * Returns the current voltage level in millivolts for the LSB. * @return int */ public int getVoltLSB(){ return readDISTNX(VOLT_DATA_LSB, 2); } /** * Returns the current voltage level in millivolts for the MSB. * @return int */ public int getVoltMSB(){ return readDISTNX(VOLT_DATA_MSB, 2); } /** * Used to determin the sensore module that is configured. * This can be helpful if the sensor is not working properly. * @return int */ public int getSensorModule(){ return readDISTNX(SENSOR_MOD_TYPE, 1); } /** * Gets the number of points that will be in the curve. * This corisponds with the set/get Volt and Distance methods.<br> * Used for recalibrating the sensor. * @return int */ public int getCurveCount(){ return readDISTNX(CURVE, 1); } /** * Sets the number of points that will be in the configured curve. * This corisponds with the set/get Vold and Distance points methods.<br> * Used for recalibrating the sensor. * @param value max 39 */ public void setCurveCount(int value){ sendData(CURVE, (byte)value); } /** * Gets the min value in millimeters for the LSB.<br> * Used for recalibrating the sensor. * @return int */ public int getDistMinLSB(){ return readDISTNX(DIST_MIN_DATA_LSB, 2); } /** * Sets the min value in millimeters for the LSB.<br> * Used for recalibrating the sensor. * @param value int */ public void setDistMinLSB(int value){ writeDISTNX(DIST_MIN_DATA_LSB, (byte)value); } /** * Gets the min value in millimeters for the MSB.<br> * Used for recalibrating the sensor. * @return int */ public int getDistMinMSB(){ return readDISTNX(DIST_MIN_DATA_MSB, 2); } /** * Sets the min value in millimeters for the MSB.<br> * Used for recalibrating the sensor. * @param value int */ public void setDistMinMSB(int value){ writeDISTNX(DIST_MIN_DATA_MSB, (byte)value); } /** * Gets the max value in millimeters for the LSB.<br> * Used for recalibrating the sensor. * @return int */ public int getDistMaxLSB(){ return readDISTNX(DIST_MAX_DATA_LSB, 2); } /** * Sets the max value in millimeters for LSB.<br> * Used for recalibrating the sensor. * @param value int */ public void setDistMaxLSB(int value){ writeDISTNX(DIST_MAX_DATA_LSB, (byte)value); } /** * Gets the max value in millimeters for the MSB.<br> * Used for recalibrating the sensor. * @return int */ public int getDistMaxMSB(){ return readDISTNX(DIST_MAX_DATA_MSB, 2); } /** * Sets the max value in millimeters for the MSB.<br> * Used for recalibrating the sensor. * @param value int */ public void setDistMaxMSB(int value){ writeDISTNX(DIST_MAX_DATA_MSB, (byte)value); } /** * Gets millivolts value of the specific index for the LSB. * These will corispond with the point methods index value.<br> * Used for recalibrating the sensor. * @param index max 39 * @return int */ public int getVoltPointLSB(int index){ if(index == 0) index = 1; index = VOLT_DATA_POINT_LSB + 4 * index; return readDISTNX(index, 2); } /** * Sets millivolts value of the specific index for the LSB. * These will corispond with the point methods index value.<br> * Used for recalibrating the sensor. * @param index max 39 * @param value int */ public void setVoltPointLSB(int index, int value){ if(index == 0) index = 1; index = VOLT_DATA_POINT_LSB + 4 * index; sendData(index, (byte)value); } /** * Gets millivolts value of the specific index for the MSB. * These will corispond with the point methods index value.<br> * Used for recalibrating the sensor. * @param index max 39 * @return Returns int */ public int getVoltPointMSB(int index){ if(index == 0) index = 1; index = VOLT_DATA_POINT_MSB + 4 * index; return readDISTNX(index, 2); } /** * Sets millivolts value of the specific index for the MSB. * These will corispond with the point methods index value.<br> * Used for recalibrating the sensor. * @param index max 39 * @param value int */ public void setVoltPointMSB(int index, int value){ if(index == 0) index = 1; index = VOLT_DATA_POINT_MSB + 4 * index; writeDISTNX(index, value); } /** * Gets millimeter value of the specific index for the LSB.<br> * Used for recalibrating the sensor. * @param index max 39 * @return Returns int */ public int getDistPointLSB(int index){ if(index == 0) index = 1; index = DIST_DATA_POINT_LSB + 4 * index; return readDISTNX(index, 2); } /** * Sets millimeter value of the specific index for the LSB. <br> * Used for recalibrating the sensor. * @param index max 39 * @param value int */ public void setDistPointLSB(int index, int value){ if(index == 0) index = 1; index = DIST_DATA_POINT_LSB + 4 * index; writeDISTNX(index, value); } /** * Gets millimeter value of the specific index for the MSB. <br> * Used for recalibrating the sensor. * @param index max 39 * @return int */ public int getDistPointMSB(int index){ if(index == 0) index = 1; index = DIST_DATA_POINT_MSB + 4 * index; return readDISTNX(index, 2); } /** * Sets millimeter value of the specific index for the MSB. <br> * Used for recalibrating the sensor. * @param index max 39. * @param value int */ public void setDistPointMSB(int index, int value){ if(index == 0) index = 1; index = DIST_DATA_POINT_MSB + 4 * index; writeDISTNX(index, value); } /** * Returns an integer value from the specified register.<br> * @param register I2C register, e.g 0x41 * @param bytes number of bytes to read 1 or 2 * @return int value from register */ private int readDISTNX(int register, int bytes){ int buf0; int buf1; getData(register, buf, bytes); if (bytes == 1) return buf[0] & 0xFF; buf0 = buf[0] & 0xFF; buf1 = buf[1] & 0xFF; return buf1 * 256 + buf0; } /** * Writes an integer value to the register. <br> * This is called if two bytes are to be writen.<br> * All other methods just call sendData() from i2cSensor. * @param register I2C register, e.g 0x41 * @param value iteger value to be writen to the register */ private void writeDISTNX(int register, int value){ int buf0; int buf1; buf0 = value % 256; buf1 = value / 256; buf[0] = (byte)buf0; buf[1] = (byte)buf1; sendData(register, buf, 2); } }