High Altitude Recovery Payload

HARP: High Altitude Recovery Payload

Version 0.1: RC design

/media/uploads/tylerjw/_scaled_2012-07-23_mbed_xbee_breadboard.jpg

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.

Files at this revision

API Documentation at this revision

Comitter:
tylerjw
Date:
Mon Oct 15 22:07:07 2012 +0000
Parent:
6:2bd373ba18ae
Child:
8:513b31554e5f
Commit message:
Simpler working left and right servo and battery voltage monitoring with warning light.

Changed in this revision

HMC6352.lib Show annotated file Show diff for this revision Revisions of this file
Servo.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-rtos.lib Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HMC6352.lib	Mon Oct 15 22:07:07 2012 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/aberk/code/HMC6352/#83c0cb554099
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Servo.lib	Mon Oct 15 22:07:07 2012 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/tylerjw/code/Servo/#1e75dcbded83
--- 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();
     }
 }
--- a/mbed-rtos.lib	Tue Aug 07 16:03:45 2012 +0000
+++ b/mbed-rtos.lib	Mon Oct 15 22:07:07 2012 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed-rtos/#4238c328365e
+http://mbed.org/users/mbed_official/code/mbed-rtos/#9654a71f5a90