Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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.
Revision 8:513b31554e5f, committed 2012-10-16
- Comitter:
- tylerjw
- Date:
- Tue Oct 16 03:11:34 2012 +0000
- Parent:
- 7:fcbf263a62b9
- Commit message:
- Gyro feedback test implemented - working sensor thread
Changed in this revision
| ITG3200.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 |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ITG3200.lib Tue Oct 16 03:11:34 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/gltest26/code/ITG3200/#05396b551a9a
--- a/main.cpp Mon Oct 15 22:07:07 2012 +0000
+++ b/main.cpp Tue Oct 16 03:11:34 2012 +0000
@@ -1,149 +1,213 @@
-/* Copyright (c) 2012 Tyler Weaver, MIT License
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
- * and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute,
- * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all copies or
- * substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
- * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * 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;
-
-// status leds
-BusOut status_led(LED4, LED3, LED2, LED1);
-
-typedef struct {
- char msg; // the direction to turn in
-} messageXbeeT;
-
-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)
-{
- // xbee serial connection
- Serial xbee(p9,p10);
- xbee.baud(9600);
- while (true) {
- if (xbee.readable()) {
- messageXbeeT *message = mpool_xbee.alloc();
- message->msg = xbee.getc();
-
- queue_xbee.put(message);
- }
- Thread::wait(100);
- }
-}
-
-/**
-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)
-{
- Serial pc(USBTX, USBRX);
- pc.baud(9600);
-
- pc.puts("\n\rCalibrating Servo Motors... ");
- // servos
- Servo left_s(p21);
- Servo right_s(p22);
-
- left_s.calibrate_max(0.0014);
- left_s.calibrate_min(-0.0008);
- right_s.calibrate_max(0.0016);
- right_s.calibrate_min(-0.0008);
-
- 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_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: // center
- status_led = 0x6;
- right_s = 0;
- left_s = 0;
- break;
- case LEFT: // left
- status_led = 0x3;
- right_s = 0;
- left_s = 1;
- break;
- case RIGHT: // right
- status_led = 0xC;
- right_s = 1;
- left_s = 0;
- break;
- }
- }
-
-}
-
-/**
-main thread
-this thread initializes everything then recieves messages from the xbee and sends messages to the parachute
-*/
-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
-
- Thread thread1(xbee_thread);
- Thread thread2(parachute_thread);
-
- while (true) {
- battery_voltage = battery.read() * BAT_MUL;
- if(battery_voltage < 6.4)
- battery_warning = 0;
-
- Thread::wait(1000);
- wdt.kick();
- }
-}
+/* Copyright (c) 2012 Tyler Weaver, MIT License
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * 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"
+#include "ITG3200.h"
+
+#define CENTER 'C'
+#define LEFT 'L'
+#define RIGHT 'R'
+
+// Setup the watchdog timer
+Watchdog wdt;
+
+// status leds
+BusOut status_led(LED4, LED3, LED2, LED1);
+
+typedef struct {
+ char msg; // the direction to turn in
+} messageXbeeT;
+
+MemoryPool<messageXbeeT, 16> mpool_xbee;
+Queue<messageXbeeT, 16> queue_xbee;
+
+Mutex direction_mutex;
+char direction = CENTER;
+
+/**
+* xbee_thread
+* this thread reads characters from the xbee serial connection and posts messages containing them
+*/
+void xbee_thread(void const *argument)
+{
+ // xbee serial connection
+ Serial xbee(p9,p10);
+ xbee.baud(9600);
+ while (true) {
+ if (xbee.readable()) {
+ messageXbeeT *message = mpool_xbee.alloc();
+ message->msg = xbee.getc();
+
+ queue_xbee.put(message);
+ }
+ Thread::wait(100);
+ }
+}
+
+/**
+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)
+{
+ // servos
+ Servo left_s(p21);
+ Servo right_s(p22);
+
+ float left = 0;
+ float right = 0;
+
+ left_s.calibrate_max(0.0007);
+ left_s.calibrate_min(-0.0014);
+ right_s.calibrate(0.0009);
+
+ for(float i = 0.0; i <= 1.0; i+=0.1) {
+ left_s = i;
+ right_s = i;
+ Thread::wait(100);
+ }
+ right_s = left;
+ left_s = right;
+
+ bool new_message = false;
+
+ char state = CENTER;
+
+ while (true) {
+ osEvent evt_xbee = queue_xbee.get(20); // 20 millisecond wait
+ if (evt_xbee.status == osEventMessage) {
+ messageXbeeT *message = (messageXbeeT*)evt_xbee.value.p;
+ state = message->msg;
+ new_message = true;
+ }
+ switch (state) {
+ case CENTER: // center
+ status_led = 0x6;
+ direction_mutex.lock();
+ if(new_message)
+ left = right = 0;
+ if(direction != CENTER) {
+ if(direction == LEFT) {
+ right += 0.02;
+ left -= 0.02;
+ } else { // right
+ right -= 0.02;
+ left += 0.02;
+ }
+ }
+ direction_mutex.unlock();
+ break;
+ case LEFT: // left
+ status_led = 0x3;
+ direction_mutex.lock();
+ if(direction != LEFT) {
+ left += 0.02;
+ right = 0;
+ }
+ direction_mutex.unlock();
+ break;
+ case RIGHT: // right
+ status_led = 0xC;
+ direction_mutex.lock();
+ if(direction != RIGHT) {
+ right += 0.02;
+ left = 0;
+ }
+ direction_mutex.unlock();
+ break;
+ }
+ if(left > 1.0) left = 1.0;
+ if(left < 0.0) left = 0.0;
+ if(right > 1.0) right = 1.0;
+ if(right < 0.0) right = 0.0;
+ right_s = right;
+ left_s = left;
+ new_message = false;
+ }
+
+}
+
+/**
+sensor thread
+for sampling from sensors
+*/
+
+void sensor_thread(void const* arg)
+{
+ Serial pc(USBTX, USBRX);
+ pc.baud(9600);
+
+ AnalogIn battery(p19);
+ DigitalOut battery_warning(p24);
+ battery_warning = 1;
+
+ const float BAT_MUL = 10.26;
+ float battery_voltage;
+
+ pc.puts("\n\rInitalizing Gyro, hold still.. ");
+ ITG3200 gyro(p28, p27); // sda, scl - gyro
+ gyro.setLpBandwidth(LPFBW_5HZ);
+ gyro.calibrate(0.5);
+ double gyro_readings[3];
+ pc.puts("OK\n\r");
+
+ while(1) {
+ gyro.getGyroXYZDegrees(gyro_readings);
+ pc.printf("\r\n%f,%f,%f \r\n", gyro_readings[0], gyro_readings[1], gyro_readings[2]);
+
+ direction_mutex.lock();
+ if(gyro_readings[2] > 10.0)
+ direction = LEFT;
+ else if (gyro_readings[2] < -10.0)
+ direction = RIGHT;
+ else
+ direction = CENTER;
+ pc.putc(direction);
+ direction_mutex.unlock();
+
+ battery_voltage = battery.read() * BAT_MUL;
+ if(battery_voltage < 6.4)
+ battery_warning = 0;
+
+ Thread::wait(100);
+ }
+}
+
+/**
+main thread
+this thread initializes everything then recieves messages from the xbee and sends messages to the parachute
+*/
+int main (void)
+{
+ status_led = 0x9;
+ // setup watchdog
+ wdt.kick(2.0); // 2 second watchdog
+ // setup xbee serial
+
+ Thread thread1(xbee_thread);
+ Thread thread2(parachute_thread);
+ Thread thread3(sensor_thread);
+
+ while (true) {
+ Thread::wait(500);
+ wdt.kick();
+ }
+}
