加速度センサADXL345用のプログラム 秋月に売ってる

Dependencies:   ADXL345_I2C mbed

Revision:
0:a172e42c145a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Mar 09 01:10:25 2016 +0000
@@ -0,0 +1,368 @@
+#include "mbed.h"
+#include "ADXL345_I2C.h"
+
+//センサの校正値(要変更)
+#define SENSOR1X 4.756
+#define SENSOR1Y 2.557
+#define SENSOR1Z -25.941
+
+#define SENSOR2X 9.133
+#define SENSOR2Y 1.428
+#define SENSOR2Z -32.222
+ 
+//LED1からLED4をled1からled4に割り当てる。
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+DigitalOut led4(LED4);
+
+DigitalOut buzzer(p18);      //電子ブザー用アナorデジ出力
+
+DigitalIn startsw(p21);
+ 
+//ADXL345 accelerometer(p5, p6, p7, p8);
+ADXL345_I2C accelerometer1(p9, p10);
+ADXL345_I2C accelerometer2(p28, p27);
+Serial pc(USBTX, USBRX);
+LocalFileSystem local("local");
+
+Timer timer;
+
+int SW();        //スタートスイッチ用関数,押して離したらスタート
+int Buzzer(int buzvar = 1);     //電子ブザーを鳴らす関数
+
+int main(){
+    
+    int ledv=1; //led value初期化
+    /*int data1[3] = {0, 0, 0};
+    int data2[3] = {0, 0, 0};*/
+    int data[2][3] = {};
+    double tempdata[2][3] = {};
+    double pfdata[2][3] = {};
+    double kousei[2][3] = {{SENSOR1X, SENSOR1Y, SENSOR1Z}, {SENSOR2X, SENSOR2Y, SENSOR2Z}};
+    const int n = 10;       //ループ回数
+    //time_t tnow;
+    //char buf[32];
+    char filename[64];
+    FILE *fp, *fpname;
+    int fpn = 0;
+    
+    /* 
+    pc.printf("Starting ADXL345 test...\n");
+    pc.printf("Device1 ID is: 0x%02x\n", accelerometer1.getDevId());
+    pc.printf("Device2 ID is: 0x%02x\n", accelerometer2.getDevId());
+    */
+ 
+    //Go into standby mode to configure the device.
+    accelerometer1.setPowerControl(0x00);
+    accelerometer2.setPowerControl(0x00);
+ 
+    //Full resolution, +/-16g, 4mg/LSB.
+    accelerometer1.setDataFormatControl(0x0B);
+    accelerometer2.setDataFormatControl(0x0B);
+     
+    //3.2kHz data rate.
+    accelerometer1.setDataRate(ADXL345_3200HZ);
+    accelerometer2.setDataRate(ADXL345_3200HZ);
+ 
+    //Measurement mode.
+    accelerometer1.setPowerControl(0x08);
+    accelerometer2.setPowerControl(0x08);
+    
+    wait(1);
+    
+    Buzzer(3);
+    
+    while(1){
+    
+        SW();
+        Buzzer(1);
+        wait(1);
+        timer.reset();
+        timer.start();
+        
+        /*
+        ///////////////////////////////////////////
+        while(1){
+            
+            for(int i = 0; i < 2; i++){
+                for(int j = 0; j < 3; j++){
+                    tempdata[i][j] = 0;
+                }
+            }
+            
+            wait(0.1-0.01*n);
+            
+            for(int i = 0; i < n; i++){
+                accelerometer1.getOutput(data[0]);
+                accelerometer2.getOutput(data[1]);
+                
+                for(int j = 0; j < 2; j++){
+                    for(int k = 0; k < 3; k++){
+                        tempdata[j][k] += (int16_t)data[j][k];
+                    }
+                }
+                wait_ms(10);
+            }
+            
+            for(int i = 0; i < 2; i++){
+                for(int j = 0; j < 3; j++){
+                    pfdata[i][j] = tempdata[i][j] / n - kousei[i][j];
+                }
+            }
+            
+            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]);
+            
+        }*/
+        
+        //////////////////////////////////ここからファイル名の決定
+        fpname = fopen("/local/fn.txt", "r");
+        if(fpname == NULL){
+            for(int i = 0; i < 5; i++){
+                led1 = !led1;
+                led2 = !led2;
+                led3 = !led3;
+                wait(1);
+            }
+            return -1;
+        }
+        fscanf(fpname,"%d",&fpn);
+        fclose(fpname);
+        fpname = fopen("/local/fn.txt","w");
+        if(fpname == NULL){
+            for(int i = 0; i < 5; i++){
+                led1 = !led1;
+                led2 = !led2;
+                wait(1);
+            }
+            return -1;
+        }
+        fprintf(fpname,"%d",fpn+1);
+        fclose(fpname);
+        //////////////////////////////////////ここまでファイル名の決定
+        /*tnow = time(NULL) + (60*60*9);
+        strftime(buf,sizeof(buf),"%H%M%S", localtime(&tnow));
+        sprintf(filename,"/local/lg%s.csv",buf);
+        strftime(buf,sizeof(buf),"%Y-%m-%d %H:%M:%S", localtime(&tnow));*/
+        /////////////////////////////////ここから出力ファイルを開く
+        sprintf(filename,"/local/log%003d.csv",fpn);
+        fp = fopen(filename,"w");
+        if(fp == NULL){
+            for(int i = 0; i < 5; i++){
+                led1 = !led1;
+                led2 = !led2;
+                led3 = !led3;
+                led4 = !led4;
+                wait(1);
+            }
+            return -1;
+        }
+        //fprintf(fp, "The time is %s\n", ctime(&tnow));
+        fprintf(fp, "time,,sensor1x,sensor1y,sensor1z,,sensor2x,sensor2y,sensor2z\n");
+        /*for(int m = 0; m < 10; m++){        //ここで周回数を決める*/
+        while(startsw == 0){
+            if(ledv>0x10)ledv=1;  //kが0b00010000になったら0b00000001にする
+            led1 = ledv & 0x01;
+            led2 = ledv & 0x02;
+            led3 = ledv & 0x04;
+            led4 = ledv & 0x08;
+            ledv=ledv<<1; //kの中を左に1つ移動(mbedのledを順番に点滅)
+            
+            for(int i = 0; i < 2; i++){     //平均を取るための合計を格納する変数を初期化
+                for(int j = 0; j < 3; j++){
+                    tempdata[i][j] = 0;
+                }
+            }
+            
+            wait(0.1-0.01*n);
+            
+            //以下データの平均をとってファイル出力
+            for(int i = 0; i < n; i++){
+                accelerometer1.getOutput(data[0]);
+                accelerometer2.getOutput(data[1]);
+                
+                for(int j = 0; j < 2; j++){
+                    for(int k = 0; k < 3; k++){
+                        tempdata[j][k] += (int16_t)data[j][k];
+                    }
+                }
+                wait_ms(10);
+            }
+            
+            for(int i = 0; i < 2; i++){
+                for(int j = 0; j < 3; j++){
+                    pfdata[i][j] = tempdata[i][j] / n - kousei[i][j];
+                }
+            }
+            
+            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]);
+        }
+        timer.stop();
+        Buzzer(5);
+        fclose(fp);
+    }
+    
+    ////////////////////////////////
+    /*
+    fp = fopen("/local/log.csv","w");
+    for(int i = 0; i < 2000; i++){
+        
+        wait(0.5);
+        
+        if(ledv>0x10)ledv=1;  //kが0b00010000になったら0b00000001にする
+        led1 = ledv & 0x01;
+        led2 = ledv & 0x02;
+        led3 = ledv & 0x04;
+        led4 = ledv & 0x08;
+        ledv=ledv<<1; //kの中を左に1つ移動
+        
+        accelerometer1.getOutput(data1);
+        accelerometer2.getOutput(data2);
+        
+        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());
+        
+    }
+    fclose(fp);
+    */
+ 
+    /*while(1){
+     
+        wait(1);
+        
+        accelerometer1.getOutput(data1);
+        accelerometer2.getOutput(data2);
+         
+        //13-bit, sign extended values.
+        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]);
+    }*/
+ 
+}
+
+
+int SW(){        //スタートスイッチ用関数,押して離したらスタート
+    int i = 0, j = 0;
+    while(i < 3){       //チャタリング除去,15msにわたってスタートスイッチが押されていればbreak
+        if(startsw == 1) i++;
+        else i = 0;
+        //DipLed();
+        wait_ms(5);
+    }
+    while(j < 3){       //上に同じ,スタートスイッチが離されたことを検知
+        if(startsw == 0) j++;
+        else j = 0;
+        //DipLed();
+        wait_ms(5);
+    }
+    return 0;
+}
+
+int Buzzer(int buzvar){     //電子ブザーを鳴らす関数
+    switch (buzvar){
+        /**************エラーを知らせるbeep**************/
+        case -3:        //error * - -
+            buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
+            buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
+            buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
+            break;
+        case -2:        //error * - - -
+            buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
+            buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
+            buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
+            buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
+            break;
+        case -1:        //error * - - - -
+            buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
+            buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
+            buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
+            buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
+            buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
+            break;
+        /**************エラーここまで**************/
+        case 0:         //サウンドなし
+            buzzer = 0;
+            break;
+        /**************状態を知らせるためのbeep**************/
+        case 1:         // *(短)
+            buzzer = 1; wait(0.1); buzzer = 0;
+            break;
+        case 2:         // * *
+            buzzer = 1; wait(0.1); buzzer = 0; wait(0.05);
+            buzzer = 1; wait(0.1); buzzer = 0;
+            break;
+        case 3:         // -(長)
+            buzzer = 1; wait(0.3); buzzer = 0;
+            break;
+        case 4:         // - -
+            buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
+            buzzer = 1; wait(0.3); buzzer = 0;
+            break;
+        case 5:         // ---
+            buzzer = 1; wait(0.9); buzzer = 0;
+            break;
+        case 6:         // * * *  * * *  * * *  *
+            for(int i = 0; i < 3; i++){
+                for(int j = 0; j < 3; j++){
+                    buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
+                }
+                wait(0.2);
+            }
+            buzzer = 1; wait(0.1); buzzer = 0;
+            break;
+        case 7:         // **-* ** -* ** *** **** "finish"
+            buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
+            buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
+            buzzer = 1; wait(0.3); buzzer = 0; wait(0.1); 
+            buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
+            wait(0.2);
+            buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
+            buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
+            wait(0.2);
+            buzzer = 1; wait(0.3); buzzer = 0; wait(0.1); 
+            buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
+            wait(0.2);
+            buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
+            buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
+            wait(0.2);
+            buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
+            buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
+            buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
+            wait(0.2);
+            buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
+            buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
+            buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
+            buzzer = 1; wait(0.1); buzzer = 0;
+            break;
+        case 8:         // *-*** -*- --* "オワリ"
+            buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
+            buzzer = 1; wait(0.3); buzzer = 0; wait(0.1);
+            buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
+            buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
+            buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
+            wait(0.2);
+            buzzer = 1; wait(0.3); buzzer = 0; wait(0.1); 
+            buzzer = 1; wait(0.1); buzzer = 0; wait(0.1); 
+            buzzer = 1; wait(0.3); buzzer = 0; wait(0.1); 
+            wait(0.2);
+            buzzer = 1; wait(0.3); buzzer = 0; wait(0.1); 
+            buzzer = 1; wait(0.3); buzzer = 0; wait(0.1); 
+            buzzer = 1; wait(0.1); buzzer = 0;
+            break;
+        case 9:        //ケータイの着信音的な
+            for(int i = 0; i < 20; i++){
+                buzzer = 1; wait(0.03);
+                buzzer = 0; wait(0.03);
+            }
+            break;
+        case 10:        //9の短いバージョン
+            for(int i = 0; i < 20; i++){
+                buzzer = 1; wait(0.02);
+                buzzer = 0; wait(0.02);
+            }
+            break;
+        /**************状態を知らせるためのbeepここまで**************/
+        default:        //no sound
+            buzzer = 0;
+            break;
+    }
+    return 0;
+}