Library for Pololu m3pi line-following robot. Implements the serial slave commands.
Dependents: 3pi_Example_2 3pi_Lab1_Task2_Example1 3pi_Lab2_Task1_Example1 3pi_Line_Follow ... more
m3pi.h@9:074ce6197b51, 2018-03-19 (annotated)
- Committer:
- eencae
- Date:
- Mon Mar 19 13:06:40 2018 +0000
- Revision:
- 9:074ce6197b51
- Parent:
- 4:0abe81f5d9fd
Added some simple functions to the library that do not require arrays to be passed by reference. Sensor values are stored in the class instead.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
eencae | 0:56320ef879a6 | 1 | #ifndef M3PI_H |
eencae | 0:56320ef879a6 | 2 | #define M3PI_H |
eencae | 0:56320ef879a6 | 3 | |
eencae | 0:56320ef879a6 | 4 | #include "mbed.h" |
eencae | 0:56320ef879a6 | 5 | |
eencae | 0:56320ef879a6 | 6 | /** m3pi Class |
eencae | 0:56320ef879a6 | 7 | @brief Library to control m3pi robot from Polulu running the serial slave code |
eencae | 0:56320ef879a6 | 8 | @brief Revision 1.0 |
eencae | 1:5523d6d1feec | 9 | @author Craig A. Evans <C.A.Evans@leeds.ac.uk> |
eencae | 0:56320ef879a6 | 10 | @date April 2017 |
eencae | 0:56320ef879a6 | 11 | |
eencae | 0:56320ef879a6 | 12 | */ |
eencae | 0:56320ef879a6 | 13 | class m3pi |
eencae | 0:56320ef879a6 | 14 | { |
eencae | 0:56320ef879a6 | 15 | |
eencae | 0:56320ef879a6 | 16 | public: |
eencae | 0:56320ef879a6 | 17 | |
eencae | 0:56320ef879a6 | 18 | /** m3pi constructor |
eencae | 0:56320ef879a6 | 19 | */ |
eencae | 0:56320ef879a6 | 20 | m3pi(); |
eencae | 0:56320ef879a6 | 21 | /** m3pi destructor |
eencae | 0:56320ef879a6 | 22 | */ |
eencae | 0:56320ef879a6 | 23 | ~m3pi(); |
eencae | 0:56320ef879a6 | 24 | |
eencae | 0:56320ef879a6 | 25 | |
eencae | 0:56320ef879a6 | 26 | /** Initialisation function |
eencae | 1:5523d6d1feec | 27 | * @details Should be called at the start of the program to interrupt demo |
eencae | 1:5523d6d1feec | 28 | * @details code and start 3pi in serial slave mode |
eencae | 0:56320ef879a6 | 29 | */ |
eencae | 0:56320ef879a6 | 30 | void init(); |
eencae | 9:074ce6197b51 | 31 | |
eencae | 9:074ce6197b51 | 32 | /** Causes the robot to read the IR sensors |
eencae | 9:074ce6197b51 | 33 | * @details is an alterative to get_*_values methods if you don't need the values themselves |
eencae | 9:074ce6197b51 | 34 | */ |
eencae | 9:074ce6197b51 | 35 | void scan(); |
eencae | 0:56320ef879a6 | 36 | |
eencae | 0:56320ef879a6 | 37 | /** Get signature of slave firmware |
eencae | 0:56320ef879a6 | 38 | * @param signature - array of size 7 to store signature |
eencae | 0:56320ef879a6 | 39 | */ |
eencae | 0:56320ef879a6 | 40 | void get_signature(char *signature); |
eencae | 1:5523d6d1feec | 41 | |
eencae | 0:56320ef879a6 | 42 | /** Read raw sensor values from IR sensors (0 - 2000) |
eencae | 0:56320ef879a6 | 43 | * @param values - array of size 5 to store values |
eencae | 0:56320ef879a6 | 44 | */ |
eencae | 1:5523d6d1feec | 45 | void get_raw_values(unsigned int *values); |
eencae | 0:56320ef879a6 | 46 | |
eencae | 0:56320ef879a6 | 47 | /** Read calibrated sensor values from IR sensors (0 - 1000) |
eencae | 0:56320ef879a6 | 48 | * @param values - array of size 5 to store values |
eencae | 0:56320ef879a6 | 49 | */ |
eencae | 0:56320ef879a6 | 50 | void get_calibrated_values(unsigned int *values); |
eencae | 1:5523d6d1feec | 51 | |
eencae | 1:5523d6d1feec | 52 | /** Read user potentiometer values (0.0 - 1.0) |
eencae | 0:56320ef879a6 | 53 | * @returns float in range 0.0 to 1.0 |
eencae | 0:56320ef879a6 | 54 | */ |
eencae | 0:56320ef879a6 | 55 | float get_trimpot_value(); |
eencae | 0:56320ef879a6 | 56 | |
eencae | 0:56320ef879a6 | 57 | /** Read battery voltage |
eencae | 0:56320ef879a6 | 58 | * @returns battery voltage in volts |
eencae | 0:56320ef879a6 | 59 | */ |
eencae | 0:56320ef879a6 | 60 | float get_battery_voltage(); |
eencae | 1:5523d6d1feec | 61 | |
eencae | 0:56320ef879a6 | 62 | /** Play music |
eencae | 0:56320ef879a6 | 63 | * @param notes - const array containing Pololu notes |
eencae | 1:5523d6d1feec | 64 | * @param length - number of notes in array |
eencae | 0:56320ef879a6 | 65 | */ |
eencae | 0:56320ef879a6 | 66 | void play_music(const char notes[],int length); |
eencae | 1:5523d6d1feec | 67 | |
eencae | 1:5523d6d1feec | 68 | /** Calibrate |
eencae | 1:5523d6d1feec | 69 | * @details manual calibration of sensors. Should be called repeatedly. |
eencae | 1:5523d6d1feec | 70 | */ |
eencae | 0:56320ef879a6 | 71 | void calibrate(); |
eencae | 0:56320ef879a6 | 72 | |
eencae | 1:5523d6d1feec | 73 | /** Reset previous calibration values |
eencae | 1:5523d6d1feec | 74 | */ |
eencae | 0:56320ef879a6 | 75 | void reset_calibration(); |
eencae | 0:56320ef879a6 | 76 | |
eencae | 1:5523d6d1feec | 77 | /** Returns estimate of normalised line position |
eencae | 1:5523d6d1feec | 78 | * @returns float in the range -1.0 to 1.0 |
eencae | 1:5523d6d1feec | 79 | * @details -1.0 for line under sensor 0, -0.5 for line under sensor 1 |
eencae | 1:5523d6d1feec | 80 | * @details 0.0 for line under sensor 2, 0.5 for line under sensor 3 etc. |
eencae | 1:5523d6d1feec | 81 | */ |
eencae | 2:26bf14f4dc84 | 82 | float get_line_position(); |
eencae | 9:074ce6197b51 | 83 | |
eencae | 9:074ce6197b51 | 84 | /** Returns an estimate of the normalised line position |
eencae | 9:074ce6197b51 | 85 | * @returns float in the range -1.0 to 1.0 |
eencae | 9:074ce6197b51 | 86 | * @details uses the values of sensor stored in the class - must call scan() first! |
eencae | 9:074ce6197b51 | 87 | * @details -1.0 for line under sensor 0, -0.5 for line under sensor 1 |
eencae | 9:074ce6197b51 | 88 | * @details 0.0 for line under sensor 2, 0.5 for line under sensor 3 etc. |
eencae | 9:074ce6197b51 | 89 | */ |
eencae | 9:074ce6197b51 | 90 | float read_line(); |
eencae | 0:56320ef879a6 | 91 | |
eencae | 1:5523d6d1feec | 92 | /** Clear LCD |
eencae | 1:5523d6d1feec | 93 | */ |
eencae | 0:56320ef879a6 | 94 | void lcd_clear(); |
eencae | 1:5523d6d1feec | 95 | |
eencae | 1:5523d6d1feec | 96 | /** Print text on LCD |
eencae | 1:5523d6d1feec | 97 | * @param text[] - string of max size 8 |
eencae | 1:5523d6d1feec | 98 | * @param - length of string |
eencae | 1:5523d6d1feec | 99 | */ |
eencae | 0:56320ef879a6 | 100 | void lcd_print(char text[],int length); |
eencae | 1:5523d6d1feec | 101 | |
eencae | 1:5523d6d1feec | 102 | /** Move cursor on LCD |
eencae | 1:5523d6d1feec | 103 | * @param x - x position |
eencae | 1:5523d6d1feec | 104 | * @param y - line number |
eencae | 1:5523d6d1feec | 105 | */ |
eencae | 0:56320ef879a6 | 106 | void lcd_goto_xy(int x, int y); |
eencae | 1:5523d6d1feec | 107 | |
eencae | 1:5523d6d1feec | 108 | /** Call automatic calibration function |
eencae | 1:5523d6d1feec | 109 | */ |
eencae | 0:56320ef879a6 | 110 | void auto_calibrate(); |
eencae | 1:5523d6d1feec | 111 | |
eencae | 1:5523d6d1feec | 112 | /** Move left motor |
eencae | 1:5523d6d1feec | 113 | * @param speed - value in range -1.0 (full-speed backward) to 1.0 (full-speed forward) |
eencae | 1:5523d6d1feec | 114 | */ |
eencae | 0:56320ef879a6 | 115 | void left_motor(float speed); |
eencae | 1:5523d6d1feec | 116 | |
eencae | 1:5523d6d1feec | 117 | /** Move right motor |
eencae | 1:5523d6d1feec | 118 | * @param speed - value in range -1.0 (full-speed backward) to 1.0 (full-speed forward) |
eencae | 1:5523d6d1feec | 119 | */ |
eencae | 0:56320ef879a6 | 120 | void right_motor(float speed); |
eencae | 1:5523d6d1feec | 121 | |
eencae | 1:5523d6d1feec | 122 | /** Move both motors |
eencae | 1:5523d6d1feec | 123 | * @param left speed - value in range -1.0 (full-speed backward) to 1.0 (full-speed forward) |
eencae | 1:5523d6d1feec | 124 | * @param right speed - value in range -1.0 (full-speed backward) to 1.0 (full-speed forward) |
eencae | 1:5523d6d1feec | 125 | */ |
eencae | 0:56320ef879a6 | 126 | void motors(float left_speed,float right_speed); |
eencae | 1:5523d6d1feec | 127 | |
eencae | 1:5523d6d1feec | 128 | /** Stop both motors |
eencae | 1:5523d6d1feec | 129 | */ |
eencae | 0:56320ef879a6 | 130 | void stop(); |
eencae | 1:5523d6d1feec | 131 | |
eencae | 1:5523d6d1feec | 132 | /** Move buggy forward |
eencae | 1:5523d6d1feec | 133 | * @param speed - value in range 0.0 to 1.0 (full-speed forward) |
eencae | 1:5523d6d1feec | 134 | */ |
eencae | 0:56320ef879a6 | 135 | void forward(float speed); |
eencae | 1:5523d6d1feec | 136 | |
eencae | 1:5523d6d1feec | 137 | /** Reverse buggy |
eencae | 1:5523d6d1feec | 138 | * @param speed - value in range 0.0 to 1.0 (full-speed forward) |
eencae | 1:5523d6d1feec | 139 | */ |
eencae | 0:56320ef879a6 | 140 | void reverse(float speed); |
eencae | 1:5523d6d1feec | 141 | |
eencae | 1:5523d6d1feec | 142 | /** Spin right |
eencae | 1:5523d6d1feec | 143 | * @param speed - value in range 0.0 to 1.0 |
eencae | 1:5523d6d1feec | 144 | */ |
eencae | 0:56320ef879a6 | 145 | void spin_right(float speed); |
eencae | 1:5523d6d1feec | 146 | |
eencae | 1:5523d6d1feec | 147 | /** Spin left |
eencae | 1:5523d6d1feec | 148 | * @param speed - value in range 0.0 to 1.0 |
eencae | 1:5523d6d1feec | 149 | */ |
eencae | 0:56320ef879a6 | 150 | void spin_left(float speed); |
eencae | 1:5523d6d1feec | 151 | |
eencae | 1:5523d6d1feec | 152 | /** Display battery voltage on LCD |
eencae | 1:5523d6d1feec | 153 | * @param x - x position on LCD to display |
eencae | 1:5523d6d1feec | 154 | * @param y - line on LCD to display |
eencae | 1:5523d6d1feec | 155 | */ |
eencae | 0:56320ef879a6 | 156 | void display_battery_voltage(int x,int y); |
eencae | 1:5523d6d1feec | 157 | |
eencae | 1:5523d6d1feec | 158 | /** Display slave firmware signature on LCD |
eencae | 1:5523d6d1feec | 159 | * @param x - x position on LCD to display |
eencae | 1:5523d6d1feec | 160 | * @param y - line on LCD to display |
eencae | 1:5523d6d1feec | 161 | */ |
eencae | 0:56320ef879a6 | 162 | void display_signature(int x,int y); |
eencae | 2:26bf14f4dc84 | 163 | |
eencae | 9:074ce6197b51 | 164 | /** Display line position and bar graph of sensor readings on LCD |
eencae | 9:074ce6197b51 | 165 | * @details must call scan() and read_line() first |
eencae | 9:074ce6197b51 | 166 | */ |
eencae | 9:074ce6197b51 | 167 | void display_data(); |
eencae | 9:074ce6197b51 | 168 | |
eencae | 2:26bf14f4dc84 | 169 | /** Display sensor values on LCD |
eencae | 2:26bf14f4dc84 | 170 | * @param values - array of calibrated sensor values |
eencae | 2:26bf14f4dc84 | 171 | * @param y - line on LCD to display |
eencae | 2:26bf14f4dc84 | 172 | */ |
eencae | 2:26bf14f4dc84 | 173 | void display_sensor_values(unsigned int values[],int y); |
eencae | 2:26bf14f4dc84 | 174 | |
eencae | 2:26bf14f4dc84 | 175 | /** Gets value of sensor array expressed as decimal number |
eencae | 2:26bf14f4dc84 | 176 | * @details Each sensor is a bit (PC4 is bit 0, PC0 is bit 5) |
eencae | 2:26bf14f4dc84 | 177 | * @returns value - 5-bit value of sensor reading |
eencae | 2:26bf14f4dc84 | 178 | */ |
eencae | 2:26bf14f4dc84 | 179 | unsigned int get_sensor_array_value(unsigned int values[]); |
eencae | 2:26bf14f4dc84 | 180 | |
eencae | 2:26bf14f4dc84 | 181 | /** Calculates an estimate of normalised line position from the sensor readings |
eencae | 2:26bf14f4dc84 | 182 | * @returns float in the range -1.0 to 1.0 |
eencae | 2:26bf14f4dc84 | 183 | * @details -1.0 for line under sensor 0, -0.5 for line under sensor 1 |
eencae | 2:26bf14f4dc84 | 184 | * @details 0.0 for line under sensor 2, 0.5 for line under sensor 3 etc. |
eencae | 2:26bf14f4dc84 | 185 | */ |
eencae | 2:26bf14f4dc84 | 186 | float calc_line_position(unsigned int values[]); |
eencae | 0:56320ef879a6 | 187 | |
eencae | 0:56320ef879a6 | 188 | private: |
eencae | 0:56320ef879a6 | 189 | |
eencae | 0:56320ef879a6 | 190 | Serial* _serial; |
eencae | 0:56320ef879a6 | 191 | DigitalOut* _reset; |
eencae | 2:26bf14f4dc84 | 192 | |
eencae | 2:26bf14f4dc84 | 193 | float _last_line_position; |
eencae | 4:0abe81f5d9fd | 194 | |
eencae | 4:0abe81f5d9fd | 195 | char _bar_graph[7]; |
eencae | 9:074ce6197b51 | 196 | unsigned int _values[5]; |
eencae | 0:56320ef879a6 | 197 | |
eencae | 0:56320ef879a6 | 198 | void reset(); |
eencae | 0:56320ef879a6 | 199 | |
eencae | 0:56320ef879a6 | 200 | }; |
eencae | 0:56320ef879a6 | 201 | |
eencae | 0:56320ef879a6 | 202 | |
eencae | 0:56320ef879a6 | 203 | |
eencae | 0:56320ef879a6 | 204 | #endif |