Unfinished v0.7, added bearing detection
Fork of Pi_Swarm_Library_v06_alpha by
piswarm.h@3:4c0f2f3de33e, 2014-02-02 (annotated)
- Committer:
- jah128
- Date:
- Sun Feb 02 21:18:05 2014 +0000
- Revision:
- 3:4c0f2f3de33e
- Parent:
- 1:b067a08ff54e
- Child:
- 4:52b3e4c5a425
updated comms
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jah128 | 0:9ffe8ebd1c40 | 1 | /* University of York Robot Lab Pi Swarm Robot Library |
jah128 | 0:9ffe8ebd1c40 | 2 | * |
jah128 | 0:9ffe8ebd1c40 | 3 | * (C) Dr James Hilder, Dept. Electronics & Computer Science, University of York |
jah128 | 0:9ffe8ebd1c40 | 4 | * |
jah128 | 0:9ffe8ebd1c40 | 5 | * Version 0.4 January 2014 |
jah128 | 0:9ffe8ebd1c40 | 6 | * |
jah128 | 0:9ffe8ebd1c40 | 7 | * Designed for use with the Pi Swarm Board (enhanced MBED sensor board) v1.2 |
jah128 | 0:9ffe8ebd1c40 | 8 | * |
jah128 | 0:9ffe8ebd1c40 | 9 | * Based on the original m3pi library, Copyright (c) 2007-2010 cstyles (see copyright notice at end of file) |
jah128 | 0:9ffe8ebd1c40 | 10 | */ |
jah128 | 0:9ffe8ebd1c40 | 11 | |
jah128 | 0:9ffe8ebd1c40 | 12 | #ifndef PISWARM_H |
jah128 | 0:9ffe8ebd1c40 | 13 | #define PISWARM_H |
jah128 | 0:9ffe8ebd1c40 | 14 | |
jah128 | 0:9ffe8ebd1c40 | 15 | #include "mbed.h" |
jah128 | 0:9ffe8ebd1c40 | 16 | #include "platform.h" |
jah128 | 0:9ffe8ebd1c40 | 17 | #include "alpha433.h" |
jah128 | 0:9ffe8ebd1c40 | 18 | #include "main.h" |
jah128 | 0:9ffe8ebd1c40 | 19 | |
jah128 | 0:9ffe8ebd1c40 | 20 | #ifdef MBED_RPC |
jah128 | 0:9ffe8ebd1c40 | 21 | #include "rpc.h" |
jah128 | 0:9ffe8ebd1c40 | 22 | #endif |
jah128 | 0:9ffe8ebd1c40 | 23 | |
jah128 | 0:9ffe8ebd1c40 | 24 | #define SEND_SIGNATURE 0x81 |
jah128 | 0:9ffe8ebd1c40 | 25 | #define SEND_RAW_SENSOR_VALUES 0x86 |
jah128 | 0:9ffe8ebd1c40 | 26 | #define SEND_TRIMPOT 0xB0 |
jah128 | 0:9ffe8ebd1c40 | 27 | #define SEND_BATTERY_MILLIVOLTS 0xB1 |
jah128 | 0:9ffe8ebd1c40 | 28 | #define DO_PLAY 0xB3 |
jah128 | 0:9ffe8ebd1c40 | 29 | #define PI_CALIBRATE 0xB4 |
jah128 | 0:9ffe8ebd1c40 | 30 | #define DO_CLEAR 0xB7 |
jah128 | 0:9ffe8ebd1c40 | 31 | #define DO_PRINT 0xB8 |
jah128 | 0:9ffe8ebd1c40 | 32 | #define DO_LCD_GOTO_XY 0xB9 |
jah128 | 0:9ffe8ebd1c40 | 33 | #define LINE_SENSORS_RESET_CALIBRATION 0xB5 |
jah128 | 0:9ffe8ebd1c40 | 34 | #define SEND_LINE_POSITION 0xB6 |
jah128 | 0:9ffe8ebd1c40 | 35 | #define AUTO_CALIBRATE 0xBA |
jah128 | 0:9ffe8ebd1c40 | 36 | #define SET_PID 0xBB |
jah128 | 0:9ffe8ebd1c40 | 37 | #define STOP_PID 0xBC |
jah128 | 0:9ffe8ebd1c40 | 38 | #define M1_FORWARD 0xC1 |
jah128 | 0:9ffe8ebd1c40 | 39 | #define M1_BACKWARD 0xC2 |
jah128 | 0:9ffe8ebd1c40 | 40 | #define M2_FORWARD 0xC5 |
jah128 | 0:9ffe8ebd1c40 | 41 | #define M2_BACKWARD 0xC6 |
jah128 | 0:9ffe8ebd1c40 | 42 | #define EXPANSION_IC_ADDRESS 0x40 |
jah128 | 0:9ffe8ebd1c40 | 43 | #define MAGNETOMETER_ADDRESS 0x1C |
jah128 | 0:9ffe8ebd1c40 | 44 | #define ADC_ADDRESS 0x46 |
jah128 | 0:9ffe8ebd1c40 | 45 | #define EEPROM_ADDRESS 0XA0 |
jah128 | 0:9ffe8ebd1c40 | 46 | |
jah128 | 0:9ffe8ebd1c40 | 47 | class PiSwarm : public Stream { |
jah128 | 0:9ffe8ebd1c40 | 48 | |
jah128 | 0:9ffe8ebd1c40 | 49 | // Public functions |
jah128 | 0:9ffe8ebd1c40 | 50 | public: |
jah128 | 0:9ffe8ebd1c40 | 51 | |
jah128 | 1:b067a08ff54e | 52 | // Create the Pi Swarm object connected to the default pins [see end of file] |
jah128 | 0:9ffe8ebd1c40 | 53 | PiSwarm(); |
jah128 | 0:9ffe8ebd1c40 | 54 | |
jah128 | 0:9ffe8ebd1c40 | 55 | // Returns the RGB Colour of the Outer LED as an int (r<<16 g<<8 b) |
jah128 | 0:9ffe8ebd1c40 | 56 | int get_oled_colour(void); |
jah128 | 0:9ffe8ebd1c40 | 57 | |
jah128 | 1:b067a08ff54e | 58 | // Returns the enable state of an single outer led |
jah128 | 1:b067a08ff54e | 59 | char get_oled_state(char oled); |
jah128 | 1:b067a08ff54e | 60 | |
jah128 | 1:b067a08ff54e | 61 | // Returns the enable state of the center LED |
jah128 | 1:b067a08ff54e | 62 | char get_cled_state(void); |
jah128 | 1:b067a08ff54e | 63 | |
jah128 | 0:9ffe8ebd1c40 | 64 | // Returns the RGB Colour of the Center LED as an int (r<<16 g<<8 b) |
jah128 | 0:9ffe8ebd1c40 | 65 | int get_cled_colour(void); |
jah128 | 0:9ffe8ebd1c40 | 66 | |
jah128 | 0:9ffe8ebd1c40 | 67 | // Toggle the state of a single outer LED without affected the others |
jah128 | 0:9ffe8ebd1c40 | 68 | void set_oled(char oled, char value); |
jah128 | 0:9ffe8ebd1c40 | 69 | |
jah128 | 0:9ffe8ebd1c40 | 70 | void test_oled(void); |
jah128 | 0:9ffe8ebd1c40 | 71 | void turn_off_all_oleds(void); |
jah128 | 0:9ffe8ebd1c40 | 72 | |
jah128 | 0:9ffe8ebd1c40 | 73 | // Toggle the states of all 10 outer LEDs |
jah128 | 0:9ffe8ebd1c40 | 74 | void set_oleds(char oled_0, char oled_1, char oled_2, char oled_3, char oled_4, char oled_5, char oled_6, char oled_7, char oled_8, char oled_9); |
jah128 | 0:9ffe8ebd1c40 | 75 | |
jah128 | 0:9ffe8ebd1c40 | 76 | void activate_oleds(void); |
jah128 | 0:9ffe8ebd1c40 | 77 | |
jah128 | 0:9ffe8ebd1c40 | 78 | // The default setup routine: called when s3pi is created |
jah128 | 0:9ffe8ebd1c40 | 79 | void setup ( void ); |
jah128 | 0:9ffe8ebd1c40 | 80 | |
jah128 | 0:9ffe8ebd1c40 | 81 | // Send a message of given length over the RF interface |
jah128 | 0:9ffe8ebd1c40 | 82 | void send_rf_message(char* message, char length); |
jah128 | 0:9ffe8ebd1c40 | 83 | |
jah128 | 0:9ffe8ebd1c40 | 84 | // Sets up the IO expansion IC using I2C commands; returns a zero if successful |
jah128 | 0:9ffe8ebd1c40 | 85 | int setup_expansion_ic ( void ); |
jah128 | 0:9ffe8ebd1c40 | 86 | |
jah128 | 0:9ffe8ebd1c40 | 87 | // Turns on or off the LDO outputs based on the current enable variables (enable_ir_ldo and enable_led_ldo) |
jah128 | 0:9ffe8ebd1c40 | 88 | void enable_ldo_outputs ( void ); |
jah128 | 0:9ffe8ebd1c40 | 89 | |
jah128 | 0:9ffe8ebd1c40 | 90 | // Called after a delay from the IO expansion interrupt; delay helps debounce switches |
jah128 | 0:9ffe8ebd1c40 | 91 | void interrupt_timeout_event ( void ); |
jah128 | 0:9ffe8ebd1c40 | 92 | |
jah128 | 0:9ffe8ebd1c40 | 93 | // The interrupt handler for the IO expansion IC; calls the timeout event to debounce switches |
jah128 | 0:9ffe8ebd1c40 | 94 | void expansion_interrupt_handler ( void ); |
jah128 | 0:9ffe8ebd1c40 | 95 | |
jah128 | 0:9ffe8ebd1c40 | 96 | // Turns off interrupt LED after a delay to indicate switch has been pressed |
jah128 | 0:9ffe8ebd1c40 | 97 | void led_timeout_event ( void ); |
jah128 | 0:9ffe8ebd1c40 | 98 | |
jah128 | 0:9ffe8ebd1c40 | 99 | // Set colour of outer LEDs |
jah128 | 0:9ffe8ebd1c40 | 100 | void set_oled_colour ( char red, char green, char blue ); |
jah128 | 0:9ffe8ebd1c40 | 101 | |
jah128 | 0:9ffe8ebd1c40 | 102 | // Set colour of central LED |
jah128 | 0:9ffe8ebd1c40 | 103 | void set_cled_colour ( char red, char green, char blue ); |
jah128 | 0:9ffe8ebd1c40 | 104 | |
jah128 | 0:9ffe8ebd1c40 | 105 | // Set brightness of outer LEDs (works by increasing total period for PWM) |
jah128 | 0:9ffe8ebd1c40 | 106 | void set_oled_brightness ( char brightness ); |
jah128 | 0:9ffe8ebd1c40 | 107 | |
jah128 | 0:9ffe8ebd1c40 | 108 | // Set brightness of central LED (works by increasing total period for PWM) |
jah128 | 0:9ffe8ebd1c40 | 109 | void set_cled_brightness ( char brightness ); |
jah128 | 0:9ffe8ebd1c40 | 110 | |
jah128 | 0:9ffe8ebd1c40 | 111 | // Read temperature from the temperature IC; return is temperature in degrees Celsius |
jah128 | 0:9ffe8ebd1c40 | 112 | float read_temperature ( void ); |
jah128 | 0:9ffe8ebd1c40 | 113 | |
jah128 | 0:9ffe8ebd1c40 | 114 | // Routine to calibrate gyro; by default run in setup, robot should be stationary to avoid errors |
jah128 | 0:9ffe8ebd1c40 | 115 | // Returns 1 if successful, 0 if failed |
jah128 | 0:9ffe8ebd1c40 | 116 | char calibrate_gyro ( void ); |
jah128 | 0:9ffe8ebd1c40 | 117 | |
jah128 | 0:9ffe8ebd1c40 | 118 | // Routine to calibrate accelerometer, by default run after successful gyro calibration, robot should be flat and stationary to avoid errors |
jah128 | 0:9ffe8ebd1c40 | 119 | // Returns 1 if successful, 0 if failed |
jah128 | 0:9ffe8ebd1c40 | 120 | char calibrate_accelerometer ( void ); |
jah128 | 0:9ffe8ebd1c40 | 121 | |
jah128 | 0:9ffe8ebd1c40 | 122 | // Routine to calibrate magnetometer |
jah128 | 0:9ffe8ebd1c40 | 123 | // Returns 1 if successful, 0 if failed |
jah128 | 0:9ffe8ebd1c40 | 124 | char calibrate_magnetometer ( void ); |
jah128 | 0:9ffe8ebd1c40 | 125 | |
jah128 | 0:9ffe8ebd1c40 | 126 | char setup_adc( void ); |
jah128 | 0:9ffe8ebd1c40 | 127 | |
jah128 | 0:9ffe8ebd1c40 | 128 | // Routine to initialise radio |
jah128 | 0:9ffe8ebd1c40 | 129 | void setup_radio( void ); |
jah128 | 0:9ffe8ebd1c40 | 130 | |
jah128 | 0:9ffe8ebd1c40 | 131 | // Routines returns an approximate distance of any reflected obstacle in front of the given IR sensor (in millimeters) |
jah128 | 0:9ffe8ebd1c40 | 132 | // Returns a value of 100 if nothing is detected |
jah128 | 0:9ffe8ebd1c40 | 133 | // True distance depends on a number of factors (reflectiveness of surface being one of the key ones) |
jah128 | 0:9ffe8ebd1c40 | 134 | // Minimum value is around 5 |
jah128 | 0:9ffe8ebd1c40 | 135 | float read_reflected_ir_distance ( char index ); |
jah128 | 0:9ffe8ebd1c40 | 136 | |
jah128 | 3:4c0f2f3de33e | 137 | // Returns the illuminated raw ADC value for a given IR sensor (500us pulse) |
jah128 | 3:4c0f2f3de33e | 138 | unsigned short read_illuminated_raw_ir_value ( char index ); |
jah128 | 3:4c0f2f3de33e | 139 | |
jah128 | 0:9ffe8ebd1c40 | 140 | // Returns the raw ADC value for a given IR sensor |
jah128 | 0:9ffe8ebd1c40 | 141 | unsigned short read_adc_value( char index ); |
jah128 | 0:9ffe8ebd1c40 | 142 | |
jah128 | 0:9ffe8ebd1c40 | 143 | // Read the I2C magnetometer and store values locally: use before get_magnetometer_x etc... |
jah128 | 0:9ffe8ebd1c40 | 144 | char read_magnetometer ( void ); |
jah128 | 0:9ffe8ebd1c40 | 145 | |
jah128 | 0:9ffe8ebd1c40 | 146 | // Return the magnetometer x value stored on last call of read_magnetometer() |
jah128 | 0:9ffe8ebd1c40 | 147 | signed short get_magnetometer_x ( void ); |
jah128 | 0:9ffe8ebd1c40 | 148 | |
jah128 | 0:9ffe8ebd1c40 | 149 | // Return the magnetometer y value stored on last call of read_magnetometer() |
jah128 | 0:9ffe8ebd1c40 | 150 | signed short get_magnetometer_y ( void ); |
jah128 | 0:9ffe8ebd1c40 | 151 | |
jah128 | 0:9ffe8ebd1c40 | 152 | // Return the magnetometer z value stored on last call of read_magnetometer() |
jah128 | 0:9ffe8ebd1c40 | 153 | signed short get_magnetometer_z ( void ); |
jah128 | 0:9ffe8ebd1c40 | 154 | |
jah128 | 0:9ffe8ebd1c40 | 155 | // Blinks the calibration LED during calibration (turns off if calibration successful) |
jah128 | 0:9ffe8ebd1c40 | 156 | void calibrate_ticker_routine ( void ); |
jah128 | 0:9ffe8ebd1c40 | 157 | |
jah128 | 0:9ffe8ebd1c40 | 158 | // Read the gyroscope yaw value. Return value is degrees per second clockwise. |
jah128 | 0:9ffe8ebd1c40 | 159 | float read_gyro ( void ); |
jah128 | 0:9ffe8ebd1c40 | 160 | |
jah128 | 0:9ffe8ebd1c40 | 161 | // Read the X value from the accelerometer. Return value is mps2. |
jah128 | 0:9ffe8ebd1c40 | 162 | float read_accelerometer_x ( void ); |
jah128 | 0:9ffe8ebd1c40 | 163 | |
jah128 | 0:9ffe8ebd1c40 | 164 | // Read the Y value from the accelerometer. Return value is mps2. |
jah128 | 0:9ffe8ebd1c40 | 165 | float read_accelerometer_y ( void ); |
jah128 | 0:9ffe8ebd1c40 | 166 | |
jah128 | 0:9ffe8ebd1c40 | 167 | // Read the Z value from the accelerometer. Return value is mps2. Generally this will have g against it. |
jah128 | 0:9ffe8ebd1c40 | 168 | float read_accelerometer_z ( void ); |
jah128 | 0:9ffe8ebd1c40 | 169 | |
jah128 | 0:9ffe8ebd1c40 | 170 | // Read the value from the light sensor. This will return a value ranging from 0 to a peak of around 100 in direct, bright light. |
jah128 | 0:9ffe8ebd1c40 | 171 | float read_light_sensor ( void ); |
jah128 | 0:9ffe8ebd1c40 | 172 | |
jah128 | 0:9ffe8ebd1c40 | 173 | // Read the robot ID set using the DIP switches (these are read during setup and not updated). |
jah128 | 0:9ffe8ebd1c40 | 174 | char get_id ( void ); |
jah128 | 0:9ffe8ebd1c40 | 175 | |
jah128 | 0:9ffe8ebd1c40 | 176 | // Read the switches value from the last call of the ISR |
jah128 | 0:9ffe8ebd1c40 | 177 | char get_switches ( void ); |
jah128 | 0:9ffe8ebd1c40 | 178 | |
jah128 | 0:9ffe8ebd1c40 | 179 | // Enable or disable the center LED |
jah128 | 0:9ffe8ebd1c40 | 180 | void enable_cled ( char enable ); |
jah128 | 0:9ffe8ebd1c40 | 181 | |
jah128 | 0:9ffe8ebd1c40 | 182 | // Write single byte to EEPROM |
jah128 | 0:9ffe8ebd1c40 | 183 | void write_eeprom_byte ( int address, char data ); |
jah128 | 0:9ffe8ebd1c40 | 184 | |
jah128 | 0:9ffe8ebd1c40 | 185 | // Write (length) bytes to EEPROM |
jah128 | 0:9ffe8ebd1c40 | 186 | void write_eeprom_block ( int address, char length, char * data); |
jah128 | 0:9ffe8ebd1c40 | 187 | |
jah128 | 0:9ffe8ebd1c40 | 188 | // Read single byte from EEPROM |
jah128 | 0:9ffe8ebd1c40 | 189 | char read_eeprom_byte ( int address ); |
jah128 | 0:9ffe8ebd1c40 | 190 | |
jah128 | 0:9ffe8ebd1c40 | 191 | // Read next byte from EEPROM at current address |
jah128 | 0:9ffe8ebd1c40 | 192 | char read_next_eeprom_byte ( void ); |
jah128 | 0:9ffe8ebd1c40 | 193 | |
jah128 | 0:9ffe8ebd1c40 | 194 | // Read (length) from EEPROM |
jah128 | 0:9ffe8ebd1c40 | 195 | char read_eeprom_block ( int address, char length ); |
jah128 | 0:9ffe8ebd1c40 | 196 | |
jah128 | 0:9ffe8ebd1c40 | 197 | // The following functions are (generally) those which are part of the original M3Pi library and interact with the 3Pi robot |
jah128 | 0:9ffe8ebd1c40 | 198 | |
jah128 | 0:9ffe8ebd1c40 | 199 | /** Read the raw line sensors into a 5-int array |
jah128 | 0:9ffe8ebd1c40 | 200 | * @ param raw_ls_array Pointer to 5-int array for raw values (range 0-2000) |
jah128 | 0:9ffe8ebd1c40 | 201 | */ |
jah128 | 0:9ffe8ebd1c40 | 202 | void read_raw_sensors ( int * raw_ls_array ); |
jah128 | 0:9ffe8ebd1c40 | 203 | |
jah128 | 0:9ffe8ebd1c40 | 204 | |
jah128 | 1:b067a08ff54e | 205 | // Play a tune on the 3-pi buzzer (see end of file for more details) |
jah128 | 0:9ffe8ebd1c40 | 206 | void play_tune (char * tune, int length); |
jah128 | 0:9ffe8ebd1c40 | 207 | |
jah128 | 1:b067a08ff54e | 208 | // Force a hardware reset of the 3-pi |
jah128 | 0:9ffe8ebd1c40 | 209 | void reset (void); |
jah128 | 0:9ffe8ebd1c40 | 210 | |
jah128 | 0:9ffe8ebd1c40 | 211 | float get_left_motor (void); |
jah128 | 0:9ffe8ebd1c40 | 212 | float get_right_motor (void); |
jah128 | 0:9ffe8ebd1c40 | 213 | |
jah128 | 0:9ffe8ebd1c40 | 214 | /** Directly control the speed and direction of the left motor |
jah128 | 0:9ffe8ebd1c40 | 215 | * |
jah128 | 0:9ffe8ebd1c40 | 216 | * @param speed A normalised number -1.0 - 1.0 represents the full range. |
jah128 | 0:9ffe8ebd1c40 | 217 | */ |
jah128 | 0:9ffe8ebd1c40 | 218 | void left_motor (float speed); |
jah128 | 0:9ffe8ebd1c40 | 219 | |
jah128 | 0:9ffe8ebd1c40 | 220 | /** Directly control the speed and direction of the right motor |
jah128 | 0:9ffe8ebd1c40 | 221 | * |
jah128 | 0:9ffe8ebd1c40 | 222 | * @param speed A normalised number -1.0 - 1.0 represents the full range. |
jah128 | 0:9ffe8ebd1c40 | 223 | */ |
jah128 | 0:9ffe8ebd1c40 | 224 | void right_motor (float speed); |
jah128 | 0:9ffe8ebd1c40 | 225 | |
jah128 | 0:9ffe8ebd1c40 | 226 | /** Drive both motors forward as the same speed |
jah128 | 0:9ffe8ebd1c40 | 227 | * |
jah128 | 0:9ffe8ebd1c40 | 228 | * @param speed A normalised number 0 - 1.0 represents the full range. |
jah128 | 0:9ffe8ebd1c40 | 229 | */ |
jah128 | 0:9ffe8ebd1c40 | 230 | void forward (float speed); |
jah128 | 0:9ffe8ebd1c40 | 231 | |
jah128 | 0:9ffe8ebd1c40 | 232 | /** Drive both motors backward as the same speed |
jah128 | 0:9ffe8ebd1c40 | 233 | * |
jah128 | 0:9ffe8ebd1c40 | 234 | * @param speed A normalised number 0 - 1.0 represents the full range. |
jah128 | 0:9ffe8ebd1c40 | 235 | */ |
jah128 | 0:9ffe8ebd1c40 | 236 | void backward (float speed); |
jah128 | 0:9ffe8ebd1c40 | 237 | |
jah128 | 0:9ffe8ebd1c40 | 238 | /** Drive left motor backwards and right motor forwards at the same speed to turn on the spot |
jah128 | 0:9ffe8ebd1c40 | 239 | * |
jah128 | 0:9ffe8ebd1c40 | 240 | * @param speed A normalised number 0 - 1.0 represents the full range. |
jah128 | 0:9ffe8ebd1c40 | 241 | */ |
jah128 | 0:9ffe8ebd1c40 | 242 | void left (float speed); |
jah128 | 0:9ffe8ebd1c40 | 243 | |
jah128 | 0:9ffe8ebd1c40 | 244 | /** Drive left motor forward and right motor backwards at the same speed to turn on the spot |
jah128 | 0:9ffe8ebd1c40 | 245 | * @param speed A normalised number 0 - 1.0 represents the full range. |
jah128 | 0:9ffe8ebd1c40 | 246 | */ |
jah128 | 0:9ffe8ebd1c40 | 247 | void right (float speed); |
jah128 | 0:9ffe8ebd1c40 | 248 | |
jah128 | 0:9ffe8ebd1c40 | 249 | /** Stop both motors |
jah128 | 0:9ffe8ebd1c40 | 250 | * |
jah128 | 0:9ffe8ebd1c40 | 251 | */ |
jah128 | 0:9ffe8ebd1c40 | 252 | void stop (void); |
jah128 | 0:9ffe8ebd1c40 | 253 | |
jah128 | 0:9ffe8ebd1c40 | 254 | /** Read the voltage of the potentiometer on the 3pi |
jah128 | 0:9ffe8ebd1c40 | 255 | * @returns voltage as a float |
jah128 | 0:9ffe8ebd1c40 | 256 | * |
jah128 | 0:9ffe8ebd1c40 | 257 | */ |
jah128 | 0:9ffe8ebd1c40 | 258 | float pot_voltage(void); |
jah128 | 0:9ffe8ebd1c40 | 259 | |
jah128 | 0:9ffe8ebd1c40 | 260 | /** Read the battery voltage on the 3pi |
jah128 | 0:9ffe8ebd1c40 | 261 | * @returns battery voltage as a float |
jah128 | 0:9ffe8ebd1c40 | 262 | */ |
jah128 | 0:9ffe8ebd1c40 | 263 | float battery(void); |
jah128 | 0:9ffe8ebd1c40 | 264 | |
jah128 | 0:9ffe8ebd1c40 | 265 | /** Read the position of the detected line |
jah128 | 0:9ffe8ebd1c40 | 266 | * @returns position as A normalised number -1.0 - 1.0 represents the full range. |
jah128 | 0:9ffe8ebd1c40 | 267 | * -1.0 means line is on the left, or the line has been lost |
jah128 | 0:9ffe8ebd1c40 | 268 | * 0.0 means the line is in the middle |
jah128 | 0:9ffe8ebd1c40 | 269 | * 1.0 means the line is on the right |
jah128 | 0:9ffe8ebd1c40 | 270 | */ |
jah128 | 0:9ffe8ebd1c40 | 271 | float line_position (void); |
jah128 | 0:9ffe8ebd1c40 | 272 | |
jah128 | 0:9ffe8ebd1c40 | 273 | |
jah128 | 0:9ffe8ebd1c40 | 274 | /** Calibrate the sensors. This turns the robot left then right, looking for a line |
jah128 | 0:9ffe8ebd1c40 | 275 | * |
jah128 | 0:9ffe8ebd1c40 | 276 | */ |
jah128 | 0:9ffe8ebd1c40 | 277 | char sensor_auto_calibrate (void); |
jah128 | 0:9ffe8ebd1c40 | 278 | |
jah128 | 0:9ffe8ebd1c40 | 279 | /** Set calibration manually to the current settings. |
jah128 | 0:9ffe8ebd1c40 | 280 | * |
jah128 | 0:9ffe8ebd1c40 | 281 | */ |
jah128 | 0:9ffe8ebd1c40 | 282 | void calibrate(void); |
jah128 | 0:9ffe8ebd1c40 | 283 | |
jah128 | 0:9ffe8ebd1c40 | 284 | /** Clear the current calibration settings |
jah128 | 0:9ffe8ebd1c40 | 285 | * |
jah128 | 0:9ffe8ebd1c40 | 286 | */ |
jah128 | 0:9ffe8ebd1c40 | 287 | void reset_calibration (void); |
jah128 | 0:9ffe8ebd1c40 | 288 | |
jah128 | 0:9ffe8ebd1c40 | 289 | void PID_start(int max_speed, int a, int b, int c, int d); |
jah128 | 0:9ffe8ebd1c40 | 290 | |
jah128 | 0:9ffe8ebd1c40 | 291 | void PID_stop(); |
jah128 | 0:9ffe8ebd1c40 | 292 | |
jah128 | 0:9ffe8ebd1c40 | 293 | /** Locate the cursor on the 8x2 LCD |
jah128 | 0:9ffe8ebd1c40 | 294 | * |
jah128 | 0:9ffe8ebd1c40 | 295 | * @param x The horizontal position, from 0 to 7 |
jah128 | 0:9ffe8ebd1c40 | 296 | * @param y The vertical position, from 0 to 1 |
jah128 | 0:9ffe8ebd1c40 | 297 | */ |
jah128 | 0:9ffe8ebd1c40 | 298 | void locate(int x, int y); |
jah128 | 0:9ffe8ebd1c40 | 299 | |
jah128 | 0:9ffe8ebd1c40 | 300 | /** Clear the LCD |
jah128 | 0:9ffe8ebd1c40 | 301 | * |
jah128 | 0:9ffe8ebd1c40 | 302 | */ |
jah128 | 0:9ffe8ebd1c40 | 303 | void cls(void); |
jah128 | 0:9ffe8ebd1c40 | 304 | |
jah128 | 0:9ffe8ebd1c40 | 305 | /** Send a character directly to the 3pi serial interface |
jah128 | 0:9ffe8ebd1c40 | 306 | * @param c The character to send to the 3pi |
jah128 | 0:9ffe8ebd1c40 | 307 | */ |
jah128 | 0:9ffe8ebd1c40 | 308 | int putc(int c); |
jah128 | 0:9ffe8ebd1c40 | 309 | |
jah128 | 0:9ffe8ebd1c40 | 310 | /** Receive a character directly to the 3pi serial interface |
jah128 | 0:9ffe8ebd1c40 | 311 | * @returns c The character received from the 3pi |
jah128 | 0:9ffe8ebd1c40 | 312 | */ |
jah128 | 0:9ffe8ebd1c40 | 313 | int getc(); |
jah128 | 0:9ffe8ebd1c40 | 314 | |
jah128 | 0:9ffe8ebd1c40 | 315 | /** Send a string buffer to the 3pi serial interface |
jah128 | 0:9ffe8ebd1c40 | 316 | * @param text A pointer to a char array |
jah128 | 0:9ffe8ebd1c40 | 317 | * @param int The character to send to the 3pi |
jah128 | 0:9ffe8ebd1c40 | 318 | */ |
jah128 | 0:9ffe8ebd1c40 | 319 | int print(char* text, int length); |
jah128 | 0:9ffe8ebd1c40 | 320 | |
jah128 | 0:9ffe8ebd1c40 | 321 | |
jah128 | 0:9ffe8ebd1c40 | 322 | void start_system_timer(void); |
jah128 | 0:9ffe8ebd1c40 | 323 | |
jah128 | 0:9ffe8ebd1c40 | 324 | float get_uptime (void); |
jah128 | 0:9ffe8ebd1c40 | 325 | |
jah128 | 0:9ffe8ebd1c40 | 326 | #ifdef MBED_RPC |
jah128 | 0:9ffe8ebd1c40 | 327 | virtual const struct rpc_method *get_rpc_methods(); |
jah128 | 0:9ffe8ebd1c40 | 328 | #endif |
jah128 | 0:9ffe8ebd1c40 | 329 | |
jah128 | 0:9ffe8ebd1c40 | 330 | private : |
jah128 | 0:9ffe8ebd1c40 | 331 | |
jah128 | 0:9ffe8ebd1c40 | 332 | Serial _ser; |
jah128 | 0:9ffe8ebd1c40 | 333 | PwmOut _oled_r, _oled_g, _oled_b, _cled_r, _cled_g, _cled_b; |
jah128 | 0:9ffe8ebd1c40 | 334 | AnalogIn _gyro, _accel_x, _accel_y, _accel_z, _temperature, _light; |
jah128 | 0:9ffe8ebd1c40 | 335 | DigitalOut _irpulse_1, _irpulse_2; |
jah128 | 0:9ffe8ebd1c40 | 336 | I2C _i2c; |
jah128 | 0:9ffe8ebd1c40 | 337 | Alpha433 _rf; |
jah128 | 0:9ffe8ebd1c40 | 338 | Timer _system_timer; |
jah128 | 0:9ffe8ebd1c40 | 339 | |
jah128 | 0:9ffe8ebd1c40 | 340 | void motor (int motor, float speed); |
jah128 | 0:9ffe8ebd1c40 | 341 | virtual int _putc(int c); |
jah128 | 0:9ffe8ebd1c40 | 342 | virtual int _getc(); |
jah128 | 0:9ffe8ebd1c40 | 343 | |
jah128 | 0:9ffe8ebd1c40 | 344 | }; |
jah128 | 0:9ffe8ebd1c40 | 345 | |
jah128 | 0:9ffe8ebd1c40 | 346 | void display_system_time(void); |
jah128 | 0:9ffe8ebd1c40 | 347 | void init(void); |
jah128 | 0:9ffe8ebd1c40 | 348 | extern Serial pc; |
jah128 | 0:9ffe8ebd1c40 | 349 | extern PiSwarm piswarm; |
jah128 | 0:9ffe8ebd1c40 | 350 | |
jah128 | 0:9ffe8ebd1c40 | 351 | #endif |
jah128 | 0:9ffe8ebd1c40 | 352 | |
jah128 | 1:b067a08ff54e | 353 | /******************************************************************************** |
jah128 | 1:b067a08ff54e | 354 | * MBED Pin connection layout * |
jah128 | 1:b067a08ff54e | 355 | * * |
jah128 | 1:b067a08ff54e | 356 | * * Pin 05 : Alpha Transceiver SDI * |
jah128 | 1:b067a08ff54e | 357 | * * Pin 06 : Alpha Transceiver SDO * |
jah128 | 1:b067a08ff54e | 358 | * * Pin 07 : Alpha Transceiver CLK * |
jah128 | 1:b067a08ff54e | 359 | * * Pin 08 : Alpha Transceiver FSS * |
jah128 | 1:b067a08ff54e | 360 | * * Pin 09 : Serial (3pi) transmit * |
jah128 | 1:b067a08ff54e | 361 | * * Pin 10 : Serial (3pi) receive * |
jah128 | 1:b067a08ff54e | 362 | * * Pin 11 : Alpha Transceiver NIRQ * |
jah128 | 1:b067a08ff54e | 363 | * * Pin 12 : IR Pulse Output for IR1,2,7,8 * |
jah128 | 1:b067a08ff54e | 364 | * * Pin 13 : IR Pulse Output for IR3,4,5,6 * |
jah128 | 1:b067a08ff54e | 365 | * * Pin 14 : Echo Pin for Sonar * |
jah128 | 1:b067a08ff54e | 366 | * * Pin 15 : Light Sensor Analogue Input * |
jah128 | 1:b067a08ff54e | 367 | * * Pin 16 : Gyrometer Analogue Input * |
jah128 | 1:b067a08ff54e | 368 | * * Pin 17 : Accelerometer Z Analogue Input * |
jah128 | 1:b067a08ff54e | 369 | * * Pin 18 : Accelerometer Y Analogue Input * |
jah128 | 1:b067a08ff54e | 370 | * * Pin 19 : Accelerometer X Analogue Input * |
jah128 | 1:b067a08ff54e | 371 | * * Pin 20 : Temperature Sensor Analogue Input * |
jah128 | 1:b067a08ff54e | 372 | * * Pin 21 : Center LED Blue PWM Output * |
jah128 | 1:b067a08ff54e | 373 | * * Pin 22 : Center LED Green PWM Output * |
jah128 | 1:b067a08ff54e | 374 | * * Pin 23 : Center LED Red PWM Output * |
jah128 | 1:b067a08ff54e | 375 | * * Pin 24 : Outer LED Blue PWM Output * |
jah128 | 1:b067a08ff54e | 376 | * * Pin 25 : Outer LED Green PWM Output * |
jah128 | 1:b067a08ff54e | 377 | * * Pin 26 : Outer LED Red PWM Output * |
jah128 | 1:b067a08ff54e | 378 | * * Pin 27 : I2C SCL * |
jah128 | 1:b067a08ff54e | 379 | * * Pin 28 : I2C SDA * |
jah128 | 1:b067a08ff54e | 380 | * * Pin 29 : GPIO Expander Interrupt * |
jah128 | 1:b067a08ff54e | 381 | * * Pin 30 : Trigger Pin for Sonar * |
jah128 | 1:b067a08ff54e | 382 | * * Pin 31 : USB D+ Connector * |
jah128 | 1:b067a08ff54e | 383 | * * Pin 32 : USB D- Connector * |
jah128 | 1:b067a08ff54e | 384 | * * |
jah128 | 1:b067a08ff54e | 385 | *******************************************************************************/ |
jah128 | 0:9ffe8ebd1c40 | 386 | |
jah128 | 0:9ffe8ebd1c40 | 387 | /******************************************************************************** |
jah128 | 1:b067a08ff54e | 388 | * Using the 3-Pi Buzzer * |
jah128 | 1:b067a08ff54e | 389 | * * |
jah128 | 1:b067a08ff54e | 390 | * play_tune (char * tune, int length) * |
jah128 | 1:b067a08ff54e | 391 | * * |
jah128 | 1:b067a08ff54e | 392 | * tune - Pointer to a character sequence of the tune * |
jah128 | 1:b067a08ff54e | 393 | * length - Length of characters in sequence * |
jah128 | 1:b067a08ff54e | 394 | * * |
jah128 | 1:b067a08ff54e | 395 | * The character sequence recognises the following characters: * |
jah128 | 1:b067a08ff54e | 396 | * * |
jah128 | 1:b067a08ff54e | 397 | * A – G : used to specify the notes that will be played * |
jah128 | 1:b067a08ff54e | 398 | * * |
jah128 | 1:b067a08ff54e | 399 | * R : used to specify a rest (no sound for the duration of the note) * |
jah128 | 1:b067a08ff54e | 400 | * * |
jah128 | 1:b067a08ff54e | 401 | * < or > : plays the next note one octave lower or higher * |
jah128 | 1:b067a08ff54e | 402 | * * |
jah128 | 1:b067a08ff54e | 403 | * + or # : raises the previous notes pitch by one semitone * |
jah128 | 1:b067a08ff54e | 404 | * * |
jah128 | 1:b067a08ff54e | 405 | * - : lowers the previous note pitch by one semitone * |
jah128 | 1:b067a08ff54e | 406 | * * |
jah128 | 1:b067a08ff54e | 407 | * . : extend length of previous by 50% (each additional dot adds half as * |
jah128 | 1:b067a08ff54e | 408 | * much as the previous dot, so that A.. is 1.75 times the length of A * |
jah128 | 1:b067a08ff54e | 409 | * * |
jah128 | 1:b067a08ff54e | 410 | * O followed by a number : sets the octave (default : O4) * |
jah128 | 1:b067a08ff54e | 411 | * * |
jah128 | 1:b067a08ff54e | 412 | * T followed by a number : sets the tempo in beats/min (default : T120) * |
jah128 | 1:b067a08ff54e | 413 | * * |
jah128 | 1:b067a08ff54e | 414 | * L followed by a number : sets the default note duration specified by the* |
jah128 | 1:b067a08ff54e | 415 | * number - 4 for quarter notes, 8 for eighth, 16 * |
jah128 | 1:b067a08ff54e | 416 | * for sixteenth notes, etc. (default : L4) * |
jah128 | 1:b067a08ff54e | 417 | * * |
jah128 | 1:b067a08ff54e | 418 | * V followed by a number : sets the volume (range 0 - 15, default : V15) * |
jah128 | 1:b067a08ff54e | 419 | * * |
jah128 | 1:b067a08ff54e | 420 | * MS : sets all subsequent notes to play staccato (each note is played for* |
jah128 | 1:b067a08ff54e | 421 | * 1/2 of its allotted time followed by an equal period of silence) * |
jah128 | 1:b067a08ff54e | 422 | * * |
jah128 | 1:b067a08ff54e | 423 | * ML : sets all subsequent notes to play legato (each note is played for * |
jah128 | 1:b067a08ff54e | 424 | * full length. This is the default setting. * |
jah128 | 1:b067a08ff54e | 425 | * * |
jah128 | 1:b067a08ff54e | 426 | * ! : resets the octave, tempo, duration, volume, and staccato setting to * |
jah128 | 1:b067a08ff54e | 427 | * their default values. These settings persist from one play_tune() to* |
jah128 | 1:b067a08ff54e | 428 | * the next, which allows you to more conveniently break up your music * |
jah128 | 1:b067a08ff54e | 429 | * into reusable sections. * |
jah128 | 1:b067a08ff54e | 430 | * * |
jah128 | 1:b067a08ff54e | 431 | * 1 - 2000 : when immediately following a note, a number determines the * |
jah128 | 1:b067a08ff54e | 432 | * duration of the note. For example, C16 specifies C played as * |
jah128 | 1:b067a08ff54e | 433 | * a sixteenth note (1/16th the length of a whole note). * |
jah128 | 1:b067a08ff54e | 434 | * * |
jah128 | 1:b067a08ff54e | 435 | * * |
jah128 | 1:b067a08ff54e | 436 | * Some examples: * |
jah128 | 1:b067a08ff54e | 437 | * * |
jah128 | 1:b067a08ff54e | 438 | * Blue Danube Waltz (played badly!) * |
jah128 | 1:b067a08ff54e | 439 | * play_tune("MSCEGGR>F>FR>D>DRCCEGGR>G>GR>E>ER<B<BDAAR>A>AR>F>F",51); * |
jah128 | 1:b067a08ff54e | 440 | * * |
jah128 | 1:b067a08ff54e | 441 | *******************************************************************************/ |
jah128 | 1:b067a08ff54e | 442 | |
jah128 | 1:b067a08ff54e | 443 | /******************************************************************************** |
jah128 | 0:9ffe8ebd1c40 | 444 | * COPYRIGHT NOTICE * |
jah128 | 0:9ffe8ebd1c40 | 445 | * * |
jah128 | 0:9ffe8ebd1c40 | 446 | * Permission is hereby granted, free of charge, to any person obtaining a copy * |
jah128 | 0:9ffe8ebd1c40 | 447 | * of this software and associated documentation files (the "Software"), to deal* |
jah128 | 0:9ffe8ebd1c40 | 448 | * in the Software without restriction, including without limitation the rights * |
jah128 | 0:9ffe8ebd1c40 | 449 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * |
jah128 | 0:9ffe8ebd1c40 | 450 | * copies of the Software, and to permit persons to whom the Software is * |
jah128 | 0:9ffe8ebd1c40 | 451 | * furnished to do so, subject to the following conditions: * |
jah128 | 0:9ffe8ebd1c40 | 452 | * * |
jah128 | 0:9ffe8ebd1c40 | 453 | * The above copyright notice and this permission notice shall be included in * |
jah128 | 0:9ffe8ebd1c40 | 454 | * all copies or substantial portions of the Software. * |
jah128 | 0:9ffe8ebd1c40 | 455 | * * |
jah128 | 0:9ffe8ebd1c40 | 456 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * |
jah128 | 0:9ffe8ebd1c40 | 457 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * |
jah128 | 0:9ffe8ebd1c40 | 458 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * |
jah128 | 0:9ffe8ebd1c40 | 459 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * |
jah128 | 0:9ffe8ebd1c40 | 460 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,* |
jah128 | 0:9ffe8ebd1c40 | 461 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * |
jah128 | 0:9ffe8ebd1c40 | 462 | * THE SOFTWARE. * |
jah128 | 0:9ffe8ebd1c40 | 463 | * * |
jah128 | 0:9ffe8ebd1c40 | 464 | *******************************************************************************/ |