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

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

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

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

Q&A

受付中

ジャイロセンサの出力をsdカードにしたい

takerussatto
takerussatto

総合スコア0

Arduino

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

2回答

1グッド

0クリップ

394閲覧

投稿2022/11/23 17:27

編集2022/11/24 06:31

ジャイロセンサのデータの出力が通常シリアルモニタに表示されますが、それをSDカードに書き込みをしたいと考えております。
(Arduinoを使っており、ジャイロセンサはMPU6050,SDモジュールはAideepen Set of 5 Micro SD Storage Expansion Board Micro SD Card Memory Shield Module with Pin for ARM AVR です)

ジャイロセンサのプログラムは
#include <Wire.h>

long accelX, accelY, accelZ;
float gForceX, gForceY, gForceZ;

long gyroX, gyroY, gyroZ;
float rotX, rotY, rotZ;

void setup() {
Serial.begin(9600);
Wire.begin();
setupMPU6050();
}

void loop() {
recordAccelRegisters();
recordGyroRegisters();
printData();
delay(200);
}

void setupMPU6050() {
//MPU6050との通信を開始し、ジャイロと加速度の最大範囲を指定
Wire.beginTransmission(0b1101000); //I2C address of the MPU
Wire.write(0x6B); //Accessing the register 6B
Wire.write(0b00000000); //SLEEP register to 0
Wire.endTransmission();
Wire.beginTransmission(0b1101000);
Wire.write(0x1B); //Accessing the register 1B - Gyroscope Configuration
Wire.write(0x00000000); //gyro to full scale ± 250deg./s
Wire.endTransmission();
Wire.beginTransmission(0b1101000);
Wire.write(0x1C); //Accessing the register 1C - Acccelerometer Configuration
Wire.write(0b00000000); //accel to +/- 2g
Wire.endTransmission();
}

void recordAccelRegisters() {
//加速度読み取り
Wire.beginTransmission(0b1101000);
Wire.write(0x3B); // Accel Readings
Wire.endTransmission();
Wire.requestFrom(0b1101000, 6); //Request Accel Registers (3B - 40)
while (Wire.available() < 6);
accelX = Wire.read() << 8 | Wire.read(); //Store first two bytes into accelX
accelY = Wire.read() << 8 | Wire.read(); //Store middle two bytes into accelY
accelZ = Wire.read() << 8 | Wire.read(); //Store last two bytes into accelZ
calculateAccelData();
}

void calculateAccelData() {
//読み取った値をgに変換
gForceX = accelX / 16384.0;
gForceY = accelY / 16384.0;
gForceZ = accelZ / 16384.0;
}

void recordGyroRegisters() {
//ジャイロの値を読み取る
Wire.beginTransmission(0b1101000); //I2C address of the MPU
Wire.write(0x43); //Starting register for Gyro Readings
Wire.endTransmission();
Wire.requestFrom(0b1101000, 6); //Request Gyro Registers (43 - 48)
while (Wire.available() < 6);
gyroX = Wire.read() << 8 | Wire.read(); //Store first two bytes into accelX
gyroY = Wire.read() << 8 | Wire.read(); //Store middle two bytes into accelY
gyroZ = Wire.read() << 8 | Wire.read(); //Store last two bytes into accelZ
calculateGyroData();
}

void calculateGyroData() {
//読み取った値をdeg/secに変換
rotX = gyroX / 131.0;
rotY = gyroY / 131.0;
rotZ = gyroZ / 131.0;
}

void printData() {
//シリアルモニタに出力
Serial.print("Gyro");
Serial.print(" X=");
Serial.print(rotX);
Serial.print("deg/sec");
Serial.print(" Y=");
Serial.print(rotY);
Serial.print("deg/sec");
Serial.print(" Z=");
Serial.print(rotZ);
Serial.print("deg/sec");
Serial.print(" Accel");
Serial.print(" X=");
Serial.print(gForceX);
Serial.print('g');
Serial.print(" Y=");
Serial.print(gForceY);
Serial.print('g');
Serial.print(" Z=");
Serial.print(gForceZ);
Serial.println('g');
}

このよう0. 番号リストになり正常に作動しました。
SDカードに出力したい場合のプログラムが分かりません。

・SDカード出力するためのプログラム
を知りたいです。

追記 
#include <Wire.h>
#include<SD.h>
const int chipSelect =4;

long accelX, accelY, accelZ;
float gForceX, gForceY, gForceZ;

long gyroX, gyroY, gyroZ;
float rotX, rotY, rotZ;

void setup() {
Serial.begin(9600);
Wire.begin();
setupMPU6050();
}

void loop() {
recordAccelRegisters();
recordGyroRegisters();

delay(200);
}

void setupMPU6050() {
//MPU6050との通信を開始し、ジャイロと加速度の最大範囲を指定
Wire.beginTransmission(0b1101000); //I2C address of the MPU
Wire.write(0x6B); //Accessing the register 6B
Wire.write(0b00000000); //SLEEP register to 0
Wire.endTransmission();
Wire.beginTransmission(0b1101000);
Wire.write(0x1B); //Accessing the register 1B - Gyroscope Configuration
Wire.write(0x00000000); //gyro to full scale ± 250deg./s
Wire.endTransmission();
Wire.beginTransmission(0b1101000);
Wire.write(0x1C); //Accessing the register 1C - Acccelerometer Configuration
Wire.write(0b00000000); //accel to +/- 2g
Wire.endTransmission();
}

void recordAccelRegisters() {
//加速度読み取り
Wire.beginTransmission(0b1101000);
Wire.write(0x3B); // Accel Readings
Wire.endTransmission();
Wire.requestFrom(0b1101000, 6); //Request Accel Registers (3B - 40)
while (Wire.available() < 6);
accelX = Wire.read() << 8 | Wire.read(); //Store first two bytes into accelX
accelY = Wire.read() << 8 | Wire.read(); //Store middle two bytes into accelY
accelZ = Wire.read() << 8 | Wire.read(); //Store last two bytes into accelZ
calculateAccelData();
}

void calculateAccelData() {
//読み取った値をgに変換
gForceX = accelX / 16384.0;
gForceY = accelY / 16384.0;
gForceZ = accelZ / 16384.0;
}

void recordGyroRegisters() {
//ジャイロの値を読み取る
Wire.beginTransmission(0b1101000); //I2C address of the MPU
Wire.write(0x43); //Starting register for Gyro Readings
Wire.endTransmission();
Wire.requestFrom(0b1101000, 6); //Request Gyro Registers (43 - 48)
while (Wire.available() < 6);
gyroX = Wire.read() << 8 | Wire.read(); //Store first two bytes into accelX
gyroY = Wire.read() << 8 | Wire.read(); //Store middle two bytes into accelY
gyroZ = Wire.read() << 8 | Wire.read(); //Store last two bytes into accelZ
calculateGyroData();
}

void calculateGyroData() {
//読み取った値をdeg/secに変換
rotX = gyroX / 131.0;
rotY = gyroY / 131.0;
rotZ = gyroZ / 131.0;
}
void printData() {
//シリアルモニタに出力
Serial.print("Gyro");
Serial.print(" X=");
Serial.print(rotX);
Serial.print("deg/sec");
Serial.print(" Y=");
Serial.print(rotY);
Serial.print("deg/sec");
Serial.print(" Z=");
Serial.print(rotZ);
Serial.print("deg/sec");
Serial.print(" Accel");
Serial.print(" X=");
Serial.print(gForceX);
Serial.print('g');
Serial.print(" Y=");
Serial.print(gForceY);
Serial.print('g');
Serial.print(" Z=");
Serial.print(gForceZ);
Serial.println('g');
}

File dataFile =SD.open("datalog.txt",FILE_WRITE);
if (dataFile){

dataFile.print("Gyro");
dataFile.print(" X=");
dataFile.print(rotX);
dataFile.print("deg/sec");
dataFile.print(" Y=");
dataFile.print(rotY);
dataFile.print("deg/sec");
dataFile.print(" Z=");
dataFile.print(rotZ);
dataFile.print("deg/sec");
dataFile.print(" Accel");
dataFile.print(" X=");
dataFile.print(gForceX);
dataFile.print('g');
dataFile.print(" Y=");
dataFile.print(gForceY);
dataFile.print('g');
dataFile.print(" Z=");
dataFile.print(gForceZ);
dataFile.println('g');
dataFile.close();
lcd.setCursor(0,1);
lcd.printf("CD write=");
lcd.print(sno);
lcd.setCursor(15,1);
lcd.printf("R");
}
else{
lcd.printf("error opening datalog.txt");
}
}

}

このようにプログラムしたのですが、
if (dataFile){
の行がエラー文が出てしまいます。

takerussatto👍を押しています

以下のような質問にはグッドを送りましょう

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

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

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

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

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

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

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

適切な質問に修正を依頼しましょう。

2022/11/23 22:04依頼された後にこの質問は修正されています

こちらの質問が他のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

thkana

2022/11/24 13:18

エラーは「出てしまいます」で終わりにしないで、「何と言うエラーが出たか」をまずは略さず解釈せずそのまま示してください(示した後あなたの解釈を示すのは構いませんが)。 エラーメッセージにかかれていることは、その状況を解決するための重要なヒントとなります。
thkana

2022/11/24 13:24

それと、プログラムのコード部分は https://teratail.com/help/question-tips#questionTips35 等を参考にマークダウンを使ってコードとして記載してください。本文と同じ状態ではインデントが保存されないなど読みにくいです。
thkana

2022/11/24 13:29

とりあえず、追記分のプログラムは{と}の対応が変ですね。 printData()もどこからも呼ばれていません。
tmp

2022/11/24 23:22

SD.beginなどの初期化がよばれていないだけでは?

回答2

1

まずはSDカードライブラリをインストールして、そのドキュメントやExampleを研究してみてください。
といってもあまりこのケースにぴったりというExampleがついてないんだなぁ...まぁ、やってみて困ったらその具体的状況を以て質問していただければと思います。

投稿2022/11/23 22:43

thkana

総合スコア7338

tain👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

1

arduinoでSDカードを操作するコード、ってのはちょっとググれば山ほど制作例が出てきますんで、まずはそれを見てやってみましょう。
そのうえで、わからないこと、疑問な事が出てきたなら、その参考にしたページとともに質問しましょう

で、一つアドバイスですが、SDカードの操作を実装するにはメモリを大量に消費します。
なんで、ATmega328などのRAM容量の少ないCPUでは実装はまず無理となります

投稿2022/11/23 22:11

y_waiwai

総合スコア86074

spoofy_dragon👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

2022/11/29 08:36

こちらの回答が複数のユーザーから「質問に対する回答となっていない投稿」という指摘を受けました。

2022/11/24 05:22

こちらの回答が他のユーザーから「説明が不足している回答」という指摘を受けました。

回答へのコメント

thkana

2022/11/23 22:36

> ATmega328などのRAM容量の少ないCPUでは実装はまず無理 Googleで"Arduino SDカード"を検索してみたところ、結果の1ページ目10件全てがATMega328(UNOが9件、Pro miniが1件)の作例だったりします。 2ページ目になるといきなりArduino MKR ZERO(SAMD)が出てきたけど、UNO,Nanoが3件、作例でない機種非依存のライブラリ解説が2件、カードI/Fの販売4件(5V接続を前提としたものが多数) もちろん無茶はできませんけれど、ATMega328で頑張っている方、いっぱいいらっしゃるみたいですよ。
y_waiwai

2022/11/23 22:45

まあ、SDカードにアクセスして、何らかのデータを(ベタに)読み書きする、と言うのは不可能ではないでしょう。 けど、それではSDカードにファイルとして書き込んで、それをPCでファイルを読み出せるように、ってのはできません
thkana

2022/11/24 00:13

SDカードライブラリ、使ってみたことありますか?
y_waiwai

2022/11/24 01:28

できるのなら、ぜひそのやり方を回答にして教えてあげてください。 こんなところで本質的でないことで云々するよりも、よっぽど建設的だと思いますよ。

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

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

Arduino

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