Cynthia Wang / Mbed 2 deprecated ECE4180-FinalProject

Dependencies:   mbed-rtos mbed Servo Motor SoftPWM

Committer:
cwang776
Date:
Wed Nov 16 01:35:20 2022 +0000
Revision:
7:f65ab31f81e7
Parent:
5:e5bf798e0522
Child:
8:c54f1cfcbfe0
Merge IR functionality and lives LEDs

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 0:16c007acb3a2 6
bzhu792 5:e5bf798e0522 7 RawSerial blue(p9, p10);
bzhu792 5:e5bf798e0522 8 Serial pc(USBTX, USBRX);
bzhu792 5:e5bf798e0522 9 PwmOut servo(p24);
bzhu792 5:e5bf798e0522 10 Motor left_motor(p23, p15, p16); // pwm, fwd, rev
bzhu792 5:e5bf798e0522 11 Motor right_motor(p22, p17, p18); // pwm, fwd, rev
cwang776 0:16c007acb3a2 12
cwang776 7:f65ab31f81e7 13 // IR
cwang776 7:f65ab31f81e7 14 Serial ir_device(p13, p14); // tx, rx
cwang776 7:f65ab31f81e7 15 DigitalOut rx_led(LED1); //LED1 and LED2 indicate TX/RX activity for IR
cwang776 7:f65ab31f81e7 16 DigitalOut tx_led(LED2);
cwang776 7:f65ab31f81e7 17 PwmOut IRLED(p21);
cwang776 7:f65ab31f81e7 18
cwang776 7:f65ab31f81e7 19 // Lives LEDs
cwang776 7:f65ab31f81e7 20 BusOut lives_leds(p5, p6, p7);
cwang776 7:f65ab31f81e7 21
cwang776 7:f65ab31f81e7 22 // Speaker
cwang776 7:f65ab31f81e7 23 PwmOut speaker(p25);
cwang776 7:f65ab31f81e7 24
yjaafar3 2:002f2def130e 25 volatile float speed_left = 0;
yjaafar3 2:002f2def130e 26 volatile float speed_right = 0;
yjaafar3 2:002f2def130e 27 volatile float turret_delta = 0;
yjaafar3 2:002f2def130e 28 volatile bool fire = false;
cwang776 0:16c007acb3a2 29
cwang776 0:16c007acb3a2 30
yjaafar3 2:002f2def130e 31 Thread thread_drive;
yjaafar3 2:002f2def130e 32 Thread thread_turret;
cwang776 7:f65ab31f81e7 33 Thread thread_ir_receive;
yjaafar3 2:002f2def130e 34
yjaafar3 2:002f2def130e 35 void input_loop();
bzhu792 5:e5bf798e0522 36 inline void set_speed(float l, float r);
bzhu792 5:e5bf798e0522 37 inline void set_turret_delta(float delta);
bzhu792 5:e5bf798e0522 38 inline void fire_cannon(bool f);
cwang776 7:f65ab31f81e7 39 inline void decrease_lives();
yjaafar3 2:002f2def130e 40
yjaafar3 2:002f2def130e 41 void input_thread() {
yjaafar3 2:002f2def130e 42
cwang776 0:16c007acb3a2 43 }
cwang776 0:16c007acb3a2 44
yjaafar3 2:002f2def130e 45 void drive_thread() {
bzhu792 5:e5bf798e0522 46 while (1) {
bzhu792 5:e5bf798e0522 47
bzhu792 5:e5bf798e0522 48 left_motor.speed(speed_left);
bzhu792 5:e5bf798e0522 49 right_motor.speed(speed_right);
bzhu792 5:e5bf798e0522 50 //pc.printf("left speed: %f, right speed: %f\n", speed_left, speed_right);
bzhu792 5:e5bf798e0522 51 Thread::wait(100);
bzhu792 5:e5bf798e0522 52 }
yjaafar3 2:002f2def130e 53 }
cwang776 0:16c007acb3a2 54
yjaafar3 2:002f2def130e 55 void turret_thread() {
bzhu792 5:e5bf798e0522 56 float pulsewidth = 0.0015; // servo is between 1 ms and 2 ms
bzhu792 5:e5bf798e0522 57
yjaafar3 3:9febeec1f271 58 while (1) {
bzhu792 5:e5bf798e0522 59 servo.period(0.020); // servo requires a 20ms period
bzhu792 5:e5bf798e0522 60 pulsewidth += turret_delta;
bzhu792 5:e5bf798e0522 61 if (pulsewidth > 0.002) pulsewidth = 0.002;
bzhu792 5:e5bf798e0522 62 else if (pulsewidth < 0.001) pulsewidth = 0.001;
bzhu792 5:e5bf798e0522 63 servo.pulsewidth(pulsewidth);
bzhu792 5:e5bf798e0522 64
yjaafar3 3:9febeec1f271 65 Thread::wait(50);
yjaafar3 3:9febeec1f271 66 }
cwang776 0:16c007acb3a2 67 }
yjaafar3 2:002f2def130e 68
cwang776 7:f65ab31f81e7 69 void ir_receive_thread() {
cwang776 7:f65ab31f81e7 70 // IR setup
cwang776 7:f65ab31f81e7 71 //Drive IR LED data pin with 38Khz PWM Carrier
cwang776 7:f65ab31f81e7 72 //Drive IR LED gnd pin with serial TX
cwang776 7:f65ab31f81e7 73 IRLED.period(1.0/38000.0);
cwang776 7:f65ab31f81e7 74 IRLED = 0.5;
cwang776 7:f65ab31f81e7 75 ir_device.baud(2400);
cwang776 7:f65ab31f81e7 76 while(1) {
cwang776 7:f65ab31f81e7 77 if(ir_device.readable()) {
cwang776 7:f65ab31f81e7 78 rx_led = 1;
cwang776 7:f65ab31f81e7 79 pc.putc(ir_device.getc());
cwang776 7:f65ab31f81e7 80 decrease_lives();
cwang776 7:f65ab31f81e7 81 rx_led = 0;
cwang776 7:f65ab31f81e7 82 }
cwang776 7:f65ab31f81e7 83 }
yjaafar3 2:002f2def130e 84 }
yjaafar3 2:002f2def130e 85
cwang776 0:16c007acb3a2 86
cwang776 0:16c007acb3a2 87 int main() {
cwang776 7:f65ab31f81e7 88 lives_leds = 7;
cwang776 7:f65ab31f81e7 89
yjaafar3 2:002f2def130e 90 thread_drive.start(drive_thread);
bzhu792 5:e5bf798e0522 91 //thread_turret.start(turret_thread);
cwang776 7:f65ab31f81e7 92 thread_ir_receive.start(ir_receive_thread);
yjaafar3 2:002f2def130e 93
yjaafar3 2:002f2def130e 94 input_loop();
cwang776 0:16c007acb3a2 95 }
yjaafar3 2:002f2def130e 96
yjaafar3 2:002f2def130e 97 void input_loop() {
yjaafar3 2:002f2def130e 98 char bnum=0;
yjaafar3 2:002f2def130e 99 char bhit=0;
yjaafar3 2:002f2def130e 100 while(1) {
yjaafar3 2:002f2def130e 101 if (blue.getc()=='!') {
yjaafar3 2:002f2def130e 102 if (blue.getc()=='B') { //button data packet
yjaafar3 2:002f2def130e 103 bnum = blue.getc(); //button number
yjaafar3 2:002f2def130e 104 bhit = blue.getc(); //1=hit, 0=release
yjaafar3 2:002f2def130e 105 if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
yjaafar3 2:002f2def130e 106 switch(bnum) {
yjaafar3 2:002f2def130e 107 case '1': //Turret Left Button
yjaafar3 2:002f2def130e 108 if (bhit == '1') {
bzhu792 5:e5bf798e0522 109 set_turret_delta(-0.000025);
yjaafar3 2:002f2def130e 110 } else {
yjaafar3 2:002f2def130e 111 set_turret_delta(0);
yjaafar3 2:002f2def130e 112 }
yjaafar3 2:002f2def130e 113 break;
yjaafar3 2:002f2def130e 114 case '2': //Turret Right Button
yjaafar3 2:002f2def130e 115 if (bhit == '1') {
bzhu792 5:e5bf798e0522 116 set_turret_delta(0.000025);
yjaafar3 2:002f2def130e 117 } else {
yjaafar3 2:002f2def130e 118 set_turret_delta(0);
yjaafar3 2:002f2def130e 119 }
yjaafar3 2:002f2def130e 120 break;
yjaafar3 2:002f2def130e 121 case '3': //Fire Button
yjaafar3 2:002f2def130e 122 if (bhit == '1') {
yjaafar3 2:002f2def130e 123 fire_cannon(true);
yjaafar3 2:002f2def130e 124 } else {
yjaafar3 2:002f2def130e 125 fire_cannon(false);
yjaafar3 2:002f2def130e 126 }
yjaafar3 2:002f2def130e 127 break;
yjaafar3 2:002f2def130e 128 case '5': //button 5 up arrow
yjaafar3 2:002f2def130e 129 if (bhit=='1') {
yjaafar3 2:002f2def130e 130 set_speed(0.5, 0.5);
yjaafar3 2:002f2def130e 131 } else {
yjaafar3 2:002f2def130e 132 set_speed(0, 0);
yjaafar3 2:002f2def130e 133 }
yjaafar3 2:002f2def130e 134 break;
yjaafar3 2:002f2def130e 135 case '6': //button 6 down arrow
yjaafar3 2:002f2def130e 136 if (bhit=='1') {
yjaafar3 2:002f2def130e 137 set_speed(-0.5, -0.5);
yjaafar3 2:002f2def130e 138 } else {
yjaafar3 2:002f2def130e 139 set_speed(0, 0);
yjaafar3 2:002f2def130e 140 }
yjaafar3 2:002f2def130e 141 break;
yjaafar3 2:002f2def130e 142 case '7': //button 7 left arrow
yjaafar3 2:002f2def130e 143 if (bhit=='1') {
yjaafar3 2:002f2def130e 144 set_speed(-0.5, 0.5);
yjaafar3 2:002f2def130e 145 } else {
yjaafar3 2:002f2def130e 146 set_speed(0, 0);
yjaafar3 2:002f2def130e 147 }
yjaafar3 2:002f2def130e 148 break;
yjaafar3 2:002f2def130e 149 case '8': //button 8 right arrow
yjaafar3 2:002f2def130e 150 if (bhit=='1') {
yjaafar3 2:002f2def130e 151 set_speed(0.5, -0.5);
yjaafar3 2:002f2def130e 152 } else {
yjaafar3 2:002f2def130e 153 set_speed(0, 0);
yjaafar3 2:002f2def130e 154 }
yjaafar3 2:002f2def130e 155 break;
yjaafar3 2:002f2def130e 156 default:
yjaafar3 2:002f2def130e 157 break;
yjaafar3 2:002f2def130e 158 }
yjaafar3 2:002f2def130e 159 }
yjaafar3 2:002f2def130e 160 }
yjaafar3 2:002f2def130e 161 }
yjaafar3 3:9febeec1f271 162 Thread::wait(50);
yjaafar3 2:002f2def130e 163 }
yjaafar3 2:002f2def130e 164 }
yjaafar3 2:002f2def130e 165
bzhu792 5:e5bf798e0522 166 inline void set_speed(float left, float right) {
yjaafar3 2:002f2def130e 167 speed_left = left;
yjaafar3 2:002f2def130e 168 speed_right = right;
yjaafar3 2:002f2def130e 169 }
yjaafar3 2:002f2def130e 170
bzhu792 5:e5bf798e0522 171 inline void set_turret_delta(float delta) {
yjaafar3 2:002f2def130e 172 turret_delta = delta;
yjaafar3 2:002f2def130e 173 }
yjaafar3 2:002f2def130e 174
bzhu792 5:e5bf798e0522 175 inline void fire_cannon(bool f) {
cwang776 7:f65ab31f81e7 176 if (f) {
cwang776 7:f65ab31f81e7 177 tx_led = 1;
cwang776 7:f65ab31f81e7 178 ir_device.putc('f');
cwang776 7:f65ab31f81e7 179 tx_led = 0;
cwang776 7:f65ab31f81e7 180 }
cwang776 7:f65ab31f81e7 181 }
cwang776 7:f65ab31f81e7 182
cwang776 7:f65ab31f81e7 183 inline void decrease_lives() {
cwang776 7:f65ab31f81e7 184 if (lives_leds == 7) {
cwang776 7:f65ab31f81e7 185 lives_leds = 3;
cwang776 7:f65ab31f81e7 186 } else if (lives_leds == 3) {
cwang776 7:f65ab31f81e7 187 lives_leds = 1;
cwang776 7:f65ab31f81e7 188 } else {
cwang776 7:f65ab31f81e7 189 lives_leds = 0;
cwang776 7:f65ab31f81e7 190 }
yjaafar3 2:002f2def130e 191 }