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

Dependencies:   ADXL345_I2C mbed

Files at this revision

API Documentation at this revision

Comitter:
neoqased
Date:
Wed Mar 09 01:10:25 2016 +0000
Commit message:
?????????????

Changed in this revision

ADXL345_I2C.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r a172e42c145a ADXL345_I2C.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ADXL345_I2C.lib	Wed Mar 09 01:10:25 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/nimbusgb/code/ADXL345_I2C/#92fa975dab32
diff -r 000000000000 -r a172e42c145a main.cpp
--- /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;
+}
diff -r 000000000000 -r a172e42c145a mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Mar 09 01:10:25 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/87f2f5183dfb
\ No newline at end of file