Reaction Wheel Actuated Satellite Dynamics Test Platform

Dependencies:   mbed

Diploma Thesis in Aerospace Engineering, January 2014

University of Applied Sciences Munich, Faculty 03

Electronics:

  • 1x mbed NXP LPC 1768 Microcontroller
  • 2x XBee S1 Radios + Sparkfun USB Adapter
  • 1x CHR UM6-lt IMU
  • 4x Graupner BEC 8 Motor Controllers
  • 4x ROXXY 2826/09 Brushless Motors
  • 1x Hacker TopFuel LiPo 1300mAh Battery
  • 1x big Selfmade BreakOutBoard to connect all components
  • 1x small BreakOutBoard to connect IMU

Hardware developed with Catia V5R20

Manufactoring Technology: Rapid Prototyping - EOS Formiga P110

Controlled via text based menu with DockLight

__________________

Committer:
DimitriGruebel
Date:
Wed Jul 09 07:35:50 2014 +0000
Revision:
0:1447d2f773db
Dynamics Test Platform

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DimitriGruebel 0:1447d2f773db 1 /*
DimitriGruebel 0:1447d2f773db 2 Copyright (c) 2011 Andy Kirkham
DimitriGruebel 0:1447d2f773db 3
DimitriGruebel 0:1447d2f773db 4 Permission is hereby granted, free of charge, to any person obtaining a copy
DimitriGruebel 0:1447d2f773db 5 of this software and associated documentation files (the "Software"), to deal
DimitriGruebel 0:1447d2f773db 6 in the Software without restriction, including without limitation the rights
DimitriGruebel 0:1447d2f773db 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
DimitriGruebel 0:1447d2f773db 8 copies of the Software, and to permit persons to whom the Software is
DimitriGruebel 0:1447d2f773db 9 furnished to do so, subject to the following conditions:
DimitriGruebel 0:1447d2f773db 10
DimitriGruebel 0:1447d2f773db 11 The above copyright notice and this permission notice shall be included in
DimitriGruebel 0:1447d2f773db 12 all copies or substantial portions of the Software.
DimitriGruebel 0:1447d2f773db 13
DimitriGruebel 0:1447d2f773db 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
DimitriGruebel 0:1447d2f773db 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
DimitriGruebel 0:1447d2f773db 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
DimitriGruebel 0:1447d2f773db 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
DimitriGruebel 0:1447d2f773db 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
DimitriGruebel 0:1447d2f773db 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
DimitriGruebel 0:1447d2f773db 20 THE SOFTWARE.
DimitriGruebel 0:1447d2f773db 21
DimitriGruebel 0:1447d2f773db 22 @file example2.cpp
DimitriGruebel 0:1447d2f773db 23 @purpose Demos a simple messaging system.
DimitriGruebel 0:1447d2f773db 24 @version see ChangeLog.c
DimitriGruebel 0:1447d2f773db 25 @date Jan 2011
DimitriGruebel 0:1447d2f773db 26 @author Andy Kirkham
DimitriGruebel 0:1447d2f773db 27 */
DimitriGruebel 0:1447d2f773db 28
DimitriGruebel 0:1447d2f773db 29 /*
DimitriGruebel 0:1447d2f773db 30 This example demostrates a simple "messaging" system. You can use it with
DimitriGruebel 0:1447d2f773db 31 a terminal program to test it out or write a cusom C#/C++/VB/etc program
DimitriGruebel 0:1447d2f773db 32 to read and write messages to or from the Mbed. The default baud rate in
DimitriGruebel 0:1447d2f773db 33 this example is 115200.
DimitriGruebel 0:1447d2f773db 34
DimitriGruebel 0:1447d2f773db 35 In this example, the LEDs are controlled and pins p21 to p24 are set as
DimitriGruebel 0:1447d2f773db 36 InterruptIn and send messages out when their value changes.
DimitriGruebel 0:1447d2f773db 37
DimitriGruebel 0:1447d2f773db 38 To use, hook up the MBed USB and open your fav terminal. All messages
DimitriGruebel 0:1447d2f773db 39 end with the \n character, don't forget to hit carriage return!.
DimitriGruebel 0:1447d2f773db 40 As an example:-
DimitriGruebel 0:1447d2f773db 41
DimitriGruebel 0:1447d2f773db 42 to switch on LED1 send LED1:1\n, off is LED1:0\n and toggle is LED1:2\n
DimitriGruebel 0:1447d2f773db 43 to switch on LED2 send LED2:1\n, off is LED2:0\n and toggle is LED2:2\n
DimitriGruebel 0:1447d2f773db 44 to switch on LED3 send LED3:1\n, off is LED3:0\n and toggle is LED3:2\n
DimitriGruebel 0:1447d2f773db 45 to switch on LED4 send LED4:1\n, off is LED4:0\n and toggle is LED4:2\n
DimitriGruebel 0:1447d2f773db 46
DimitriGruebel 0:1447d2f773db 47 When a pin change on p21 to p24 happens, a message is sent. As an example
DimitriGruebel 0:1447d2f773db 48 when p21 goes low PIN21:0\n is sent, when goes high PIN21:1\n is sent.
DimitriGruebel 0:1447d2f773db 49
DimitriGruebel 0:1447d2f773db 50 Note, the InterruptIn pins p21 to p24 are setup to have pullups. This means
DimitriGruebel 0:1447d2f773db 51 they are high. To activate them use a wire to short the pin to 0volts.
DimitriGruebel 0:1447d2f773db 52
DimitriGruebel 0:1447d2f773db 53 If you find that p21 to p24 sent a lot of on/off/on/off then it's probably
DimitriGruebel 0:1447d2f773db 54 due to "bounce". If you are connecting a mechanical switch to a pin you
DimitriGruebel 0:1447d2f773db 55 may prefer to use the PinDetect library rather than using InterruptIn.
DimitriGruebel 0:1447d2f773db 56 @see http://mbed.org/users/AjK/libraries/PinDetect/latest
DimitriGruebel 0:1447d2f773db 57
DimitriGruebel 0:1447d2f773db 58 One point you may notice. Incoming messages are processed via main()'s
DimitriGruebel 0:1447d2f773db 59 while(1) loop whereas pin changes have their messages directly sent.
DimitriGruebel 0:1447d2f773db 60 The reason for this is when MODSERIAL makes callbacks to your application
DimitriGruebel 0:1447d2f773db 61 it is in "interrupt context". And one thing you want to avoid is spending
DimitriGruebel 0:1447d2f773db 62 lots of CPU time in that context. So, the callback moves the message from
DimitriGruebel 0:1447d2f773db 63 the input buffer to a local holding buffer and it then sets a bool flag
DimitriGruebel 0:1447d2f773db 64 which tells main()'s while(1) loop to process that buffer. This means the
DimitriGruebel 0:1447d2f773db 65 time spent doing the real incoming message handing is within your program
DimitriGruebel 0:1447d2f773db 66 and not within MODSERIAL's interrupt context. So you may ask, why not do
DimitriGruebel 0:1447d2f773db 67 the same for out going messages? Well, because MODSERIAL output buffers
DimitriGruebel 0:1447d2f773db 68 all your sent content then sending chars is very fast. MODSERIAL handles
DimitriGruebel 0:1447d2f773db 69 all the nitty gritty bits for you. You can just send. This example uses
DimitriGruebel 0:1447d2f773db 70 puts() to send the message. If you can, always try and use sprintf()+puts()
DimitriGruebel 0:1447d2f773db 71 rathe than printf(), printf() is known to often screw things up when used
DimitriGruebel 0:1447d2f773db 72 within an interrupt context. Better still, just use puts() and do away
DimitriGruebel 0:1447d2f773db 73 with any of the crappy ?printf() calls if possible. But I found the code
DimitriGruebel 0:1447d2f773db 74 below to work fine even at 115200baud.
DimitriGruebel 0:1447d2f773db 75
DimitriGruebel 0:1447d2f773db 76 */
DimitriGruebel 0:1447d2f773db 77
DimitriGruebel 0:1447d2f773db 78
DimitriGruebel 0:1447d2f773db 79 #ifdef COMPILE_EXAMPLE1_CODE_MODSERIAL
DimitriGruebel 0:1447d2f773db 80
DimitriGruebel 0:1447d2f773db 81 #include "mbed.h"
DimitriGruebel 0:1447d2f773db 82 #include "MODSERIAL.h"
DimitriGruebel 0:1447d2f773db 83
DimitriGruebel 0:1447d2f773db 84 #define MESSAGE_BUFFER_SIZE 32
DimitriGruebel 0:1447d2f773db 85
DimitriGruebel 0:1447d2f773db 86 DigitalOut led1(LED1);
DimitriGruebel 0:1447d2f773db 87 DigitalOut led2(LED2);
DimitriGruebel 0:1447d2f773db 88 DigitalOut led3(LED3);
DimitriGruebel 0:1447d2f773db 89 DigitalOut led4(LED4);
DimitriGruebel 0:1447d2f773db 90
DimitriGruebel 0:1447d2f773db 91 InterruptIn P21(p21);
DimitriGruebel 0:1447d2f773db 92 InterruptIn P22(p22);
DimitriGruebel 0:1447d2f773db 93 InterruptIn P23(p23);
DimitriGruebel 0:1447d2f773db 94 InterruptIn P24(p24);
DimitriGruebel 0:1447d2f773db 95
DimitriGruebel 0:1447d2f773db 96 MODSERIAL messageSystem(USBTX, USBRX);
DimitriGruebel 0:1447d2f773db 97
DimitriGruebel 0:1447d2f773db 98 char messageBufferIncoming[MESSAGE_BUFFER_SIZE];
DimitriGruebel 0:1447d2f773db 99 char messageBufferOutgoing[MESSAGE_BUFFER_SIZE];
DimitriGruebel 0:1447d2f773db 100 bool messageReceived;
DimitriGruebel 0:1447d2f773db 101
DimitriGruebel 0:1447d2f773db 102 void messageReceive(MODSERIAL_IRQ_INFO *q) {
DimitriGruebel 0:1447d2f773db 103 MODSERIAL *sys = q->serial;
DimitriGruebel 0:1447d2f773db 104 sys->move(messageBufferIncoming, MESSAGE_BUFFER_SIZE);
DimitriGruebel 0:1447d2f773db 105 messageReceived = true;
DimitriGruebel 0:1447d2f773db 106 return 0;
DimitriGruebel 0:1447d2f773db 107 }
DimitriGruebel 0:1447d2f773db 108
DimitriGruebel 0:1447d2f773db 109 void messageProcess(void) {
DimitriGruebel 0:1447d2f773db 110 if (!strncmp(messageBufferIncoming, "LED1:1", sizeof("LED1:1")-1)) led1 = 1;
DimitriGruebel 0:1447d2f773db 111 else if (!strncmp(messageBufferIncoming, "LED1:0", sizeof("LED1:0")-1)) led1 = 0;
DimitriGruebel 0:1447d2f773db 112 else if (!strncmp(messageBufferIncoming, "LED1:2", sizeof("LED1:2")-1)) led1 = !led1;
DimitriGruebel 0:1447d2f773db 113
DimitriGruebel 0:1447d2f773db 114 else if (!strncmp(messageBufferIncoming, "LED2:1", sizeof("LED2:1")-1)) led2 = 1;
DimitriGruebel 0:1447d2f773db 115 else if (!strncmp(messageBufferIncoming, "LED2:0", sizeof("LED2:0")-1)) led2 = 0;
DimitriGruebel 0:1447d2f773db 116 else if (!strncmp(messageBufferIncoming, "LED2:2", sizeof("LED2:2")-1)) led2 = !led2;
DimitriGruebel 0:1447d2f773db 117
DimitriGruebel 0:1447d2f773db 118 else if (!strncmp(messageBufferIncoming, "LED3:1", sizeof("LED3:1")-1)) led3 = 1;
DimitriGruebel 0:1447d2f773db 119 else if (!strncmp(messageBufferIncoming, "LED3:0", sizeof("LED3:0")-1)) led3 = 0;
DimitriGruebel 0:1447d2f773db 120 else if (!strncmp(messageBufferIncoming, "LED3:2", sizeof("LED3:2")-1)) led3 = !led3;
DimitriGruebel 0:1447d2f773db 121
DimitriGruebel 0:1447d2f773db 122 else if (!strncmp(messageBufferIncoming, "LED4:1", sizeof("LED4:1")-1)) led4 = 1;
DimitriGruebel 0:1447d2f773db 123 else if (!strncmp(messageBufferIncoming, "LED4:0", sizeof("LED4:0")-1)) led4 = 0;
DimitriGruebel 0:1447d2f773db 124 else if (!strncmp(messageBufferIncoming, "LED4:2", sizeof("LED4:2")-1)) led4 = !led4;
DimitriGruebel 0:1447d2f773db 125
DimitriGruebel 0:1447d2f773db 126 messageReceived = false;
DimitriGruebel 0:1447d2f773db 127 }
DimitriGruebel 0:1447d2f773db 128
DimitriGruebel 0:1447d2f773db 129 #define PIN_MESSAGE_SEND(x,y) \
DimitriGruebel 0:1447d2f773db 130 sprintf(messageBufferOutgoing,"PIN%02d:%d\n",x,y);\
DimitriGruebel 0:1447d2f773db 131 messageSystem.puts(messageBufferOutgoing);
DimitriGruebel 0:1447d2f773db 132
DimitriGruebel 0:1447d2f773db 133 void pin21Rise(void) { PIN_MESSAGE_SEND(21, 1); }
DimitriGruebel 0:1447d2f773db 134 void pin21Fall(void) { PIN_MESSAGE_SEND(21, 0); }
DimitriGruebel 0:1447d2f773db 135 void pin22Rise(void) { PIN_MESSAGE_SEND(22, 1); }
DimitriGruebel 0:1447d2f773db 136 void pin22Fall(void) { PIN_MESSAGE_SEND(22, 0); }
DimitriGruebel 0:1447d2f773db 137 void pin23Rise(void) { PIN_MESSAGE_SEND(23, 1); }
DimitriGruebel 0:1447d2f773db 138 void pin23Fall(void) { PIN_MESSAGE_SEND(23, 0); }
DimitriGruebel 0:1447d2f773db 139 void pin24Rise(void) { PIN_MESSAGE_SEND(24, 1); }
DimitriGruebel 0:1447d2f773db 140 void pin24Fall(void) { PIN_MESSAGE_SEND(24, 0); }
DimitriGruebel 0:1447d2f773db 141
DimitriGruebel 0:1447d2f773db 142 int main() {
DimitriGruebel 0:1447d2f773db 143
DimitriGruebel 0:1447d2f773db 144 messageReceived = false;
DimitriGruebel 0:1447d2f773db 145 messageSystem.baud(115200);
DimitriGruebel 0:1447d2f773db 146 messageSystem.attach(&messageReceive, MODSERIAL::RxAutoDetect);
DimitriGruebel 0:1447d2f773db 147 messageSystem.autoDetectChar('\n');
DimitriGruebel 0:1447d2f773db 148
DimitriGruebel 0:1447d2f773db 149 // Enable pullup resistors on pins.
DimitriGruebel 0:1447d2f773db 150 P21.mode(PullUp); P22.mode(PullUp); P23.mode(PullUp); P24.mode(PullUp);
DimitriGruebel 0:1447d2f773db 151
DimitriGruebel 0:1447d2f773db 152 // Fix Mbed library bug, see http://mbed.org/forum/bugs-suggestions/topic/1498
DimitriGruebel 0:1447d2f773db 153 LPC_GPIOINT->IO2IntClr = (1UL << 5) | (1UL << 4) | (1UL << 3) | (1UL << 2);
DimitriGruebel 0:1447d2f773db 154
DimitriGruebel 0:1447d2f773db 155 // Attach InterruptIn pin callbacks.
DimitriGruebel 0:1447d2f773db 156 P21.rise(&pin21Rise); P21.fall(&pin21Fall);
DimitriGruebel 0:1447d2f773db 157 P22.rise(&pin22Rise); P22.fall(&pin22Fall);
DimitriGruebel 0:1447d2f773db 158 P23.rise(&pin23Rise); P23.fall(&pin23Fall);
DimitriGruebel 0:1447d2f773db 159 P24.rise(&pin24Rise); P24.fall(&pin24Fall);
DimitriGruebel 0:1447d2f773db 160
DimitriGruebel 0:1447d2f773db 161 while(1) {
DimitriGruebel 0:1447d2f773db 162 // Process incoming messages.
DimitriGruebel 0:1447d2f773db 163 if (messageReceived) messageProcess();
DimitriGruebel 0:1447d2f773db 164 }
DimitriGruebel 0:1447d2f773db 165 }
DimitriGruebel 0:1447d2f773db 166
DimitriGruebel 0:1447d2f773db 167 #endif