A compilation of code from different sources to provide support for a Playstation 3 controller via bluetooth on the m3pi.

Dependencies:   TextLCD mbed

Fork of mbed_TANK_PS3 by Yasuhiko YAMAMOTO

Committer:
srsmitherman
Date:
Sun Dec 30 05:16:28 2012 +0000
Revision:
1:ae49669c5e92
Bluetooth PS3 interface for m3pi. User must pair bluetooth dongle address to PS3 controller with other program. Works but needs tweaking.

Who changed what in which revision?

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