加速度センサADXL345用のプログラム 秋月に売ってる
Dependencies: ADXL345_I2C mbed
Revision 0:a172e42c145a, committed 2016-03-09
- Comitter:
- neoqased
- Date:
- Wed Mar 09 01:10:25 2016 +0000
- Commit message:
- ?????????????
Changed in this revision
--- /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
--- /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;
+}
--- /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