function correction on motor control adding get individual sensor function

Dependents:   m3PI_TP_POPS_II2015v0 m3PI_TP_POPS_II2015v0 m3PI_TP1_SETI2018 ourproject ... more

Fork of m3pi by Chris Styles

Committer:
bouaziz
Date:
Mon Nov 23 23:22:28 2015 +0000
Revision:
9:f65c5aa1775c
Parent:
8:4b7d6ea9b35b
update ; motor inversion control + get individual sensor function; POPS PAris Sud

Who changed what in which revision?

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