Adds ability to play a tune and to directly read sensor values

Dependents:   m3pi_MazeSolver m3pi_MazeSolverLVC mbeddedNets hiworld

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers m3pimaze.h Source File

m3pimaze.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 
00056 
00057 
00058 
00059 /** m3pi control class
00060  *
00061  * Example:
00062  * @code
00063  * // Drive the m3pi forward, turn left, back, turn right, at half speed for half a second
00064 
00065    #include "mbed.h"
00066    #include "m3pimusic.h"
00067 
00068    m3pi pi(p8,p9,p10);
00069 
00070    int main() {
00071 
00072      wait(0.5);
00073 
00074      pi.forward(0.5);
00075      wait (0.5);
00076      pi.left(0.5);
00077      wait (0.5);
00078      pi.backward(0.5);
00079      wait (0.5);
00080      pi.right(0.5);
00081      wait (0.5);
00082 
00083      pi.stop();
00084 
00085  }
00086  * @endcode
00087  */
00088 class m3pi :  public Stream {
00089 
00090     // Public functions
00091 public:
00092 
00093     /** Create the m3pi object connected to the default pins
00094      *
00095      * @param nrst GPIO pin used for reset. Default is p8
00096      * @param tx Serial transmit pin. Default is p9
00097      * @param rx Serial receive pin. Default is p10
00098      */
00099     m3pi(PinName nrst, PinName tx, PinName rx);
00100 
00101 
00102     /** Force a hardware reset of the 3pi
00103      */
00104     void reset (void);
00105 
00106     /** Directly control the speed and direction of the left motor
00107      *
00108      * @param speed A normalised number -1.0 - 1.0 represents the full range.
00109      */
00110     void left_motor (float speed);
00111 
00112     /** Directly control the speed and direction of the right motor
00113      *
00114      * @param speed A normalised number -1.0 - 1.0 represents the full range.
00115      */
00116     void right_motor (float speed);
00117 
00118     /** Drive both motors forward as the same speed
00119      *
00120      * @param speed A normalised number 0 - 1.0 represents the full range.
00121      */
00122     void forward (float speed);
00123 
00124     /** Drive both motors backward as the same speed
00125      *
00126      * @param speed A normalised number 0 - 1.0 represents the full range.
00127      */
00128     void backward (float speed);
00129 
00130     /** Drive left motor backwards and right motor forwards at the same speed to turn on the spot
00131      *
00132      * @param speed A normalised number 0 - 1.0 represents the full range.
00133      */
00134     void left (float speed);
00135 
00136     /** Drive left motor forward and right motor backwards at the same speed to turn on the spot
00137      *
00138      * @param speed A normalised number 0 - 1.0 represents the full range.
00139      */
00140     void right (float speed);
00141 
00142     /** Stop both motors
00143      *
00144      */
00145     void stop (void);
00146 
00147     /** Read the voltage of the potentiometer on the 3pi
00148      * @returns voltage as a float
00149      *
00150      */
00151     float pot_voltage(void);
00152 
00153     /** Read the battery voltage on the 3pi
00154      * @returns battery voltage as a float
00155      *
00156      */
00157     float battery(void);
00158 
00159     /** Read the position of the detected line
00160      * @returns position as A normalised number -1.0 - 1.0 represents the full range.
00161      *
00162      */
00163     float line_position (void);
00164 
00165 
00166     /** Calibrate the sensors. This turns the robot left then right, loking for a line
00167      *
00168      */
00169     char sensor_auto_calibrate (void);
00170 
00171     /** Set calibration manually to the current settings.
00172      *
00173      */
00174     void calibrate(void);
00175 
00176     /** Clear the current calibration settings
00177      *
00178      */
00179     void reset_calibration (void);
00180 
00181     void PID_start(int max_speed, int a, int b, int c, int d);
00182 
00183     void PID_stop();
00184 
00185     /** Write to the 8 LEDs
00186      *
00187      * @param leds An 8 bit value to put on the LEDs
00188      */
00189     void leds(int val);
00190 
00191 
00192 
00193     /** Locate the cursor on the 8x2 LCD
00194      *
00195      * @param x The horizontal position, from 0 to 7
00196      * @param y The vertical position, from 0 to 1
00197      */
00198     void locate(int x, int y);
00199 
00200     /** Clear the LCD
00201      *
00202      */
00203     void cls(void);
00204 
00205     /** Send a character directly to the 3pi serial interface
00206      * @param c The character to send to the 3pi
00207      */
00208     int putc(int c);
00209 
00210     /** Receive a character directly to the 3pi serial interface
00211      * @returns c The character received from the 3pi
00212      */
00213     int getc();
00214 
00215     /** Send a string buffer to the 3pi serial interface
00216      * @param text A pointer to a char array
00217      * @param int The character to send to the 3pi
00218      */
00219     int print(char* text, int length);
00220     
00221     /** Play a tune
00222     */
00223     int playtune(char* text, int length);
00224     
00225     /**
00226     * Read the calibrated value of a sensor
00227     * @param sensor Pointer to array sensor [0-4]
00228     * @param values returned in the range 0-1000 where 1000=completely dark
00229     */
00230     void readsensor(int *sensor);
00231 
00232 #ifdef MBED_RPC
00233     virtual const struct rpc_method *get_rpc_methods();
00234 #endif
00235 
00236 private :
00237 
00238     DigitalOut _nrst;
00239     Serial _ser;
00240     BusOut _leds;
00241     
00242     void motor (int motor, float speed);
00243     virtual int _putc(int c);
00244     virtual int _getc();
00245 
00246 };
00247 
00248 #endif