質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.58%

ArduinoでSDに起動ごとに新しいファイルをつくって書き込みたいです。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,010

iisa

score 18

Arduino nano にSDカードリーダー?と加速度センサ、ジャイロセンサを搭載しています。
Arduinoにつなげた電池ソケットに毎回電池をいれて、以下のプログラムを実行させています。(スイッチ等はありません)
すると、毎回データがdatalog.txtに上書きされてしまいます。
どのようにすればよいのでしょうか。

#include <SD.h>
#include <Wire.h>
#include <SPI.h>

/*
connecting
MM-TXS04(LSM330DLC) Arduino(Duemilanove/UNO)
1:VDD---------------5V
2:GND---------------GND
3:SDA---------------D11(MOSI)
4:CLK---------------D13(SCK)
5:SDO(SA0)----------D12(MISO)
6:INT1_A
7:INT2_A
8:INT1_G
9:INT2_G
10:DEN_G------------5V
11:CS_A-------------D4
12:CS_G-------------D51
*/
const int chipSelect = 4;
int cs_Accel = 2;
int cs_Gyro  = 3;
// LSM330D Register Map
// Acceleromete
#define LSM330D_CTRL_REG1_A     0x20
#define LSM330D_CTRL_REG2_A     0x21
#define LSM330D_CTRL_REG3_A     0x22
#define LSM330D_CTRL_REG4_A     0x23
#define LSM330D_CTRL_REG5_A     0x24
#define LSM330D_OUT_X_L_A       0x28
#define LSM330D_OUT_X_H_A       0x29
#define LSM330D_OUT_Y_L_A       0x2A
#define LSM330D_OUT_Y_H_A       0x2B
#define LSM330D_OUT_Z_L_A       0x2C
#define LSM330D_OUT_Z_H_A       0x2D
// gyro
#define LSM330D_WHO_AM_I_G      0x0F
#define LSM330D_WHOAMI_G_VAL    0xD4
#define LSM330D_CTRL_REG1_G     0x20
#define LSM330D_CTRL_REG2_G     0x21
#define LSM330D_CTRL_REG3_G     0x22
#define LSM330D_CTRL_REG4_G     0x23
#define LSM330D_CTRL_REG5_G     0x24
#define LSM330D_OUT_X_L_G       0x28
#define LSM330D_OUT_X_H_G       0x29
#define LSM330D_OUT_Y_L_G       0x2A
#define LSM330D_OUT_Y_H_G       0x2B
#define LSM330D_OUT_Z_L_G       0x2C
#define LSM330D_OUT_Z_H_G       0x2D
int a;
unsigned long time;
void setup()
{
    Serial.begin(9600);   
    digitalWrite(cs_Accel, HIGH);
    digitalWrite(cs_Gyro,  HIGH);
    pinMode(cs_Accel, OUTPUT);
    pinMode(cs_Gyro,  OUTPUT);
    delay(100);
    SPI.begin();
    a=0;

    // Accelerometer
    writeReg(cs_Accel, LSM330D_CTRL_REG1_A, 0b10010111);
    writeReg(cs_Accel, LSM330D_CTRL_REG2_A, 0b00000000);
    writeReg(cs_Accel, LSM330D_CTRL_REG3_A, 0b00001000);
    writeReg(cs_Accel, LSM330D_CTRL_REG4_A, 0b00001000);    // +/-2G (1mg/digt)
    writeReg(cs_Accel, LSM330D_CTRL_REG5_A, 0b01000000);

    // Gyro
    writeReg(cs_Gyro, LSM330D_CTRL_REG1_G, 0b00001111);
    writeReg(cs_Gyro, LSM330D_CTRL_REG2_G, 0b00000000);
    writeReg(cs_Gyro, LSM330D_CTRL_REG3_G, 0b00000000);
    writeReg(cs_Gyro, LSM330D_CTRL_REG4_G, 0b00000000);     // 250dps (8.75mdps/digit)
    writeReg(cs_Gyro, LSM330D_CTRL_REG5_G, 0b00000000);
// シリアルポート初期化
  Serial.begin(9600);
  while (!Serial) {
    ; // USBケーブルが接続されるのを待つ。この待ちループは Leonardo のみ必要。
  }
  Serial.print(F("Initializing SD card..."));
  // SSピン(Unoは10番、Megaは53番)は使わない場合でも出力にする必要があります。
  // そうしないと、SPIがスレーブモードに移行し、SDライブラリが動作しなくなります。
  pinMode(SS, OUTPUT);
  // SDライブラリを初期化
  if (!SD.begin(chipSelect)) {
   Serial.println(F("Card failed, or not present"));
     //失敗、何もしない
    while(1);
  }
  Serial.println(F("ok."));
  // 日付と時刻を返す関数を登録

}
void loop() {
    a++ ;
    byte Buffer[6];

    short AccelRaw_x, AccelRaw_y, AccelRaw_z;
    short GyroRaw_x,  GyroRaw_y,  GyroRaw_z;

    float Accel_x, Accel_y, Accel_z;
    float Gyro_x,  Gyro_y,  Gyro_z;
    // Accelerometer
    readReg(cs_Accel, LSM330D_OUT_X_L_A, 6, Buffer);

    AccelRaw_x = ((Buffer[1] << 8) | Buffer[0]);
    AccelRaw_x = AccelRaw_x >> 4;
    Accel_x = AccelRaw_x * 0.001;

    AccelRaw_y = ((Buffer[3] << 8) | Buffer[2]);
    AccelRaw_y = AccelRaw_y >> 4;
    Accel_y = AccelRaw_y * 0.001;

    AccelRaw_z = ((Buffer[5] << 8) | Buffer[4]);
    AccelRaw_z = AccelRaw_z >> 4;
    Accel_z = AccelRaw_z * 0.001;

    // Gyro
    readReg(cs_Gyro, LSM330D_OUT_X_L_G, 6, Buffer);

    GyroRaw_x = ((Buffer[1] << 8) | Buffer[0]);
    Gyro_x = GyroRaw_x * 0.00875;

    GyroRaw_y = ((Buffer[3] << 8) | Buffer[2]);
    Gyro_y = GyroRaw_y * 0.00875;

    GyroRaw_z = ((Buffer[5] << 8) | Buffer[4]);
    Gyro_z = GyroRaw_z * 0.00875;

    // output serial
   //Serial.print("Accel:\t");
   //Serial.print(Accel_x);
   //Serial.print(",\t");
   //Serial.print(Accel_y);
   //Serial.print(",\t");
   //Serial.print(Accel_z);
   //Serial.print(",\t");

   //Serial.print("|Gyro:\t");
   //Serial.print(Gyro_x);
   //Serial.print(",\t");
   //Serial.print(Gyro_y);
   //Serial.print(",\t");
   //Serial.print(Gyro_z);
   //Serial.print("\n");
   //Serial.print(a);

   time = millis();
   //Serial.print(time);

    delay(50);
// ファイルを開く
   File dataFile = SD.open("datalog.txt", FILE_WRITE);



    dataFile.print(Accel_x);
    dataFile.print(" ");
    dataFile.print(Accel_y);
    dataFile.print(" ");
    dataFile.print(Accel_z);
    dataFile.print(" ");
    dataFile.print(Gyro_x);
    dataFile.print(" ");
    dataFile.print(Gyro_y);
    dataFile.print(" ");
    dataFile.print(Gyro_z);
    dataFile.print(" ");
    dataFile.print(a);
    dataFile.print(" ");
    dataFile.println(time);
    dataFile.close();




  delay(50);
}
void dateTime(uint16_t* date, uint16_t* time)
{
  uint16_t year = 2013;
  uint8_t month = 2, day = 3, hour = 9, minute = 0, second = 0;
  // GPSやRTCから日付と時間を取得
  // FAT_DATEマクロでフィールドを埋めて日付を返す
  *date = FAT_DATE(year, month, day);
  // FAT_TIMEマクロでフィールドを埋めて時間を返す
  *time = FAT_TIME(hour, minute, second);
}
void writeReg(int cs_pin, byte reg, byte value)
{
    reg = reg & 0x7F;               // bit7-0 (write)
    reg = reg & 0xBF;               // bit6-0 (address not-inc)

    digitalWrite(cs_pin, LOW);
    SPI.transfer(reg);
    SPI.transfer(value);
    digitalWrite(cs_pin, HIGH);
}
void readReg(byte cs_pin, byte reg, byte len, byte *data)
{
    byte i;

    reg = reg | 0x80;               // bit7-1 (read)
    reg = reg | 0x40;               // bit6-1 (address auto-inc)

    digitalWrite(cs_pin, LOW);

    SPI.transfer(reg);

    for (i = 0; i < len; i++){
        *data = SPI.transfer(0x00);
        data ++;
    }

    digitalWrite(cs_pin, HIGH);
}


このうち、

// ファイルを開く
   File dataFile = SD.open("datalog.txt", FILE_WRITE);



    dataFile.print(Accel_x);
    dataFile.print(" ");
    dataFile.print(Accel_y);
//以下プログラムが続く・・・


の部分です。
宜しくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

たとえばファイルをもう一本用意します。
count.txt とでもしましょうか。ナカミはカウンタで、0から始まる数値です。

電源入ったら count.txt をopenし、カウンタ値を読み出します。(open失敗したら0)
その値+1 を count.txt に書き込みます。

カウンタ値を基にファイル名を作ります。datalog0.txt, datalog1.txt... みたいな。
んでもってこのファイル名でlogを生成してはいかがでしょ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る