Threaded version of Herndon cover toss

Dependencies:   Servo Motor

Committer:
m215676
Date:
Tue Oct 23 01:00:41 2018 +0000
Revision:
5:226dfa7d6308
Parent:
4:5ba96337741c
Child:
6:f76e93f043e2
added LEDs

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.
evangeli 4:5ba96337741c 26 DigitalOut heartbeat_led(LED1); // indicates heartbeat
evangeli 4:5ba96337741c 27 DigitalOut aiming_led(LED2); // indicates aiming state
evangeli 4:5ba96337741c 28 DigitalOut firing_led(LED3); // indicates firing
evangeli 4:5ba96337741c 29 DigitalOut recycle_led(LED4); // indicates recycling
evangeli 0:047ab874a574 30
m215676 5:226dfa7d6308 31 DigitalOut LEDs[5]={p25, p26, p27, p28, p29}; // possible LEDs that can be lit
m215676 5:226dfa7d6308 32
evangeli 0:047ab874a574 33
evangeli 0:047ab874a574 34 // Herndon wiggling thread stuff
evangeli 0:047ab874a574 35 Thread herndon_thread; // thread to run Herndon in
evangeli 0:047ab874a574 36 void herndon_callback(void); // function for driving Herndon
evangeli 0:047ab874a574 37
evangeli 4:5ba96337741c 38 // Heartbeat indication thread
evangeli 4:5ba96337741c 39 Thread heartbeat_thread; // thread for heartbeat indication
evangeli 4:5ba96337741c 40 void heartbeat_callback(void); // function for heartbeat indication
evangeli 4:5ba96337741c 41
evangeli 4:5ba96337741c 42
evangeli 0:047ab874a574 43
evangeli 0:047ab874a574 44
evangeli 0:047ab874a574 45 /*
evangeli 4:5ba96337741c 46 Thread herndon_thread runs a proces to make Herndon Monument move continuously,
evangeli 4:5ba96337741c 47 as controlled by DigitalIn herndon_sw1.
evangeli 4:5ba96337741c 48
evangeli 4:5ba96337741c 49 Thread heartbeat_thread just blinks a light to know code is alive and running.
evangeli 0:047ab874a574 50
evangeli 4:5ba96337741c 51 The main() thread contains a loop that contains a state machine implementing the
evangeli 4:5ba96337741c 52 following states:
evangeli 4:5ba96337741c 53 1. aiming state: use Servo traverse_servo to turn the cover launch mechanism to
evangeli 4:5ba96337741c 54 match position of AnalogIn traverse_pot
evangeli 4:5ba96337741c 55
evangeli 4:5ba96337741c 56 2. firing state, entered when launch_sw3 is high: use launch_motor to launch cover
evangeli 4:5ba96337741c 57 3. recovery state, entered when recycle_sw4 is high: return back to battery
evangeli 4:5ba96337741c 58 Then goes back to aiming state.
evangeli 0:047ab874a574 59 */
evangeli 0:047ab874a574 60 int main(void)
evangeli 0:047ab874a574 61 {
evangeli 0:047ab874a574 62 // setup stuff
evangeli 0:047ab874a574 63 pc.printf("ES200 1121 Project 2 Group 3\r\n");
evangeli 0:047ab874a574 64 pc.printf("Herndon Cover Toss Game\r\n");
evangeli 0:047ab874a574 65 pc.printf("main() thread running\r\n");
evangeli 0:047ab874a574 66 herndon_servo.calibrate(0.0009, 90.0); // HiTec HS422 servo ES200/202 numbers
evangeli 4:5ba96337741c 67 traverse_servo.calibrate(0.0009, 90.0); // HiTec HS422 servo ES200/202 numbers
evangeli 4:5ba96337741c 68 launch_motor.speed(0.0);
evangeli 0:047ab874a574 69
evangeli 0:047ab874a574 70 // start the Herndon thread
evangeli 0:047ab874a574 71 herndon_thread.start(callback(herndon_callback));
evangeli 4:5ba96337741c 72
evangeli 4:5ba96337741c 73
evangeli 4:5ba96337741c 74 // start the heartbeat thread
evangeli 4:5ba96337741c 75 heartbeat_thread.start(callback(heartbeat_callback));
evangeli 4:5ba96337741c 76
evangeli 0:047ab874a574 77
evangeli 4:5ba96337741c 78 // main loop for user interaction goes here
evangeli 4:5ba96337741c 79 while(1){
evangeli 4:5ba96337741c 80
evangeli 4:5ba96337741c 81 // aiming state
evangeli 4:5ba96337741c 82 pc.printf("main() entering aiming mode, turn dial to aim cover\r\n");
evangeli 4:5ba96337741c 83 aiming_led.write(1);
evangeli 4:5ba96337741c 84 while(!launch_sw3.read()){
m215676 5:226dfa7d6308 85 LEDs[0] = 1;
evangeli 4:5ba96337741c 86 pc.printf("main() aiming, dial at %f, servo at %f\r\n",traverse_pot.read(),traverse_servo.read());
evangeli 4:5ba96337741c 87 traverse_servo.write(traverse_pot.read());
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);
m215676 5:226dfa7d6308 94 LEDs[1] = 1;
evangeli 4:5ba96337741c 95 pc.printf("main() thread entering cover launch sequence\r\n");
evangeli 4:5ba96337741c 96 pc.printf("main() thread motor launch cover\r\n");
evangeli 4:5ba96337741c 97 launch_motor.speed(1.0);
evangeli 4:5ba96337741c 98 ThisThread::sleep_for(400);
evangeli 4:5ba96337741c 99 pc.printf("main() thread motor off\r\n");
evangeli 4:5ba96337741c 100 launch_motor.speed(0.0);
evangeli 4:5ba96337741c 101 pc.printf("main() thread awaiting order to recycle\r\n");
evangeli 4:5ba96337741c 102 firing_led.write(0);
evangeli 4:5ba96337741c 103 while(!recycle_sw4.read()){
m215676 5:226dfa7d6308 104
evangeli 4:5ba96337741c 105 ThisThread::sleep_for(200);
evangeli 4:5ba96337741c 106 } // wait for user to
evangeli 4:5ba96337741c 107
evangeli 4:5ba96337741c 108 // recovery state
evangeli 4:5ba96337741c 109 recycle_led.write(1);
m215676 5:226dfa7d6308 110 LEDs[3] = 1;
evangeli 4:5ba96337741c 111 pc.printf("main() thread recycling catapult back to battery\r\n");
evangeli 4:5ba96337741c 112 pc.printf("main() thread motor reversing back to battery \r\n");
evangeli 4:5ba96337741c 113 launch_motor.speed(-0.25);
evangeli 4:5ba96337741c 114 ThisThread::sleep_for(600);
evangeli 4:5ba96337741c 115 pc.printf("main() thread motor off\r\n");
evangeli 4:5ba96337741c 116 launch_motor.speed(0.0);
evangeli 4:5ba96337741c 117 ThisThread::sleep_for(1000);
evangeli 4:5ba96337741c 118 pc.printf("main() thread back in battery\r\n");
evangeli 4:5ba96337741c 119 recycle_led.write(0);
evangeli 4:5ba96337741c 120
evangeli 4:5ba96337741c 121 }// while(1)
m215676 5:226dfa7d6308 122 LEDs[0] = 0;
m215676 5:226dfa7d6308 123 LEDs[1] = 0;
m215676 5:226dfa7d6308 124 LEDs[2] = 0;
m215676 5:226dfa7d6308 125 LEDs[3] = 0;
m215676 5:226dfa7d6308 126 LEDs[4] = 0;
m215676 5:226dfa7d6308 127
evangeli 4:5ba96337741c 128 } // main()
evangeli 0:047ab874a574 129
evangeli 0:047ab874a574 130
evangeli 0:047ab874a574 131
evangeli 4:5ba96337741c 132
evangeli 4:5ba96337741c 133
evangeli 4:5ba96337741c 134
evangeli 4:5ba96337741c 135
evangeli 0:047ab874a574 136
evangeli 0:047ab874a574 137
evangeli 0:047ab874a574 138
evangeli 0:047ab874a574 139 /** Callback for running Herndon wiggling thread as its own self-contained thing
evangeli 0:047ab874a574 140 */
evangeli 0:047ab874a574 141 void herndon_callback(void)
evangeli 0:047ab874a574 142 {
evangeli 4:5ba96337741c 143 // declare local variables
evangeli 0:047ab874a574 144 float x=0.0; // current position of Herndon
evangeli 0:047ab874a574 145 float xinc=0.1; // increment to move Herndon each time step
evangeli 0:047ab874a574 146
evangeli 4:5ba96337741c 147 // herndon_callback thread startup
evangeli 4:5ba96337741c 148 printf("herndon_thread running\r\n");
evangeli 4:5ba96337741c 149
evangeli 4:5ba96337741c 150 // herndon_thread loop here
evangeli 0:047ab874a574 151 while(1) {
evangeli 0:047ab874a574 152 if (herndon_sw1.read()) {
evangeli 4:5ba96337741c 153 x = x + xinc; // move
evangeli 0:047ab874a574 154 if (x > 1.0) {
evangeli 0:047ab874a574 155 x = 1.0;
evangeli 4:5ba96337741c 156 xinc = -0.1; // switch to moving left
evangeli 4:5ba96337741c 157 pc.printf("herndon_thread hit right end, now moving left\r\n");
evangeli 0:047ab874a574 158 } // hit the right end
m215676 5:226dfa7d6308 159 LEDs[4] = 1;
evangeli 0:047ab874a574 160 else if (x < 0.0) {
evangeli 0:047ab874a574 161 x = 0.0;
evangeli 4:5ba96337741c 162 xinc = 0.1; // switch to moving right
evangeli 4:5ba96337741c 163 pc.printf("herndon_thread hit left end, now moving right\r\n");
evangeli 0:047ab874a574 164 } // hit the left end
evangeli 4:5ba96337741c 165
evangeli 0:047ab874a574 166 herndon_servo.write(x);
evangeli 4:5ba96337741c 167 pc.printf("herndon_thread herndon_servo at %f\r\n",x);
evangeli 0:047ab874a574 168 } // s1 is on
evangeli 0:047ab874a574 169
evangeli 0:047ab874a574 170 else {
evangeli 0:047ab874a574 171 herndon_servo.write(0.0);
evangeli 4:5ba96337741c 172 pc.printf("herndon_thread herndon_servo at %f\r\n",x);
evangeli 4:5ba96337741c 173
evangeli 4:5ba96337741c 174
evangeli 0:047ab874a574 175 } // s1 if off
evangeli 0:047ab874a574 176
evangeli 0:047ab874a574 177 ThisThread::sleep_for(200); // change this number if too fast or too slow
evangeli 0:047ab874a574 178 } // while(1)
evangeli 0:047ab874a574 179
evangeli 4:5ba96337741c 180 }// herndon_callback()
evangeli 4:5ba96337741c 181
evangeli 4:5ba96337741c 182
evangeli 4:5ba96337741c 183 /** Callback for heartbeat indication to indicate program is alive
evangeli 4:5ba96337741c 184 */
evangeli 4:5ba96337741c 185 void heartbeat_callback(void)
evangeli 4:5ba96337741c 186 {
evangeli 4:5ba96337741c 187 // heartbeat_thread startup
evangeli 4:5ba96337741c 188 pc.printf("heartbeat_thread running\r\n");
evangeli 4:5ba96337741c 189
evangeli 4:5ba96337741c 190 // heartbeat_thread loop here
evangeli 4:5ba96337741c 191 while(1) {
m215676 5:226dfa7d6308 192 LEDs[2] = 1;
evangeli 4:5ba96337741c 193 heartbeat_led = !heartbeat_led;
evangeli 4:5ba96337741c 194 ThisThread::sleep_for(500);
evangeli 4:5ba96337741c 195 } // while(1)
evangeli 4:5ba96337741c 196 } // heartbeat_callback()