Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed-rtos mbed Servo Motor SoftPWM
main.cpp@7:f65ab31f81e7, 2022-11-16 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |
