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

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

新規登録して質問してみよう
ただいま回答率
87.20%
Arduino

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

受付中

arduinoのsdカード保存プログラムについて

shio
shio

総合スコア3

Arduino

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

0回答

2評価

0クリップ

152閲覧

投稿2022/06/21 01:53

arduinoを用いてad変換をし,データを配列に格納してからsdカードへ一気に保存することを試みています.ただ,格納用の配列が大きくなると,プログラムが作動しません.なぜでしょうか.プログラムは以下の通りです.

#include <SPI.h>
#include <SD.h>
#include <Utility.h>
//#include <SdFat.h>

//SdFat SD;

//SPI通信のチップセレクトの設定
const int chipSelect = 4;

void setup(void)
{
//サンプリング周波数の設定レジスタを操作して(ADCクロックの分周比を設定)
//ADC_DIV2|8000
//ADC_DIV4|4000
//ADC_DIV8|2000
//ADC_DIV16|1000
//ADC_DIV32|500
//ADC_DIV64|250
//ADC_DIV128|125
setADCFrequency(ADC_DIV64);
Serial.begin(2000000);

//温度変換
float a = 0.1033;
float b = 0.1639;

//サンプリング時間[sec]の宣言
unsigned short int sampling_time_sec = 100;
//タイムスタンプ用の変数の宣言
unsigned long int time_stamp_begining;
unsigned long int time_stamp_end;
//データセットの行数の宣言
unsigned long int num_of_lines_per_one_dataset = 70;
num_of_lines_per_one_dataset += 1;

//ADC値格納のための配列の宣言
unsigned short int chanel1[num_of_lines_per_one_dataset] = {0};
unsigned short int chanel2[num_of_lines_per_one_dataset] = {0};
unsigned short int chanel3[num_of_lines_per_one_dataset] = {0};
unsigned short int chanel4[num_of_lines_per_one_dataset] = {0};
unsigned short int chanel5[num_of_lines_per_one_dataset] = {0};
//カウンター変数の宣言
int i = 0;
int j = 0;

SD.begin(chipSelect);

//see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {

// don't do anything more: return;

}
Serial.println("card initialized.");

//CSVファイルのオープン
File dataFile = SD.open("datalog.csv", FILE_WRITE);
if (dataFile) {
//ヘッダーの書き込み
dataFile.print("Time stamp[microsec],CH.1,CH.2,Ch.3,CH.4,");
//単データセット当たりの行数をSDカードへ書き込み
dataFile.println("Number of lines pre dataset");
//データのサンプリング及びSDカード

while (1) { //ADC開始 i = 0; time_stamp_begining = micros(); chanel1[i] = analogRead(A1); chanel2[i] = analogRead(A2); chanel3[i] = analogRead(A3); chanel4[i] = analogRead(A4); chanel5[i] = analogRead(A5); for (i = 1; i < num_of_lines_per_one_dataset - 2; i++) { chanel1[i] = analogRead(A1); chanel2[i] = analogRead(A2); chanel3[i] = analogRead(A3); chanel4[i] = analogRead(A4); chanel5[i] = analogRead(A5); } i++; chanel1[i] = analogRead(A1); chanel2[i] = analogRead(A2); chanel3[i] = analogRead(A3); chanel4[i] = analogRead(A4); chanel5[i] = analogRead(A5); time_stamp_end = micros(); //ADC終了 //SDカードへ書き込み開始 i = 0; dataFile.print(time_stamp_begining); dataFile.print(","); dataFile.print(chanel1[i]); dataFile.print(","); dataFile.print(chanel2[i]); dataFile.print(","); dataFile.print(chanel3[i]); dataFile.print(","); dataFile.print(chanel4[i]); dataFile.print(","); //Serial.print(time_stamp_begining); Serial.print(","); Serial.print(a/1023*5000*chanel1[i]); Serial.print(","); Serial.print(a/1023*5000*chanel2[i]); Serial.print(","); Serial.print(a/1023*5000*chanel3[i]); Serial.print(","); Serial.print(a/1023*5000*chanel4[i]); Serial.print(","); if (j == 0) { dataFile.print(chanel5[i]); dataFile.print(","); dataFile.println(num_of_lines_per_one_dataset - 1); Serial.print(chanel5[i]*500.0/1024); Serial.print(","); Serial.println(num_of_lines_per_one_dataset - 1); } if (j != 0) { dataFile.println(chanel5[i]); Serial.println(chanel5[i]*500.0/1024); } j++; for (i = 1; i < num_of_lines_per_one_dataset - 2; i++) { dataFile.print(","); dataFile.print(chanel1[i]); dataFile.print(","); dataFile.print(chanel2[i]); dataFile.print(","); dataFile.print(chanel3[i]); dataFile.print(","); dataFile.print(chanel4[i]); dataFile.print(","); dataFile.println(chanel5[i]); Serial.print(","); Serial.print(a/1023*5000*chanel1[i]); Serial.print(","); Serial.print(a/1023*5000*chanel2[i]); Serial.print(","); Serial.print(a/1023*5000*chanel3[i]); Serial.print(","); Serial.print(a/1023*5000*chanel4[i]); Serial.print(","); Serial.println(chanel5[i]*500.0/1024); } i++; dataFile.print(time_stamp_end); dataFile.print(","); dataFile.print(chanel1[i]); dataFile.print(","); dataFile.print(chanel2[i]); dataFile.print(","); dataFile.print(chanel3[i]); dataFile.print(","); dataFile.print(chanel4[i]); dataFile.print(","); dataFile.println(chanel5[i]); //Serial.print(time_stamp_end); Serial.print(","); Serial.print(a/1023*5000*chanel1[i]); Serial.print(","); Serial.print(a/1023*5000*chanel2[i]); Serial.print(","); Serial.print(a/1023*5000*chanel3[i]); Serial.print(","); Serial.print(a/1023*5000*chanel4[i]); Serial.print(","); Serial.println(chanel5[i]*500.0/1024); //サンプリング時間に達したらループを抜ける if (time_stamp_end / 1000000 > sampling_time_sec) { dataFile.close(); break; } }

}
}

void loop(void) {}

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

thkana

2022/06/21 03:34

Arduinoといっても各種ボードがあり、それぞれ異なる部分があります。 今回であれば、RAM容量が大きな影響を及ぼしそうに思いますが、具体的な機種はなんですか? 例えばAruduino UNOであれば、RAM容量は2KB=2048Byteしかないので、他の動作を一切無視したとしても配列のサイズを512にするとそれだけでRAMを使い尽くします。 > Serial.begin(2000000); とかやっているあたり、UNOではなさそうですが。
shio

2022/06/21 03:44

お返事ありがとうございます.arduino nanoを使っています. Serial.begin(2000000)についてですが,無知ゆえにとりあえず最速の設定にしています.
y_waiwai

2022/06/21 04:18

nanoでもCPUは同じなので、RAM容量は2Kbyteですね。 RAM容量の大きな他のArduinoを使いましょう。それでSDカード操作はちと無理です
shio

2022/06/23 12:26

お返事ありがとうございます.ほかのアルディーノを使うこと,またはRAMを増設することを検討しようと思います.いつも私の質問に答えてくださって本当にありがとうございます^^

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Arduino

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