加速度センサADXL345用のプログラム 秋月に売ってる
Dependencies: ADXL345_I2C mbed
main.cpp
- Committer:
- neoqased
- Date:
- 2016-03-09
- Revision:
- 0:a172e42c145a
File content as of revision 0:a172e42c145a:
#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;
}