Modified library for the m3pi robot with individual calibrated sensor measurement functionality. This works with a Pololu 3pi robot with the Serial Slave firmware.

Fork of m3pi by Chris Styles

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers m3pi.h Source File

m3pi.h

00001 /* mbed m3pi Library
00002  * Copyright (c) 2007-2010 cstyles
00003  *
00004  * Permission is hereby granted, free of charge, to any person obtaining a copy
00005  * of this software and associated documentation files (the "Software"), to deal
00006  * in the Software without restriction, including without limitation the rights
00007  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00008  * copies of the Software, and to permit persons to whom the Software is
00009  * furnished to do so, subject to the following conditions:
00010  *
00011  * The above copyright notice and this permission notice shall be included in
00012  * all copies or substantial portions of the Software.
00013  *
00014  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00015  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00016  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00017  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00018  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00019  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00020  * THE SOFTWARE.
00021  */
00022 
00023 #ifndef M3PI_H
00024 #define M3PI_H
00025 
00026 #include "mbed.h"
00027 #include "platform.h"
00028 
00029 #ifdef MBED_RPC
00030 #include "rpc.h"
00031 #endif
00032 
00033 #define SEND_SIGNATURE 0x81
00034 #define SEND_RAW_SENSOR_VALUES 0x86
00035 #define SEND_CALIBRATED_SENSOR_VALUES 0x87
00036 #define SEND_TRIMPOT 0xB0
00037 #define SEND_BATTERY_MILLIVOLTS 0xB1
00038 #define DO_PLAY 0xB3
00039 #define PI_CALIBRATE 0xB4
00040 #define DO_CLEAR 0xB7
00041 #define DO_PRINT 0xB8
00042 #define DO_LCD_GOTO_XY 0xB9
00043 #define LINE_SENSORS_RESET_CALIBRATION 0xB5
00044 #define SEND_LINE_POSITION 0xB6
00045 #define AUTO_CALIBRATE 0xBA
00046 #define SET_PID 0xBB
00047 #define STOP_PID 0xBC
00048 #define M1_FORWARD 0xC1
00049 #define M1_BACKWARD 0xC2
00050 #define M2_FORWARD 0xC5
00051 #define M2_BACKWARD 0xC6
00052 
00053 
00054 
00055 /** m3pi control class
00056  *
00057  * Example:
00058  * @code
00059  * // Drive the m3pi forward, turn left, back, turn right, at half speed for half a second
00060 
00061    #include "mbed.h"
00062    #include "m3pi.h"
00063 
00064    m3pi pi;
00065 
00066    int main() {
00067 
00068      wait(0.5);
00069 
00070      pi.forward(0.5);
00071      wait (0.5);
00072      pi.left(0.5);
00073      wait (0.5);
00074      pi.backward(0.5);
00075      wait (0.5);
00076      pi.right(0.5);
00077      wait (0.5);
00078 
00079      pi.stop();
00080 
00081  }
00082  * @endcode
00083  */
00084 class m3pi :  public Stream {
00085 
00086     // Public functions
00087 public:
00088 
00089     /** Create the m3pi object connected to the default pins
00090      *
00091      * @param nrst GPIO pin used for reset. Default is p23
00092      * @param tx Serial transmit pin. Default is p9
00093      * @param rx Serial receive pin. Default is p10
00094      */
00095     m3pi();
00096 
00097 
00098     /** Create the m3pi object connected to specific pins
00099      *
00100      */
00101     m3pi(PinName nrst, PinName tx, PinName rx);
00102 
00103 
00104 
00105     /** Force a hardware reset of the 3pi
00106      */
00107     void reset (void);
00108 
00109     /** Directly control the speed and direction of the left motor
00110      *
00111      * @param speed A normalised number -1.0 - 1.0 represents the full range.
00112      */
00113     void left_motor (float speed);
00114 
00115     /** Directly control the speed and direction of the right motor
00116      *
00117      * @param speed A normalised number -1.0 - 1.0 represents the full range.
00118      */
00119     void right_motor (float speed);
00120 
00121     /** Drive both motors forward as the same speed
00122      *
00123      * @param speed A normalised number 0 - 1.0 represents the full range.
00124      */
00125     void forward (float speed);
00126 
00127     /** Drive both motors backward as the same speed
00128      *
00129      * @param speed A normalised number 0 - 1.0 represents the full range.
00130      */
00131     void backward (float speed);
00132 
00133     /** Drive left motor backwards and right motor forwards at the same speed to turn on the spot
00134      *
00135      * @param speed A normalised number 0 - 1.0 represents the full range.
00136      */
00137     void left (float speed);
00138 
00139     /** Drive left motor forward and right motor backwards at the same speed to turn on the spot
00140      * @param speed A normalised number 0 - 1.0 represents the full range.
00141      */
00142     void right (float speed);
00143 
00144     /** Stop both motors
00145      *
00146      */
00147     void stop (void);
00148 
00149     /** Read the voltage of the potentiometer on the 3pi
00150      * @returns voltage as a float
00151      *
00152      */
00153     float pot_voltage(void);
00154 
00155     /** Read the battery voltage on the 3pi
00156      * @returns battery voltage as a float
00157      */
00158     float battery(void);
00159     
00160     int * calibrated_sensors(void);
00161 
00162     /** Read the position of the detected line
00163      * @returns position as A normalised number -1.0 - 1.0 represents the full range.
00164      *  -1.0 means line is on the left, or the line has been lost
00165      *   0.0 means the line is in the middle
00166      *   1.0 means the line is on the right
00167      */
00168     float line_position (void);
00169 
00170 
00171     /** Calibrate the sensors. This turns the robot left then right, looking for a line
00172      *
00173      */
00174     char sensor_auto_calibrate (void);
00175 
00176     /** Set calibration manually to the current settings.
00177      *
00178      */
00179     void calibrate(void);
00180 
00181     /** Clear the current calibration settings
00182      *
00183      */
00184     void reset_calibration (void);
00185 
00186     void PID_start(int max_speed, int a, int b, int c, int d);
00187 
00188     void PID_stop();
00189 
00190     /** Write to the 8 LEDs
00191      *
00192      * @param leds An 8 bit value to put on the LEDs
00193      */
00194     void leds(int val);
00195 
00196     /** Locate the cursor on the 8x2 LCD
00197      *
00198      * @param x The horizontal position, from 0 to 7
00199      * @param y The vertical position, from 0 to 1
00200      */
00201     void locate(int x, int y);
00202 
00203     /** Clear the LCD
00204      *
00205      */
00206     void cls(void);
00207 
00208     /** Send a character directly to the 3pi serial interface
00209      * @param c The character to send to the 3pi
00210      */
00211     int putc(int c);
00212 
00213     /** Receive a character directly to the 3pi serial interface
00214      * @returns c The character received from the 3pi
00215      */
00216     int getc();
00217 
00218     /** Send a string buffer to the 3pi serial interface
00219      * @param text A pointer to a char array
00220      * @param int The character to send to the 3pi
00221      */
00222     int print(char* text, int length);
00223 
00224 #ifdef MBED_RPC
00225     virtual const struct rpc_method *get_rpc_methods();
00226 #endif
00227 
00228 private :
00229 
00230     DigitalOut _nrst;
00231     Serial _ser;
00232     
00233     void motor (int motor, float speed);
00234     virtual int _putc(int c);
00235     virtual int _getc();
00236 
00237 };
00238 
00239 #endif