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 07:11:10 2010 +0000
Revision:
2:997b4057c879
Parent:
1:b533b95e807a
Child:
3:05183e50a923

        

Who changed what in which revision?

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