Modifid library for m3pi

Dependents:   BeaconAvoid

Committer:
mpanetta
Date:
Sun Sep 09 22:28:04 2012 +0000
Revision:
0:1ce8bf1f4452
[mbed] converted /BeaconAvoid/m3pi

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mpanetta 0:1ce8bf1f4452 1 /* mbed m3pi Library
mpanetta 0:1ce8bf1f4452 2 * Copyright (c) 2007-2010 cstyles
mpanetta 0:1ce8bf1f4452 3 *
mpanetta 0:1ce8bf1f4452 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
mpanetta 0:1ce8bf1f4452 5 * of this software and associated documentation files (the "Software"), to deal
mpanetta 0:1ce8bf1f4452 6 * in the Software without restriction, including without limitation the rights
mpanetta 0:1ce8bf1f4452 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
mpanetta 0:1ce8bf1f4452 8 * copies of the Software, and to permit persons to whom the Software is
mpanetta 0:1ce8bf1f4452 9 * furnished to do so, subject to the following conditions:
mpanetta 0:1ce8bf1f4452 10 *
mpanetta 0:1ce8bf1f4452 11 * The above copyright notice and this permission notice shall be included in
mpanetta 0:1ce8bf1f4452 12 * all copies or substantial portions of the Software.
mpanetta 0:1ce8bf1f4452 13 *
mpanetta 0:1ce8bf1f4452 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
mpanetta 0:1ce8bf1f4452 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
mpanetta 0:1ce8bf1f4452 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
mpanetta 0:1ce8bf1f4452 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
mpanetta 0:1ce8bf1f4452 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
mpanetta 0:1ce8bf1f4452 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
mpanetta 0:1ce8bf1f4452 20 * THE SOFTWARE.
mpanetta 0:1ce8bf1f4452 21 */
mpanetta 0:1ce8bf1f4452 22
mpanetta 0:1ce8bf1f4452 23 #ifndef M3PI_H
mpanetta 0:1ce8bf1f4452 24 #define M3PI_H
mpanetta 0:1ce8bf1f4452 25
mpanetta 0:1ce8bf1f4452 26 #include "mbed.h"
mpanetta 0:1ce8bf1f4452 27 #include "platform.h"
mpanetta 0:1ce8bf1f4452 28
mpanetta 0:1ce8bf1f4452 29 #ifdef MBED_RPC
mpanetta 0:1ce8bf1f4452 30 #include "rpc.h"
mpanetta 0:1ce8bf1f4452 31 #endif
mpanetta 0:1ce8bf1f4452 32
mpanetta 0:1ce8bf1f4452 33 #define SEND_SIGNATURE 0x81
mpanetta 0:1ce8bf1f4452 34 #define SEND_RAW_SENSOR_VALUES 0x86
mpanetta 0:1ce8bf1f4452 35 #define SEND_TRIMPOT 0xB0
mpanetta 0:1ce8bf1f4452 36 #define SEND_BATTERY_MILLIVOLTS 0xB1
mpanetta 0:1ce8bf1f4452 37 #define DO_PLAY 0xB3
mpanetta 0:1ce8bf1f4452 38 #define PI_CALIBRATE 0xB4
mpanetta 0:1ce8bf1f4452 39 #define DO_CLEAR 0xB7
mpanetta 0:1ce8bf1f4452 40 #define DO_PRINT 0xB8
mpanetta 0:1ce8bf1f4452 41 #define DO_LCD_GOTO_XY 0xB9
mpanetta 0:1ce8bf1f4452 42 #define LINE_SENSORS_RESET_CALIBRATION 0xB5
mpanetta 0:1ce8bf1f4452 43 #define SEND_LINE_POSITION 0xB6
mpanetta 0:1ce8bf1f4452 44 #define AUTO_CALIBRATE 0xBA
mpanetta 0:1ce8bf1f4452 45 #define SET_PID 0xBB
mpanetta 0:1ce8bf1f4452 46 #define STOP_PID 0xBC
mpanetta 0:1ce8bf1f4452 47 #define M1_FORWARD 0xC1
mpanetta 0:1ce8bf1f4452 48 #define M1_BACKWARD 0xC2
mpanetta 0:1ce8bf1f4452 49 #define M2_FORWARD 0xC5
mpanetta 0:1ce8bf1f4452 50 #define M2_BACKWARD 0xC6
mpanetta 0:1ce8bf1f4452 51
mpanetta 0:1ce8bf1f4452 52
mpanetta 0:1ce8bf1f4452 53
mpanetta 0:1ce8bf1f4452 54 /** m3pi control class
mpanetta 0:1ce8bf1f4452 55 *
mpanetta 0:1ce8bf1f4452 56 * Example:
mpanetta 0:1ce8bf1f4452 57 * @code
mpanetta 0:1ce8bf1f4452 58 * // Drive the m3pi forward, turn left, back, turn right, at half speed for half a second
mpanetta 0:1ce8bf1f4452 59
mpanetta 0:1ce8bf1f4452 60 #include "mbed.h"
mpanetta 0:1ce8bf1f4452 61 #include "m3pi.h"
mpanetta 0:1ce8bf1f4452 62
mpanetta 0:1ce8bf1f4452 63 m3pi pi;
mpanetta 0:1ce8bf1f4452 64
mpanetta 0:1ce8bf1f4452 65 int main() {
mpanetta 0:1ce8bf1f4452 66
mpanetta 0:1ce8bf1f4452 67 wait(0.5);
mpanetta 0:1ce8bf1f4452 68
mpanetta 0:1ce8bf1f4452 69 pi.forward(0.5);
mpanetta 0:1ce8bf1f4452 70 wait (0.5);
mpanetta 0:1ce8bf1f4452 71 pi.left(0.5);
mpanetta 0:1ce8bf1f4452 72 wait (0.5);
mpanetta 0:1ce8bf1f4452 73 pi.backward(0.5);
mpanetta 0:1ce8bf1f4452 74 wait (0.5);
mpanetta 0:1ce8bf1f4452 75 pi.right(0.5);
mpanetta 0:1ce8bf1f4452 76 wait (0.5);
mpanetta 0:1ce8bf1f4452 77
mpanetta 0:1ce8bf1f4452 78 pi.stop();
mpanetta 0:1ce8bf1f4452 79
mpanetta 0:1ce8bf1f4452 80 }
mpanetta 0:1ce8bf1f4452 81 * @endcode
mpanetta 0:1ce8bf1f4452 82 */
mpanetta 0:1ce8bf1f4452 83 class m3pi : public Stream {
mpanetta 0:1ce8bf1f4452 84
mpanetta 0:1ce8bf1f4452 85 // Public functions
mpanetta 0:1ce8bf1f4452 86 public:
mpanetta 0:1ce8bf1f4452 87
mpanetta 0:1ce8bf1f4452 88 /** Create the m3pi object connected to the default pins
mpanetta 0:1ce8bf1f4452 89 *
mpanetta 0:1ce8bf1f4452 90 * @param nrst GPIO pin used for reset. Default is p23
mpanetta 0:1ce8bf1f4452 91 * @param tx Serial transmit pin. Default is p9
mpanetta 0:1ce8bf1f4452 92 * @param rx Serial receive pin. Default is p10
mpanetta 0:1ce8bf1f4452 93 */
mpanetta 0:1ce8bf1f4452 94 m3pi();
mpanetta 0:1ce8bf1f4452 95
mpanetta 0:1ce8bf1f4452 96
mpanetta 0:1ce8bf1f4452 97 /** Create the m3pi object connected to specific pins
mpanetta 0:1ce8bf1f4452 98 *
mpanetta 0:1ce8bf1f4452 99 */
mpanetta 0:1ce8bf1f4452 100 m3pi(PinName nrst, PinName tx, PinName rx);
mpanetta 0:1ce8bf1f4452 101
mpanetta 0:1ce8bf1f4452 102
mpanetta 0:1ce8bf1f4452 103
mpanetta 0:1ce8bf1f4452 104 /** Force a hardware reset of the 3pi
mpanetta 0:1ce8bf1f4452 105 */
mpanetta 0:1ce8bf1f4452 106 void reset (void);
mpanetta 0:1ce8bf1f4452 107
mpanetta 0:1ce8bf1f4452 108 /** Directly control the speed and direction of the left motor
mpanetta 0:1ce8bf1f4452 109 *
mpanetta 0:1ce8bf1f4452 110 * @param speed A normalised number -1.0 - 1.0 represents the full range.
mpanetta 0:1ce8bf1f4452 111 */
mpanetta 0:1ce8bf1f4452 112 void left_motor (float speed);
mpanetta 0:1ce8bf1f4452 113
mpanetta 0:1ce8bf1f4452 114 /** Directly control the speed and direction of the right motor
mpanetta 0:1ce8bf1f4452 115 *
mpanetta 0:1ce8bf1f4452 116 * @param speed A normalised number -1.0 - 1.0 represents the full range.
mpanetta 0:1ce8bf1f4452 117 */
mpanetta 0:1ce8bf1f4452 118 void right_motor (float speed);
mpanetta 0:1ce8bf1f4452 119
mpanetta 0:1ce8bf1f4452 120 /** Drive both motors forward as the same speed
mpanetta 0:1ce8bf1f4452 121 *
mpanetta 0:1ce8bf1f4452 122 * @param speed A normalised number 0 - 1.0 represents the full range.
mpanetta 0:1ce8bf1f4452 123 */
mpanetta 0:1ce8bf1f4452 124 void forward (float speed);
mpanetta 0:1ce8bf1f4452 125
mpanetta 0:1ce8bf1f4452 126 /** Drive both motors backward as the same speed
mpanetta 0:1ce8bf1f4452 127 *
mpanetta 0:1ce8bf1f4452 128 * @param speed A normalised number 0 - 1.0 represents the full range.
mpanetta 0:1ce8bf1f4452 129 */
mpanetta 0:1ce8bf1f4452 130 void backward (float speed);
mpanetta 0:1ce8bf1f4452 131
mpanetta 0:1ce8bf1f4452 132 /** Drive left motor backwards and right motor forwards at the same speed to turn on the spot
mpanetta 0:1ce8bf1f4452 133 *
mpanetta 0:1ce8bf1f4452 134 * @param speed A normalised number 0 - 1.0 represents the full range.
mpanetta 0:1ce8bf1f4452 135 */
mpanetta 0:1ce8bf1f4452 136 void left (float speed);
mpanetta 0:1ce8bf1f4452 137
mpanetta 0:1ce8bf1f4452 138 /** Drive left motor forward and right motor backwards at the same speed to turn on the spot
mpanetta 0:1ce8bf1f4452 139 * @param speed A normalised number 0 - 1.0 represents the full range.
mpanetta 0:1ce8bf1f4452 140 */
mpanetta 0:1ce8bf1f4452 141 void right (float speed);
mpanetta 0:1ce8bf1f4452 142
mpanetta 0:1ce8bf1f4452 143 /** Stop both motors
mpanetta 0:1ce8bf1f4452 144 *
mpanetta 0:1ce8bf1f4452 145 */
mpanetta 0:1ce8bf1f4452 146 void stop (void);
mpanetta 0:1ce8bf1f4452 147
mpanetta 0:1ce8bf1f4452 148 /** Read the voltage of the potentiometer on the 3pi
mpanetta 0:1ce8bf1f4452 149 * @returns voltage as a float
mpanetta 0:1ce8bf1f4452 150 *
mpanetta 0:1ce8bf1f4452 151 */
mpanetta 0:1ce8bf1f4452 152 float pot_voltage(void);
mpanetta 0:1ce8bf1f4452 153
mpanetta 0:1ce8bf1f4452 154 /** Read the battery voltage on the 3pi
mpanetta 0:1ce8bf1f4452 155 * @returns battery voltage as a float
mpanetta 0:1ce8bf1f4452 156 */
mpanetta 0:1ce8bf1f4452 157 float battery(void);
mpanetta 0:1ce8bf1f4452 158
mpanetta 0:1ce8bf1f4452 159 /** Read the position of the detected line
mpanetta 0:1ce8bf1f4452 160 * @returns position as A normalised number -1.0 - 1.0 represents the full range.
mpanetta 0:1ce8bf1f4452 161 * -1.0 means line is on the left, or the line has been lost
mpanetta 0:1ce8bf1f4452 162 * 0.0 means the line is in the middle
mpanetta 0:1ce8bf1f4452 163 * 1.0 means the line is on the right
mpanetta 0:1ce8bf1f4452 164 */
mpanetta 0:1ce8bf1f4452 165 float line_position (void);
mpanetta 0:1ce8bf1f4452 166
mpanetta 0:1ce8bf1f4452 167
mpanetta 0:1ce8bf1f4452 168 /** Calibrate the sensors. This turns the robot left then right, looking for a line
mpanetta 0:1ce8bf1f4452 169 *
mpanetta 0:1ce8bf1f4452 170 */
mpanetta 0:1ce8bf1f4452 171 char sensor_auto_calibrate (void);
mpanetta 0:1ce8bf1f4452 172
mpanetta 0:1ce8bf1f4452 173 /** Set calibration manually to the current settings.
mpanetta 0:1ce8bf1f4452 174 *
mpanetta 0:1ce8bf1f4452 175 */
mpanetta 0:1ce8bf1f4452 176 void calibrate(void);
mpanetta 0:1ce8bf1f4452 177
mpanetta 0:1ce8bf1f4452 178 /** Clear the current calibration settings
mpanetta 0:1ce8bf1f4452 179 *
mpanetta 0:1ce8bf1f4452 180 */
mpanetta 0:1ce8bf1f4452 181 void reset_calibration (void);
mpanetta 0:1ce8bf1f4452 182
mpanetta 0:1ce8bf1f4452 183 void PID_start(int max_speed, int a, int b, int c, int d);
mpanetta 0:1ce8bf1f4452 184
mpanetta 0:1ce8bf1f4452 185 void PID_stop();
mpanetta 0:1ce8bf1f4452 186
mpanetta 0:1ce8bf1f4452 187 /** Write to the 8 LEDs
mpanetta 0:1ce8bf1f4452 188 *
mpanetta 0:1ce8bf1f4452 189 * @param leds An 8 bit value to put on the LEDs
mpanetta 0:1ce8bf1f4452 190 */
mpanetta 0:1ce8bf1f4452 191 void leds(int val);
mpanetta 0:1ce8bf1f4452 192
mpanetta 0:1ce8bf1f4452 193 /** Locate the cursor on the 8x2 LCD
mpanetta 0:1ce8bf1f4452 194 *
mpanetta 0:1ce8bf1f4452 195 * @param x The horizontal position, from 0 to 7
mpanetta 0:1ce8bf1f4452 196 * @param y The vertical position, from 0 to 1
mpanetta 0:1ce8bf1f4452 197 */
mpanetta 0:1ce8bf1f4452 198 void locate(int x, int y);
mpanetta 0:1ce8bf1f4452 199
mpanetta 0:1ce8bf1f4452 200 /** Clear the LCD
mpanetta 0:1ce8bf1f4452 201 *
mpanetta 0:1ce8bf1f4452 202 */
mpanetta 0:1ce8bf1f4452 203 void cls(void);
mpanetta 0:1ce8bf1f4452 204
mpanetta 0:1ce8bf1f4452 205 /** Send a character directly to the 3pi serial interface
mpanetta 0:1ce8bf1f4452 206 * @param c The character to send to the 3pi
mpanetta 0:1ce8bf1f4452 207 */
mpanetta 0:1ce8bf1f4452 208 int putc(int c);
mpanetta 0:1ce8bf1f4452 209
mpanetta 0:1ce8bf1f4452 210 /** Receive a character directly to the 3pi serial interface
mpanetta 0:1ce8bf1f4452 211 * @returns c The character received from the 3pi
mpanetta 0:1ce8bf1f4452 212 */
mpanetta 0:1ce8bf1f4452 213 int getc();
mpanetta 0:1ce8bf1f4452 214
mpanetta 0:1ce8bf1f4452 215 /** Send a string buffer to the 3pi serial interface
mpanetta 0:1ce8bf1f4452 216 * @param text A pointer to a char array
mpanetta 0:1ce8bf1f4452 217 * @param int The character to send to the 3pi
mpanetta 0:1ce8bf1f4452 218 */
mpanetta 0:1ce8bf1f4452 219 int print(char* text, int length);
mpanetta 0:1ce8bf1f4452 220
mpanetta 0:1ce8bf1f4452 221 struct LineSensors {
mpanetta 0:1ce8bf1f4452 222 uint16_t sensor1;
mpanetta 0:1ce8bf1f4452 223 uint16_t sensor2;
mpanetta 0:1ce8bf1f4452 224 uint16_t sensor3;
mpanetta 0:1ce8bf1f4452 225 uint16_t sensor4;
mpanetta 0:1ce8bf1f4452 226 uint16_t sensor5;
mpanetta 0:1ce8bf1f4452 227 };
mpanetta 0:1ce8bf1f4452 228
mpanetta 0:1ce8bf1f4452 229 const LineSensors get_raw_sensors(void);
mpanetta 0:1ce8bf1f4452 230
mpanetta 0:1ce8bf1f4452 231
mpanetta 0:1ce8bf1f4452 232 #ifdef MBED_RPC
mpanetta 0:1ce8bf1f4452 233 virtual const struct rpc_method *get_rpc_methods();
mpanetta 0:1ce8bf1f4452 234 #endif
mpanetta 0:1ce8bf1f4452 235
mpanetta 0:1ce8bf1f4452 236 private :
mpanetta 0:1ce8bf1f4452 237
mpanetta 0:1ce8bf1f4452 238 DigitalOut _nrst;
mpanetta 0:1ce8bf1f4452 239 Serial _ser;
mpanetta 0:1ce8bf1f4452 240
mpanetta 0:1ce8bf1f4452 241 void motor (int motor, float speed);
mpanetta 0:1ce8bf1f4452 242 virtual int _putc(int c);
mpanetta 0:1ce8bf1f4452 243 virtual int _getc();
mpanetta 0:1ce8bf1f4452 244
mpanetta 0:1ce8bf1f4452 245 };
mpanetta 0:1ce8bf1f4452 246
mpanetta 0:1ce8bf1f4452 247 #endif