Threaded version of Herndon cover toss

Dependencies:   Servo Motor

Committer:
nhersom
Date:
Mon Nov 05 12:53:56 2018 +0000
Revision:
6:f76e93f043e2
Parent:
5:226dfa7d6308
Final code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
evangeli 0:047ab874a574 1 /*
evangeli 0:047ab874a574 2 ES200 1121 Project 2 Herndon Cover Toss - threaded version
evangeli 0:047ab874a574 3 Get threaded!
evangeli 4:5ba96337741c 4 MIDN 3/c Roach, Duffey, Marasco, Zaharakis, Hersom
evangeli 0:047ab874a574 5 */
evangeli 0:047ab874a574 6
evangeli 4:5ba96337741c 7 #include "mbed.h" // note this code uses mbed OS 5
evangeli 0:047ab874a574 8 #include "rtos.h"
evangeli 0:047ab874a574 9 #include "stdio.h"
evangeli 0:047ab874a574 10 #include "Motor.h"
evangeli 0:047ab874a574 11 #include "Servo.h"
evangeli 0:047ab874a574 12
evangeli 0:047ab874a574 13
evangeli 0:047ab874a574 14 // Connections to hardware defined here
evangeli 0:047ab874a574 15 Serial pc(USBTX,USBRX); // connection to laptop for debugging
evangeli 4:5ba96337741c 16 Motor launch_motor(p26, p30, p29); //launches the cover
m215676 3:65416d9052dd 17 Servo herndon_servo(p23); //servo to move monument on turn table
evangeli 4:5ba96337741c 18 Servo traverse_servo(p22); //servo to adjust horizontal angle of arm
m215676 3:65416d9052dd 19 DigitalIn herndon_sw1(p17); //moves herndon monument on turn table continuously while switch is on
evangeli 4:5ba96337741c 20 AnalogIn traverse_pot(p16); //turn dial to adjust servo for horizontal angle of arm SWITCH 2
evangeli 4:5ba96337741c 21 DigitalIn launch_sw3(p18); //releases the cover when switch 3 is turned on
evangeli 4:5ba96337741c 22 DigitalIn recycle_sw4(p19); //retracts arm back to starting position to try again
evangeli 0:047ab874a574 23 //DigitalIn sw1 (p16) ; not sure why this is here - maybe broken pin
evangeli 0:047ab874a574 24
evangeli 4:5ba96337741c 25 // You guys are supposed to include at least a few EXTERNAL leds.
nhersom 6:f76e93f043e2 26 DigitalOut heartbeat_led(p5); // indicates heartbeat
nhersom 6:f76e93f043e2 27 DigitalOut aiming_led(p6); // indicates aiming state
nhersom 6:f76e93f043e2 28 DigitalOut firing_led(p7); // indicates firing
nhersom 6:f76e93f043e2 29 DigitalOut recycle_led(p8); // indicates recycling
evangeli 0:047ab874a574 30
m215676 5:226dfa7d6308 31
evangeli 0:047ab874a574 32
evangeli 0:047ab874a574 33 // Herndon wiggling thread stuff
evangeli 0:047ab874a574 34 Thread herndon_thread; // thread to run Herndon in
evangeli 0:047ab874a574 35 void herndon_callback(void); // function for driving Herndon
evangeli 0:047ab874a574 36
evangeli 4:5ba96337741c 37 // Heartbeat indication thread
evangeli 4:5ba96337741c 38 Thread heartbeat_thread; // thread for heartbeat indication
evangeli 4:5ba96337741c 39 void heartbeat_callback(void); // function for heartbeat indication
evangeli 4:5ba96337741c 40
evangeli 4:5ba96337741c 41
evangeli 0:047ab874a574 42
evangeli 0:047ab874a574 43
evangeli 0:047ab874a574 44 /*
evangeli 4:5ba96337741c 45 Thread herndon_thread runs a proces to make Herndon Monument move continuously,
evangeli 4:5ba96337741c 46 as controlled by DigitalIn herndon_sw1.
evangeli 4:5ba96337741c 47
evangeli 4:5ba96337741c 48 Thread heartbeat_thread just blinks a light to know code is alive and running.
evangeli 0:047ab874a574 49
evangeli 4:5ba96337741c 50 The main() thread contains a loop that contains a state machine implementing the
evangeli 4:5ba96337741c 51 following states:
evangeli 4:5ba96337741c 52 1. aiming state: use Servo traverse_servo to turn the cover launch mechanism to
evangeli 4:5ba96337741c 53 match position of AnalogIn traverse_pot
evangeli 4:5ba96337741c 54
evangeli 4:5ba96337741c 55 2. firing state, entered when launch_sw3 is high: use launch_motor to launch cover
evangeli 4:5ba96337741c 56 3. recovery state, entered when recycle_sw4 is high: return back to battery
evangeli 4:5ba96337741c 57 Then goes back to aiming state.
evangeli 0:047ab874a574 58 */
evangeli 0:047ab874a574 59 int main(void)
evangeli 0:047ab874a574 60 {
evangeli 0:047ab874a574 61 // setup stuff
evangeli 0:047ab874a574 62 pc.printf("ES200 1121 Project 2 Group 3\r\n");
evangeli 0:047ab874a574 63 pc.printf("Herndon Cover Toss Game\r\n");
evangeli 0:047ab874a574 64 pc.printf("main() thread running\r\n");
evangeli 0:047ab874a574 65 herndon_servo.calibrate(0.0009, 90.0); // HiTec HS422 servo ES200/202 numbers
evangeli 4:5ba96337741c 66 traverse_servo.calibrate(0.0009, 90.0); // HiTec HS422 servo ES200/202 numbers
evangeli 4:5ba96337741c 67 launch_motor.speed(0.0);
evangeli 0:047ab874a574 68
evangeli 0:047ab874a574 69 // start the Herndon thread
evangeli 0:047ab874a574 70 herndon_thread.start(callback(herndon_callback));
evangeli 4:5ba96337741c 71
evangeli 4:5ba96337741c 72
evangeli 4:5ba96337741c 73 // start the heartbeat thread
evangeli 4:5ba96337741c 74 heartbeat_thread.start(callback(heartbeat_callback));
evangeli 4:5ba96337741c 75
evangeli 0:047ab874a574 76
evangeli 4:5ba96337741c 77 // main loop for user interaction goes here
evangeli 4:5ba96337741c 78 while(1){
evangeli 4:5ba96337741c 79
evangeli 4:5ba96337741c 80 // aiming state
evangeli 4:5ba96337741c 81 pc.printf("main() entering aiming mode, turn dial to aim cover\r\n");
evangeli 4:5ba96337741c 82 aiming_led.write(1);
evangeli 4:5ba96337741c 83 while(!launch_sw3.read()){
nhersom 6:f76e93f043e2 84 printf("traverse_pot.read()");
evangeli 4:5ba96337741c 85 pc.printf("main() aiming, dial at %f, servo at %f\r\n",traverse_pot.read(),traverse_servo.read());
evangeli 4:5ba96337741c 86 traverse_servo.write(traverse_pot.read());
nhersom 6:f76e93f043e2 87
evangeli 4:5ba96337741c 88 ThisThread::sleep_for(200);
evangeli 4:5ba96337741c 89 }
evangeli 4:5ba96337741c 90 aiming_led.write(0);
evangeli 4:5ba96337741c 91
evangeli 4:5ba96337741c 92 // firing state
evangeli 4:5ba96337741c 93 firing_led.write(1);
evangeli 4:5ba96337741c 94 pc.printf("main() thread entering cover launch sequence\r\n");
evangeli 4:5ba96337741c 95 pc.printf("main() thread motor launch cover\r\n");
nhersom 6:f76e93f043e2 96 launch_motor.speed(-1.0);
evangeli 4:5ba96337741c 97 ThisThread::sleep_for(400);
evangeli 4:5ba96337741c 98 pc.printf("main() thread motor off\r\n");
evangeli 4:5ba96337741c 99 launch_motor.speed(0.0);
evangeli 4:5ba96337741c 100 pc.printf("main() thread awaiting order to recycle\r\n");
evangeli 4:5ba96337741c 101 firing_led.write(0);
evangeli 4:5ba96337741c 102 while(!recycle_sw4.read()){
m215676 5:226dfa7d6308 103
evangeli 4:5ba96337741c 104 ThisThread::sleep_for(200);
evangeli 4:5ba96337741c 105 } // wait for user to
evangeli 4:5ba96337741c 106
evangeli 4:5ba96337741c 107 // recovery state
evangeli 4:5ba96337741c 108 recycle_led.write(1);
evangeli 4:5ba96337741c 109 pc.printf("main() thread recycling catapult back to battery\r\n");
evangeli 4:5ba96337741c 110 pc.printf("main() thread motor reversing back to battery \r\n");
nhersom 6:f76e93f043e2 111 launch_motor.speed(0.25);
evangeli 4:5ba96337741c 112 ThisThread::sleep_for(600);
evangeli 4:5ba96337741c 113 pc.printf("main() thread motor off\r\n");
evangeli 4:5ba96337741c 114 launch_motor.speed(0.0);
evangeli 4:5ba96337741c 115 ThisThread::sleep_for(1000);
evangeli 4:5ba96337741c 116 pc.printf("main() thread back in battery\r\n");
evangeli 4:5ba96337741c 117 recycle_led.write(0);
evangeli 4:5ba96337741c 118 }// while(1)
nhersom 6:f76e93f043e2 119
m215676 5:226dfa7d6308 120
evangeli 4:5ba96337741c 121 } // main()
evangeli 0:047ab874a574 122
evangeli 0:047ab874a574 123
evangeli 0:047ab874a574 124
evangeli 4:5ba96337741c 125
evangeli 4:5ba96337741c 126
evangeli 4:5ba96337741c 127
evangeli 4:5ba96337741c 128
evangeli 0:047ab874a574 129
evangeli 0:047ab874a574 130
evangeli 0:047ab874a574 131
evangeli 0:047ab874a574 132 /** Callback for running Herndon wiggling thread as its own self-contained thing
evangeli 0:047ab874a574 133 */
evangeli 0:047ab874a574 134 void herndon_callback(void)
evangeli 0:047ab874a574 135 {
evangeli 4:5ba96337741c 136 // declare local variables
evangeli 0:047ab874a574 137 float x=0.0; // current position of Herndon
evangeli 0:047ab874a574 138 float xinc=0.1; // increment to move Herndon each time step
evangeli 0:047ab874a574 139
evangeli 4:5ba96337741c 140 // herndon_callback thread startup
evangeli 4:5ba96337741c 141 printf("herndon_thread running\r\n");
evangeli 4:5ba96337741c 142
evangeli 4:5ba96337741c 143 // herndon_thread loop here
evangeli 0:047ab874a574 144 while(1) {
evangeli 0:047ab874a574 145 if (herndon_sw1.read()) {
evangeli 4:5ba96337741c 146 x = x + xinc; // move
evangeli 0:047ab874a574 147 if (x > 1.0) {
evangeli 0:047ab874a574 148 x = 1.0;
evangeli 4:5ba96337741c 149 xinc = -0.1; // switch to moving left
evangeli 4:5ba96337741c 150 pc.printf("herndon_thread hit right end, now moving left\r\n");
nhersom 6:f76e93f043e2 151
evangeli 0:047ab874a574 152 } // hit the right end
nhersom 6:f76e93f043e2 153
evangeli 0:047ab874a574 154 else if (x < 0.0) {
evangeli 0:047ab874a574 155 x = 0.0;
evangeli 4:5ba96337741c 156 xinc = 0.1; // switch to moving right
evangeli 4:5ba96337741c 157 pc.printf("herndon_thread hit left end, now moving right\r\n");
evangeli 0:047ab874a574 158 } // hit the left end
evangeli 4:5ba96337741c 159
evangeli 0:047ab874a574 160 herndon_servo.write(x);
evangeli 4:5ba96337741c 161 pc.printf("herndon_thread herndon_servo at %f\r\n",x);
evangeli 0:047ab874a574 162 } // s1 is on
evangeli 0:047ab874a574 163
evangeli 0:047ab874a574 164 else {
evangeli 0:047ab874a574 165 herndon_servo.write(0.0);
evangeli 4:5ba96337741c 166 pc.printf("herndon_thread herndon_servo at %f\r\n",x);
evangeli 4:5ba96337741c 167
evangeli 4:5ba96337741c 168
evangeli 0:047ab874a574 169 } // s1 if off
evangeli 0:047ab874a574 170
evangeli 0:047ab874a574 171 ThisThread::sleep_for(200); // change this number if too fast or too slow
evangeli 0:047ab874a574 172 } // while(1)
evangeli 0:047ab874a574 173
evangeli 4:5ba96337741c 174 }// herndon_callback()
evangeli 4:5ba96337741c 175
evangeli 4:5ba96337741c 176
evangeli 4:5ba96337741c 177 /** Callback for heartbeat indication to indicate program is alive
evangeli 4:5ba96337741c 178 */
evangeli 4:5ba96337741c 179 void heartbeat_callback(void)
evangeli 4:5ba96337741c 180 {
evangeli 4:5ba96337741c 181 // heartbeat_thread startup
evangeli 4:5ba96337741c 182 pc.printf("heartbeat_thread running\r\n");
evangeli 4:5ba96337741c 183
evangeli 4:5ba96337741c 184 // heartbeat_thread loop here
evangeli 4:5ba96337741c 185 while(1) {
evangeli 4:5ba96337741c 186 heartbeat_led = !heartbeat_led;
evangeli 4:5ba96337741c 187 ThisThread::sleep_for(500);
evangeli 4:5ba96337741c 188 } // while(1)
evangeli 4:5ba96337741c 189 } // heartbeat_callback()