James Heavey / 3875_Individualproject

Dependents:   3875_DISSERTATION

Committer:
eencae
Date:
Fri Apr 07 18:22:35 2017 +0000
Revision:
2:26bf14f4dc84
Parent:
1:5523d6d1feec
Child:
3:5015bc2d1cf8
Added local line calculating method.;

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 /** Write value to LEDs
eencae 0:56320ef879a6 26 * @param val - value to display in binary on LEDs (0 to 255)
eencae 0:56320ef879a6 27 */
eencae 0:56320ef879a6 28 void write_leds(int val);
eencae 0:56320ef879a6 29
eencae 0:56320ef879a6 30 /** Initialisation function
eencae 1:5523d6d1feec 31 * @details Should be called at the start of the program to interrupt demo
eencae 1:5523d6d1feec 32 * @details code and start 3pi in serial slave mode
eencae 0:56320ef879a6 33 */
eencae 0:56320ef879a6 34 void init();
eencae 0:56320ef879a6 35
eencae 0:56320ef879a6 36 /** Get signature of slave firmware
eencae 0:56320ef879a6 37 * @param signature - array of size 7 to store signature
eencae 0:56320ef879a6 38 */
eencae 0:56320ef879a6 39 void get_signature(char *signature);
eencae 1:5523d6d1feec 40
eencae 0:56320ef879a6 41 /** Read raw sensor values from IR sensors (0 - 2000)
eencae 0:56320ef879a6 42 * @param values - array of size 5 to store values
eencae 0:56320ef879a6 43 */
eencae 1:5523d6d1feec 44 void get_raw_values(unsigned int *values);
eencae 0:56320ef879a6 45
eencae 0:56320ef879a6 46 /** Read calibrated sensor values from IR sensors (0 - 1000)
eencae 0:56320ef879a6 47 * @param values - array of size 5 to store values
eencae 0:56320ef879a6 48 */
eencae 0:56320ef879a6 49 void get_calibrated_values(unsigned int *values);
eencae 1:5523d6d1feec 50
eencae 1:5523d6d1feec 51 /** Read user potentiometer values (0.0 - 1.0)
eencae 0:56320ef879a6 52 * @returns float in range 0.0 to 1.0
eencae 0:56320ef879a6 53 */
eencae 0:56320ef879a6 54 float get_trimpot_value();
eencae 0:56320ef879a6 55
eencae 0:56320ef879a6 56 /** Read battery voltage
eencae 0:56320ef879a6 57 * @returns battery voltage in volts
eencae 0:56320ef879a6 58 */
eencae 0:56320ef879a6 59 float get_battery_voltage();
eencae 1:5523d6d1feec 60
eencae 0:56320ef879a6 61 /** Play music
eencae 0:56320ef879a6 62 * @param notes - const array containing Pololu notes
eencae 1:5523d6d1feec 63 * @param length - number of notes in array
eencae 0:56320ef879a6 64 */
eencae 0:56320ef879a6 65 void play_music(const char notes[],int length);
eencae 1:5523d6d1feec 66
eencae 1:5523d6d1feec 67 /** Calibrate
eencae 1:5523d6d1feec 68 * @details manual calibration of sensors. Should be called repeatedly.
eencae 1:5523d6d1feec 69 */
eencae 0:56320ef879a6 70 void calibrate();
eencae 0:56320ef879a6 71
eencae 1:5523d6d1feec 72 /** Reset previous calibration values
eencae 1:5523d6d1feec 73 */
eencae 0:56320ef879a6 74 void reset_calibration();
eencae 0:56320ef879a6 75
eencae 1:5523d6d1feec 76 /** Returns estimate of normalised line position
eencae 1:5523d6d1feec 77 * @returns float in the range -1.0 to 1.0
eencae 1:5523d6d1feec 78 * @details -1.0 for line under sensor 0, -0.5 for line under sensor 1
eencae 1:5523d6d1feec 79 * @details 0.0 for line under sensor 2, 0.5 for line under sensor 3 etc.
eencae 1:5523d6d1feec 80 */
eencae 2:26bf14f4dc84 81 float get_line_position();
eencae 0:56320ef879a6 82
eencae 1:5523d6d1feec 83 /** Clear LCD
eencae 1:5523d6d1feec 84 */
eencae 0:56320ef879a6 85 void lcd_clear();
eencae 1:5523d6d1feec 86
eencae 1:5523d6d1feec 87 /** Print text on LCD
eencae 1:5523d6d1feec 88 * @param text[] - string of max size 8
eencae 1:5523d6d1feec 89 * @param - length of string
eencae 1:5523d6d1feec 90 */
eencae 0:56320ef879a6 91 void lcd_print(char text[],int length);
eencae 1:5523d6d1feec 92
eencae 1:5523d6d1feec 93 /** Move cursor on LCD
eencae 1:5523d6d1feec 94 * @param x - x position
eencae 1:5523d6d1feec 95 * @param y - line number
eencae 1:5523d6d1feec 96 */
eencae 0:56320ef879a6 97 void lcd_goto_xy(int x, int y);
eencae 1:5523d6d1feec 98
eencae 1:5523d6d1feec 99 /** Call automatic calibration function
eencae 1:5523d6d1feec 100 */
eencae 0:56320ef879a6 101 void auto_calibrate();
eencae 1:5523d6d1feec 102
eencae 1:5523d6d1feec 103 /** Move left motor
eencae 1:5523d6d1feec 104 * @param speed - value in range -1.0 (full-speed backward) to 1.0 (full-speed forward)
eencae 1:5523d6d1feec 105 */
eencae 0:56320ef879a6 106 void left_motor(float speed);
eencae 1:5523d6d1feec 107
eencae 1:5523d6d1feec 108 /** Move right motor
eencae 1:5523d6d1feec 109 * @param speed - value in range -1.0 (full-speed backward) to 1.0 (full-speed forward)
eencae 1:5523d6d1feec 110 */
eencae 0:56320ef879a6 111 void right_motor(float speed);
eencae 1:5523d6d1feec 112
eencae 1:5523d6d1feec 113 /** Move both motors
eencae 1:5523d6d1feec 114 * @param left speed - value in range -1.0 (full-speed backward) to 1.0 (full-speed forward)
eencae 1:5523d6d1feec 115 * @param right speed - value in range -1.0 (full-speed backward) to 1.0 (full-speed forward)
eencae 1:5523d6d1feec 116 */
eencae 0:56320ef879a6 117 void motors(float left_speed,float right_speed);
eencae 1:5523d6d1feec 118
eencae 1:5523d6d1feec 119 /** Stop both motors
eencae 1:5523d6d1feec 120 */
eencae 0:56320ef879a6 121 void stop();
eencae 1:5523d6d1feec 122
eencae 1:5523d6d1feec 123 /** Move buggy forward
eencae 1:5523d6d1feec 124 * @param speed - value in range 0.0 to 1.0 (full-speed forward)
eencae 1:5523d6d1feec 125 */
eencae 0:56320ef879a6 126 void forward(float speed);
eencae 1:5523d6d1feec 127
eencae 1:5523d6d1feec 128 /** Reverse buggy
eencae 1:5523d6d1feec 129 * @param speed - value in range 0.0 to 1.0 (full-speed forward)
eencae 1:5523d6d1feec 130 */
eencae 0:56320ef879a6 131 void reverse(float speed);
eencae 1:5523d6d1feec 132
eencae 1:5523d6d1feec 133 /** Spin right
eencae 1:5523d6d1feec 134 * @param speed - value in range 0.0 to 1.0
eencae 1:5523d6d1feec 135 */
eencae 0:56320ef879a6 136 void spin_right(float speed);
eencae 1:5523d6d1feec 137
eencae 1:5523d6d1feec 138 /** Spin left
eencae 1:5523d6d1feec 139 * @param speed - value in range 0.0 to 1.0
eencae 1:5523d6d1feec 140 */
eencae 0:56320ef879a6 141 void spin_left(float speed);
eencae 1:5523d6d1feec 142
eencae 1:5523d6d1feec 143 /** Read button on m3pi expansion shield (p21)
eencae 1:5523d6d1feec 144 * @returns int - active-low - 0 for pressed/ 1 for not pressed
eencae 1:5523d6d1feec 145 */
eencae 0:56320ef879a6 146 int read_button();
eencae 1:5523d6d1feec 147
eencae 1:5523d6d1feec 148 /** Display battery voltage on LCD
eencae 1:5523d6d1feec 149 * @param x - x position on LCD to display
eencae 1:5523d6d1feec 150 * @param y - line on LCD to display
eencae 1:5523d6d1feec 151 */
eencae 0:56320ef879a6 152 void display_battery_voltage(int x,int y);
eencae 1:5523d6d1feec 153
eencae 1:5523d6d1feec 154 /** Display slave firmware signature on LCD
eencae 1:5523d6d1feec 155 * @param x - x position on LCD to display
eencae 1:5523d6d1feec 156 * @param y - line on LCD to display
eencae 1:5523d6d1feec 157 */
eencae 0:56320ef879a6 158 void display_signature(int x,int y);
eencae 2:26bf14f4dc84 159
eencae 2:26bf14f4dc84 160 /** Display sensor values on LCD
eencae 2:26bf14f4dc84 161 * @param values - array of calibrated sensor values
eencae 2:26bf14f4dc84 162 * @param y - line on LCD to display
eencae 2:26bf14f4dc84 163 */
eencae 2:26bf14f4dc84 164 void display_sensor_values(unsigned int values[],int y);
eencae 2:26bf14f4dc84 165
eencae 2:26bf14f4dc84 166 /** Gets value of sensor array expressed as decimal number
eencae 2:26bf14f4dc84 167 * @details Each sensor is a bit (PC4 is bit 0, PC0 is bit 5)
eencae 2:26bf14f4dc84 168 * @returns value - 5-bit value of sensor reading
eencae 2:26bf14f4dc84 169 */
eencae 2:26bf14f4dc84 170 unsigned int get_sensor_array_value(unsigned int values[]);
eencae 2:26bf14f4dc84 171
eencae 2:26bf14f4dc84 172 /** Calculates an estimate of normalised line position from the sensor readings
eencae 2:26bf14f4dc84 173 * @returns float in the range -1.0 to 1.0
eencae 2:26bf14f4dc84 174 * @details -1.0 for line under sensor 0, -0.5 for line under sensor 1
eencae 2:26bf14f4dc84 175 * @details 0.0 for line under sensor 2, 0.5 for line under sensor 3 etc.
eencae 2:26bf14f4dc84 176 */
eencae 2:26bf14f4dc84 177 float calc_line_position(unsigned int values[]);
eencae 0:56320ef879a6 178
eencae 0:56320ef879a6 179 private:
eencae 0:56320ef879a6 180
eencae 0:56320ef879a6 181 Serial* _serial;
eencae 0:56320ef879a6 182 DigitalOut* _reset;
eencae 0:56320ef879a6 183 DigitalIn* _button;
eencae 0:56320ef879a6 184 BusOut* _leds;
eencae 2:26bf14f4dc84 185
eencae 2:26bf14f4dc84 186 float _last_line_position;
eencae 0:56320ef879a6 187
eencae 0:56320ef879a6 188 void reset();
eencae 0:56320ef879a6 189
eencae 0:56320ef879a6 190 };
eencae 0:56320ef879a6 191
eencae 0:56320ef879a6 192
eencae 0:56320ef879a6 193
eencae 0:56320ef879a6 194 #endif