Class to read range measurements from a MaxBotix MaxSonar ranging device.

Dependents:   BETAGO CleaningMachine_Betago clean_V1 CleaningM-Palm ... more

Committer:
mkanli
Date:
Tue Dec 14 12:08:17 2010 +0000
Revision:
0:18790852a055
Child:
1:b439ab68c8d9
Supports LV series, analog measurement, triggered or continuous. Can be expanded to support WR, WRC, XL and XL_AE series devices and PWM/Serial measurements.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mkanli 0:18790852a055 1 /**
mkanli 0:18790852a055 2 * @file MaxSonar.h
mkanli 0:18790852a055 3 * @section LICENSE
mkanli 0:18790852a055 4 * Copyright (c) 2010 Mustafa Ozgur Kanli.
mkanli 0:18790852a055 5 *
mkanli 0:18790852a055 6 * Permission is hereby granted, free of charge, to any person obtaining a copy
mkanli 0:18790852a055 7 * of this software and associated documentation files (the "Software"),to deal
mkanli 0:18790852a055 8 * in the Software without restriction, including without limitation the rights
mkanli 0:18790852a055 9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
mkanli 0:18790852a055 10 * copies of the Software, and to permit persons to whom the Software is
mkanli 0:18790852a055 11 * furnished to do so, subject to the following conditions:
mkanli 0:18790852a055 12 *
mkanli 0:18790852a055 13 * The above copyright notice and this permission notice shall be included in
mkanli 0:18790852a055 14 * all copies or substantial portions of the Software.
mkanli 0:18790852a055 15 *
mkanli 0:18790852a055 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
mkanli 0:18790852a055 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
mkanli 0:18790852a055 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
mkanli 0:18790852a055 19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
mkanli 0:18790852a055 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
mkanli 0:18790852a055 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
mkanli 0:18790852a055 22 * THE SOFTWARE.
mkanli 0:18790852a055 23 *
mkanli 0:18790852a055 24 * @section Description
mkanli 0:18790852a055 25 * This class provides an object to obtain range measurements from a
mkanli 0:18790852a055 26 * Maxbotix MaxSonar ultrasonic range finder.
mkanli 0:18790852a055 27 *
mkanli 0:18790852a055 28 * Supported devices:
mkanli 0:18790852a055 29 * 1) LV-MaxSonar: -EZ0 MB1000, -EZ1 MB1010, -EZ2 MB1020,
mkanli 0:18790852a055 30 * -EZ3 MB1030, -EZ4 MB1040
mkanli 0:18790852a055 31 * 2) @todo add more?
mkanli 0:18790852a055 32 *
mkanli 0:18790852a055 33 * Supported modes:
mkanli 0:18790852a055 34 * 1) Analog.
mkanli 0:18790852a055 35 * 2) @todo add more?
mkanli 0:18790852a055 36 */
mkanli 0:18790852a055 37 #ifndef MAXSONAR_H_
mkanli 0:18790852a055 38 #define MAXSONAR_H_
mkanli 0:18790852a055 39
mkanli 0:18790852a055 40 #include "mbed.h"
mkanli 0:18790852a055 41
mkanli 0:18790852a055 42 //! Define types of MaxSonar devices.
mkanli 0:18790852a055 43 enum MSType {
mkanli 0:18790852a055 44 MS_LV = 0,
mkanli 0:18790852a055 45 MS_WR, //!< Not supported yet.
mkanli 0:18790852a055 46 MS_WRC, //!< Not supported yet.
mkanli 0:18790852a055 47 MS_XL, //!< Not supported yet.
mkanli 0:18790852a055 48 MS_XL_AE //!< Not supported yet.
mkanli 0:18790852a055 49 };
mkanli 0:18790852a055 50
mkanli 0:18790852a055 51 //! Define units for returning range.
mkanli 0:18790852a055 52 enum MSUnits {
mkanli 0:18790852a055 53 MS_CM = 0, //!< centimeters.
mkanli 0:18790852a055 54 MS_INCH //!< inches.
mkanli 0:18790852a055 55 };
mkanli 0:18790852a055 56
mkanli 0:18790852a055 57 //! Define access mode for obtaining range measurement.
mkanli 0:18790852a055 58 enum MSMode {
mkanli 0:18790852a055 59 MS_ANALOG = 0,
mkanli 0:18790852a055 60 MS_SERIAL, //!< Not supported yet.
mkanli 0:18790852a055 61 MS_PWM //!< Not supported yet.
mkanli 0:18790852a055 62 };
mkanli 0:18790852a055 63
mkanli 0:18790852a055 64 /**
mkanli 0:18790852a055 65 * Class to read range measurements from MaxBotix MaxSonar
mkanli 0:18790852a055 66 * range-finder devices.
mkanli 0:18790852a055 67 *
mkanli 0:18790852a055 68 * Example
mkanli 0:18790852a055 69 * @code
mkanli 0:18790852a055 70 * #include "mbed.h"
mkanli 0:18790852a055 71 * #include "MaxSonar.h"
mkanli 0:18790852a055 72 *
mkanli 0:18790852a055 73 * int main() {
mkanli 0:18790852a055 74 * MaxSonar *range;
mkanli 0:18790852a055 75 * float r;
mkanli 0:18790852a055 76 *
mkanli 0:18790852a055 77 * // Create and configure object for 3.3V powered LV-series device,
mkanli 0:18790852a055 78 * // accessed with analog reads (in cm) on p16, triggered by p7.
mkanli 0:18790852a055 79 * range = new MaxSonar(MS_LV, MS_ANALOG, p7, p16);
mkanli 0:18790852a055 80 * range->setVoltage(3.3);
mkanli 0:18790852a055 81 * range->setUnits(MS_CM);
mkanli 0:18790852a055 82 *
mkanli 0:18790852a055 83 * while(1) {
mkanli 0:18790852a055 84 * // Trigger read, wait 49ms until ranger finder has
mkanli 0:18790852a055 85 * // finished, then read.
mkanli 0:18790852a055 86 * range->triggerRead();
mkanli 0:18790852a055 87 * wait_ms(49);
mkanli 0:18790852a055 88 * r = range->read();
mkanli 0:18790852a055 89 *
mkanli 0:18790852a055 90 * // Print and delay 0.5s.
mkanli 0:18790852a055 91 * printf("Range: %.3f cm\n", r);
mkanli 0:18790852a055 92 * wait(0.5);
mkanli 0:18790852a055 93 * }
mkanli 0:18790852a055 94 * @endcode
mkanli 0:18790852a055 95 */
mkanli 0:18790852a055 96 class MaxSonar {
mkanli 0:18790852a055 97
mkanli 0:18790852a055 98 private:
mkanli 0:18790852a055 99 enum MSType type; //!< Device type.
mkanli 0:18790852a055 100 enum MSMode mode; //!< Range reading mode.
mkanli 0:18790852a055 101 enum MSUnits units; //!< Range units.
mkanli 0:18790852a055 102 float voltage; //!< Supply/reference voltage (V).
mkanli 0:18790852a055 103 int analog_scale; //!< resolution = voltage/scale.
mkanli 0:18790852a055 104 float analog_resolution; //!< V/inch to compute range.
mkanli 0:18790852a055 105 AnalogIn *ain; //!< For analog reads.
mkanli 0:18790852a055 106 DigitalOut *rx_req; //!< For triggered reads (PWM or AIN).
mkanli 0:18790852a055 107
mkanli 0:18790852a055 108 public:
mkanli 0:18790852a055 109 /**
mkanli 0:18790852a055 110 * Constructor.
mkanli 0:18790852a055 111 *
mkanli 0:18790852a055 112 * @param type The type of device.
mkanli 0:18790852a055 113 * @param mode The access mode.
mkanli 0:18790852a055 114 * @param pin1 MS_ANALOG: Pin connected to RX of device.
mkanli 0:18790852a055 115 * MS_SERIAL: Pin connected to RX of device.
mkanli 0:18790852a055 116 * MS_PWM: Pin connected to RX of device.
mkanli 0:18790852a055 117 * @param pin2 MS_ANALOG: Pin connected to AN of device.
mkanli 0:18790852a055 118 * MS_SERIAL: Pin connected to TX of device.
mkanli 0:18790852a055 119 * MS_PWM: Pin connected to PW of device.
mkanli 0:18790852a055 120 * @note pin1 may be NC if only continuous reading is desired
mkanli 0:18790852a055 121 * when in analog or pwm mode.
mkanli 0:18790852a055 122 * @note Default units are in cm (MS_CM).
mkanli 0:18790852a055 123 */
mkanli 0:18790852a055 124 MaxSonar(enum MSType type, enum MSMode mode,
mkanli 0:18790852a055 125 PinName pin1, PinName pin2);
mkanli 0:18790852a055 126
mkanli 0:18790852a055 127 /**
mkanli 0:18790852a055 128 * Destructor.
mkanli 0:18790852a055 129 */
mkanli 0:18790852a055 130 ~MaxSonar(void);
mkanli 0:18790852a055 131
mkanli 0:18790852a055 132 /**
mkanli 0:18790852a055 133 * Set the units for reading range value. Default cm (MS_CM).
mkanli 0:18790852a055 134 *
mkanli 0:18790852a055 135 * @param units The specified units option.
mkanli 0:18790852a055 136 */
mkanli 0:18790852a055 137 void setUnits(enum MSUnits units);
mkanli 0:18790852a055 138
mkanli 0:18790852a055 139 /**
mkanli 0:18790852a055 140 * Specify the supply voltage used by the device.
mkanli 0:18790852a055 141 *
mkanli 0:18790852a055 142 * @param voltage The specified voltage (default 3.3)
mkanli 0:18790852a055 143 *
mkanli 0:18790852a055 144 * @note This is important for correct conversion of the voltage
mkanli 0:18790852a055 145 * from pin AN of device into the range value.
mkanli 0:18790852a055 146 */
mkanli 0:18790852a055 147 void setVoltage(float voltage);
mkanli 0:18790852a055 148
mkanli 0:18790852a055 149 /**
mkanli 0:18790852a055 150 * Trigger a reading of range. The reading will be ready 49 ms
mkanli 0:18790852a055 151 * after the trigger, accessable by the read() function.
mkanli 0:18790852a055 152 *
mkanli 0:18790852a055 153 * @param none
mkanli 0:18790852a055 154 *
mkanli 0:18790852a055 155 * @note Triggered reading is only possible if a pin connected to
mkanli 0:18790852a055 156 * RX of the device was specified when calling the constructor.
mkanli 0:18790852a055 157 */
mkanli 0:18790852a055 158 void triggerRead(void);
mkanli 0:18790852a055 159
mkanli 0:18790852a055 160 /**
mkanli 0:18790852a055 161 * Read range value.
mkanli 0:18790852a055 162 *
mkanli 0:18790852a055 163 * @return Range value in the set units (default cm).
mkanli 0:18790852a055 164 */
mkanli 0:18790852a055 165 float read(void);
mkanli 0:18790852a055 166 };
mkanli 0:18790852a055 167
mkanli 0:18790852a055 168 #endif