こんにちは.
Arduinoに関する質問です.
私は今,加速度センサで読み取った値をSDカードに保存するという電子工作をしています.
SDへの保存は5000Hzを目標としていますが,現在のスケッチでは約50Hz(1秒間に50個)程のデータ取得が限界です.
そこで現在のスケッチを改善したいと考えています.
delay(20)にして実験すると,SDにはきちんとデータが書き込まれまずが,
それ以下の数値になると,処理が追い付かず保存が間に合いません.
現在はサイクル毎にファイルを書き込むようなスケッチにしています.
今後は,
加速度センサから数秒間(例えば3秒)データ採取→SD保存
といったプログラムを作成したいのですが,それは可能なのでしょうか.
使用したものは以下のとおりです.
・Arduino UNO
・SD Card Shield
・SDカード 32GB - FAT32
・三軸加速度センサ ADXL375
・I2Cバス用双方向電圧レベル変換モジュール
です.
以下にスケッチを掲載します.
お手数だとは思いますが,改善点などご指摘いただければ幸いです.
よろしくお願いします.
※以下スケッチ掲載
#include <SD.h>
#include <Wire.h>
//ファイル名をrecordFileで定義
File myFile;
//シールドの番号指定
const int chipselect = 4;
//演算用変数型の定義
float senX , senY , senZ = 0;
//デバイスアドレス(スレーブ)
uint8_t DEVICE_ADDRESS = 0x1D;
//XYZレジスタ用のテーブル(6byte)
uint8_t RegTbl[6];
void setup()
{
//SSピンを出力に設定
pinMode(SS,OUTPUT);
Serial.begin(9600);
//マスタとしてI2Cバスに接続する
Wire.begin();
//DATA_FORMAT(データ形式の制御)
Wire.beginTransmission(DEVICE_ADDRESS);
//DATA_FORMATのアドレス
Wire.write(0x31);
//最大分解能モードに「±200G」
Wire.write(0x0b);
Wire.endTransmission();
//POWER_TCL(節電機能の制御)
Wire.beginTransmission(DEVICE_ADDRESS);
//POWER_CTLのアドレス
Wire.write(0x2d);
//測定モードにする
Wire.write(0x08);
Wire.endTransmission();
//SDカードスロットのチップセレクト番号にてSDライブラリを初期化
//初期化に失敗したらエラーを出す
if(!SD.begin(chipselect))
{
Serial.println(F("カードが見つかりません"));
return;
}
//成功したら完了を表示する
Serial.println("カード初期化に成功しました");
}
void loop()
{
//XYZの先頭アドレスに移動する
Wire.beginTransmission(DEVICE_ADDRESS);
Wire.write(0x32);
Wire.endTransmission();
//デバイスへ6byteのレジスタデータを要求する
Wire.requestFrom(DEVICE_ADDRESS,6);
//6byteのデータを取得する
int i;
for(i=0;i<6;i++)
{
while(Wire.available()==0){}
RegTbl[i]=Wire.read();
}
//データを各XYZの値に変換する(LSB単位)
int16_t x = (((int16_t)RegTbl[1]) << 8) | RegTbl[0];
int16_t y = (((int16_t)RegTbl[3]) << 8) | RegTbl[2];
int16_t z = (((int16_t)RegTbl[5]) << 8) | RegTbl[4];
//SDに書き込むためにSDB値をm/s^2値に変換
senX = x * 0.6533;
senY = y * 0.6533;
senZ = z * 0.6533;
//ログを書き込むためにファイルを開く
myFile = SD.open("test.txt",FILE_WRITE);
if(myFile)
{
Serial.println("test.txtをSDに書き込んでいます");
myFile.print( senX );
myFile.print(",");
myFile.print( senY );
myFile.print(",");
myFile.println( senZ );
myFile.close(); Serial.println("書き込みが完了しました");
}
else
{
Serial.println(F("error opening test.txt"));
}
delay(20);
}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/03/03 08:22