A program that connects a distance sensor to the m3pi and avoids obstacles.

Dependencies:   mbed m3pi

Committer:
kanpapa
Date:
Wed Nov 23 14:15:24 2011 +0000
Revision:
0:1c32a3ae67e1
alpha version

Who changed what in which revision?

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