High Altitude Recovery Payload
HARP: High Altitude Recovery Payload
Information
Version 0.1: RC design
By connecting the second xbee to a computer using a terminal command and supplying the characters L, R, C, F the light patterns change on the mbed.
Diff: main.cpp
- Revision:
- 7:fcbf263a62b9
- Parent:
- 6:2bd373ba18ae
- Child:
- 8:513b31554e5f
diff -r 2bd373ba18ae -r fcbf263a62b9 main.cpp --- a/main.cpp Tue Aug 07 16:03:45 2012 +0000 +++ b/main.cpp Mon Oct 15 22:07:07 2012 +0000 @@ -16,44 +16,40 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #include "mbed.h" #include "rtos.h" #include "watchdog.h" +#include "Servo.h" + +#define CENTER 'C' +#define LEFT 'L' +#define RIGHT 'R' // Setup the watchdog timer Watchdog wdt; -// xbee serial connection -Serial xbee(p13,p14); - // status leds BusOut status_led(LED4, LED3, LED2, LED1); typedef struct { char msg; // the direction to turn in -} message_xbee; - -enum state_p { LEFT, CENTER, RIGHT }; +} messageXbeeT; -typedef struct { - state_p state; -} message_para; - -MemoryPool<message_para, 16> mpool_para; -Queue<message_para, 16> queue_para; - -MemoryPool<message_xbee, 16> mpool_xbee; -Queue<message_xbee, 16> queue_xbee; +MemoryPool<messageXbeeT, 16> mpool_xbee; +Queue<messageXbeeT, 16> queue_xbee; /** * xbee_thread * this thread reads characters from the xbee serial connection and posts messages containing them */ -void xbee_thread(void const *argument) { +void xbee_thread(void const *argument) +{ + // xbee serial connection + Serial xbee(p9,p10); + xbee.baud(9600); while (true) { if (xbee.readable()) { - message_xbee *message = mpool_xbee.alloc(); + messageXbeeT *message = mpool_xbee.alloc(); message->msg = xbee.getc(); queue_xbee.put(message); @@ -66,84 +62,57 @@ parachute_thread this thread recieves messages from the main thread and turns the servos for control of the parachute */ -void parachute_thread(void const *argument) { - PwmOut left(p21); - PwmOut right(p22); - left.period(0.020); - right.period(0.020); +void parachute_thread(void const *argument) +{ + Serial pc(USBTX, USBRX); + pc.baud(9600); + + pc.puts("\n\rCalibrating Servo Motors... "); + // servos + Servo left_s(p21); + Servo right_s(p22); - const float WIND = 0.001; - const float STOP = 0.0015; - const float UNWIND = 0.002; - const int HOLD = 500; - - left.pulsewidth(STOP); // STOP - right.pulsewidth(STOP); - - state_p state = CENTER; - state_p oldState = CENTER; + left_s.calibrate_max(0.0014); + left_s.calibrate_min(-0.0008); + right_s.calibrate_max(0.0016); + right_s.calibrate_min(-0.0008); - //initalize - // left - left.pulsewidth(WIND); - Thread::wait(HOLD); - left.pulsewidth(STOP); - Thread::wait(HOLD); - left.pulsewidth(UNWIND); - Thread::wait(HOLD); - left.pulsewidth(STOP); - right.pulsewidth(WIND); - Thread::wait(HOLD); - right.pulsewidth(STOP); - Thread::wait(HOLD); - right.pulsewidth(UNWIND); - Thread::wait(HOLD); - right.pulsewidth(STOP); + for(float i = 0.0; i <= 1.0; i+=0.1) { + left_s = i; + right_s = i; + //release = i; + Thread::wait(500); + } + right_s = 0; + left_s = 0; + pc.puts("OK!"); + char state = CENTER; + pc.puts("\n\rEntering Main Loop... "); while (true) { - osEvent evt_para = queue_para.get(10); // 10 millisecond wait - if (evt_para.status == osEventMessage) { - message_para *message = (message_para*)evt_para.value.p; - printf("\nMessage for para: %d\n\r", message->state); - oldState = state; - state = message->state; + osEvent evt_xbee = queue_xbee.get(1); // 20 millisecond wait + if (evt_xbee.status == osEventMessage) { + messageXbeeT *message = (messageXbeeT*)evt_xbee.value.p; + state = message->msg; + pc.puts("\n\rMessage recieved!"); } switch (state) { - case CENTER: // HOLD - if (oldState == LEFT) { // previous left turn - left.pulsewidth(UNWIND); // wind forward - Thread::wait(HOLD); - } else if (oldState == RIGHT) { // previous right turn - right.pulsewidth(UNWIND); // wind forward - Thread::wait(HOLD); - } + case CENTER: // center + status_led = 0x6; + right_s = 0; + left_s = 0; break; case LEFT: // left - if (oldState == RIGHT) { // previous right turn - right.pulsewidth(UNWIND); // wind forward - Thread::wait(HOLD); - right.pulsewidth(STOP); // HOLD - } else if (oldState == LEFT) // previous left - break; - //initiate left turn - left.pulsewidth(WIND); // wind back - Thread::wait(HOLD); // 0.5 second turn (TODO: compass feedback) + status_led = 0x3; + right_s = 0; + left_s = 1; break; case RIGHT: // right - if (oldState == LEFT) { // previous left turn - left.pulsewidth(UNWIND); // wind forward - Thread::wait(HOLD); - left.pulsewidth(STOP); // HOLD - } else if (oldState == RIGHT) // previous right turn - break; - //initiate right turn - right.pulsewidth(WIND); // wind back - Thread::wait(HOLD); // 0.5 second turn (TODO: compass feedback) + status_led = 0xC; + right_s = 1; + left_s = 0; break; } - oldState = state; - right.pulsewidth(STOP); - left.pulsewidth(STOP); } } @@ -152,48 +121,29 @@ main thread this thread initializes everything then recieves messages from the xbee and sends messages to the parachute */ -int main (void) { +int main (void) +{ + AnalogIn battery(p19); + DigitalOut battery_warning(p24); + battery_warning = 1; + + const float BAT_MUL = 10.26; + float battery_voltage; + status_led = 0x9; // setup watchdog wdt.kick(2.0); // 2 second watchdog // setup xbee serial - xbee.baud(9600); Thread thread1(xbee_thread); Thread thread2(parachute_thread); while (true) { - - osEvent evt_xbee = queue_xbee.get(1000); // wait for 1 second - - if (evt_xbee.status == osEventMessage) { - message_xbee *message_x = (message_xbee*)evt_xbee.value.p; - printf("\nMessage from xbee: %c\n\r", message_x->msg); - - message_para *message_p = mpool_para.alloc(); - - switch (message_x->msg) { - case 'L': // turn left - status_led = 0x3; - message_p->state = LEFT; - break; - case 'C': // center - status_led = 0x6; - message_p->state = CENTER; - break; - case 'R': // turn right - status_led = 0xC; - message_p->state = RIGHT; - break; - case 'F': // flare - status_led = 0xF; - message_p->state = CENTER; - break; - } - - queue_para.put(message_p); - mpool_xbee.free(message_x); - } + battery_voltage = battery.read() * BAT_MUL; + if(battery_voltage < 6.4) + battery_warning = 0; + + Thread::wait(1000); wdt.kick(); } }