2019伊豆のコード
Dependencies: mbed LSM9DS1 IM920 SDFileSystem LPS331 ADXL345_I2C GPS_Interface millis
Diff: main.cpp
- Revision:
- 7:1f2508ade0a3
- Parent:
- 5:03d31f0a4943
--- a/main.cpp Tue Mar 12 13:44:46 2019 +0000 +++ b/main.cpp Wed Jul 31 15:34:38 2019 +0000 @@ -4,39 +4,52 @@ #include "SDFileSystem.h" #include "IM920.h" #include "millis.h" +#include "ADXL345_I2C.h" #include "GPS.h" -#include "LPS22HB.h" -#include "stdio.h" +#include <stdio.h> +#include <string.h> -//ピン -DigitalIn flightpin(p12); -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); +//ピンとか +Serial pc(USBTX, USBRX); +DigitalIn flightpin(p12);//フライトピン +LPS331_I2C lps331(p9, p10, LPS331_I2C_SA0_HIGH);//気温気圧 + ADXL345_I2C accelerometer(p9, p10);//オープニングショック +LSM9DS1 lsm(p9,p10);//9軸 +IM920 im920(p28, p27, p29, p30);//無線 +GPS gps(p13, p14);//GPS +SDFileSystem sd(p5, p6, p7, p8, "sd");//SD +PwmOut servo_1(p26), servo_2(p25);//サーボ Timer waitTime; -char sendData[256]; -PwmOut servo_1(p22), servo_2(p25); -bool SDisAvailable=false; + -//関数 + +//function void init(FILE **file);//諸々の初期化 void checkingSensors(); -void readValues(int sequence);//センサの読み取り +void readValues(int sequence,float *temperature,float *pressure,float *openingShockReadings);//センサの読み取り +void imRecv(char *receive);//無線受信 float calcAltitude(float pres, float temp);//高度計算 +void imSend(char *send); +void mbedOperate(char *command); +void sendDatas(float time,float temp,float pres,float ax,float ay,float az,float gx,float gy,float gz);//unity用data送信 + +//global +char sendData[256]; +FILE *fp; +bool SDisAvailable=false; int main() { int sequence=0;//機体の状態の推移 int pretime=0,pretime_2=0; - float altitude,maxAltitude=0.0;//m単位 + float altitude=-1000.0,maxAltitude=-1000.0;//m単位 float launchTime,reducerExpantionedTime;//発射・減速機構展開時間の保持 char receive[9]={};//受信した文字列 bool flightpinAttached=false;//フライトピンが付いているかどうか + float temperature,pressure; + float accelReadings[3] = {0, 0, 0};//x,y,z + millisStart(); - - FILE *fp; + //サーボclose servo_1.pulsewidth(1.05/1000.0);//ms/1000 servo_2.pulsewidth(1.94/1000.0); @@ -44,128 +57,59 @@ init(&fp);//初期化 flightpinAttached=flightpin; - while(flightpinAttached == false){ - im920.poll(); - memset(receive,'\0',sizeof(receive)); - im920.recv(receive,8); - flightpinAttached=flightpin; + while(strncmp(receive,"escape",sizeof(receive))!=0){//準備中 + imRecv(receive); + mbedOperate(receive); + readValues(sequence,&temperature,&pressure,accelReadings); + sendDatas((float)millis()/1000,temperature,pressure,lsm.ax,lsm.ay,lsm.az,lsm.gx,lsm.gy,lsm.gz); if(millis()-pretime>5000){ - im920.send("Waiting_1",10); pretime=millis(); - } - if(strncmp(receive,"nowait",sizeof(receive))==0){ - flightpinAttached=false; - break; - } - if(strncmp(receive,"retry",sizeof(receive))==0){//retryと受信したら再度初期化 - im920.send("Retry initializing",19); - init(&fp); - wait(1); - } - if(strncmp(receive,"reset",sizeof(receive))==0){//resetと受信したらMbedリセット - im920.send("Mbed reset",11); - NVIC_SystemReset(); - } - } - while(flightpinAttached == true){//組み立て中はつけたまま - im920.poll(); - memset(receive,'\0',sizeof(receive)); - im920.recv(receive,8); - flightpinAttached=flightpin; - if(millis()-pretime>5000){ - im920.send("Waiting_2",10); - pretime=millis(); - } - if(strncmp(receive,"nowait",sizeof(receive))==0){ - flightpinAttached=false; - break; - } - if(strncmp(receive,"retry",sizeof(receive))==0){//retryと受信したら再度初期化 - im920.send("Retry initializing",19); - init(&fp); - wait(1); - } - if(strncmp(receive,"reset",sizeof(receive))==0){//resetと受信したらMbedリセット - im920.send("Mbed reset",11); - NVIC_SystemReset(); + //センサ・フライトピン + flightpinAttached=flightpin; + //altitude=calcAltitude(pressure,temperature); + //sprintf(sendData,"time=%06.3fs, alt=%.2fm, absAcc=%.2fm/s^2",(float)millis()/1000,altitude,sqrt(lsm.ax*lsm.ax+lsm.ay*lsm.ay+lsm.az*lsm.az)); + //imSend(sendData); + imSend("Waiting: command 'escape' to escape waiting"); + if(flightpinAttached==false){ + imSend("flightpin isn't attached"); + } } } - while(flightpinAttached == false){//ランチャー取り付け中は取り外す - im920.poll(); - memset(receive,'\0',sizeof(receive)); - im920.recv(receive,8); + + imSend("Escape Waiting"); + + while(strncmp(receive,"record",sizeof(receive))!=0){//開始指令待ち + imRecv(receive); + mbedOperate(receive); + //加速度・フライトピン読み取り + readValues(sequence,&temperature,&pressure,accelReadings); + sendDatas((float)millis()/1000,temperature,pressure,lsm.ax,lsm.ay,lsm.az,lsm.gx,lsm.gy,lsm.gz); flightpinAttached=flightpin; - if(millis()-pretime>5000){ - im920.send("Waiting_3",10); - pretime=millis(); - } - if(strncmp(receive,"nowait",sizeof(receive))==0){ - flightpinAttached=false; - break; - } - if(strncmp(receive,"retry",sizeof(receive))==0){//retryと受信したら再度初期化 - im920.send("Retry initializing",19); - init(&fp); - wait(1); - } - if(strncmp(receive,"reset",sizeof(receive))==0){//resetと受信したらMbedリセット - im920.send("Mbed reset",11); - NVIC_SystemReset(); - } - } - im920.send("escape Waiting",14); - - while(strncmp(receive,"start",sizeof(receive))!=0){//無線での開始指令待ち txda startと受信したら計測開始 - 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); - wait(1); - } - 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); + if(lsm.ax*lsm.ax+lsm.ay*lsm.ay+lsm.az*lsm.az>=2.0*2.0 && flightpinAttached==false){//加速度2.0G以上かつフライトピンがぬけていたらコマンドがなくても開始 + imSend("Forced start"); launchTime=millis(); sequence=1; break; } //地上局への送信 if(millis() - pretime > 5000){//5秒おきに経過時間送信 - lps33hw.get(); - sprintf(sendData," %06.3fs, %06.2fPa",(float)millis()/1000,lps33hw.pressure()); - im920.send(sendData,20); + //altitude=calcAltitude(pressure,temperature); + //sprintf(sendData,"time=%06.3fs, alt=%.2fm, absAcc=%.2fm/s^2",(float)millis()/1000,altitude,sqrt(lsm.ax*lsm.ax+lsm.ay*lsm.ay+lsm.az*lsm.az)); + //imSend(sendData); + imSend("Start Waiting: command 'record' to start recording"); pretime = millis(); } } - im920.send("START",6); + imSend("RECORDEING START"); 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(); - } - + imRecv(receive); + mbedOperate(receive); //センサ・フライトピン読み取り 高度計測 - readValues(sequence); + readValues(sequence,&temperature,&pressure,accelReadings); + sendDatas((float)millis()/1000,temperature,pressure,lsm.ax,lsm.ay,lsm.az,lsm.gx,lsm.gy,lsm.gz); flightpinAttached=flightpin; - altitude=calcAltitude(lps33hw.pressure(),lps33hw.temperature()); + altitude=calcAltitude(pressure,temperature); if(maxAltitude<altitude){//最高高度更新 maxAltitude=altitude; @@ -174,13 +118,13 @@ 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); + if(lsm.ax*lsm.ax+lsm.ay*lsm.ay+lsm.az*lsm.az>=2.0*2.0 &&flightpinAttached==false){//加速度2.0G以上かつフライトピンがぬけている + imSend("LAUNCH ACC>2.0G"); launchTime=millis(); sequence=1; } if(lsm.ax*lsm.ax+lsm.ay*lsm.ay+lsm.az*lsm.az>=3.9*3.9 &&flightpinAttached==true){//加速度4.0G以上かつフライトピンがぬけてない - im920.send("LAUNCH ACC>3.9G",16); + imSend("LAUNCH ACC>3.9G"); launchTime=millis(); sequence=1; } @@ -188,9 +132,9 @@ case 1://発射~減速機構展開 //減速機構展開 - if(millis()-launchTime>=10*1000){ - if(millis()-launchTime>=15*1000||maxAltitude-altitude>=10){//離床検知から18秒経過 or 最高高度から10m落下 - im920.send("Start speed reducing",21); + if(millis()-launchTime>=13*1000){ + if(millis()-launchTime>=15*1000||maxAltitude-altitude>=10){//離床検知から18秒経過 or 最高高度から10m落下 + imSend("Start speed reducing"); reducerExpantionedTime=millis(); //サーボopen servo_1.pulsewidth(1.90/1000);//ms/1000 @@ -202,29 +146,63 @@ case 2://減速機構展開~着地 if(millis()-reducerExpantionedTime>=80*1000){//減速機構展開から80秒経過 - im920.send("LANDING",8); + imSend("LANDING"); sequence=3; } break; } - //SD書き込み time,temp,pres,temp_hw,pres_hw,accXYZ,gyroXYZ,magnXYZ,longitude,latitude - if(SDisAvailable){ - if(sequence==1){//飛行中 - fprintf(fp,"%.3f,%f,%f,%f,%f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f\r\n", - (float)millis()/1000,lps331.getTemperature(),lps331.getPressure(),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,"%.3f,%f,%f,%f,%f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%f,%f\r\n", - (float)millis()/1000,lps331.getTemperature(),lps331.getPressure(),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); - } - } - if(millis() - pretime_2 > 2000){//2秒おきにGPS送信 + if(millis() - pretime_2 > 2000){//2秒おきに状態送信 sprintf(sendData," %1d: %06.2fm, %07.3fs",sequence,altitude,(float)millis()/1000); - im920.send(sendData,22); + imSend(sendData); pretime_2=millis(); } - //地上局へのGPS情報送信 + if(sequence==1){ + //SD書き込み + if(SDisAvailable){ + fprintf(fp,"%.3f,%f,%f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f\r\n", + (float)millis()/1000,temperature,pressure,lsm.ax,lsm.ay,lsm.az,lsm.gx,lsm.gy,lsm.gz,lsm.mx,lsm.my,lsm.mz); + } + }else{ + //SD書き込み + if(SDisAvailable){ + fprintf(fp,"%.3f,%f,%f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%f,%f\r\n", + (float)millis()/1000,temperature,pressure,lsm.ax,lsm.ay,lsm.az,lsm.gx,lsm.gy,lsm.gz,lsm.mx,lsm.my,lsm.mz,gps.longitude,gps.latitude); + } + + //地上局へのGPS情報送信 + /*if(millis() - pretime > 5000){//5秒おきにGPS送信 + waitTime.start(); + waitTime.reset(); + while(gps.result==false){//GPSが利用可能になるまでまつ + gps.getgps(); + if(waitTime.read() > 1){ + waitTime.stop(); + break; + } + } + sprintf(sendData," %08.5fE, %08.5fN",gps.longitude,gps.latitude); + imSend(sendData); + }*/ + pretime=millis(); + } + } + + //着地後 + if(SDisAvailable){ + fclose(fp); + imSend("File closed"); + }else{ + imSend("SD error"); + } + + sprintf(sendData,"MaxAltitude:%06.2fm",maxAltitude); + imSend(sendData); + + while(1){ + imRecv(receive); + mbedOperate(receive); if(millis() - pretime > 5000){//5秒おきにGPS送信 if(sequence != 1){ waitTime.start(); @@ -236,44 +214,8 @@ break; } } - sprintf(sendData," %08.5fE, %08.5fN",gps.longitude,gps.latitude); - im920.send(sendData,24); - } - pretime=millis(); - } - } - if(SDisAvailable){ - fclose(fp); - im920.send("File closed",12); - }else{ - im920.send("SD error",9); - } - sprintf(sendData," MaxAltitude: %06.2fm",maxAltitude); - im920.send(sendData,23); - while(1){ - //受信内容の初期化 - 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(); - } - - if(millis() - pretime > 5000){//5秒おきにGPS送信 - if(sequence != 1){ - waitTime.start(); - waitTime.reset(); - while(gps.result==false){//GPSが利用可能になるまでまつ - gps.getgps(); - if(waitTime.read() > 1){ - waitTime.stop(); - break; - } - } - sprintf(sendData," %08.5fE, %08.5fN",gps.longitude,gps.latitude); - im920.send(sendData,24); + sprintf(sendData,"%08.5fE,%08.5fN",gps.longitude,gps.latitude); + imSend(sendData); } pretime=millis(); } @@ -287,106 +229,189 @@ //MMTXS03 if(lps331.isAvailable()) { - im920.send("MM-TXS03...OK",14); + imSend("MM-TXS03,OK"); } else { - im920.send("MM-TXS03...NG",14); + imSend("MM-TXS03,NG"); } //MM9DS1 - lsm.begin(); - if(lsm.whoAmI()){ - im920.send("MM-9DS1...OK",13); + //lsm.begin(); + uint16_t WhoIsLsm = lsm.begin(); + if(WhoIsLsm==0x683D){ + imSend("MM-9DS1,OK"); + }else{ + imSend("MM-9DS1,NG"); + } + /*if(lsm.whoAmI()){ + imSend("MM-9DS1,OK"); }else { - im920.send("MM-9DS1...NG",13); - } + imSend("MM-9DS1,NG"); + }*/ - //LPS33HW - if(!lps33hw.whoAmI()){ - im920.send("LPS33HW...OK",13); - }else { - im920.send("LPS33HW...NG",13); - } + //opening shock + if(accelerometer.getDeviceID()==0xE5) { + imSend("ADXL345,OK"); + }else{ + imSend("ADXL345,NG"); + } + wait(1); //SD *file = fopen("/sd/data.csv", "w"); if(*file == NULL) { - im920.send("SD...NG",8); + imSend("SD,NG"); SDisAvailable = false; }else{ - im920.send("SD...OK",8); + imSend("SD,OK"); fprintf(*file,"time,temperature,pressure,temperature_hw,pressure_hw,accX,accY,accZ,gyroX,gyroY,gyroZ,magnX,magnY,magnZ,longitude,latitude\r\n"); SDisAvailable = true; } //GPS優先度 - NVIC_SetPriority(UART3_IRQn,0); + /*NVIC_SetPriority(UART3_IRQn,0); gps.getgps(); if(gps.result){ - im920.send("GPS...OK",9); + imSend("GPS...OK"); sprintf(sendData,"%05.2f,%04.2f",gps.longitude,gps.latitude); - im920.send(sendData,11); + imSend(sendData); }else{ - im920.send("GPS...NG",9); - } + imSend("GPS...NG"); + }*/ //フライトピン //flightpin.output(); //各種設定 - /*lps331.setResolution(LPS331_I2C_PRESSURE_AVG_512, LPS331_I2C_TEMP_AVG_128); - lps331.setDataRate(LPS331_I2C_DATARATE_25HZ_T); + lps331.setResolution(LPS331_I2C_PRESSURE_AVG_512, LPS331_I2C_TEMP_AVG_128); + lps331.setDataRate(LPS331_I2C_DATARATE_7HZ); lps331.setActive(true); lsm.setAccelODR(lsm.A_ODR_952); lsm.setGyroODR(lsm.G_ODR_952_BW_100); - lsm.setMagODR(lsm.M_ODR_80);*/ + lsm.setMagODR(lsm.M_ODR_80); + + // These are here to test whether any of the initialization fails. It will print the failure + /*if (accelerometer.setPowerControl(0x00)){ + pc.printf("didn't intitialize power control\r\n"); + } + //Full resolution, +/-16g, 4mg/LSB. + wait(.001); + + if(accelerometer.setDataFormatControl(0x0B)){ + pc.printf("didn't set data format\r\n"); + } + wait(.001);*/ + + //3.2kHz data rate. + if(accelerometer.setDataRate(ADXL345_200HZ)){ + pc.printf("didn't set data rate\r\n"); + } + wait(.001); + + //分解能 + accelerometer.setOpticalResolution(0x0B); + + //測定モード + if(accelerometer.setPowerControl(MeasurementMode)) { + pc.printf("didn't set the power control to measurement\r\n"); + } + + } void checkingSensors(){ //MMTXS03 if(lps331.isAvailable()) { - im920.send("MM-TXS03...OK",14); + imSend("MM-TXS03,OK"); } else { - im920.send("MM-TXS03...NG",14); + imSend("MM-TXS03,NG"); } //MM9DS1 if(lsm.whoAmI()){ - im920.send("MM-9DS1...OK",13); + imSend("MM-9DS1,OK"); }else { - im920.send("MM-9DS1...NG",13); - } - - //LPS33HW - if(!lps33hw.whoAmI()){ - im920.send("LPS33HW...OK",13); - }else { - im920.send("LPS33HW...NG",13); + imSend("MM-9DS1,NG"); } + //opening shock + if(accelerometer.getDeviceID()==0xE5) { + imSend("ADXL345,OK"); + }else{ + imSend("ADXL345,NG"); + } + //GPS - gps.getgps(); + /*gps.getgps(); if(gps.result){ - im920.send("GPS...OK",9); + imSend("GPS...OK"); sprintf(sendData,"%05.2f,%04.2f",gps.longitude,gps.latitude); - im920.send(sendData,11); + imSend(sendData); }else{ - im920.send("GPS...NG",9); - } + imSend("GPS...NG"); + }*/ } -void readValues(int sequence){ +void readValues(int sequence,float *temperature,float *pressure,float *openingShockReadings){ + int accels[3]; + lsm.readAccel(); lsm.readGyro(); lsm.readMag(); - lps331.getPressure(); - lps331.getTemperature(); - lps33hw.get(); - if(sequence!=1){ + *pressure=lps331.getPressure(); + *temperature=lps331.getTemperature(); + /*if(sequence!=1){ gps.getgps(); + }*/ + accelerometer.getOutput(accels); + for(int i=0;i<3;i++){ + openingShockReadings[i]=(int16_t)accels[i];//*0.0392266; } } float calcAltitude(float pres, float temp){ - return (pow(1013.25/pres,1/5.257)-1)*(temp+273.15)/0.0065; + return (pow(1015.5/pres,1/5.257)-1)*(temp+273.15)/0.0065; +} + +void imRecv(char *receive){ + im920.poll(); + memset(receive,'\0',sizeof(receive)); + im920.recv(receive,8); + pc.printf(receive); + //camera用コマンド認識 + char *camStr=strtok(receive,":");//cam:startというようにコマンド + if(strncmp(camStr,"cam",sizeof(camStr))==0){ + imSend(receive); + } +} + +void imSend(char *send){ + im920.send(send,strlen(send)+1); + pc.printf(send); + pc.printf("\r\n"); +} + +void mbedOperate(char *command){ + if(strncmp(command,"reset",sizeof(command))==0){ + imSend("Mbed reset"); + NVIC_SystemReset(); + } + + if(strncmp(command,"retry",sizeof(command))==0){ + imSend("Retry initializing"); + init(&fp); + wait(1); + } + + if(strncmp(command,"check",sizeof(command))==0){ + imSend("Check"); + checkingSensors(); + } +} + +void sendDatas(float time, float temp, float pres, float ax, float ay, float az, float gx, float gy, float gz){ + sprintf(sendData,"data1,%.3f,%.3f,%.3f",time,temp,pres); + imSend(sendData); + sprintf(sendData,"data2,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f",ax,ay,az,gx,gy,gz); + imSend(sendData); } \ No newline at end of file