2017年3月,伊豆大島共同打上実験 CORE_缶ロケチーム電装

Dependencies:   MPU6050 MS5607 mbed SDFileSystem

Committer:
mikawataru
Date:
Thu Mar 02 22:59:12 2017 +0000
Revision:
11:b61d0fcc2ed3
Parent:
10:c1d1ff35a6a1
Child:
12:211d2c6d2afc
correction offset value of acceleration

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mikawataru 5:bcf55d8fe7a7 1 /*
mikawataru 5:bcf55d8fe7a7 2 2017年3月 伊豆大島共同打上実験
mikawataru 5:bcf55d8fe7a7 3 団体名:CORE
mikawataru 5:bcf55d8fe7a7 4 チーム名:ヌペリオル
mikawataru 5:bcf55d8fe7a7 5 該当電装:ロケット搭載用
mikawataru 5:bcf55d8fe7a7 6
mikawataru 5:bcf55d8fe7a7 7 使用部品
mikawataru 5:bcf55d8fe7a7 8 ・LPC1768(マイコン)
mikawataru 5:bcf55d8fe7a7 9 ・MPU6050(加速度・ジャイロセンサ)
mikawataru 5:bcf55d8fe7a7 10 ・MS5607(気圧・気温センサ)
mikawataru 5:bcf55d8fe7a7 11 ・MicroSDスロット
mikawataru 5:bcf55d8fe7a7 12 ・MG995(サーボモータ)×4
mikawataru 5:bcf55d8fe7a7 13
mikawataru 7:5f693667d0e9 14 使用ライブラリ
mikawataru 7:5f693667d0e9 15 ・MPU6050.h
mikawataru 7:5f693667d0e9 16 https://developer.mbed.org/teams/mbed/code/SDFileSystem/
mikawataru 7:5f693667d0e9 17 ・MS5607.h
mikawataru 7:5f693667d0e9 18 https://developer.mbed.org/users/yamaguch/code/MS5607/
mikawataru 7:5f693667d0e9 19 ・SDFileSystem.h
mikawataru 7:5f693667d0e9 20 https://developer.mbed.org/teams/mbed/code/SDFileSystem/
mikawataru 7:5f693667d0e9 21
mikawataru 5:bcf55d8fe7a7 22 ピン配置
mikawataru 5:bcf55d8fe7a7 23 LPC1768 MPU6050 MS5607 MicroSD MG995_1 MG995_2 MG995_3 MG995_4
mikawataru 5:bcf55d8fe7a7 24 VIN--------------------------------------------------------------------4.5~9.0V
mikawataru 5:bcf55d8fe7a7 25 -----------------------------------VIN------VIN------VIN------VIN------5V
mikawataru 5:bcf55d8fe7a7 26 Vout-----VCC------VIN-----VDD------------------------------------------3.3V
mikawataru 6:15204813ef87 27 \-ADO \-PS
mikawataru 5:bcf55d8fe7a7 28 GND------GND------GND-----VSS------GND------GND------GND------GND------0V
mikawataru 6:15204813ef87 29 \-CS
mikawataru 5:bcf55d8fe7a7 30 p9-------SDA------SDA----------------------------------------------------
mikawataru 5:bcf55d8fe7a7 31 p10------SCL------SCL----------------------------------------------------
mikawataru 5:bcf55d8fe7a7 32 p11-----------------------CLK--------------------------------------------
mikawataru 5:bcf55d8fe7a7 33 p12-----------------------DAT0-------------------------------------------
mikawataru 5:bcf55d8fe7a7 34 p13-----------------------CMD--------------------------------------------
mikawataru 5:bcf55d8fe7a7 35 p14-----------------------CD/DAT0----------------------------------------
mikawataru 5:bcf55d8fe7a7 36 p23--------------------------------CTRL----------------------------------
mikawataru 5:bcf55d8fe7a7 37 p24-----------------------------------------CTRL-------------------------
mikawataru 5:bcf55d8fe7a7 38 p25--------------------------------------------------CTRL----------------
mikawataru 5:bcf55d8fe7a7 39 p26-----------------------------------------------------------CTRL-------
mikawataru 5:bcf55d8fe7a7 40 */
mikawataru 0:10a9c9c5ce83 41 #include "mbed.h"
mikawataru 7:5f693667d0e9 42 #include "math.h"
mikawataru 0:10a9c9c5ce83 43 #include "MS5607I2C.h"
mikawataru 0:10a9c9c5ce83 44 #include "MPU6050.h"
mikawataru 1:ec75f428c6b3 45 #include "SDFileSystem.h"
mikawataru 7:5f693667d0e9 46 /*判定パラメータ*/
mikawataru 8:a9e115560ba3 47 #define ACC_LAUNCH 4//発射判定加速度[g]
mikawataru 7:5f693667d0e9 48 #define DROP_TOP 1.5//頂点判定最低降下量[m]
mikawataru 8:a9e115560ba3 49 #define ALT_CAN 350//缶サット開放高度[m]
mikawataru 8:a9e115560ba3 50 #define TIME_TOP 15//タイマー開放時間[s]
mikawataru 3:9cd74af355cc 51 /*動作レート*/
mikawataru 3:9cd74af355cc 52 #define RATE_LOG 10//ログ用
mikawataru 3:9cd74af355cc 53 #define RATE_OPEN 10//開放用
mikawataru 3:9cd74af355cc 54 /*サーボ動作*/
mikawataru 6:15204813ef87 55 #define LOCK 0.0005
mikawataru 6:15204813ef87 56 #define UNLOCK 0.0015
mikawataru 3:9cd74af355cc 57 /*フェイズ定義*/
mikawataru 3:9cd74af355cc 58 #define STANDBY 0
mikawataru 3:9cd74af355cc 59 #define LAUNCH 1
mikawataru 3:9cd74af355cc 60 #define FLIGHT 2
mikawataru 7:5f693667d0e9 61 #define DROP 3
mikawataru 0:10a9c9c5ce83 62
mikawataru 8:a9e115560ba3 63 #define P0 1013.25f//海面気圧[hPa]
mikawataru 11:b61d0fcc2ed3 64 #define ACC 4096.0f//加速度オフセット値
mikawataru 7:5f693667d0e9 65 /*ピン指定*/
mikawataru 0:10a9c9c5ce83 66 MS5607I2C ms5607(p9, p10, false);
mikawataru 0:10a9c9c5ce83 67 MPU6050 mpu(p9,p10);
mikawataru 3:9cd74af355cc 68 BusOut myled(LED1,LED2,LED3,LED4);
mikawataru 7:5f693667d0e9 69 SDFileSystem sd(p11, p12, p13, p14, "sd");
mikawataru 10:c1d1ff35a6a1 70 Serial device(USBTX, USBRX);
mikawataru 5:bcf55d8fe7a7 71 PwmOut Door_1_1(p23);
mikawataru 5:bcf55d8fe7a7 72 PwmOut Door_1_2(p24);
mikawataru 5:bcf55d8fe7a7 73 PwmOut Door_2_1(p25);
mikawataru 5:bcf55d8fe7a7 74 PwmOut Door_2_2(p26);
mikawataru 7:5f693667d0e9 75 /*タイマー類*/
mikawataru 1:ec75f428c6b3 76 Timer timer;
mikawataru 3:9cd74af355cc 77 Ticker loop_log;
mikawataru 3:9cd74af355cc 78 Ticker loop_open;
mikawataru 5:bcf55d8fe7a7 79 /*ログカウンタ*/
mikawataru 5:bcf55d8fe7a7 80 bool row = 0;
mikawataru 3:9cd74af355cc 81 int8_t col = 0;
mikawataru 5:bcf55d8fe7a7 82 /*ログ格納用*/
mikawataru 11:b61d0fcc2ed3 83 float altitude[2][RATE_LOG],pressure[2][RATE_LOG],temperature[2][RATE_LOG];
mikawataru 3:9cd74af355cc 84 float acc[2][RATE_LOG][3],gyro[2][RATE_LOG][3];
mikawataru 3:9cd74af355cc 85 float t[2][RATE_LOG];
mikawataru 7:5f693667d0e9 86 FILE *fp;
mikawataru 11:b61d0fcc2ed3 87 /*フェーズ変数*/
mikawataru 5:bcf55d8fe7a7 88 int8_t Phase = STANDBY;
mikawataru 7:5f693667d0e9 89 /*判定用*/
mikawataru 11:b61d0fcc2ed3 90 float alt4open[RATE_OPEN],acc4open;
mikawataru 11:b61d0fcc2ed3 91 float alt_max,alt_launch;
mikawataru 7:5f693667d0e9 92 float t_drop,t_top,t_launch;
mikawataru 11:b61d0fcc2ed3 93 int8_t cnt_judge = 0;
mikawataru 11:b61d0fcc2ed3 94 int8_t col_open = 0;
mikawataru 7:5f693667d0e9 95 /*関数*/
mikawataru 3:9cd74af355cc 96 void _Open();
mikawataru 6:15204813ef87 97 void _Servo(int8_t door_num, float motion);
mikawataru 3:9cd74af355cc 98 void _Log();
mikawataru 11:b61d0fcc2ed3 99 float _GetAlt(float press, float temp);
mikawataru 11:b61d0fcc2ed3 100 float _Median(float data[], int num);
mikawataru 11:b61d0fcc2ed3 101
mikawataru 7:5f693667d0e9 102 /*---------------------------------------------------------------------*/
mikawataru 0:10a9c9c5ce83 103 int main() {
mikawataru 11:b61d0fcc2ed3 104 mpu.setAcceleroRange(2);
mikawataru 11:b61d0fcc2ed3 105 mpu.setGyroRange(2);
mikawataru 1:ec75f428c6b3 106 timer.start();
mikawataru 5:bcf55d8fe7a7 107 Door_1_1.period_ms(20);
mikawataru 5:bcf55d8fe7a7 108 Door_1_2.period_ms(20);
mikawataru 5:bcf55d8fe7a7 109 Door_2_1.period_ms(20);
mikawataru 5:bcf55d8fe7a7 110 Door_2_2.period_ms(20);
mikawataru 6:15204813ef87 111 _Servo(0,LOCK);
mikawataru 2:b6eb08d059cc 112 fp = fopen("/sd/log.txt", "w");
mikawataru 1:ec75f428c6b3 113 fprintf(fp, "pressure,temperature,ax,ay,az,gx,gy,gz\r\n");
mikawataru 3:9cd74af355cc 114 loop_log.attach(&_Log,1.0/RATE_LOG);
mikawataru 3:9cd74af355cc 115 loop_open.attach(&_Open,1.0/RATE_OPEN);
mikawataru 3:9cd74af355cc 116 while(1);
mikawataru 3:9cd74af355cc 117 }
mikawataru 6:15204813ef87 118 /*開放用関数 RATE_OPEN[Hz]で判定を行う*/
mikawataru 3:9cd74af355cc 119 void _Open(){
mikawataru 3:9cd74af355cc 120 myled = 1 << (Phase-1);
mikawataru 3:9cd74af355cc 121 switch (Phase) {
mikawataru 3:9cd74af355cc 122 case STANDBY://スタンバイモード(発射判定不可)
mikawataru 11:b61d0fcc2ed3 123 Phase = LAUNCH;
mikawataru 3:9cd74af355cc 124 break;
mikawataru 7:5f693667d0e9 125 case LAUNCH://点火モード(発射判定可)
mikawataru 11:b61d0fcc2ed3 126 acc4open = (float)mpu.getAcceleroRawZ()/(ACC*0.981);
mikawataru 11:b61d0fcc2ed3 127 alt4open[col_open] = _GetAlt(ms5607.getPressure()/100,ms5607.getTemperature());
mikawataru 11:b61d0fcc2ed3 128 if(acc4open>ACC_LAUNCH){
mikawataru 11:b61d0fcc2ed3 129 if(cnt_judge++==3){
mikawataru 11:b61d0fcc2ed3 130 Phase = FLIGHT;
mikawataru 11:b61d0fcc2ed3 131 alt_launch = _Median(alt4open, RATE_OPEN);
mikawataru 11:b61d0fcc2ed3 132 cnt_judge = 0;
mikawataru 11:b61d0fcc2ed3 133 }
mikawataru 7:5f693667d0e9 134 t_launch = timer.read();
mikawataru 11:b61d0fcc2ed3 135 alt_max = alt_launch;
mikawataru 7:5f693667d0e9 136 }else{
mikawataru 11:b61d0fcc2ed3 137 if(timer.read()>t_launch+1.0) cnt_judge = 0;
mikawataru 3:9cd74af355cc 138 }
mikawataru 11:b61d0fcc2ed3 139 device.printf("%f\r\n",acc4open);
mikawataru 4:cc266df87f3e 140 break;
mikawataru 7:5f693667d0e9 141 case FLIGHT://飛翔中(パラシュート開放判定)
mikawataru 11:b61d0fcc2ed3 142 alt4open[col_open] = _GetAlt(ms5607.getPressure()/100,ms5607.getTemperature());
mikawataru 11:b61d0fcc2ed3 143 if(alt4open[col_open]>alt_max) alt_max = alt4open[col_open];
mikawataru 11:b61d0fcc2ed3 144 if(alt4open[col_open]<alt_max-DROP_TOP){
mikawataru 11:b61d0fcc2ed3 145 if(cnt_judge++==3){
mikawataru 7:5f693667d0e9 146 _Servo(1,UNLOCK);
mikawataru 7:5f693667d0e9 147 Phase = DROP;
mikawataru 11:b61d0fcc2ed3 148 cnt_judge = 0;
mikawataru 7:5f693667d0e9 149 }
mikawataru 7:5f693667d0e9 150 t_top = timer.read();
mikawataru 7:5f693667d0e9 151 }else{
mikawataru 11:b61d0fcc2ed3 152 if(timer.read()>t_top+1.0) cnt_judge = 0;
mikawataru 7:5f693667d0e9 153 }
mikawataru 7:5f693667d0e9 154 if(timer.read()-t_launch>TIME_TOP){
mikawataru 7:5f693667d0e9 155 _Servo(1,UNLOCK);
mikawataru 7:5f693667d0e9 156 Phase = DROP;
mikawataru 11:b61d0fcc2ed3 157 cnt_judge = 0;
mikawataru 7:5f693667d0e9 158 }
mikawataru 7:5f693667d0e9 159 break;
mikawataru 7:5f693667d0e9 160 case DROP://降下中(缶サット開放判定)
mikawataru 11:b61d0fcc2ed3 161 if(alt4open[col_open] < alt_launch+ALT_CAN){
mikawataru 11:b61d0fcc2ed3 162 if(cnt_judge++==3){
mikawataru 11:b61d0fcc2ed3 163 _Servo(2,UNLOCK);
mikawataru 11:b61d0fcc2ed3 164 cnt_judge = 0;
mikawataru 11:b61d0fcc2ed3 165 }
mikawataru 7:5f693667d0e9 166 t_drop = timer.read();
mikawataru 7:5f693667d0e9 167 }else{
mikawataru 11:b61d0fcc2ed3 168 if(timer.read()>t_drop+1.0)cnt_judge = 0;
mikawataru 7:5f693667d0e9 169 }
mikawataru 3:9cd74af355cc 170 break;
mikawataru 0:10a9c9c5ce83 171 }
mikawataru 11:b61d0fcc2ed3 172 if(col_open++==RATE_OPEN) col_open = 0;
mikawataru 0:10a9c9c5ce83 173 }
mikawataru 6:15204813ef87 174 /*記録用関数 RATE_LOG[Hz]で記録を行う*/
mikawataru 3:9cd74af355cc 175 void _Log(){
mikawataru 3:9cd74af355cc 176 t[row][col] = timer.read();
mikawataru 7:5f693667d0e9 177 pressure[row][col] = ms5607.getPressure()/100;
mikawataru 3:9cd74af355cc 178 temperature[row][col] = ms5607.getTemperature();
mikawataru 3:9cd74af355cc 179 mpu.getAccelero(&acc[row][col][0]);
mikawataru 3:9cd74af355cc 180 mpu.getGyro(&gyro[row][col][0]);
mikawataru 3:9cd74af355cc 181 fprintf(fp, "%f,%f,%f,%f,%f,%f,%f,%f,%f\r\n",
mikawataru 11:b61d0fcc2ed3 182 t[row][col],pressure[row][col],temperature[row][col],acc[row][col][0]/10.0,
mikawataru 11:b61d0fcc2ed3 183 acc[row][col][1]/10.0,acc[row][col][2]/10.0,gyro[row][col][0],gyro[row][col][1],gyro[row][col][2]
mikawataru 3:9cd74af355cc 184 );
mikawataru 3:9cd74af355cc 185 if(col++==RATE_LOG){
mikawataru 3:9cd74af355cc 186 fclose(fp);
mikawataru 3:9cd74af355cc 187 fp = fopen("/sd/log.txt", "a");
mikawataru 3:9cd74af355cc 188 row =! row;
mikawataru 3:9cd74af355cc 189 col = 0;
mikawataru 3:9cd74af355cc 190 }
mikawataru 3:9cd74af355cc 191 }
mikawataru 6:15204813ef87 192 /*サーボ動作用関数 _Servo(int8_t 扉番号,float pwm波長)*/
mikawataru 6:15204813ef87 193 void _Servo(int8_t door_num, float motion){
mikawataru 6:15204813ef87 194 if(door_num==0){//全扉
mikawataru 6:15204813ef87 195 Door_1_1.pulsewidth(motion);
mikawataru 6:15204813ef87 196 Door_1_2.pulsewidth(motion);
mikawataru 6:15204813ef87 197 Door_2_1.pulsewidth(motion);
mikawataru 6:15204813ef87 198 Door_2_2.pulsewidth(motion);
mikawataru 6:15204813ef87 199 }else if(door_num==1){//扉1
mikawataru 6:15204813ef87 200 Door_1_1.pulsewidth(motion);
mikawataru 6:15204813ef87 201 Door_1_2.pulsewidth(motion);
mikawataru 6:15204813ef87 202 }else if(door_num==2){//扉2
mikawataru 6:15204813ef87 203 Door_2_1.pulsewidth(motion);
mikawataru 6:15204813ef87 204 Door_2_2.pulsewidth(motion);
mikawataru 6:15204813ef87 205 }else{
mikawataru 10:c1d1ff35a6a1 206 device.printf("error\r\n");
mikawataru 6:15204813ef87 207 }
mikawataru 3:9cd74af355cc 208 }
mikawataru 7:5f693667d0e9 209
mikawataru 11:b61d0fcc2ed3 210 float _GetAlt(float press, float temp){
mikawataru 7:5f693667d0e9 211 return (pow((P0/press), (1.0f/5.257f))-1.0f)*(temp+273.15f)/0.0065f;
mikawataru 7:5f693667d0e9 212 }
mikawataru 11:b61d0fcc2ed3 213
mikawataru 11:b61d0fcc2ed3 214 float _Median(float data[], int num){
mikawataru 11:b61d0fcc2ed3 215 float median;
mikawataru 11:b61d0fcc2ed3 216 float *sort = (float *)malloc(sizeof(float)*num);
mikawataru 11:b61d0fcc2ed3 217 for(int i=0; i<num; i++) sort[i] = data[i];
mikawataru 11:b61d0fcc2ed3 218 for(int i=0; i<num; i++){
mikawataru 11:b61d0fcc2ed3 219 for(int j=0; j<num-i-1; j++){
mikawataru 11:b61d0fcc2ed3 220 if(sort[j]>sort[j+1]){
mikawataru 11:b61d0fcc2ed3 221 float buff = sort[j+1];
mikawataru 11:b61d0fcc2ed3 222 sort[j+1] = sort[j];
mikawataru 11:b61d0fcc2ed3 223 sort[j] = buff;
mikawataru 11:b61d0fcc2ed3 224 }
mikawataru 11:b61d0fcc2ed3 225 }
mikawataru 11:b61d0fcc2ed3 226 }
mikawataru 11:b61d0fcc2ed3 227
mikawataru 11:b61d0fcc2ed3 228 if(num%2!=0)median = sort[num/2];
mikawataru 11:b61d0fcc2ed3 229 else median = (sort[num/2-1]+sort[num/2])/2.0;
mikawataru 11:b61d0fcc2ed3 230
mikawataru 11:b61d0fcc2ed3 231 free(sort);
mikawataru 11:b61d0fcc2ed3 232 return median;
mikawataru 11:b61d0fcc2ed3 233 }