Makoto Kobayashi / Mbed 2 deprecated doubleADXL345

Dependencies:   ADXL345_I2C mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "ADXL345_I2C.h"
00003 
00004 //センサの校正値(要変更)
00005 #define SENSOR1X 4.756
00006 #define SENSOR1Y 2.557
00007 #define SENSOR1Z -25.941
00008 
00009 #define SENSOR2X 9.133
00010 #define SENSOR2Y 1.428
00011 #define SENSOR2Z -32.222
00012  
00013 //LED1からLED4をled1からled4に割り当てる。
00014 DigitalOut led1(LED1);
00015 DigitalOut led2(LED2);
00016 DigitalOut led3(LED3);
00017 DigitalOut led4(LED4);
00018 
00019 DigitalOut buzzer(p18);      //電子ブザー用アナorデジ出力
00020 
00021 DigitalIn startsw(p21);
00022  
00023 //ADXL345 accelerometer(p5, p6, p7, p8);
00024 ADXL345_I2C accelerometer1(p9, p10);
00025 ADXL345_I2C accelerometer2(p28, p27);
00026 Serial pc(USBTX, USBRX);
00027 LocalFileSystem local("local");
00028 
00029 Timer timer;
00030 
00031 int SW();        //スタートスイッチ用関数,押して離したらスタート
00032 int Buzzer(int buzvar = 1);     //電子ブザーを鳴らす関数
00033 
00034 int main(){
00035     
00036     int ledv=1; //led value初期化
00037     /*int data1[3] = {0, 0, 0};
00038     int data2[3] = {0, 0, 0};*/
00039     int data[2][3] = {};
00040     double tempdata[2][3] = {};
00041     double pfdata[2][3] = {};
00042     double kousei[2][3] = {{SENSOR1X, SENSOR1Y, SENSOR1Z}, {SENSOR2X, SENSOR2Y, SENSOR2Z}};
00043     const int n = 10;       //ループ回数
00044     //time_t tnow;
00045     //char buf[32];
00046     char filename[64];
00047     FILE *fp, *fpname;
00048     int fpn = 0;
00049     
00050     /* 
00051     pc.printf("Starting ADXL345 test...\n");
00052     pc.printf("Device1 ID is: 0x%02x\n", accelerometer1.getDevId());
00053     pc.printf("Device2 ID is: 0x%02x\n", accelerometer2.getDevId());
00054     */
00055  
00056     //Go into standby mode to configure the device.
00057     accelerometer1.setPowerControl(0x00);
00058     accelerometer2.setPowerControl(0x00);
00059  
00060     //Full resolution, +/-16g, 4mg/LSB.
00061     accelerometer1.setDataFormatControl(0x0B);
00062     accelerometer2.setDataFormatControl(0x0B);
00063      
00064     //3.2kHz data rate.
00065     accelerometer1.setDataRate(ADXL345_3200HZ);
00066     accelerometer2.setDataRate(ADXL345_3200HZ);
00067  
00068     //Measurement mode.
00069     accelerometer1.setPowerControl(0x08);
00070     accelerometer2.setPowerControl(0x08);
00071     
00072     wait(1);
00073     
00074     Buzzer(3);
00075     
00076     while(1){
00077     
00078         SW();
00079         Buzzer(1);
00080         wait(1);
00081         timer.reset();
00082         timer.start();
00083         
00084         /*
00085         ///////////////////////////////////////////
00086         while(1){
00087             
00088             for(int i = 0; i < 2; i++){
00089                 for(int j = 0; j < 3; j++){
00090                     tempdata[i][j] = 0;
00091                 }
00092             }
00093             
00094             wait(0.1-0.01*n);
00095             
00096             for(int i = 0; i < n; i++){
00097                 accelerometer1.getOutput(data[0]);
00098                 accelerometer2.getOutput(data[1]);
00099                 
00100                 for(int j = 0; j < 2; j++){
00101                     for(int k = 0; k < 3; k++){
00102                         tempdata[j][k] += (int16_t)data[j][k];
00103                     }
00104                 }
00105                 wait_ms(10);
00106             }
00107             
00108             for(int i = 0; i < 2; i++){
00109                 for(int j = 0; j < 3; j++){
00110                     pfdata[i][j] = tempdata[i][j] / n - kousei[i][j];
00111                 }
00112             }
00113             
00114             pc.printf("(%.2f,%.2f,%.2f),(%.2f,%.2f,%.2f)\n", pfdata[0][0],pfdata[0][1],pfdata[0][2],pfdata[1][0],pfdata[1][1],pfdata[1][2]);
00115             
00116         }*/
00117         
00118         //////////////////////////////////ここからファイル名の決定
00119         fpname = fopen("/local/fn.txt", "r");
00120         if(fpname == NULL){
00121             for(int i = 0; i < 5; i++){
00122                 led1 = !led1;
00123                 led2 = !led2;
00124                 led3 = !led3;
00125                 wait(1);
00126             }
00127             return -1;
00128         }
00129         fscanf(fpname,"%d",&fpn);
00130         fclose(fpname);
00131         fpname = fopen("/local/fn.txt","w");
00132         if(fpname == NULL){
00133             for(int i = 0; i < 5; i++){
00134                 led1 = !led1;
00135                 led2 = !led2;
00136                 wait(1);
00137             }
00138             return -1;
00139         }
00140         fprintf(fpname,"%d",fpn+1);
00141         fclose(fpname);
00142         //////////////////////////////////////ここまでファイル名の決定
00143         /*tnow = time(NULL) + (60*60*9);
00144         strftime(buf,sizeof(buf),"%H%M%S", localtime(&tnow));
00145         sprintf(filename,"/local/lg%s.csv",buf);
00146         strftime(buf,sizeof(buf),"%Y-%m-%d %H:%M:%S", localtime(&tnow));*/
00147         /////////////////////////////////ここから出力ファイルを開く
00148         sprintf(filename,"/local/log%003d.csv",fpn);
00149         fp = fopen(filename,"w");
00150         if(fp == NULL){
00151             for(int i = 0; i < 5; i++){
00152                 led1 = !led1;
00153                 led2 = !led2;
00154                 led3 = !led3;
00155                 led4 = !led4;
00156                 wait(1);
00157             }
00158             return -1;
00159         }
00160         //fprintf(fp, "The time is %s\n", ctime(&tnow));
00161         fprintf(fp, "time,,sensor1x,sensor1y,sensor1z,,sensor2x,sensor2y,sensor2z\n");
00162         /*for(int m = 0; m < 10; m++){        //ここで周回数を決める*/
00163         while(startsw == 0){
00164             if(ledv>0x10)ledv=1;  //kが0b00010000になったら0b00000001にする
00165             led1 = ledv & 0x01;
00166             led2 = ledv & 0x02;
00167             led3 = ledv & 0x04;
00168             led4 = ledv & 0x08;
00169             ledv=ledv<<1; //kの中を左に1つ移動(mbedのledを順番に点滅)
00170             
00171             for(int i = 0; i < 2; i++){     //平均を取るための合計を格納する変数を初期化
00172                 for(int j = 0; j < 3; j++){
00173                     tempdata[i][j] = 0;
00174                 }
00175             }
00176             
00177             wait(0.1-0.01*n);
00178             
00179             //以下データの平均をとってファイル出力
00180             for(int i = 0; i < n; i++){
00181                 accelerometer1.getOutput(data[0]);
00182                 accelerometer2.getOutput(data[1]);
00183                 
00184                 for(int j = 0; j < 2; j++){
00185                     for(int k = 0; k < 3; k++){
00186                         tempdata[j][k] += (int16_t)data[j][k];
00187                     }
00188                 }
00189                 wait_ms(10);
00190             }
00191             
00192             for(int i = 0; i < 2; i++){
00193                 for(int j = 0; j < 3; j++){
00194                     pfdata[i][j] = tempdata[i][j] / n - kousei[i][j];
00195                 }
00196             }
00197             
00198             fprintf(fp, "%f,,%f,%f,%f,,%f,%f,%f\n",timer.read(),pfdata[0][0],pfdata[0][1],pfdata[0][2],pfdata[1][0],pfdata[1][1],pfdata[1][2]);
00199         }
00200         timer.stop();
00201         Buzzer(5);
00202         fclose(fp);
00203     }
00204     
00205     ////////////////////////////////
00206     /*
00207     fp = fopen("/local/log.csv","w");
00208     for(int i = 0; i < 2000; i++){
00209         
00210         wait(0.5);
00211         
00212         if(ledv>0x10)ledv=1;  //kが0b00010000になったら0b00000001にする
00213         led1 = ledv & 0x01;
00214         led2 = ledv & 0x02;
00215         led3 = ledv & 0x04;
00216         led4 = ledv & 0x08;
00217         ledv=ledv<<1; //kの中を左に1つ移動
00218         
00219         accelerometer1.getOutput(data1);
00220         accelerometer2.getOutput(data2);
00221         
00222         fprintf(fp,"%i, %i, %i,,%i, %i, %i,,%f\n", (int16_t)data1[0], (int16_t)data1[1], (int16_t)data1[2], (int16_t)data2[0], (int16_t)data2[1], (int16_t)data2[2],timer.read());
00223         
00224     }
00225     fclose(fp);
00226     */
00227  
00228     /*while(1){
00229      
00230         wait(1);
00231         
00232         accelerometer1.getOutput(data1);
00233         accelerometer2.getOutput(data2);
00234          
00235         //13-bit, sign extended values.
00236         pc.printf("(%i, %i, %i),(%i, %i, %i)\n", (int16_t)data1[0], (int16_t)data1[1], (int16_t)data1[2], (int16_t)data2[0], (int16_t)data2[1], (int16_t)data2[2]);
00237     }*/
00238  
00239 }
00240 
00241 
00242 int SW(){        //スタートスイッチ用関数,押して離したらスタート
00243     int i = 0, j = 0;
00244     while(i < 3){       //チャタリング除去,15msにわたってスタートスイッチが押されていればbreak
00245         if(startsw == 1) i++;
00246         else i = 0;
00247         //DipLed();
00248         wait_ms(5);
00249     }
00250     while(j < 3){       //上に同じ,スタートスイッチが離されたことを検知
00251         if(startsw == 0) j++;
00252         else j = 0;
00253         //DipLed();
00254         wait_ms(5);
00255     }
00256     return 0;
00257 }
00258 
00259 int Buzzer(int buzvar){     //電子ブザーを鳴らす関数
00260     switch (buzvar){
00261         /**************エラーを知らせるbeep**************/
00262         case -3:        //error * - -
00263             buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
00264             buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
00265             buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
00266             break;
00267         case -2:        //error * - - -
00268             buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
00269             buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
00270             buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
00271             buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
00272             break;
00273         case -1:        //error * - - - -
00274             buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
00275             buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
00276             buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
00277             buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
00278             buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
00279             break;
00280         /**************エラーここまで**************/
00281         case 0:         //サウンドなし
00282             buzzer = 0;
00283             break;
00284         /**************状態を知らせるためのbeep**************/
00285         case 1:         // *(短)
00286             buzzer = 1; wait(0.1); buzzer = 0;
00287             break;
00288         case 2:         // * *
00289             buzzer = 1; wait(0.1); buzzer = 0; wait(0.05);
00290             buzzer = 1; wait(0.1); buzzer = 0;
00291             break;
00292         case 3:         // -(長)
00293             buzzer = 1; wait(0.3); buzzer = 0;
00294             break;
00295         case 4:         // - -
00296             buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
00297             buzzer = 1; wait(0.3); buzzer = 0;
00298             break;
00299         case 5:         // ---
00300             buzzer = 1; wait(0.9); buzzer = 0;
00301             break;
00302         case 6:         // * * *  * * *  * * *  *
00303             for(int i = 0; i < 3; i++){
00304                 for(int j = 0; j < 3; j++){
00305                     buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
00306                 }
00307                 wait(0.2);
00308             }
00309             buzzer = 1; wait(0.1); buzzer = 0;
00310             break;
00311         case 7:         // **-* ** -* ** *** **** "finish"
00312             buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
00313             buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
00314             buzzer = 1; wait(0.3); buzzer = 0; wait(0.1); 
00315             buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
00316             wait(0.2);
00317             buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
00318             buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
00319             wait(0.2);
00320             buzzer = 1; wait(0.3); buzzer = 0; wait(0.1); 
00321             buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
00322             wait(0.2);
00323             buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
00324             buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
00325             wait(0.2);
00326             buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
00327             buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
00328             buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
00329             wait(0.2);
00330             buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
00331             buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
00332             buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
00333             buzzer = 1; wait(0.1); buzzer = 0;
00334             break;
00335         case 8:         // *-*** -*- --* "オワリ"
00336             buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
00337             buzzer = 1; wait(0.3); buzzer = 0; wait(0.1);
00338             buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
00339             buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
00340             buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
00341             wait(0.2);
00342             buzzer = 1; wait(0.3); buzzer = 0; wait(0.1); 
00343             buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
00344             buzzer = 1; wait(0.3); buzzer = 0; wait(0.1); 
00345             wait(0.2);
00346             buzzer = 1; wait(0.3); buzzer = 0; wait(0.1); 
00347             buzzer = 1; wait(0.3); buzzer = 0; wait(0.1); 
00348             buzzer = 1; wait(0.1); buzzer = 0;
00349             break;
00350         case 9:        //ケータイの着信音的な
00351             for(int i = 0; i < 20; i++){
00352                 buzzer = 1; wait(0.03);
00353                 buzzer = 0; wait(0.03);
00354             }
00355             break;
00356         case 10:        //9の短いバージョン
00357             for(int i = 0; i < 20; i++){
00358                 buzzer = 1; wait(0.02);
00359                 buzzer = 0; wait(0.02);
00360             }
00361             break;
00362         /**************状態を知らせるためのbeepここまで**************/
00363         default:        //no sound
00364             buzzer = 0;
00365             break;
00366     }
00367     return 0;
00368 }