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

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

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

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

Q&A

解決済

1回答

9429閲覧

Arduinoで3軸加速度データをSDに保存したい

退会済みユーザー

退会済みユーザー

総合スコア0

Arduino

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

0グッド

0クリップ

投稿2018/02/10 10:41

こんにちは.

はじめて投稿します.
Arduinoについての質問です.

私は今,加速度センサで読み取った値をSDカードに保存するという電子工作をしています.これまでにPC上で加速度の値を読み取ることは可能としましたが

,どうしてもSDカードに保存することが出来ません.

使用したものは以下のとおりです.

・Arduino UNO
・SD Card Shield
・三軸加速度センサ ADXL375
・I2Cバス用双方向電圧レベル変換モジュール

です.

私自身Arduino初心者なので,I2C通信を使いこなせていないことが原因だと考えています.
SDカードシールドのCSピンは4番,SSピンは10番です.
ハード側の4番,10番ピンには何もつないでいません.

以下にスケッチを掲載します.
このスケッチだと,SDの初期化には成功し,3軸の加速度もシリアルモニタに表示してくれますが,肝心のSDには保存してくれません.

お手数だとは思いますが,
添削のほどよろしくお願いいたします.

※以下スケッチ
ーーーーーーーーーーーーーーーーー
#include <SD.h>
#include <Wire.h>

//ファイル名をrecordFileで定義
File myFile;

//シールドの番号指定
const int chipselect = 4;

//デバイスアドレス(スレーブ)
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];

//各XYZ軸の加速度(m/s^2)を出力
Serial.print("X: ");
Serial.print( x * 0.6533);
Serial.print(" Y: ");
Serial.print( y * 0.6533);
Serial.print(" Z: ");
Serial.print( z * 0.6533);
Serial.println(" m/s^2");

//ログを書き込むためにファイルを開く
myFile = SD.open("test.txt,FILE_WRITE");
if(myFile)
{
Serial.println("test.txtをSDに書き込んでいます");
myFile.print( x );
myFile.print( y );
myFile.println( z );

//myFile.close();
Serial.println("書き込みが完了しました");
}
else
{
Serial.println(F("error opening test.txt"));
}

delay(500);
}

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

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

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

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

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

guest

回答1

0

ベストアンサー

myFile = SD.open("test.txt,FILE_WRITE");

myFile = SD.open("test.txt",FILE_WRITE);

の誤りでは?

投稿2018/02/10 11:15

MasahikoHirata

総合スコア3747

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

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

退会済みユーザー

退会済みユーザー

2018/02/10 11:25

ご回答ありがとうございます. 直ちに修正したところ,シリアルモニタ上で表示に成功し,書き込みにも成功したとの表示が出ました. やった!と思い加速度センサを動かしてみると,今度はファイル書き込みにエラーが... SDカードを覗いてみると,テキストファイルの作成には成功していましたが,肝心のデータは記録されていませんでした. 兎にも角にも,本当にありがとうございます.一歩前進することが出来ました!
MasahikoHirata

2018/02/10 14:39

//myFile.close(); は何故?コメントアウトされています?
退会済みユーザー

退会済みユーザー

2018/02/19 03:15

ご回答に対する返信が遅くなり申し訳ございません. ご指摘ありがとうございます.単純な誤りでした. 早速修正してみたところ,LSB単位の数値がSDに保存されていました! ありがとうございます!もう少し修正を試みて完成に近づけたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問