GuardDog using application board robot.
Dependencies: C12832 Ping Servo USBHost mbed wave_player_appbd
main.h@0:a10cfed4fa88, 2015-12-10 (annotated)
- Committer:
- twmeares
- Date:
- Thu Dec 10 06:55:09 2015 +0000
- Revision:
- 0:a10cfed4fa88
GuardDog code for application board robot.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
twmeares | 0:a10cfed4fa88 | 1 | #include "mbed.h" |
twmeares | 0:a10cfed4fa88 | 2 | |
twmeares | 0:a10cfed4fa88 | 3 | #include "C12832.h" |
twmeares | 0:a10cfed4fa88 | 4 | #include "USBHostMSD.h" |
twmeares | 0:a10cfed4fa88 | 5 | #include "wave_player.h" |
twmeares | 0:a10cfed4fa88 | 6 | #include "Servo.h" |
twmeares | 0:a10cfed4fa88 | 7 | #include "Ping.h" |
twmeares | 0:a10cfed4fa88 | 8 | |
twmeares | 0:a10cfed4fa88 | 9 | #define BIAS 0.2030303 |
twmeares | 0:a10cfed4fa88 | 10 | #define THRES 17 |
twmeares | 0:a10cfed4fa88 | 11 | |
twmeares | 0:a10cfed4fa88 | 12 | /* States enumated and compartmentalized into functions */ |
twmeares | 0:a10cfed4fa88 | 13 | enum States { PATROL, SEARCH, ALERT }; |
twmeares | 0:a10cfed4fa88 | 14 | States patrol_state(); |
twmeares | 0:a10cfed4fa88 | 15 | States search_state(); |
twmeares | 0:a10cfed4fa88 | 16 | States alert_state(); |
twmeares | 0:a10cfed4fa88 | 17 | |
twmeares | 0:a10cfed4fa88 | 18 | /* Global Variables and components */ |
twmeares | 0:a10cfed4fa88 | 19 | DigitalOut board_led1(LED1); |
twmeares | 0:a10cfed4fa88 | 20 | DigitalOut board_led2(LED2); |
twmeares | 0:a10cfed4fa88 | 21 | DigitalOut board_led3(LED3); |
twmeares | 0:a10cfed4fa88 | 22 | DigitalOut board_led4(LED4); |
twmeares | 0:a10cfed4fa88 | 23 | C12832 lcd(p5, p7, p6, p8, p11); |
twmeares | 0:a10cfed4fa88 | 24 | PwmOut r_led(p23); |
twmeares | 0:a10cfed4fa88 | 25 | PwmOut g_led(p24); |
twmeares | 0:a10cfed4fa88 | 26 | PwmOut b_led(p25); |
twmeares | 0:a10cfed4fa88 | 27 | |
twmeares | 0:a10cfed4fa88 | 28 | Serial pc(USBTX, USBRX); |
twmeares | 0:a10cfed4fa88 | 29 | USBHostMSD* msd = 0; |
twmeares | 0:a10cfed4fa88 | 30 | |
twmeares | 0:a10cfed4fa88 | 31 | enum MOVE {BAD = -1, STOP, FORW, BACK, LTUR, RTUR, LPIV,RPIV }; |
twmeares | 0:a10cfed4fa88 | 32 | MOVE g_movement = BAD; |
twmeares | 0:a10cfed4fa88 | 33 | Servo rightServo(p21); |
twmeares | 0:a10cfed4fa88 | 34 | Servo leftServo(p22); |
twmeares | 0:a10cfed4fa88 | 35 | |
twmeares | 0:a10cfed4fa88 | 36 | DigitalIn pir1(p29,PullUp); |
twmeares | 0:a10cfed4fa88 | 37 | DigitalIn pir2(p30, PullUp); |
twmeares | 0:a10cfed4fa88 | 38 | Ping ultrasonic_in(p16); |
twmeares | 0:a10cfed4fa88 | 39 | AnalogIn microphone_in(p17); |
twmeares | 0:a10cfed4fa88 | 40 | |
twmeares | 0:a10cfed4fa88 | 41 | AnalogOut DACout(p18); |
twmeares | 0:a10cfed4fa88 | 42 | PwmOut board_speaker(p23);//(p26); |
twmeares | 0:a10cfed4fa88 | 43 | wave_player waver(&DACout,&board_speaker); |
twmeares | 0:a10cfed4fa88 | 44 | Serial bluetooth(p9, p10); |
twmeares | 0:a10cfed4fa88 | 45 | |
twmeares | 0:a10cfed4fa88 | 46 | /* Helper Functions */ |
twmeares | 0:a10cfed4fa88 | 47 | |
twmeares | 0:a10cfed4fa88 | 48 | /* * |
twmeares | 0:a10cfed4fa88 | 49 | * VISUAL FUNCTIONS * |
twmeares | 0:a10cfed4fa88 | 50 | * */ |
twmeares | 0:a10cfed4fa88 | 51 | void set_boardleds(int one, int two = board_led2, int thr = board_led3, int fou = board_led4) { |
twmeares | 0:a10cfed4fa88 | 52 | board_led1 = (one <= 0 ? 0 : 1); |
twmeares | 0:a10cfed4fa88 | 53 | board_led2 = (two <= 0 ? 0 : 1); |
twmeares | 0:a10cfed4fa88 | 54 | board_led3 = (thr <= 0 ? 0 : 1); |
twmeares | 0:a10cfed4fa88 | 55 | board_led4 = (fou <= 0 ? 0 : 1); |
twmeares | 0:a10cfed4fa88 | 56 | } |
twmeares | 0:a10cfed4fa88 | 57 | |
twmeares | 0:a10cfed4fa88 | 58 | void lcd_newmessage(const char* const message) { |
twmeares | 0:a10cfed4fa88 | 59 | lcd.cls(); |
twmeares | 0:a10cfed4fa88 | 60 | lcd.locate(0,3); |
twmeares | 0:a10cfed4fa88 | 61 | lcd.printf(message); |
twmeares | 0:a10cfed4fa88 | 62 | } |
twmeares | 0:a10cfed4fa88 | 63 | |
twmeares | 0:a10cfed4fa88 | 64 | void set_rgb_f(float r, float g, float b) { |
twmeares | 0:a10cfed4fa88 | 65 | r_led = r; |
twmeares | 0:a10cfed4fa88 | 66 | g_led = g; |
twmeares | 0:a10cfed4fa88 | 67 | b_led = b; |
twmeares | 0:a10cfed4fa88 | 68 | } |
twmeares | 0:a10cfed4fa88 | 69 | |
twmeares | 0:a10cfed4fa88 | 70 | void set_rgb(unsigned int r, unsigned int g, unsigned int b) { |
twmeares | 0:a10cfed4fa88 | 71 | r_led = (float)r / 255.f; |
twmeares | 0:a10cfed4fa88 | 72 | g_led = (float)g / 255.f; |
twmeares | 0:a10cfed4fa88 | 73 | b_led = (float)b / 255.f; |
twmeares | 0:a10cfed4fa88 | 74 | } |
twmeares | 0:a10cfed4fa88 | 75 | |
twmeares | 0:a10cfed4fa88 | 76 | /* * |
twmeares | 0:a10cfed4fa88 | 77 | * USB FUNCTIONS * |
twmeares | 0:a10cfed4fa88 | 78 | * */ |
twmeares | 0:a10cfed4fa88 | 79 | void setup_usb() { |
twmeares | 0:a10cfed4fa88 | 80 | msd = new USBHostMSD("usb"); |
twmeares | 0:a10cfed4fa88 | 81 | while(!msd->connect()) { |
twmeares | 0:a10cfed4fa88 | 82 | Thread::wait(500); |
twmeares | 0:a10cfed4fa88 | 83 | } |
twmeares | 0:a10cfed4fa88 | 84 | } |
twmeares | 0:a10cfed4fa88 | 85 | |
twmeares | 0:a10cfed4fa88 | 86 | void play_file(const char * const filepath) { |
twmeares | 0:a10cfed4fa88 | 87 | FILE *wave_file; |
twmeares | 0:a10cfed4fa88 | 88 | wave_file=fopen(filepath,"r"); |
twmeares | 0:a10cfed4fa88 | 89 | if(wave_file == NULL) { |
twmeares | 0:a10cfed4fa88 | 90 | set_boardleds(1, 1, 1, 1); |
twmeares | 0:a10cfed4fa88 | 91 | return; |
twmeares | 0:a10cfed4fa88 | 92 | } |
twmeares | 0:a10cfed4fa88 | 93 | waver.play(wave_file); |
twmeares | 0:a10cfed4fa88 | 94 | fclose(wave_file); |
twmeares | 0:a10cfed4fa88 | 95 | } |
twmeares | 0:a10cfed4fa88 | 96 | |
twmeares | 0:a10cfed4fa88 | 97 | void play_usbfile(const char * const filename) { |
twmeares | 0:a10cfed4fa88 | 98 | char filepath[80]; |
twmeares | 0:a10cfed4fa88 | 99 | strcpy(filepath, "/usb/"); |
twmeares | 0:a10cfed4fa88 | 100 | strcat(filepath, filename); |
twmeares | 0:a10cfed4fa88 | 101 | play_file(filepath); |
twmeares | 0:a10cfed4fa88 | 102 | } |
twmeares | 0:a10cfed4fa88 | 103 | |
twmeares | 0:a10cfed4fa88 | 104 | /* * |
twmeares | 0:a10cfed4fa88 | 105 | * DRIVE FUNCTIONS * |
twmeares | 0:a10cfed4fa88 | 106 | * */ |
twmeares | 0:a10cfed4fa88 | 107 | void drive_stop() { |
twmeares | 0:a10cfed4fa88 | 108 | if(g_movement != STOP) { |
twmeares | 0:a10cfed4fa88 | 109 | rightServo = 0.5; |
twmeares | 0:a10cfed4fa88 | 110 | leftServo = 0.5; |
twmeares | 0:a10cfed4fa88 | 111 | g_movement = STOP; |
twmeares | 0:a10cfed4fa88 | 112 | } |
twmeares | 0:a10cfed4fa88 | 113 | } |
twmeares | 0:a10cfed4fa88 | 114 | void drive_forward() { |
twmeares | 0:a10cfed4fa88 | 115 | if(g_movement != FORW) { |
twmeares | 0:a10cfed4fa88 | 116 | rightServo = 0; |
twmeares | 0:a10cfed4fa88 | 117 | leftServo = 1; |
twmeares | 0:a10cfed4fa88 | 118 | g_movement = FORW; |
twmeares | 0:a10cfed4fa88 | 119 | } |
twmeares | 0:a10cfed4fa88 | 120 | } |
twmeares | 0:a10cfed4fa88 | 121 | void drive_backward() { |
twmeares | 0:a10cfed4fa88 | 122 | if(g_movement != BACK) { |
twmeares | 0:a10cfed4fa88 | 123 | rightServo = 1; |
twmeares | 0:a10cfed4fa88 | 124 | leftServo = 0; |
twmeares | 0:a10cfed4fa88 | 125 | g_movement = BACK; |
twmeares | 0:a10cfed4fa88 | 126 | } |
twmeares | 0:a10cfed4fa88 | 127 | } |
twmeares | 0:a10cfed4fa88 | 128 | void drive_turnLeft() { |
twmeares | 0:a10cfed4fa88 | 129 | if(g_movement != LTUR) { |
twmeares | 0:a10cfed4fa88 | 130 | rightServo = 0; |
twmeares | 0:a10cfed4fa88 | 131 | leftServo = 0.5; |
twmeares | 0:a10cfed4fa88 | 132 | g_movement = LTUR; |
twmeares | 0:a10cfed4fa88 | 133 | } |
twmeares | 0:a10cfed4fa88 | 134 | } |
twmeares | 0:a10cfed4fa88 | 135 | void drive_turnRight() { |
twmeares | 0:a10cfed4fa88 | 136 | if(g_movement != RTUR) { |
twmeares | 0:a10cfed4fa88 | 137 | rightServo = 0.5; |
twmeares | 0:a10cfed4fa88 | 138 | leftServo = 1; |
twmeares | 0:a10cfed4fa88 | 139 | g_movement = RTUR; |
twmeares | 0:a10cfed4fa88 | 140 | } |
twmeares | 0:a10cfed4fa88 | 141 | } |
twmeares | 0:a10cfed4fa88 | 142 | void drive_pivotLeft() { |
twmeares | 0:a10cfed4fa88 | 143 | if(g_movement != LPIV) { |
twmeares | 0:a10cfed4fa88 | 144 | rightServo = 0; |
twmeares | 0:a10cfed4fa88 | 145 | leftServo = 0; |
twmeares | 0:a10cfed4fa88 | 146 | g_movement = LPIV; |
twmeares | 0:a10cfed4fa88 | 147 | } |
twmeares | 0:a10cfed4fa88 | 148 | } |
twmeares | 0:a10cfed4fa88 | 149 | void drive_pivotRight() { |
twmeares | 0:a10cfed4fa88 | 150 | if(g_movement != RPIV) { |
twmeares | 0:a10cfed4fa88 | 151 | rightServo = 1; |
twmeares | 0:a10cfed4fa88 | 152 | leftServo = 1; |
twmeares | 0:a10cfed4fa88 | 153 | g_movement = RPIV; |
twmeares | 0:a10cfed4fa88 | 154 | } |
twmeares | 0:a10cfed4fa88 | 155 | } |
twmeares | 0:a10cfed4fa88 | 156 | |
twmeares | 0:a10cfed4fa88 | 157 | /* * |
twmeares | 0:a10cfed4fa88 | 158 | * SENSOR FUNCTIONS * |
twmeares | 0:a10cfed4fa88 | 159 | * */ |
twmeares | 0:a10cfed4fa88 | 160 | int read_distance() { |
twmeares | 0:a10cfed4fa88 | 161 | int distance = -1; |
twmeares | 0:a10cfed4fa88 | 162 | ultrasonic_in.Send(); |
twmeares | 0:a10cfed4fa88 | 163 | wait_ms(30); |
twmeares | 0:a10cfed4fa88 | 164 | distance = ultrasonic_in.Read_cm(); |
twmeares | 0:a10cfed4fa88 | 165 | return distance; |
twmeares | 0:a10cfed4fa88 | 166 | } |
twmeares | 0:a10cfed4fa88 | 167 | int motion_detected() { |
twmeares | 0:a10cfed4fa88 | 168 | return !pir1 || !pir2; //pir pulls low when motion is detected |
twmeares | 0:a10cfed4fa88 | 169 | } |
twmeares | 0:a10cfed4fa88 | 170 | |
twmeares | 0:a10cfed4fa88 | 171 | int hear_sound() { |
twmeares | 0:a10cfed4fa88 | 172 | if((microphone_in - BIAS)*500 > THRES) {//70% volume |
twmeares | 0:a10cfed4fa88 | 173 | return 1; |
twmeares | 0:a10cfed4fa88 | 174 | } else { |
twmeares | 0:a10cfed4fa88 | 175 | return 0; |
twmeares | 0:a10cfed4fa88 | 176 | } |
twmeares | 0:a10cfed4fa88 | 177 | } |
twmeares | 0:a10cfed4fa88 | 178 | |
twmeares | 0:a10cfed4fa88 | 179 | /* * |
twmeares | 0:a10cfed4fa88 | 180 | * WIRELESS FUNCTIONS * |
twmeares | 0:a10cfed4fa88 | 181 | * */ |
twmeares | 0:a10cfed4fa88 | 182 | void send_email() { |
twmeares | 0:a10cfed4fa88 | 183 | bluetooth.printf("Send Email\n"); |
twmeares | 0:a10cfed4fa88 | 184 | } |