2019伊豆のコード
Dependencies: mbed LSM9DS1 IM920 SDFileSystem LPS331 ADXL345_I2C GPS_Interface millis
main.cpp
- Committer:
- zeutel
- Date:
- 2019-03-02
- Revision:
- 0:cebf1f73ffd5
- Child:
- 2:cad76b5be4ba
- Child:
- 4:ad2faabb7995
File content as of revision 0:cebf1f73ffd5:
#include "mbed.h" #include <string.h> #include "LPS331_I2C.h" #include "LSM9DS1.h" #include "SDFileSystem.h" #include "IM920.h" #include "GPS.h" #include "LPS22HB.h" //ピン DigitalInOut flightpin(p12); Serial pc(USBTX, USBRX); LPS331_I2C lps331(p9, p10, LPS331_I2C_SA0_HIGH); LSM9DS1 lsm(p9,p10); SDFileSystem sd(p5, p6, p7, p8, "sd"); IM920 im920(p28, p27, p29, p30); GPS gps(p13, p14); LPS22HB lps33hw(p9,p10,LPS22HB_G_CHIP_ADDR); //I2C i2c(p9,p10); //LPS22HB lps33hw(i2c, LPS22HB_G_CHIP_ADDR); PwmOut servo_1(p22), servo_2(p25); //関数 void init(FILE **file);//諸々の初期化 void checkingSensors(); void readValues(int sequence);//センサの読み取り char *valueToChar(float value);//数値を文字列に float calcAltitude(float pres, float temp);//高度計算 int main() { int sequence=0;//機体の状態の推移 int timer=0;//ms単位 const int timeInterval=50;//ms単位 float altitude,maxAltitude=0.0;//m単位 float launchTime,reducerExpantionedTime;//発射・減速機構展開時間の保持 char receive[9]={};//受信した文字列 bool flightpinAttached=false;//フライトピンが付いているかどうか FILE *fp; init(&fp);//初期化 //サーボclose //servo_1.pulsewidth(0.76/1000);//ms/1000 //servo_2.pulsewidth(1.94/1000); while(strncmp(receive,"start",sizeof(receive))!=0){//無線での開始指令待ち txda tartと受信したら計測開始 im920.poll(); memset(receive,'\0',sizeof(receive)); im920.recv(receive,8); //加速度・フライトピン読み取り lsm.readAccel(); flightpinAttached=flightpin; if(strncmp(receive,"check",sizeof(receive))==0){//checkと受信したらセンサーの状態確認 主にGPS im920.send("Check",6); checkingSensors(); } if(strncmp(receive,"retry",sizeof(receive))==0){//retryと受信したら再度初期化 im920.send("Retry initializing",19); init(&fp); } if(strncmp(receive,"reset",sizeof(receive))==0){//resetと受信したらMbedリセット im920.send("Mbed reset",11); NVIC_SystemReset(); } if(lsm.ax*lsm.ax+lsm.ay*lsm.ay+lsm.az*lsm.az>=4.0/*&&flightpinAttached==false*/){//加速度2.0G以上かつフライトピンがぬけていたらコマンドがなくても開始 im920.send("Forced start",13); break; } } im920.send("START",6); while(strncmp(receive,"end",sizeof(receive))!=0&&sequence!=3) {//endと受信するまたは着地したら終了 //受信内容の初期化 im920.poll(); memset(receive,'\0',sizeof(receive)); im920.recv(receive,8); if(strncmp(receive,"reset",sizeof(receive))==0){//resetと受信したらMbedリセット im920.send("Mbed reset",11); NVIC_SystemReset(); } //センサ・フライトピン読み取り 高度計測 readValues(sequence); flightpinAttached=flightpin; altitude=calcAltitude(lps331.pressure,lps331.temperature); pc.printf("%.2f\r\n",(float)timer/1000); /*pc.printf("%f,%f\r\n", lps331.pressure, lps331.temperature); pc.printf("accX=%.3f / accY=%.3f / accZ=%.3f\r\n",lsm.ax,lsm.ay,lsm.az); pc.printf("gyroX=%.3f / gyroY=%.3f / gyroZ=%.3f\r\n",lsm.gx,lsm.gy,lsm.gz); pc.printf("magnX=%.3f / magnY=%.3f / magnZ=%.3f\r\n",lsm.mx,lsm.my,lsm.mz); pc.printf("\r\n");*/ //地上局への送信 if(timer%1000==0){//1秒おきに経過時間送信 im920.send(valueToChar((float)timer/1000),7); } if(maxAltitude<altitude){//最高高度更新 maxAltitude=altitude; } switch(sequence){ case 0://発射待機中 //離床検知 if(lsm.ax*lsm.ax+lsm.ay*lsm.ay+lsm.az*lsm.az>=4.0/*&&flightpinAttached==false*/){//加速度2.0G以上かつフライトピンがぬけている im920.send("LAUNCH ACC>2.0G",16); launchTime=timer; sequence=1; } break; case 1://発射~減速機構展開 //減速機構展開 if(timer-launchTime>=18*1000||maxAltitude-altitude>=10){//離床検知から18秒経過 or 最高高度から10m落下 im920.send("Start speed reducing",21); reducerExpantionedTime=timer; //サーボopen //servo_1.pulsewidth(1.28/1000);//ms/1000 //servo_2.pulsewidth(1.32/1000); sequence=2; } break; case 2://減速機構展開~着地 if(timer-reducerExpantionedTime>=80*1000){//減速機構展開から80秒経過 im920.send("LANDING",8); sequence=3; } break; } //SD書き込み time,temp,pres,temp_hw,pres_hw,accXYZ,gyroXYZ,magnXYZ,longitude,latitude if(sequence==1){//飛行中 fprintf(fp,"%.2f,%f,%f,%f,%f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f\r\n", (float)timer/1000,lps331.temperature,lps331.pressure,lps33hw.temperature(),lps33hw.pressure(),lsm.ax,lsm.ay,lsm.az,lsm.gx,lsm.gy,lsm.gz,lsm.mx,lsm.my,lsm.mz); }else{//飛行中以外はGPS情報も保存 fprintf(fp,"%.2f,%f,%f,%f,%f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%f,%f\r\n", (float)timer/1000,lps331.temperature,lps331.pressure,lps33hw.temperature(),lps33hw.pressure(),lsm.ax,lsm.ay,lsm.az,lsm.gx,lsm.gy,lsm.gz,lsm.mx,lsm.my,lsm.mz,gps.longitude,gps.latitude); } timer+=timeInterval; wait((float)timeInterval/1000); } wait(0.5); fclose(fp); wait(0.5); im920.send("File closed",12); im920.send("MaxAltitude=",13); im920.send(valueToChar(maxAltitude),7); //地上局へのGPS情報送信 im920.send("Waiting for GPS response",25); while(gps.result==false){//GPSが利用可能になるまでまつ gps.getgps(); } im920.send(valueToChar(gps.longitude),7); im920.send(valueToChar(gps.latitude),7); } void init(FILE **file){ //im920 im920.init(); wait(1); //MMTXS03 if(lps331.isAvailable()) { pc.printf("LPS331 is available\r\n"); im920.send("MM-TXS03...OK",14); } else { pc.printf("LPS331 is unavailable\r\n"); im920.send("MM-TXS03...NG",14); } //MM9DS1 lsm.begin(); if(lsm.whoAmI()){ pc.printf("LSM9DS1 is available\r\n"); im920.send("MM-9DS1...OK",13); }else { pc.printf("LSM9DS1 is unavailable\r\n"); im920.send("MM-9DS1...NG",13); } //LPS33HW if(lps33hw.whoAmI()){ pc.printf("LPS33HW is available\r\n"); im920.send("LPS33HW...OK",13); }else { pc.printf("LPS33HW is unavailable\r\n"); im920.send("LPS33HW...NG",13); } //SD if(*file!=NULL){ fclose(*file); } *file = fopen("/sd/data.csv", "w"); if(*file == NULL) { pc.printf("Could not open file for write\r\n"); im920.send("SD...NG",8); }else{ pc.printf("file opend\r\n"); im920.send("SD...OK",8); fprintf(*file,"time,temperature,pressure,accX,accY,accZ,gyroX,gyroY,gyroZ,magnX,magnY,magnZ,longitude,latitude\r\n"); } //GPS優先度 NVIC_SetPriority(UART3_IRQn,0); gps.getgps(); if(gps.result){ pc.printf("GPS is available\r\n"); im920.send("GPS...OK",9); im920.send(valueToChar(gps.longitude),7); im920.send(valueToChar(gps.latitude),7); }else{ pc.printf("GPS is unavailable\r\n"); im920.send("GPS...NG",9); } //フライトピン flightpin.output(); //各種設定 lps331.setResolution(LPS331_I2C_PRESSURE_AVG_512, LPS331_I2C_TEMP_AVG_128); lps331.setDataRate(LPS331_I2C_DATARATE_25HZ_T); lps331.setActive(true); lsm.setAccelODR(lsm.A_ODR_952); lsm.setGyroODR(lsm.G_ODR_952_BW_100); lsm.setMagODR(lsm.M_ODR_80); } void checkingSensors(){ //MMTXS03 if(lps331.isAvailable()) { pc.printf("LPS331 is available\r\n"); im920.send("MM-TXS03...OK",14); } else { pc.printf("LPS331 is unavailable\r\n"); im920.send("MM-TXS03...NG",14); } //MM9DS1 if(lsm.whoAmI()){ pc.printf("LSM9DS1 is available\r\n"); im920.send("MM-9DS1...OK",13); }else { pc.printf("LSM9DS1 is unavailable\r\n"); im920.send("MM-9DS1...NG",13); } //LPS33HW if(lps33hw.whoAmI()){ pc.printf("LPS33HW is available\r\n"); im920.send("LPS33HW...OK",13); }else { pc.printf("LPS33HW is unavailable\r\n"); im920.send("LPS33HW...NG",13); } //GPS gps.getgps(); if(gps.result){ pc.printf("GPS is available\r\n"); im920.send("GPS...OK",9); im920.send(valueToChar(gps.longitude),7); im920.send(valueToChar(gps.latitude),7); }else{ pc.printf("GPS is unavailable\r\n"); im920.send("GPS...NG",9); } } void readValues(int sequence){ lsm.readAccel(); lsm.readGyro(); lsm.readMag(); lps331.getPressure(); lps331.getTemperature(); lps33hw.get(); if(sequence!=1){ gps.getgps(); } } char *valueToChar(float value){ char buf[6]; sprintf(buf,"%06.2f",value); return buf; } float calcAltitude(float pres, float temp){ return (pow(1013.25/pres,1/5.257)-1)*(temp+273.15)/0.0065; }