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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

1回答

1677閲覧

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

iisa

総合スコア18

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2018/02/18 13:25

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

arduino

1#include <SD.h> 2#include <Wire.h> 3#include <SPI.h> 4 5/* 6connecting 7MM-TXS04(LSM330DLC) Arduino(Duemilanove/UNO) 81:VDD---------------5V 92:GND---------------GND 103:SDA---------------D11(MOSI) 114:CLK---------------D13(SCK) 125:SDO(SA0)----------D12(MISO) 136:INT1_A 147:INT2_A 158:INT1_G 169:INT2_G 1710:DEN_G------------5V 1811:CS_A-------------D4 1912:CS_G-------------D51 20*/ 21const int chipSelect = 4; 22int cs_Accel = 2; 23int cs_Gyro = 3; 24// LSM330D Register Map 25// Acceleromete 26#define LSM330D_CTRL_REG1_A 0x20 27#define LSM330D_CTRL_REG2_A 0x21 28#define LSM330D_CTRL_REG3_A 0x22 29#define LSM330D_CTRL_REG4_A 0x23 30#define LSM330D_CTRL_REG5_A 0x24 31#define LSM330D_OUT_X_L_A 0x28 32#define LSM330D_OUT_X_H_A 0x29 33#define LSM330D_OUT_Y_L_A 0x2A 34#define LSM330D_OUT_Y_H_A 0x2B 35#define LSM330D_OUT_Z_L_A 0x2C 36#define LSM330D_OUT_Z_H_A 0x2D 37// gyro 38#define LSM330D_WHO_AM_I_G 0x0F 39#define LSM330D_WHOAMI_G_VAL 0xD4 40#define LSM330D_CTRL_REG1_G 0x20 41#define LSM330D_CTRL_REG2_G 0x21 42#define LSM330D_CTRL_REG3_G 0x22 43#define LSM330D_CTRL_REG4_G 0x23 44#define LSM330D_CTRL_REG5_G 0x24 45#define LSM330D_OUT_X_L_G 0x28 46#define LSM330D_OUT_X_H_G 0x29 47#define LSM330D_OUT_Y_L_G 0x2A 48#define LSM330D_OUT_Y_H_G 0x2B 49#define LSM330D_OUT_Z_L_G 0x2C 50#define LSM330D_OUT_Z_H_G 0x2D 51int a; 52unsigned long time; 53void setup() 54{ 55 Serial.begin(9600); 56 digitalWrite(cs_Accel, HIGH); 57 digitalWrite(cs_Gyro, HIGH); 58 pinMode(cs_Accel, OUTPUT); 59 pinMode(cs_Gyro, OUTPUT); 60 delay(100); 61 SPI.begin(); 62 a=0; 63 64 // Accelerometer 65 writeReg(cs_Accel, LSM330D_CTRL_REG1_A, 0b10010111); 66 writeReg(cs_Accel, LSM330D_CTRL_REG2_A, 0b00000000); 67 writeReg(cs_Accel, LSM330D_CTRL_REG3_A, 0b00001000); 68 writeReg(cs_Accel, LSM330D_CTRL_REG4_A, 0b00001000); // +/-2G (1mg/digt) 69 writeReg(cs_Accel, LSM330D_CTRL_REG5_A, 0b01000000); 70 71 // Gyro 72 writeReg(cs_Gyro, LSM330D_CTRL_REG1_G, 0b00001111); 73 writeReg(cs_Gyro, LSM330D_CTRL_REG2_G, 0b00000000); 74 writeReg(cs_Gyro, LSM330D_CTRL_REG3_G, 0b00000000); 75 writeReg(cs_Gyro, LSM330D_CTRL_REG4_G, 0b00000000); // 250dps (8.75mdps/digit) 76 writeReg(cs_Gyro, LSM330D_CTRL_REG5_G, 0b00000000); 77// シリアルポート初期化 78 Serial.begin(9600); 79 while (!Serial) { 80 ; // USBケーブルが接続されるのを待つ。この待ちループは Leonardo のみ必要。 81 } 82 Serial.print(F("Initializing SD card...")); 83 // SSピン(Unoは10番、Megaは53番)は使わない場合でも出力にする必要があります。 84 // そうしないと、SPIがスレーブモードに移行し、SDライブラリが動作しなくなります。 85 pinMode(SS, OUTPUT); 86 // SDライブラリを初期化 87 if (!SD.begin(chipSelect)) { 88 Serial.println(F("Card failed, or not present")); 89 //失敗、何もしない 90 while(1); 91 } 92 Serial.println(F("ok.")); 93 // 日付と時刻を返す関数を登録 94 95} 96void loop() { 97 a++ ; 98 byte Buffer[6]; 99 100 short AccelRaw_x, AccelRaw_y, AccelRaw_z; 101 short GyroRaw_x, GyroRaw_y, GyroRaw_z; 102 103 float Accel_x, Accel_y, Accel_z; 104 float Gyro_x, Gyro_y, Gyro_z; 105 // Accelerometer 106 readReg(cs_Accel, LSM330D_OUT_X_L_A, 6, Buffer); 107 108 AccelRaw_x = ((Buffer[1] << 8) | Buffer[0]); 109 AccelRaw_x = AccelRaw_x >> 4; 110 Accel_x = AccelRaw_x * 0.001; 111 112 AccelRaw_y = ((Buffer[3] << 8) | Buffer[2]); 113 AccelRaw_y = AccelRaw_y >> 4; 114 Accel_y = AccelRaw_y * 0.001; 115 116 AccelRaw_z = ((Buffer[5] << 8) | Buffer[4]); 117 AccelRaw_z = AccelRaw_z >> 4; 118 Accel_z = AccelRaw_z * 0.001; 119 120 // Gyro 121 readReg(cs_Gyro, LSM330D_OUT_X_L_G, 6, Buffer); 122 123 GyroRaw_x = ((Buffer[1] << 8) | Buffer[0]); 124 Gyro_x = GyroRaw_x * 0.00875; 125 126 GyroRaw_y = ((Buffer[3] << 8) | Buffer[2]); 127 Gyro_y = GyroRaw_y * 0.00875; 128 129 GyroRaw_z = ((Buffer[5] << 8) | Buffer[4]); 130 Gyro_z = GyroRaw_z * 0.00875; 131 132 // output serial 133 //Serial.print("Accel:\t"); 134 //Serial.print(Accel_x); 135 //Serial.print(",\t"); 136 //Serial.print(Accel_y); 137 //Serial.print(",\t"); 138 //Serial.print(Accel_z); 139 //Serial.print(",\t"); 140 141 //Serial.print("|Gyro:\t"); 142 //Serial.print(Gyro_x); 143 //Serial.print(",\t"); 144 //Serial.print(Gyro_y); 145 //Serial.print(",\t"); 146 //Serial.print(Gyro_z); 147 //Serial.print("\n"); 148 //Serial.print(a); 149 150 time = millis(); 151 //Serial.print(time); 152 153 delay(50); 154// ファイルを開く 155 File dataFile = SD.open("datalog.txt", FILE_WRITE); 156 157 158 159 dataFile.print(Accel_x); 160 dataFile.print(" "); 161 dataFile.print(Accel_y); 162 dataFile.print(" "); 163 dataFile.print(Accel_z); 164 dataFile.print(" "); 165 dataFile.print(Gyro_x); 166 dataFile.print(" "); 167 dataFile.print(Gyro_y); 168 dataFile.print(" "); 169 dataFile.print(Gyro_z); 170 dataFile.print(" "); 171 dataFile.print(a); 172 dataFile.print(" "); 173 dataFile.println(time); 174 dataFile.close(); 175 176 177 178 179 delay(50); 180} 181void dateTime(uint16_t* date, uint16_t* time) 182{ 183 uint16_t year = 2013; 184 uint8_t month = 2, day = 3, hour = 9, minute = 0, second = 0; 185 // GPSやRTCから日付と時間を取得 186 // FAT_DATEマクロでフィールドを埋めて日付を返す 187 *date = FAT_DATE(year, month, day); 188 // FAT_TIMEマクロでフィールドを埋めて時間を返す 189 *time = FAT_TIME(hour, minute, second); 190} 191void writeReg(int cs_pin, byte reg, byte value) 192{ 193 reg = reg & 0x7F; // bit7-0 (write) 194 reg = reg & 0xBF; // bit6-0 (address not-inc) 195 196 digitalWrite(cs_pin, LOW); 197 SPI.transfer(reg); 198 SPI.transfer(value); 199 digitalWrite(cs_pin, HIGH); 200} 201void readReg(byte cs_pin, byte reg, byte len, byte *data) 202{ 203 byte i; 204 205 reg = reg | 0x80; // bit7-1 (read) 206 reg = reg | 0x40; // bit6-1 (address auto-inc) 207 208 digitalWrite(cs_pin, LOW); 209 210 SPI.transfer(reg); 211 212 for (i = 0; i < len; i++){ 213 *data = SPI.transfer(0x00); 214 data ++; 215 } 216 217 digitalWrite(cs_pin, HIGH); 218} 219

このうち、

arduino

1// ファイルを開く 2 File dataFile = SD.open("datalog.txt", FILE_WRITE); 3 4 5 6 dataFile.print(Accel_x); 7 dataFile.print(" "); 8 dataFile.print(Accel_y); 9//以下プログラムが続く・・・

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

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

投稿2018/02/18 23:00

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問