Cynthia Wang / Mbed 2 deprecated ECE4180-FinalProject

Dependencies:   mbed-rtos mbed Servo Motor SoftPWM

Committer:
bzhu792
Date:
Thu Nov 17 23:22:17 2022 +0000
Revision:
10:3deaf72fa257
Parent:
9:0b045f2791ea
Child:
12:b282102b3e23
Speaker works

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cwang776 0:16c007acb3a2 1 #include "mbed.h"
cwang776 0:16c007acb3a2 2 #include "rtos.h"
yjaafar3 2:002f2def130e 3 #include "Serial.h"
yjaafar3 3:9febeec1f271 4 #include "Servo.h"
bzhu792 5:e5bf798e0522 5 #include "Motor.h"
cwang776 8:c54f1cfcbfe0 6 #include "SoftPWM.h"
bzhu792 10:3deaf72fa257 7 #include "explosion.h"
bzhu792 10:3deaf72fa257 8 #include "shooting.h"
bzhu792 10:3deaf72fa257 9 #include "ricochet.h"
bzhu792 10:3deaf72fa257 10
bzhu792 10:3deaf72fa257 11 #define sample_freq 11025.0
bzhu792 10:3deaf72fa257 12 //get and set the frequency from wav conversion tool GUI
bzhu792 10:3deaf72fa257 13 int i=0;
bzhu792 10:3deaf72fa257 14 Ticker sampletick;
cwang776 0:16c007acb3a2 15
bzhu792 5:e5bf798e0522 16 RawSerial blue(p9, p10);
bzhu792 5:e5bf798e0522 17 Serial pc(USBTX, USBRX);
cwang776 8:c54f1cfcbfe0 18 SoftPWM servo(p24, true);
bzhu792 5:e5bf798e0522 19 Motor left_motor(p23, p15, p16); // pwm, fwd, rev
bzhu792 10:3deaf72fa257 20 Motor right_motor(p22, p17, p19); // pwm, fwd, rev
cwang776 0:16c007acb3a2 21
cwang776 7:f65ab31f81e7 22 // IR
cwang776 7:f65ab31f81e7 23 Serial ir_device(p13, p14); // tx, rx
cwang776 7:f65ab31f81e7 24 DigitalOut rx_led(LED1); //LED1 and LED2 indicate TX/RX activity for IR
cwang776 7:f65ab31f81e7 25 DigitalOut tx_led(LED2);
cwang776 7:f65ab31f81e7 26 PwmOut IRLED(p21);
cwang776 7:f65ab31f81e7 27
cwang776 7:f65ab31f81e7 28 // Lives LEDs
cwang776 7:f65ab31f81e7 29 BusOut lives_leds(p5, p6, p7);
cwang776 7:f65ab31f81e7 30
cwang776 7:f65ab31f81e7 31 // Speaker
bzhu792 10:3deaf72fa257 32 AnalogOut speaker(p18);
cwang776 7:f65ab31f81e7 33
yjaafar3 2:002f2def130e 34 volatile float speed_left = 0;
yjaafar3 2:002f2def130e 35 volatile float speed_right = 0;
yjaafar3 2:002f2def130e 36 volatile float turret_delta = 0;
yjaafar3 2:002f2def130e 37 volatile bool fire = false;
cwang776 0:16c007acb3a2 38
cwang776 0:16c007acb3a2 39
yjaafar3 2:002f2def130e 40 Thread thread_drive;
yjaafar3 2:002f2def130e 41 Thread thread_turret;
cwang776 7:f65ab31f81e7 42 Thread thread_ir_receive;
yjaafar3 2:002f2def130e 43
yjaafar3 2:002f2def130e 44 void input_loop();
bzhu792 5:e5bf798e0522 45 inline void set_speed(float l, float r);
bzhu792 5:e5bf798e0522 46 inline void set_turret_delta(float delta);
bzhu792 5:e5bf798e0522 47 inline void fire_cannon(bool f);
cwang776 7:f65ab31f81e7 48 inline void decrease_lives();
bzhu792 10:3deaf72fa257 49
bzhu792 10:3deaf72fa257 50
bzhu792 10:3deaf72fa257 51 //interrupt routine to play next audio sample from array in flash
bzhu792 10:3deaf72fa257 52 void explosion_audio_sample ()
bzhu792 10:3deaf72fa257 53 {
bzhu792 10:3deaf72fa257 54 speaker.write_u16(explosion_sound_data[i]);
bzhu792 10:3deaf72fa257 55 i++;
bzhu792 10:3deaf72fa257 56 if (i>= EXPLOSION_NUM_ELEMENTS) {
bzhu792 10:3deaf72fa257 57 i = 0;
bzhu792 10:3deaf72fa257 58 sampletick.detach();
bzhu792 10:3deaf72fa257 59 }
bzhu792 10:3deaf72fa257 60 }
bzhu792 10:3deaf72fa257 61
bzhu792 10:3deaf72fa257 62 //interrupt routine to play next audio sample from array in flash
bzhu792 10:3deaf72fa257 63 void shooting_audio_sample ()
bzhu792 10:3deaf72fa257 64 {
bzhu792 10:3deaf72fa257 65 speaker.write_u16(shooting_sound_data[i]);
bzhu792 10:3deaf72fa257 66 i++;
bzhu792 10:3deaf72fa257 67 if (i>= SHOOTING_NUM_ELEMENTS) {
bzhu792 10:3deaf72fa257 68 i = 0;
bzhu792 10:3deaf72fa257 69 sampletick.detach();
bzhu792 10:3deaf72fa257 70 }
bzhu792 10:3deaf72fa257 71 }
bzhu792 10:3deaf72fa257 72
bzhu792 10:3deaf72fa257 73
bzhu792 10:3deaf72fa257 74 //interrupt routine to play next audio sample from array in flash
bzhu792 10:3deaf72fa257 75 void ricochet_audio_sample ()
bzhu792 10:3deaf72fa257 76 {
bzhu792 10:3deaf72fa257 77 speaker.write_u16(ricochet_sound_data[i]);
bzhu792 10:3deaf72fa257 78 i++;
bzhu792 10:3deaf72fa257 79 if (i>= RICOCHET_NUM_ELEMENTS) {
bzhu792 10:3deaf72fa257 80 i = 0;
bzhu792 10:3deaf72fa257 81 sampletick.detach();
bzhu792 10:3deaf72fa257 82 }
bzhu792 10:3deaf72fa257 83 }
bzhu792 10:3deaf72fa257 84
yjaafar3 2:002f2def130e 85 void input_thread() {
yjaafar3 2:002f2def130e 86
cwang776 0:16c007acb3a2 87 }
cwang776 0:16c007acb3a2 88
yjaafar3 2:002f2def130e 89 void drive_thread() {
bzhu792 5:e5bf798e0522 90 while (1) {
bzhu792 5:e5bf798e0522 91
bzhu792 5:e5bf798e0522 92 left_motor.speed(speed_left);
bzhu792 5:e5bf798e0522 93 right_motor.speed(speed_right);
bzhu792 5:e5bf798e0522 94 //pc.printf("left speed: %f, right speed: %f\n", speed_left, speed_right);
bzhu792 5:e5bf798e0522 95 Thread::wait(100);
bzhu792 5:e5bf798e0522 96 }
yjaafar3 2:002f2def130e 97 }
cwang776 0:16c007acb3a2 98
yjaafar3 2:002f2def130e 99 void turret_thread() {
bzhu792 5:e5bf798e0522 100 float pulsewidth = 0.0015; // servo is between 1 ms and 2 ms
bzhu792 5:e5bf798e0522 101
yjaafar3 3:9febeec1f271 102 while (1) {
bzhu792 5:e5bf798e0522 103 servo.period(0.020); // servo requires a 20ms period
bzhu792 5:e5bf798e0522 104 pulsewidth += turret_delta;
bzhu792 5:e5bf798e0522 105 if (pulsewidth > 0.002) pulsewidth = 0.002;
bzhu792 5:e5bf798e0522 106 else if (pulsewidth < 0.001) pulsewidth = 0.001;
bzhu792 5:e5bf798e0522 107 servo.pulsewidth(pulsewidth);
bzhu792 5:e5bf798e0522 108
cwang776 8:c54f1cfcbfe0 109 Thread::wait(25);
yjaafar3 3:9febeec1f271 110 }
cwang776 0:16c007acb3a2 111 }
yjaafar3 2:002f2def130e 112
cwang776 7:f65ab31f81e7 113 void ir_receive_thread() {
cwang776 7:f65ab31f81e7 114 // IR setup
cwang776 7:f65ab31f81e7 115 //Drive IR LED data pin with 38Khz PWM Carrier
cwang776 7:f65ab31f81e7 116 //Drive IR LED gnd pin with serial TX
bzhu792 9:0b045f2791ea 117 Thread::wait(1000); //Let other PWM threads initialize
cwang776 7:f65ab31f81e7 118 IRLED.period(1.0/38000.0);
cwang776 7:f65ab31f81e7 119 IRLED = 0.5;
cwang776 7:f65ab31f81e7 120 ir_device.baud(2400);
cwang776 7:f65ab31f81e7 121 while(1) {
bzhu792 9:0b045f2791ea 122 while (!ir_device.readable()) Thread::wait(0);
bzhu792 9:0b045f2791ea 123 char c = ir_device.getc();
bzhu792 9:0b045f2791ea 124 if (c == 'f') {
cwang776 7:f65ab31f81e7 125 rx_led = 1;
bzhu792 9:0b045f2791ea 126 pc.putc(c);
cwang776 7:f65ab31f81e7 127 decrease_lives();
cwang776 7:f65ab31f81e7 128 rx_led = 0;
bzhu792 9:0b045f2791ea 129 }
cwang776 7:f65ab31f81e7 130 }
yjaafar3 2:002f2def130e 131 }
yjaafar3 2:002f2def130e 132
cwang776 0:16c007acb3a2 133
cwang776 0:16c007acb3a2 134 int main() {
cwang776 7:f65ab31f81e7 135 lives_leds = 7;
cwang776 7:f65ab31f81e7 136
yjaafar3 2:002f2def130e 137 thread_drive.start(drive_thread);
cwang776 8:c54f1cfcbfe0 138 thread_turret.start(turret_thread);
cwang776 7:f65ab31f81e7 139 thread_ir_receive.start(ir_receive_thread);
yjaafar3 2:002f2def130e 140
yjaafar3 2:002f2def130e 141 input_loop();
cwang776 0:16c007acb3a2 142 }
yjaafar3 2:002f2def130e 143
yjaafar3 2:002f2def130e 144 void input_loop() {
yjaafar3 2:002f2def130e 145 char bnum=0;
yjaafar3 2:002f2def130e 146 char bhit=0;
yjaafar3 2:002f2def130e 147 while(1) {
yjaafar3 2:002f2def130e 148 if (blue.getc()=='!') {
yjaafar3 2:002f2def130e 149 if (blue.getc()=='B') { //button data packet
yjaafar3 2:002f2def130e 150 bnum = blue.getc(); //button number
yjaafar3 2:002f2def130e 151 bhit = blue.getc(); //1=hit, 0=release
yjaafar3 2:002f2def130e 152 if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
yjaafar3 2:002f2def130e 153 switch(bnum) {
yjaafar3 2:002f2def130e 154 case '1': //Turret Left Button
yjaafar3 2:002f2def130e 155 if (bhit == '1') {
bzhu792 5:e5bf798e0522 156 set_turret_delta(-0.000025);
yjaafar3 2:002f2def130e 157 } else {
yjaafar3 2:002f2def130e 158 set_turret_delta(0);
yjaafar3 2:002f2def130e 159 }
yjaafar3 2:002f2def130e 160 break;
yjaafar3 2:002f2def130e 161 case '2': //Turret Right Button
yjaafar3 2:002f2def130e 162 if (bhit == '1') {
bzhu792 5:e5bf798e0522 163 set_turret_delta(0.000025);
yjaafar3 2:002f2def130e 164 } else {
yjaafar3 2:002f2def130e 165 set_turret_delta(0);
yjaafar3 2:002f2def130e 166 }
yjaafar3 2:002f2def130e 167 break;
yjaafar3 2:002f2def130e 168 case '3': //Fire Button
yjaafar3 2:002f2def130e 169 if (bhit == '1') {
yjaafar3 2:002f2def130e 170 fire_cannon(true);
yjaafar3 2:002f2def130e 171 } else {
yjaafar3 2:002f2def130e 172 fire_cannon(false);
yjaafar3 2:002f2def130e 173 }
yjaafar3 2:002f2def130e 174 break;
yjaafar3 2:002f2def130e 175 case '5': //button 5 up arrow
yjaafar3 2:002f2def130e 176 if (bhit=='1') {
yjaafar3 2:002f2def130e 177 set_speed(0.5, 0.5);
yjaafar3 2:002f2def130e 178 } else {
yjaafar3 2:002f2def130e 179 set_speed(0, 0);
yjaafar3 2:002f2def130e 180 }
yjaafar3 2:002f2def130e 181 break;
yjaafar3 2:002f2def130e 182 case '6': //button 6 down arrow
yjaafar3 2:002f2def130e 183 if (bhit=='1') {
yjaafar3 2:002f2def130e 184 set_speed(-0.5, -0.5);
yjaafar3 2:002f2def130e 185 } else {
yjaafar3 2:002f2def130e 186 set_speed(0, 0);
yjaafar3 2:002f2def130e 187 }
yjaafar3 2:002f2def130e 188 break;
yjaafar3 2:002f2def130e 189 case '7': //button 7 left arrow
yjaafar3 2:002f2def130e 190 if (bhit=='1') {
yjaafar3 2:002f2def130e 191 set_speed(-0.5, 0.5);
yjaafar3 2:002f2def130e 192 } else {
yjaafar3 2:002f2def130e 193 set_speed(0, 0);
yjaafar3 2:002f2def130e 194 }
yjaafar3 2:002f2def130e 195 break;
yjaafar3 2:002f2def130e 196 case '8': //button 8 right arrow
yjaafar3 2:002f2def130e 197 if (bhit=='1') {
yjaafar3 2:002f2def130e 198 set_speed(0.5, -0.5);
yjaafar3 2:002f2def130e 199 } else {
yjaafar3 2:002f2def130e 200 set_speed(0, 0);
yjaafar3 2:002f2def130e 201 }
yjaafar3 2:002f2def130e 202 break;
yjaafar3 2:002f2def130e 203 default:
yjaafar3 2:002f2def130e 204 break;
yjaafar3 2:002f2def130e 205 }
yjaafar3 2:002f2def130e 206 }
yjaafar3 2:002f2def130e 207 }
yjaafar3 2:002f2def130e 208 }
yjaafar3 3:9febeec1f271 209 Thread::wait(50);
yjaafar3 2:002f2def130e 210 }
yjaafar3 2:002f2def130e 211 }
yjaafar3 2:002f2def130e 212
bzhu792 5:e5bf798e0522 213 inline void set_speed(float left, float right) {
yjaafar3 2:002f2def130e 214 speed_left = left;
yjaafar3 2:002f2def130e 215 speed_right = right;
yjaafar3 2:002f2def130e 216 }
yjaafar3 2:002f2def130e 217
bzhu792 5:e5bf798e0522 218 inline void set_turret_delta(float delta) {
yjaafar3 2:002f2def130e 219 turret_delta = delta;
yjaafar3 2:002f2def130e 220 }
yjaafar3 2:002f2def130e 221
bzhu792 5:e5bf798e0522 222 inline void fire_cannon(bool f) {
cwang776 7:f65ab31f81e7 223 if (f) {
bzhu792 10:3deaf72fa257 224 sampletick.attach(&shooting_audio_sample, 1.0 / sample_freq);
cwang776 7:f65ab31f81e7 225 tx_led = 1;
cwang776 7:f65ab31f81e7 226 ir_device.putc('f');
cwang776 7:f65ab31f81e7 227 tx_led = 0;
cwang776 7:f65ab31f81e7 228 }
cwang776 7:f65ab31f81e7 229 }
cwang776 7:f65ab31f81e7 230
cwang776 7:f65ab31f81e7 231 inline void decrease_lives() {
bzhu792 10:3deaf72fa257 232 Thread::wait(1000);
cwang776 7:f65ab31f81e7 233 if (lives_leds == 7) {
bzhu792 10:3deaf72fa257 234 sampletick.attach(&ricochet_audio_sample, 1.0 / sample_freq);
cwang776 7:f65ab31f81e7 235 lives_leds = 3;
cwang776 7:f65ab31f81e7 236 } else if (lives_leds == 3) {
bzhu792 10:3deaf72fa257 237 sampletick.attach(&ricochet_audio_sample, 1.0 / sample_freq);
cwang776 7:f65ab31f81e7 238 lives_leds = 1;
cwang776 7:f65ab31f81e7 239 } else {
cwang776 7:f65ab31f81e7 240 lives_leds = 0;
bzhu792 10:3deaf72fa257 241 sampletick.attach(&explosion_audio_sample, 1.0 / sample_freq);
cwang776 7:f65ab31f81e7 242 }
yjaafar3 2:002f2def130e 243 }