James Heavey / 3875_Individualproject

Dependents:   3875_DISSERTATION

Committer:
jamesheavey
Date:
Tue Feb 04 14:55:06 2020 +0000
Revision:
10:0dec82280040
Parent:
9:074ce6197b51
Basic line following, left and back turns

Who changed what in which revision?

UserRevisionLine numberNew 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[]);
jamesheavey 10:0dec82280040 187
jamesheavey 10:0dec82280040 188 unsigned int * get_sensors();
eencae 0:56320ef879a6 189
eencae 0:56320ef879a6 190 private:
eencae 0:56320ef879a6 191
eencae 0:56320ef879a6 192 Serial* _serial;
eencae 0:56320ef879a6 193 DigitalOut* _reset;
eencae 2:26bf14f4dc84 194
eencae 2:26bf14f4dc84 195 float _last_line_position;
eencae 4:0abe81f5d9fd 196
eencae 4:0abe81f5d9fd 197 char _bar_graph[7];
eencae 9:074ce6197b51 198 unsigned int _values[5];
eencae 0:56320ef879a6 199
eencae 0:56320ef879a6 200 void reset();
eencae 0:56320ef879a6 201
eencae 0:56320ef879a6 202 };
eencae 0:56320ef879a6 203
eencae 0:56320ef879a6 204
eencae 0:56320ef879a6 205
eencae 0:56320ef879a6 206 #endif