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

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?

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[]);
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