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

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

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

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

Q&A

2回答

1003閲覧

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

takerussatto

総合スコア0

Arduino

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

1グッド

0クリップ

投稿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👍を押しています

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

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

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

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

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

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などの初期化がよばれていないだけでは?
guest

回答2

0

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

投稿2022/11/23 22:43

thkana

総合スコア7629

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

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

0

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

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

投稿2022/11/23 22:11

y_waiwai

総合スコア87747

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

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

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問