Interface class for the Max Botix ultrasonic range finder model 1210. It includes input methods for PWM, Analog, and Serial. A PwmIn class was created to allow the PWM input to be read. Now includes automatic range update via interrupts.

Dependencies:   mbed

Committer:
Blaze513
Date:
Mon Aug 23 01:12:57 2010 +0000
Revision:
1:b533b95e807a
Parent:
0:3d969e0b4ca0
Child:
2:997b4057c879

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Blaze513 0:3d969e0b4ca0 1 #include "MB1210.h"
Blaze513 0:3d969e0b4ca0 2
Blaze513 1:b533b95e807a 3 MB1210::MB1210(PinName pw, PinName an, PinName tx, PinName rx) : OperatingMode(0x00),
Blaze513 1:b533b95e807a 4 UnitFactor(1), PwmScalingFactor(17014.5), AnalogScalingFactor(1024), Range(0)
Blaze513 0:3d969e0b4ca0 5 {
Blaze513 0:3d969e0b4ca0 6 if (rx != NC)
Blaze513 0:3d969e0b4ca0 7 {
Blaze513 0:3d969e0b4ca0 8 SerialInput = new Serial(NC, rx);
Blaze513 0:3d969e0b4ca0 9 SerialInput->baud(9600);
Blaze513 0:3d969e0b4ca0 10 SerialInput->format(8, Serial::None, 1);
Blaze513 0:3d969e0b4ca0 11 OperatingMode = 0x02;
Blaze513 0:3d969e0b4ca0 12 }
Blaze513 0:3d969e0b4ca0 13 if (an != NC)
Blaze513 0:3d969e0b4ca0 14 {
Blaze513 0:3d969e0b4ca0 15 AnalogInput = new AnalogIn(an);
Blaze513 0:3d969e0b4ca0 16 OperatingMode = 0x01;
Blaze513 0:3d969e0b4ca0 17 }
Blaze513 0:3d969e0b4ca0 18 if (pw != NC)
Blaze513 0:3d969e0b4ca0 19 {
Blaze513 0:3d969e0b4ca0 20 PwmInput = new PwmIn(pw);
Blaze513 0:3d969e0b4ca0 21 OperatingMode = 0x00;
Blaze513 0:3d969e0b4ca0 22 }
Blaze513 0:3d969e0b4ca0 23 if (tx != NC)
Blaze513 0:3d969e0b4ca0 24 {
Blaze513 0:3d969e0b4ca0 25 SerialOutput = new DigitalOut(tx);
Blaze513 0:3d969e0b4ca0 26 SerialOutput->write(0);
Blaze513 0:3d969e0b4ca0 27 }
Blaze513 0:3d969e0b4ca0 28 }
Blaze513 0:3d969e0b4ca0 29 //constructor dynamically allocates memory and cpu time (interrupts)
Blaze513 0:3d969e0b4ca0 30 //to input objects depending on how the device is connected
Blaze513 0:3d969e0b4ca0 31
Blaze513 0:3d969e0b4ca0 32 MB1210::~MB1210()
Blaze513 0:3d969e0b4ca0 33 {
Blaze513 0:3d969e0b4ca0 34 delete PwmInput;
Blaze513 0:3d969e0b4ca0 35 delete AnalogInput;
Blaze513 0:3d969e0b4ca0 36 delete SerialOutput;
Blaze513 0:3d969e0b4ca0 37 delete SerialInput;
Blaze513 0:3d969e0b4ca0 38 delete this;
Blaze513 0:3d969e0b4ca0 39 }
Blaze513 0:3d969e0b4ca0 40 //input objects must be deallocated
Blaze513 0:3d969e0b4ca0 41
Blaze513 0:3d969e0b4ca0 42 void MB1210::SoundVelocity(float MetersPerSecond)
Blaze513 0:3d969e0b4ca0 43 {
Blaze513 0:3d969e0b4ca0 44 PwmScalingFactor = (UnitFactor * MetersPerSecond * 50);
Blaze513 0:3d969e0b4ca0 45 }
Blaze513 0:3d969e0b4ca0 46 //set the velocity of sound for pwm readings
Blaze513 0:3d969e0b4ca0 47
Blaze513 0:3d969e0b4ca0 48 void MB1210::Voltage(float Volts)
Blaze513 0:3d969e0b4ca0 49 {
Blaze513 0:3d969e0b4ca0 50 AnalogScalingFactor = (UnitFactor * 3379.2 / Volts);
Blaze513 0:3d969e0b4ca0 51 }
Blaze513 0:3d969e0b4ca0 52 //set the voltage correction factor for analog readings
Blaze513 0:3d969e0b4ca0 53
Blaze513 0:3d969e0b4ca0 54 void MB1210::Unit(float UnitsPerMeter)
Blaze513 0:3d969e0b4ca0 55 {
Blaze513 0:3d969e0b4ca0 56 PwmScalingFactor *= (UnitsPerMeter / UnitFactor / 100);
Blaze513 0:3d969e0b4ca0 57 AnalogScalingFactor *= (UnitsPerMeter / UnitFactor / 100);
Blaze513 0:3d969e0b4ca0 58 UnitFactor = UnitsPerMeter / 100;
Blaze513 0:3d969e0b4ca0 59 }
Blaze513 0:3d969e0b4ca0 60 //set the unit factor to return the range in units other than cm
Blaze513 0:3d969e0b4ca0 61
Blaze513 0:3d969e0b4ca0 62 void MB1210::Mode(char Selection)
Blaze513 0:3d969e0b4ca0 63 {
Blaze513 0:3d969e0b4ca0 64 if (SerialOutput)
Blaze513 0:3d969e0b4ca0 65 {
Blaze513 0:3d969e0b4ca0 66 SerialOutput->write(Selection & 0x04);
Blaze513 0:3d969e0b4ca0 67 }
Blaze513 0:3d969e0b4ca0 68 OperatingMode = Selection & 0x03;
Blaze513 0:3d969e0b4ca0 69 }
Blaze513 0:3d969e0b4ca0 70 //change the operating mode; SerialOutput controls synchronicity
Blaze513 0:3d969e0b4ca0 71
Blaze513 0:3d969e0b4ca0 72 void MB1210::RequestSyncRead()
Blaze513 0:3d969e0b4ca0 73 {
Blaze513 0:3d969e0b4ca0 74 if (SerialOutput)
Blaze513 0:3d969e0b4ca0 75 {
Blaze513 0:3d969e0b4ca0 76 SerialOutput->write(1);
Blaze513 0:3d969e0b4ca0 77 wait_us(20);
Blaze513 0:3d969e0b4ca0 78 SerialOutput->write(0);
Blaze513 0:3d969e0b4ca0 79 }
Blaze513 0:3d969e0b4ca0 80 }
Blaze513 0:3d969e0b4ca0 81 //hold pin high for at least 20 us to request a synchronous range reading
Blaze513 0:3d969e0b4ca0 82
Blaze513 0:3d969e0b4ca0 83 float MB1210::Read()
Blaze513 0:3d969e0b4ca0 84 {
Blaze513 0:3d969e0b4ca0 85 switch (OperatingMode)
Blaze513 0:3d969e0b4ca0 86 {
Blaze513 0:3d969e0b4ca0 87 case 0:
Blaze513 0:3d969e0b4ca0 88 if (PwmInput)
Blaze513 0:3d969e0b4ca0 89 {
Blaze513 0:3d969e0b4ca0 90 return PwmInput->pulsewidth() * PwmScalingFactor;
Blaze513 0:3d969e0b4ca0 91 }
Blaze513 0:3d969e0b4ca0 92 else
Blaze513 0:3d969e0b4ca0 93 {
Blaze513 0:3d969e0b4ca0 94 return 0;
Blaze513 0:3d969e0b4ca0 95 }
Blaze513 0:3d969e0b4ca0 96 case 1:
Blaze513 0:3d969e0b4ca0 97 if (AnalogInput)
Blaze513 0:3d969e0b4ca0 98 {
Blaze513 0:3d969e0b4ca0 99 return AnalogInput->read() * AnalogScalingFactor;
Blaze513 0:3d969e0b4ca0 100 }
Blaze513 0:3d969e0b4ca0 101 else
Blaze513 0:3d969e0b4ca0 102 {
Blaze513 0:3d969e0b4ca0 103 return 0;
Blaze513 0:3d969e0b4ca0 104 }
Blaze513 0:3d969e0b4ca0 105 case 2:
Blaze513 0:3d969e0b4ca0 106 if (SerialInput)
Blaze513 0:3d969e0b4ca0 107 {
Blaze513 1:b533b95e807a 108 unsigned char i = 0;
Blaze513 1:b533b95e807a 109 while (SerialInput->readable() && !SerialInput->scanf("R%3d", &Range) && (i < 32))
Blaze513 0:3d969e0b4ca0 110 {
Blaze513 1:b533b95e807a 111 SerialInput->getc();
Blaze513 1:b533b95e807a 112 i++;
Blaze513 0:3d969e0b4ca0 113 }
Blaze513 1:b533b95e807a 114 return (float)Range * UnitFactor;
Blaze513 0:3d969e0b4ca0 115 }
Blaze513 0:3d969e0b4ca0 116 else
Blaze513 0:3d969e0b4ca0 117 {
Blaze513 0:3d969e0b4ca0 118 return 0;
Blaze513 0:3d969e0b4ca0 119 }
Blaze513 0:3d969e0b4ca0 120 default:
Blaze513 0:3d969e0b4ca0 121 return 0;
Blaze513 0:3d969e0b4ca0 122 }
Blaze513 0:3d969e0b4ca0 123 }
Blaze513 0:3d969e0b4ca0 124 //OperatingMode switches to desired output method;
Blaze513 0:3d969e0b4ca0 125 //once gathered, the result is scaled according to voltage, the speed of sound, and desired unit
Blaze513 0:3d969e0b4ca0 126 void MB1210::Read(char* Buffer)
Blaze513 0:3d969e0b4ca0 127 {
Blaze513 0:3d969e0b4ca0 128 if (SerialInput)
Blaze513 0:3d969e0b4ca0 129 {
Blaze513 1:b533b95e807a 130 unsigned char i = 0;
Blaze513 1:b533b95e807a 131 while (SerialInput->readable() && !SerialInput->scanf("R%3s", Buffer) && (i < 32))
Blaze513 0:3d969e0b4ca0 132 {
Blaze513 1:b533b95e807a 133 SerialInput->getc();
Blaze513 1:b533b95e807a 134 i++;
Blaze513 0:3d969e0b4ca0 135 }
Blaze513 0:3d969e0b4ca0 136 }
Blaze513 0:3d969e0b4ca0 137 }
Blaze513 0:3d969e0b4ca0 138 //this overload is for serial only, regardless of selected mode;
Blaze513 0:3d969e0b4ca0 139 //reads 3 ASCII character result into the given buffer
Blaze513 0:3d969e0b4ca0 140
Blaze513 0:3d969e0b4ca0 141 MB1210::operator float()
Blaze513 0:3d969e0b4ca0 142 {
Blaze513 0:3d969e0b4ca0 143 return Read();
Blaze513 0:3d969e0b4ca0 144 }
Blaze513 0:3d969e0b4ca0 145 //conversion function acts as shorthand for Read()