ARLISS2012
Dependencies: mbed-rtos mbed MMA7361L MPL115A2
Fork of rtos_basic by
main.cpp@6:c97217c9191b, 2015-04-30 (annotated)
- Committer:
- AkiraK
- Date:
- Thu Apr 30 13:50:23 2015 +0000
- Revision:
- 6:c97217c9191b
- Parent:
- 5:31bafc5b1bcd
ARLISS2012 Hidaka High School
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AkiraK | 6:c97217c9191b | 1 | /* |
AkiraK | 6:c97217c9191b | 2 | @author Akira Kashihara <akira.kashihara@gmail.com> |
AkiraK | 6:c97217c9191b | 3 | @suthor Kenta Osaki |
AkiraK | 6:c97217c9191b | 4 | */ |
AkiraK | 2:5e02179f4141 | 5 | #include "mbed.h" //use mbed basic library <include start |
AkiraK | 2:5e02179f4141 | 6 | #include "MPL115A2.h" // use MPL115A2 library |
AkiraK | 2:5e02179f4141 | 7 | #include "MMA7361L.h" //use MMA7361L library use |
AkiraK | 2:5e02179f4141 | 8 | #include "rtos.h" //use rtos library <include end |
AkiraK | 2:5e02179f4141 | 9 | |
AkiraK | 2:5e02179f4141 | 10 | LocalFileSystem local("local"); //use Local file system <file system define |
AkiraK | 2:5e02179f4141 | 11 | |
AkiraK | 2:5e02179f4141 | 12 | Timer timer; //use timer <which pin does system use?(start) |
AkiraK | 2:5e02179f4141 | 13 | MMA7361L accel(p17, p18, p19, p23, p24, p22); //decide pin number of accel |
AkiraK | 2:5e02179f4141 | 14 | AnalogIn lm60(p20); // decide pin number of tempareture |
AkiraK | 2:5e02179f4141 | 15 | DigitalIn endsw(p5); // decide pin number of end switch |
AkiraK | 2:5e02179f4141 | 16 | DigitalIn startsw(p6); //decide pin number of start switch |
AkiraK | 2:5e02179f4141 | 17 | BusOut leds(LED1, LED2, LED3, LED4); // decide led number of system check |
AkiraK | 2:5e02179f4141 | 18 | AnalogIn hu(p16); // decide pin number of humidity |
AkiraK | 6:c97217c9191b | 19 | //AnalogIn illu(p15); |
AkiraK | 2:5e02179f4141 | 20 | Serial xbee(p28,p27); //decide pin number of xbee and decide Serial using |
AkiraK | 2:5e02179f4141 | 21 | Serial gps(p13, p14); // decide pin number of gps <which pin does system use?(end) |
AkiraK | 2:5e02179f4141 | 22 | |
AkiraK | 6:c97217c9191b | 23 | long int begin, end;// timer define |
AkiraK | 6:c97217c9191b | 24 | long int begin_1 = 0; |
AkiraK | 2:5e02179f4141 | 25 | |
AkiraK | 2:5e02179f4141 | 26 | FILE *fp = fopen("/local/cansat.txt", "a"); //file system start, file open <about file system to open "cansat.txt" |
AkiraK | 2:5e02179f4141 | 27 | |
AkiraK | 2:5e02179f4141 | 28 | char gps1[1000]; |
AkiraK | 2:5e02179f4141 | 29 | char GPS[1000]; |
AkiraK | 2:5e02179f4141 | 30 | int timer_count = 0; |
AkiraK | 2:5e02179f4141 | 31 | int xbee_count = 0; |
AkiraK | 6:c97217c9191b | 32 | bool xbee_flag = true; |
AkiraK | 2:5e02179f4141 | 33 | bool gps_flag = true; //about gps_flag define(true) <gps_define(true) |
AkiraK | 2:5e02179f4141 | 34 | bool gps_get = true; //which gps get or lost |
AkiraK | 6:c97217c9191b | 35 | bool stateSW = false; //about switch flag define(false) // <stateSW(false) |
AkiraK | 3:b740280416f6 | 36 | int at = 20; // define avarage time |
AkiraK | 2:5e02179f4141 | 37 | |
AkiraK | 2:5e02179f4141 | 38 | void gps_thread(void const *argument) // <gps thread start |
AkiraK | 2:5e02179f4141 | 39 | { |
AkiraK | 2:5e02179f4141 | 40 | while (gps_flag) { //if gps_flag is true, while can run <gps data scan start |
AkiraK | 2:5e02179f4141 | 41 | gps.scanf("%s", gps1); |
AkiraK | 2:5e02179f4141 | 42 | if (gps1[3] == 'R' && gps1[4] == 'M' && gps1[5] == 'C') { //if gps1 is $GPGGA, this program can write data <what data do I want get |
AkiraK | 2:5e02179f4141 | 43 | gps.scanf("%s\r\n", GPS); |
AkiraK | 2:5e02179f4141 | 44 | gps_get = true; |
AkiraK | 2:5e02179f4141 | 45 | } |
AkiraK | 2:5e02179f4141 | 46 | } |
AkiraK | 2:5e02179f4141 | 47 | } |
AkiraK | 2:5e02179f4141 | 48 | |
AkiraK | 2:5e02179f4141 | 49 | int main() |
AkiraK | 2:5e02179f4141 | 50 | { |
AkiraK | 2:5e02179f4141 | 51 | |
AkiraK | 2:5e02179f4141 | 52 | float press_buff = 0; //press buffer is 0 <buff define start |
AkiraK | 2:5e02179f4141 | 53 | float temp_buff = 0; //temparature buffer is 0 |
AkiraK | 2:5e02179f4141 | 54 | float humi_buff = 0; //humidity buffer is 0 |
AkiraK | 2:5e02179f4141 | 55 | float accelx_buff = 0; //accelx buffer is 0 |
AkiraK | 2:5e02179f4141 | 56 | float accely_buff = 0; //accely buffer is 0 |
AkiraK | 2:5e02179f4141 | 57 | float accelz_buff = 0; //accelz buffer is 0 <buff define end |
AkiraK | 2:5e02179f4141 | 58 | |
AkiraK | 2:5e02179f4141 | 59 | accel.setScale(MMA7361L::SCALE_6G); //6g mode |
AkiraK | 2:5e02179f4141 | 60 | accel.calibrate(MMA7361L::SCALE_6G, -0.96, 1.06, -0.78, 1.28, -1.14, 0.78); //calibration of accelation <calibration of accelation |
AkiraK | 2:5e02179f4141 | 61 | |
AkiraK | 2:5e02179f4141 | 62 | MPL115A2 mpl115a2(p9, p10); //define pressure pin number <pressure pin number define |
AkiraK | 2:5e02179f4141 | 63 | |
AkiraK | 2:5e02179f4141 | 64 | //____define of main program(end) |
AkiraK | 2:5e02179f4141 | 65 | |
AkiraK | 2:5e02179f4141 | 66 | //____run main program(start) |
AkiraK | 2:5e02179f4141 | 67 | |
AkiraK | 2:5e02179f4141 | 68 | while (true) { |
AkiraK | 2:5e02179f4141 | 69 | |
AkiraK | 2:5e02179f4141 | 70 | leds = 1; // <led start(if mbed get A) |
AkiraK | 2:5e02179f4141 | 71 | wait(1.0); |
AkiraK | 2:5e02179f4141 | 72 | leds = 0; |
AkiraK | 2:5e02179f4141 | 73 | wait(1.0); |
AkiraK | 2:5e02179f4141 | 74 | |
AkiraK | 2:5e02179f4141 | 75 | if (startsw != stateSW) { //if start switch is pushed bu anyone run <get data start(if push start switch) |
AkiraK | 2:5e02179f4141 | 76 | stateSW = !stateSW; |
AkiraK | 2:5e02179f4141 | 77 | if (stateSW) { |
AkiraK | 2:5e02179f4141 | 78 | |
AkiraK | 2:5e02179f4141 | 79 | timer.start(); //timer start <timer caunt system start |
AkiraK | 2:5e02179f4141 | 80 | begin = timer.read_us(); //timer number read |
AkiraK | 2:5e02179f4141 | 81 | |
AkiraK | 2:5e02179f4141 | 82 | Thread thread(gps_thread); //gps thread run |
AkiraK | 2:5e02179f4141 | 83 | |
AkiraK | 2:5e02179f4141 | 84 | while (true) { |
AkiraK | 2:5e02179f4141 | 85 | |
AkiraK | 2:5e02179f4141 | 86 | leds = 1; |
AkiraK | 2:5e02179f4141 | 87 | press_buff = 0; //pressure buffer reset <buffer reset(start) |
AkiraK | 2:5e02179f4141 | 88 | temp_buff = 0; //temparture buffer reset |
AkiraK | 2:5e02179f4141 | 89 | humi_buff = 0; //humidity buffer reset |
AkiraK | 2:5e02179f4141 | 90 | accelx_buff = 0; //accelx buffer reset |
AkiraK | 2:5e02179f4141 | 91 | accely_buff = 0; //accely buffer reset |
AkiraK | 3:b740280416f6 | 92 | accelz_buff = 0; //accelz buffer reset // <buffer reset(end) |
AkiraK | 2:5e02179f4141 | 93 | leds = 0; |
AkiraK | 2:5e02179f4141 | 94 | leds = 2; |
AkiraK | 2:5e02179f4141 | 95 | |
AkiraK | 2:5e02179f4141 | 96 | for (int i = 0; i < at; i++) { //get data and + 20 times (loop) <get data loop(start) |
AkiraK | 2:5e02179f4141 | 97 | temp_buff += (3.3 * lm60 - 0.424) / 0.00625; //temperture data calculation |
AkiraK | 2:5e02179f4141 | 98 | press_buff += mpl115a2.readPressure(); //pressure get data(this calculation is run by library) |
AkiraK | 2:5e02179f4141 | 99 | humi_buff += hu * 3.3 * 100; //humidity data culculation |
AkiraK | 2:5e02179f4141 | 100 | accelx_buff += accel.getAccelX(); //accelx get |
AkiraK | 2:5e02179f4141 | 101 | accely_buff += accel.getAccelY(); //accely get |
AkiraK | 3:b740280416f6 | 102 | accelz_buff += accel.getAccelZ(); //accelz get |
AkiraK | 2:5e02179f4141 | 103 | wait(0.005); |
AkiraK | 2:5e02179f4141 | 104 | } |
AkiraK | 2:5e02179f4141 | 105 | |
AkiraK | 2:5e02179f4141 | 106 | leds = 0; |
AkiraK | 2:5e02179f4141 | 107 | |
AkiraK | 2:5e02179f4141 | 108 | float tempv = temp_buff / at; // <avarage data(start) |
AkiraK | 2:5e02179f4141 | 109 | float press = press_buff / at; |
AkiraK | 2:5e02179f4141 | 110 | float humi = humi_buff / at; |
AkiraK | 2:5e02179f4141 | 111 | float accelX = accelx_buff / at; |
AkiraK | 2:5e02179f4141 | 112 | float accelY = accely_buff / at; |
AkiraK | 2:5e02179f4141 | 113 | float accelZ = accelz_buff / at; // <avarage data(end) |
AkiraK | 6:c97217c9191b | 114 | // float lx = illu * 3.3 / 3 * 1000; |
AkiraK | 2:5e02179f4141 | 115 | |
AkiraK | 5:31bafc5b1bcd | 116 | end = timer.read_us() - timer_count*2000; |
AkiraK | 6:c97217c9191b | 117 | double timers = 1.0 * (end - begin ) / 1000000; |
AkiraK | 4:4faccc542b32 | 118 | |
AkiraK | 5:31bafc5b1bcd | 119 | if(timers > 2000) { |
AkiraK | 4:4faccc542b32 | 120 | timer_count ++; |
AkiraK | 6:c97217c9191b | 121 | begin = timer.read_us() - timer_count * 2000; //timer number read |
AkiraK | 5:31bafc5b1bcd | 122 | timers = (end - begin) / 1000000; |
AkiraK | 4:4faccc542b32 | 123 | } |
AkiraK | 4:4faccc542b32 | 124 | |
AkiraK | 2:5e02179f4141 | 125 | |
AkiraK | 3:b740280416f6 | 126 | if(xbee_count > 6) { |
AkiraK | 6:c97217c9191b | 127 | double stop_timer = 1.0 * (end - begin_1) / 1000000; |
AkiraK | 6:c97217c9191b | 128 | if(stop_timer > 60 * 30) { |
AkiraK | 3:b740280416f6 | 129 | fclose(fp); |
AkiraK | 3:b740280416f6 | 130 | timer.stop(); |
AkiraK | 6:c97217c9191b | 131 | gps_get = 1; |
AkiraK | 6:c97217c9191b | 132 | gps_flag = 1; |
AkiraK | 6:c97217c9191b | 133 | xbee.printf("CanSat was able to close the file\r\n"); |
AkiraK | 3:b740280416f6 | 134 | while(true) { |
AkiraK | 3:b740280416f6 | 135 | leds = 8; |
AkiraK | 3:b740280416f6 | 136 | wait(1.0); |
AkiraK | 3:b740280416f6 | 137 | leds = 0; |
AkiraK | 3:b740280416f6 | 138 | wait(1.0); |
AkiraK | 3:b740280416f6 | 139 | } |
AkiraK | 3:b740280416f6 | 140 | } |
AkiraK | 3:b740280416f6 | 141 | } |
AkiraK | 6:c97217c9191b | 142 | /* if(lx > 800) { |
AkiraK | 6:c97217c9191b | 143 | xbee_count ++; |
AkiraK | 2:5e02179f4141 | 144 | |
AkiraK | 6:c97217c9191b | 145 | if(xbee_count >= 5) { |
AkiraK | 6:c97217c9191b | 146 | xbee_flag = true; |
AkiraK | 6:c97217c9191b | 147 | if(xbee_count == 5) { |
AkiraK | 6:c97217c9191b | 148 | begin_1 = timer.read_us(); |
AkiraK | 6:c97217c9191b | 149 | } |
AkiraK | 6:c97217c9191b | 150 | } |
AkiraK | 6:c97217c9191b | 151 | }*/ |
AkiraK | 2:5e02179f4141 | 152 | leds = 4; |
AkiraK | 2:5e02179f4141 | 153 | |
AkiraK | 2:5e02179f4141 | 154 | if (gps_get == false) { |
AkiraK | 6:c97217c9191b | 155 | fprintf(fp, "$DATA,%4.1f,%4.1f,%2.2f,%2.2f,%2.2f,%4.1f,%4.1f,#end\r\n", timers + timer_count * 2000, tempv, accelX, accelY, accelZ, press, humi); |
AkiraK | 2:5e02179f4141 | 156 | if(xbee_flag == true) { |
AkiraK | 6:c97217c9191b | 157 | xbee.printf("$DATA,%4.1f,%4.1f,%2.2f,%2.2f,%2.2f,%4.1f,%4.1f,#end\r\n", timers + timer_count * 2000, tempv, accelX, accelY, accelZ, press, humi); |
AkiraK | 2:5e02179f4141 | 158 | } |
AkiraK | 2:5e02179f4141 | 159 | } |
AkiraK | 2:5e02179f4141 | 160 | |
AkiraK | 2:5e02179f4141 | 161 | if (gps_get == true) { |
AkiraK | 2:5e02179f4141 | 162 | leds = 15; |
AkiraK | 2:5e02179f4141 | 163 | if(xbee_flag == true) { |
AkiraK | 6:c97217c9191b | 164 | xbee.printf("%s,#end\r\n", GPS); //GPS data is dent by xbee |
AkiraK | 2:5e02179f4141 | 165 | } |
AkiraK | 2:5e02179f4141 | 166 | fprintf(fp, "%s,#end\r\n", GPS); //GPS data is writen to mbed <write system(GPS) |
AkiraK | 2:5e02179f4141 | 167 | gps_get = false; |
AkiraK | 2:5e02179f4141 | 168 | leds = 0; |
AkiraK | 2:5e02179f4141 | 169 | } |
AkiraK | 2:5e02179f4141 | 170 | |
AkiraK | 2:5e02179f4141 | 171 | leds = 0; |
AkiraK | 2:5e02179f4141 | 172 | leds = 8; |
AkiraK | 2:5e02179f4141 | 173 | |
AkiraK | 2:5e02179f4141 | 174 | wait(0.1); |
AkiraK | 2:5e02179f4141 | 175 | |
AkiraK | 2:5e02179f4141 | 176 | if (endsw != stateSW) { |
AkiraK | 2:5e02179f4141 | 177 | stateSW = !stateSW; |
AkiraK | 2:5e02179f4141 | 178 | |
AkiraK | 2:5e02179f4141 | 179 | if (stateSW) { |
AkiraK | 2:5e02179f4141 | 180 | fclose(fp); |
AkiraK | 2:5e02179f4141 | 181 | timer.stop(); |
AkiraK | 2:5e02179f4141 | 182 | gps_flag = 0; |
AkiraK | 2:5e02179f4141 | 183 | |
AkiraK | 2:5e02179f4141 | 184 | while (true) { |
AkiraK | 2:5e02179f4141 | 185 | leds = 8; |
AkiraK | 2:5e02179f4141 | 186 | wait(1.0); |
AkiraK | 2:5e02179f4141 | 187 | leds = 0; |
AkiraK | 2:5e02179f4141 | 188 | wait(1.0); |
AkiraK | 2:5e02179f4141 | 189 | } |
AkiraK | 2:5e02179f4141 | 190 | |
AkiraK | 2:5e02179f4141 | 191 | } |
AkiraK | 2:5e02179f4141 | 192 | |
AkiraK | 2:5e02179f4141 | 193 | } |
AkiraK | 2:5e02179f4141 | 194 | |
AkiraK | 2:5e02179f4141 | 195 | } |
AkiraK | 2:5e02179f4141 | 196 | } |
AkiraK | 2:5e02179f4141 | 197 | } |
AkiraK | 2:5e02179f4141 | 198 | } |
AkiraK | 2:5e02179f4141 | 199 | } |