Threaded version of Herndon cover toss

Dependencies:   Servo Motor

Committer:
evangeli
Date:
Mon Oct 22 12:22:52 2018 +0000
Revision:
0:047ab874a574
Child:
3:65416d9052dd
Initial commit - herndon thread test

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 0:047ab874a574 4 */
evangeli 0:047ab874a574 5
evangeli 0:047ab874a574 6 #include "mbed.h"
evangeli 0:047ab874a574 7 #include "rtos.h"
evangeli 0:047ab874a574 8
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 0:047ab874a574 16 Motor m(p26, p30, p29); //launches the cover
evangeli 0:047ab874a574 17 Servo herndon_servo(p21); //servo to move monument on turn table
evangeli 0:047ab874a574 18 Servo angle(p22); //servo to adjust horizontal angle of arm
evangeli 0:047ab874a574 19 DigitalIn herndon_sw1(p25); //moves herndon monument on turn table continuously while switch is on
evangeli 0:047ab874a574 20 AnalogIn turn(p15); //turn dial to adjust servo for horizontal angle of arm SWITCH 2
evangeli 0:047ab874a574 21 DigitalIn swtch3(p18); //releases the cover when switch 3 is turned on
evangeli 0:047ab874a574 22 DigitalIn swtch4(p19); //retracts arm back to starting position to try again
evangeli 0:047ab874a574 23
evangeli 0:047ab874a574 24 //DigitalIn sw1 (p16) ; not sure why this is here - maybe broken pin
evangeli 0:047ab874a574 25
evangeli 0:047ab874a574 26 // other variables
evangeli 0:047ab874a574 27 int s1, s3, s4, i;
evangeli 0:047ab874a574 28 float x;
evangeli 0:047ab874a574 29 float y;
evangeli 0:047ab874a574 30
evangeli 0:047ab874a574 31
evangeli 0:047ab874a574 32 // Herndon wiggling thread stuff
evangeli 0:047ab874a574 33 Thread herndon_thread; // thread to run Herndon in
evangeli 0:047ab874a574 34 void herndon_callback(void); // function for driving Herndon
evangeli 0:047ab874a574 35
evangeli 0:047ab874a574 36
evangeli 0:047ab874a574 37
evangeli 0:047ab874a574 38 /*
evangeli 0:047ab874a574 39 One thread:
evangeli 0:047ab874a574 40 herndon sw Switch 1 - turns on and makes the herndon monument move continously
evangeli 0:047ab874a574 41
evangeli 0:047ab874a574 42 Analog in turn - for aiming
evangeli 0:047ab874a574 43 Switch 3 - release cover
evangeli 0:047ab874a574 44 Switch 4 - back to battery (only after relase)
evangeli 0:047ab874a574 45 */
evangeli 0:047ab874a574 46
evangeli 0:047ab874a574 47
evangeli 0:047ab874a574 48 int main(void)
evangeli 0:047ab874a574 49 {
evangeli 0:047ab874a574 50 // setup stuff
evangeli 0:047ab874a574 51 pc.printf("ES200 1121 Project 2 Group 3\r\n");
evangeli 0:047ab874a574 52 pc.printf("Herndon Cover Toss Game\r\n");
evangeli 0:047ab874a574 53 pc.printf("main() thread running\r\n");
evangeli 0:047ab874a574 54 herndon_servo.calibrate(0.0009, 90.0); // HiTec HS422 servo ES200/202 numbers
evangeli 0:047ab874a574 55 angle.calibrate(0.0009, 90.0); // HiTec HS422 servo ES200/202 numbers
evangeli 0:047ab874a574 56 m.speed(0.0);
evangeli 0:047ab874a574 57
evangeli 0:047ab874a574 58 // start the Herndon thread
evangeli 0:047ab874a574 59 herndon_thread.start(callback(herndon_callback));
evangeli 0:047ab874a574 60 pc.printf("herndon_thread running\r\n");
evangeli 0:047ab874a574 61
evangeli 0:047ab874a574 62
evangeli 0:047ab874a574 63
evangeli 0:047ab874a574 64
evangeli 0:047ab874a574 65 // main loop for user interaction goes here
evangeli 0:047ab874a574 66 } // main()
evangeli 0:047ab874a574 67
evangeli 0:047ab874a574 68
evangeli 0:047ab874a574 69
evangeli 0:047ab874a574 70 /*
evangeli 0:047ab874a574 71 //Adjust horiztonal angle with switch 2/dial
evangeli 0:047ab874a574 72 while(1) {
evangeli 0:047ab874a574 73 y = turn.read(); //reads the state of the dial the user changes
evangeli 0:047ab874a574 74 printf("The dial is at %f\n", x);
evangeli 0:047ab874a574 75 angle.write(y); //makes the servo turn according to the dial
evangeli 0:047ab874a574 76 printf("The servo is at %f\n", x);
evangeli 0:047ab874a574 77 } //end of while loop
evangeli 0:047ab874a574 78
evangeli 0:047ab874a574 79
evangeli 0:047ab874a574 80
evangeli 0:047ab874a574 81 swtch3.read(); //read state of switch 3 (launch the cover)
evangeli 0:047ab874a574 82 if (swtch3==1) {
evangeli 0:047ab874a574 83 while(1) {
evangeli 0:047ab874a574 84 printf("motor on");
evangeli 0:047ab874a574 85 m.speed(1.0);
evangeli 0:047ab874a574 86 wait (.4);
evangeli 0:047ab874a574 87 printf("motor off");
evangeli 0:047ab874a574 88 m.speed(0.0);
evangeli 0:047ab874a574 89 wait (1);
evangeli 0:047ab874a574 90 break;
evangeli 0:047ab874a574 91 } //end of while
evangeli 0:047ab874a574 92 } //end of if
evangeli 0:047ab874a574 93
evangeli 0:047ab874a574 94
evangeli 0:047ab874a574 95
evangeli 0:047ab874a574 96
evangeli 0:047ab874a574 97 s4 = swtch4.read(); //read state of switch 4 (retract arm to try again)
evangeli 0:047ab874a574 98 if (s4 == 1){
evangeli 0:047ab874a574 99 while(1) {
evangeli 0:047ab874a574 100 printf("reversed");
evangeli 0:047ab874a574 101 m.speed(-.25);
evangeli 0:047ab874a574 102 wait(.6);
evangeli 0:047ab874a574 103 printf("motor off");
evangeli 0:047ab874a574 104 m.speed(0);
evangeli 0:047ab874a574 105 wait(1);
evangeli 0:047ab874a574 106 break;
evangeli 0:047ab874a574 107 } //end of while
evangeli 0:047ab874a574 108 } //end of if
evangeli 0:047ab874a574 109 }//end of int main
evangeli 0:047ab874a574 110 */
evangeli 0:047ab874a574 111
evangeli 0:047ab874a574 112
evangeli 0:047ab874a574 113
evangeli 0:047ab874a574 114
evangeli 0:047ab874a574 115 /** Callback for running Herndon wiggling thread as its own self-contained thing
evangeli 0:047ab874a574 116 */
evangeli 0:047ab874a574 117 void herndon_callback(void)
evangeli 0:047ab874a574 118 {
evangeli 0:047ab874a574 119 float x=0.0; // current position of Herndon
evangeli 0:047ab874a574 120 float xinc=0.1; // increment to move Herndon each time step
evangeli 0:047ab874a574 121
evangeli 0:047ab874a574 122 while(1) {
evangeli 0:047ab874a574 123 if (herndon_sw1.read()) {
evangeli 0:047ab874a574 124 x = x + xinc;
evangeli 0:047ab874a574 125 if (x > 1.0) {
evangeli 0:047ab874a574 126 x = 1.0;
evangeli 0:047ab874a574 127 xinc = -0.1;
evangeli 0:047ab874a574 128 } // hit the right end
evangeli 0:047ab874a574 129 else if (x < 0.0) {
evangeli 0:047ab874a574 130 x = 0.0;
evangeli 0:047ab874a574 131 xinc = 0.1;
evangeli 0:047ab874a574 132 } // hit the left end
evangeli 0:047ab874a574 133 herndon_servo.write(x);
evangeli 0:047ab874a574 134 } // s1 is on
evangeli 0:047ab874a574 135
evangeli 0:047ab874a574 136 else {
evangeli 0:047ab874a574 137 herndon_servo.write(0.0);
evangeli 0:047ab874a574 138 } // s1 if off
evangeli 0:047ab874a574 139
evangeli 0:047ab874a574 140 ThisThread::sleep_for(200); // change this number if too fast or too slow
evangeli 0:047ab874a574 141 } // while(1)
evangeli 0:047ab874a574 142
evangeli 0:047ab874a574 143 }// herndon_callback()