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@5:e5bf798e0522, 2022-11-16 (annotated)
- Committer:
- bzhu792
- Date:
- Wed Nov 16 00:12:04 2022 +0000
- Revision:
- 5:e5bf798e0522
- Parent:
- 3:9febeec1f271
- Child:
- 7:f65ab31f81e7
Wheel works but not turret at the same time
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 | |
| yjaafar3 | 2:002f2def130e | 13 | volatile float speed_left = 0; |
| yjaafar3 | 2:002f2def130e | 14 | volatile float speed_right = 0; |
| yjaafar3 | 2:002f2def130e | 15 | volatile float turret_delta = 0; |
| yjaafar3 | 2:002f2def130e | 16 | volatile bool fire = false; |
| cwang776 | 0:16c007acb3a2 | 17 | |
| cwang776 | 0:16c007acb3a2 | 18 | |
| yjaafar3 | 2:002f2def130e | 19 | Thread thread_drive; |
| yjaafar3 | 2:002f2def130e | 20 | Thread thread_turret; |
| yjaafar3 | 2:002f2def130e | 21 | Thread thread_fire; |
| yjaafar3 | 2:002f2def130e | 22 | |
| yjaafar3 | 2:002f2def130e | 23 | void input_loop(); |
| bzhu792 | 5:e5bf798e0522 | 24 | inline void set_speed(float l, float r); |
| bzhu792 | 5:e5bf798e0522 | 25 | inline void set_turret_delta(float delta); |
| bzhu792 | 5:e5bf798e0522 | 26 | inline void fire_cannon(bool f); |
| yjaafar3 | 2:002f2def130e | 27 | |
| yjaafar3 | 2:002f2def130e | 28 | void input_thread() { |
| yjaafar3 | 2:002f2def130e | 29 | |
| cwang776 | 0:16c007acb3a2 | 30 | } |
| cwang776 | 0:16c007acb3a2 | 31 | |
| yjaafar3 | 2:002f2def130e | 32 | void drive_thread() { |
| bzhu792 | 5:e5bf798e0522 | 33 | while (1) { |
| bzhu792 | 5:e5bf798e0522 | 34 | |
| bzhu792 | 5:e5bf798e0522 | 35 | left_motor.speed(speed_left); |
| bzhu792 | 5:e5bf798e0522 | 36 | right_motor.speed(speed_right); |
| bzhu792 | 5:e5bf798e0522 | 37 | //pc.printf("left speed: %f, right speed: %f\n", speed_left, speed_right); |
| bzhu792 | 5:e5bf798e0522 | 38 | Thread::wait(100); |
| bzhu792 | 5:e5bf798e0522 | 39 | } |
| yjaafar3 | 2:002f2def130e | 40 | } |
| cwang776 | 0:16c007acb3a2 | 41 | |
| yjaafar3 | 2:002f2def130e | 42 | void turret_thread() { |
| bzhu792 | 5:e5bf798e0522 | 43 | float pulsewidth = 0.0015; // servo is between 1 ms and 2 ms |
| bzhu792 | 5:e5bf798e0522 | 44 | |
| yjaafar3 | 3:9febeec1f271 | 45 | while (1) { |
| bzhu792 | 5:e5bf798e0522 | 46 | servo.period(0.020); // servo requires a 20ms period |
| bzhu792 | 5:e5bf798e0522 | 47 | pulsewidth += turret_delta; |
| bzhu792 | 5:e5bf798e0522 | 48 | if (pulsewidth > 0.002) pulsewidth = 0.002; |
| bzhu792 | 5:e5bf798e0522 | 49 | else if (pulsewidth < 0.001) pulsewidth = 0.001; |
| bzhu792 | 5:e5bf798e0522 | 50 | servo.pulsewidth(pulsewidth); |
| bzhu792 | 5:e5bf798e0522 | 51 | |
| yjaafar3 | 3:9febeec1f271 | 52 | Thread::wait(50); |
| yjaafar3 | 3:9febeec1f271 | 53 | } |
| cwang776 | 0:16c007acb3a2 | 54 | } |
| yjaafar3 | 2:002f2def130e | 55 | |
| yjaafar3 | 2:002f2def130e | 56 | void fire_thread() { |
| yjaafar3 | 2:002f2def130e | 57 | |
| yjaafar3 | 2:002f2def130e | 58 | } |
| yjaafar3 | 2:002f2def130e | 59 | |
| cwang776 | 0:16c007acb3a2 | 60 | |
| cwang776 | 0:16c007acb3a2 | 61 | int main() { |
| yjaafar3 | 2:002f2def130e | 62 | thread_drive.start(drive_thread); |
| bzhu792 | 5:e5bf798e0522 | 63 | //thread_turret.start(turret_thread); |
| yjaafar3 | 2:002f2def130e | 64 | thread_fire.start(fire_thread); |
| yjaafar3 | 2:002f2def130e | 65 | |
| yjaafar3 | 2:002f2def130e | 66 | input_loop(); |
| cwang776 | 0:16c007acb3a2 | 67 | } |
| yjaafar3 | 2:002f2def130e | 68 | |
| yjaafar3 | 2:002f2def130e | 69 | void input_loop() { |
| yjaafar3 | 2:002f2def130e | 70 | char bnum=0; |
| yjaafar3 | 2:002f2def130e | 71 | char bhit=0; |
| yjaafar3 | 2:002f2def130e | 72 | while(1) { |
| yjaafar3 | 2:002f2def130e | 73 | if (blue.getc()=='!') { |
| yjaafar3 | 2:002f2def130e | 74 | if (blue.getc()=='B') { //button data packet |
| yjaafar3 | 2:002f2def130e | 75 | bnum = blue.getc(); //button number |
| yjaafar3 | 2:002f2def130e | 76 | bhit = blue.getc(); //1=hit, 0=release |
| yjaafar3 | 2:002f2def130e | 77 | if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK? |
| yjaafar3 | 2:002f2def130e | 78 | switch(bnum) { |
| yjaafar3 | 2:002f2def130e | 79 | case '1': //Turret Left Button |
| yjaafar3 | 2:002f2def130e | 80 | if (bhit == '1') { |
| bzhu792 | 5:e5bf798e0522 | 81 | set_turret_delta(-0.000025); |
| yjaafar3 | 2:002f2def130e | 82 | } else { |
| yjaafar3 | 2:002f2def130e | 83 | set_turret_delta(0); |
| yjaafar3 | 2:002f2def130e | 84 | } |
| yjaafar3 | 2:002f2def130e | 85 | break; |
| yjaafar3 | 2:002f2def130e | 86 | case '2': //Turret Right Button |
| yjaafar3 | 2:002f2def130e | 87 | if (bhit == '1') { |
| bzhu792 | 5:e5bf798e0522 | 88 | set_turret_delta(0.000025); |
| yjaafar3 | 2:002f2def130e | 89 | } else { |
| yjaafar3 | 2:002f2def130e | 90 | set_turret_delta(0); |
| yjaafar3 | 2:002f2def130e | 91 | } |
| yjaafar3 | 2:002f2def130e | 92 | break; |
| yjaafar3 | 2:002f2def130e | 93 | case '3': //Fire Button |
| yjaafar3 | 2:002f2def130e | 94 | if (bhit == '1') { |
| yjaafar3 | 2:002f2def130e | 95 | fire_cannon(true); |
| yjaafar3 | 2:002f2def130e | 96 | } else { |
| yjaafar3 | 2:002f2def130e | 97 | fire_cannon(false); |
| yjaafar3 | 2:002f2def130e | 98 | } |
| yjaafar3 | 2:002f2def130e | 99 | break; |
| yjaafar3 | 2:002f2def130e | 100 | case '5': //button 5 up arrow |
| yjaafar3 | 2:002f2def130e | 101 | if (bhit=='1') { |
| yjaafar3 | 2:002f2def130e | 102 | set_speed(0.5, 0.5); |
| yjaafar3 | 2:002f2def130e | 103 | } else { |
| yjaafar3 | 2:002f2def130e | 104 | set_speed(0, 0); |
| yjaafar3 | 2:002f2def130e | 105 | } |
| yjaafar3 | 2:002f2def130e | 106 | break; |
| yjaafar3 | 2:002f2def130e | 107 | case '6': //button 6 down arrow |
| yjaafar3 | 2:002f2def130e | 108 | if (bhit=='1') { |
| yjaafar3 | 2:002f2def130e | 109 | set_speed(-0.5, -0.5); |
| yjaafar3 | 2:002f2def130e | 110 | } else { |
| yjaafar3 | 2:002f2def130e | 111 | set_speed(0, 0); |
| yjaafar3 | 2:002f2def130e | 112 | } |
| yjaafar3 | 2:002f2def130e | 113 | break; |
| yjaafar3 | 2:002f2def130e | 114 | case '7': //button 7 left arrow |
| yjaafar3 | 2:002f2def130e | 115 | if (bhit=='1') { |
| yjaafar3 | 2:002f2def130e | 116 | set_speed(-0.5, 0.5); |
| yjaafar3 | 2:002f2def130e | 117 | } else { |
| yjaafar3 | 2:002f2def130e | 118 | set_speed(0, 0); |
| yjaafar3 | 2:002f2def130e | 119 | } |
| yjaafar3 | 2:002f2def130e | 120 | break; |
| yjaafar3 | 2:002f2def130e | 121 | case '8': //button 8 right arrow |
| yjaafar3 | 2:002f2def130e | 122 | if (bhit=='1') { |
| yjaafar3 | 2:002f2def130e | 123 | set_speed(0.5, -0.5); |
| yjaafar3 | 2:002f2def130e | 124 | } else { |
| yjaafar3 | 2:002f2def130e | 125 | set_speed(0, 0); |
| yjaafar3 | 2:002f2def130e | 126 | } |
| yjaafar3 | 2:002f2def130e | 127 | break; |
| yjaafar3 | 2:002f2def130e | 128 | default: |
| yjaafar3 | 2:002f2def130e | 129 | break; |
| yjaafar3 | 2:002f2def130e | 130 | } |
| yjaafar3 | 2:002f2def130e | 131 | } |
| yjaafar3 | 2:002f2def130e | 132 | } |
| yjaafar3 | 2:002f2def130e | 133 | } |
| yjaafar3 | 3:9febeec1f271 | 134 | Thread::wait(50); |
| yjaafar3 | 2:002f2def130e | 135 | } |
| yjaafar3 | 2:002f2def130e | 136 | } |
| yjaafar3 | 2:002f2def130e | 137 | |
| bzhu792 | 5:e5bf798e0522 | 138 | inline void set_speed(float left, float right) { |
| yjaafar3 | 2:002f2def130e | 139 | speed_left = left; |
| yjaafar3 | 2:002f2def130e | 140 | speed_right = right; |
| yjaafar3 | 2:002f2def130e | 141 | } |
| yjaafar3 | 2:002f2def130e | 142 | |
| bzhu792 | 5:e5bf798e0522 | 143 | inline void set_turret_delta(float delta) { |
| yjaafar3 | 2:002f2def130e | 144 | turret_delta = delta; |
| yjaafar3 | 2:002f2def130e | 145 | } |
| yjaafar3 | 2:002f2def130e | 146 | |
| bzhu792 | 5:e5bf798e0522 | 147 | inline void fire_cannon(bool f) { |
| yjaafar3 | 2:002f2def130e | 148 | fire = f; |
| yjaafar3 | 2:002f2def130e | 149 | } |
