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:13:42 2010 +0000
Revision:
1:b439ab68c8d9
Parent:
0:18790852a055
Some comment fixes.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mkanli 0:18790852a055 1 /**
mkanli 0:18790852a055 2 * @file MaxSonar.cpp
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 * Implementation of MaxSonar class.
mkanli 0:18790852a055 26 */
mkanli 0:18790852a055 27
mkanli 0:18790852a055 28 #include "mbed.h"
mkanli 0:18790852a055 29 #include "MaxSonar.h"
mkanli 0:18790852a055 30
mkanli 0:18790852a055 31 MaxSonar::MaxSonar(enum MSType type, enum MSMode mode,
mkanli 0:18790852a055 32 PinName pin1, PinName pin2) {
mkanli 0:18790852a055 33
mkanli 0:18790852a055 34 // Set some defaults common to all devices.
mkanli 0:18790852a055 35 this->units = MS_CM;
mkanli 0:18790852a055 36 this->voltage = 3.3;
mkanli 0:18790852a055 37 this->ain = NULL;
mkanli 0:18790852a055 38 this->rx_req = NULL;
mkanli 0:18790852a055 39
mkanli 0:18790852a055 40 // Save settings.
mkanli 0:18790852a055 41 this->type = type;
mkanli 0:18790852a055 42 this->mode = mode;
mkanli 0:18790852a055 43
mkanli 0:18790852a055 44 // Device specific settings.
mkanli 0:18790852a055 45 switch(this->type) {
mkanli 0:18790852a055 46 case MS_LV:
mkanli 0:18790852a055 47 this->analog_scale = 512;
mkanli 0:18790852a055 48 break;
mkanli 0:18790852a055 49
mkanli 0:18790852a055 50 // @todo Add functionality.
mkanli 0:18790852a055 51 case MS_WR:
mkanli 0:18790852a055 52 case MS_WRC:
mkanli 0:18790852a055 53 case MS_XL:
mkanli 0:18790852a055 54 case MS_XL_AE:
mkanli 0:18790852a055 55 default:
mkanli 0:18790852a055 56 error("MaxSonar: Currently unsupported.\n");
mkanli 0:18790852a055 57 break;
mkanli 0:18790852a055 58 }
mkanli 0:18790852a055 59
mkanli 0:18790852a055 60 // Mode specific settings.
mkanli 0:18790852a055 61 switch(this->mode) {
mkanli 0:18790852a055 62 case MS_ANALOG:
mkanli 0:18790852a055 63 if (pin1 != NC)
mkanli 0:18790852a055 64 {
mkanli 0:18790852a055 65 rx_req = new DigitalOut(pin1);
mkanli 0:18790852a055 66 rx_req->write(0); // Default low to stop it ranging.
mkanli 0:18790852a055 67 }
mkanli 0:18790852a055 68 ain = new AnalogIn(pin2);
mkanli 0:18790852a055 69 this->analog_resolution = this->voltage / this->analog_scale;
mkanli 0:18790852a055 70 break;
mkanli 0:18790852a055 71
mkanli 0:18790852a055 72 // @todo Add functionality.
mkanli 0:18790852a055 73 case MS_SERIAL:
mkanli 0:18790852a055 74 case MS_PWM:
mkanli 0:18790852a055 75 default:
mkanli 0:18790852a055 76 error("MaxSonar: Currently unsupported.\n");
mkanli 0:18790852a055 77 break;
mkanli 0:18790852a055 78 }
mkanli 0:18790852a055 79 }
mkanli 0:18790852a055 80
mkanli 0:18790852a055 81 MaxSonar::~MaxSonar(void) {
mkanli 0:18790852a055 82 delete ain;
mkanli 0:18790852a055 83 }
mkanli 0:18790852a055 84
mkanli 0:18790852a055 85 void MaxSonar::setUnits(enum MSUnits units) {
mkanli 0:18790852a055 86 this->units = units;
mkanli 0:18790852a055 87 }
mkanli 0:18790852a055 88
mkanli 0:18790852a055 89 void MaxSonar::setVoltage(float voltage) {
mkanli 0:18790852a055 90 this->voltage = voltage;
mkanli 0:18790852a055 91 this->analog_resolution = this->voltage / this->analog_scale;
mkanli 0:18790852a055 92 }
mkanli 0:18790852a055 93
mkanli 0:18790852a055 94 void MaxSonar::triggerRead(void) {
mkanli 0:18790852a055 95
mkanli 0:18790852a055 96 if (rx_req != NULL)
mkanli 0:18790852a055 97 {
mkanli 0:18790852a055 98 // Bring rx line high for 20us to perform a read. The read will
mkanli 0:18790852a055 99 // be available 49ms after request.
mkanli 0:18790852a055 100 rx_req->write(1);
mkanli 0:18790852a055 101 wait_us(20);
mkanli 0:18790852a055 102 rx_req->write(0);
mkanli 0:18790852a055 103 }
mkanli 0:18790852a055 104 }
mkanli 0:18790852a055 105
mkanli 0:18790852a055 106 float MaxSonar::read(void) {
mkanli 0:18790852a055 107
mkanli 0:18790852a055 108 float range;
mkanli 0:18790852a055 109
mkanli 0:18790852a055 110 // Make the reading.
mkanli 0:18790852a055 111 switch(this->mode) {
mkanli 0:18790852a055 112 case MS_ANALOG:
mkanli 0:18790852a055 113 //! Range value is computed in inches by default.
mkanli 0:18790852a055 114 range = (this->ain->read() * this->voltage) / this->analog_resolution;
mkanli 0:18790852a055 115 break;
mkanli 0:18790852a055 116
mkanli 0:18790852a055 117 // @todo Add functionality.
mkanli 0:18790852a055 118 case MS_SERIAL:
mkanli 0:18790852a055 119 case MS_PWM:
mkanli 0:18790852a055 120 default:
mkanli 0:18790852a055 121 error("MaxSonar: Currently unsupported.\n");
mkanli 0:18790852a055 122 break;
mkanli 0:18790852a055 123 }
mkanli 0:18790852a055 124
mkanli 0:18790852a055 125 // Perform conversion.
mkanli 0:18790852a055 126 switch(this->units) {
mkanli 0:18790852a055 127 case MS_CM:
mkanli 0:18790852a055 128 range *= 2.54;
mkanli 0:18790852a055 129 break;
mkanli 0:18790852a055 130
mkanli 0:18790852a055 131 case MS_INCH:
mkanli 0:18790852a055 132 break;
mkanli 0:18790852a055 133
mkanli 0:18790852a055 134 default:
mkanli 0:18790852a055 135 error("MaxSonar: Currently unsupported.\n");
mkanli 0:18790852a055 136 break;
mkanli 0:18790852a055 137 }
mkanli 0:18790852a055 138
mkanli 0:18790852a055 139 return range;
mkanli 0:18790852a055 140 }
mkanli 0:18790852a055 141