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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

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

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

1回答

1627閲覧

ジャイロセンサの値のずれを修正したい

Helio

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

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

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

0クリップ

投稿2020/08/19 10:27

編集2022/01/12 10:55

前提・実現したいこと

BMX055という9軸センサのジャイロセンサのみを使い、値を出力したいです。使うマイコンボードはAruduinoで、AruduinoIDEを使ってプログラムを書いています。

発生している問題・エラーメッセージ

 エラーメッセージはありません。
下の画像で、青がX軸、赤がY軸、緑がZ軸となっています。画像①はセンサを動かさずに静止した状態、画像②は順番にX軸のみ、Y軸のみ、Z軸のみを動かした状態です。まず画像①を見てもらうと、明らかに青X軸が異常な値を出力していて、緑Z軸は止まる気配すら感じられません。
次に画像②を見てもらうと、最初にX軸のみを動かしたのですが、なぜか赤Y軸が反応し、本来の青X軸が反応していなさそうです。次にY軸のみを動かし、この場合は正しくY軸が反応していますが、もう少し大きく反応してもいいと思います。最後のZ軸は、おそらく正しい動きかと思われます。
〇データ画像
イメージ説明

該当のソースコード

//BMX055-Gyro// #include<Wire.h> #define Addr_Gyro 0x69 float xGyro = 0.00; float yGyro = 0.00; float zGyro = 0.00; void setup(){ Wire.begin(); Serial.begin(9600); BMX055_Init(); pinMode(8,OUTPUT); delay(300); } #define ON LOW void loop(){ BMX055_Gyro(); //Serial.print("Gyro= "); Serial.print(xGyro); Serial.print(","); Serial.print(yGyro); Serial.print(","); Serial.print(zGyro); Serial.println(""); delay(100); } void BMX055_Init(){ Wire.beginTransmission(Addr_Gyro); Wire.write(0x0F); // 範囲レジスタを選択 Wire.write(0x04); // フルスケール= +/- 125度/秒 Wire.endTransmission(); delay(100); //------------------------------------------------------------// Wire.beginTransmission(Addr_Gyro); Wire.write(0x10); // 帯域幅レジスタを選択 Wire.write(0x07); // ODR = 100 Hz Wire.endTransmission(); delay(100); //------------------------------------------------------------// Wire.beginTransmission(Addr_Gyro); Wire.write(0x11); // LPM1レジスタを選択 Wire.write(0x00); // 通常モード、スリープ期間= 2ms Wire.endTransmission(); delay(100); } void BMX055_Gyro(){ int data[6]; for (int i = 0; i < 6; i++) { Wire.beginTransmission(Addr_Gyro); Wire.write((2 + i)); // データレジスタを選択 Wire.endTransmission(); Wire.requestFrom(Addr_Gyro, 1); // 1バイトのデータを要求する // 6バイトのデータを読み取る if (Wire.available() == 1) data[i] = Wire.read(); } // データを変換する xGyro = (data[1] * 256) + data[0]; if (xGyro > 32767) xGyro -= 65536; yGyro = (data[3] * 256) + data[2]; if (yGyro > 32767) yGyro -= 65536; zGyro = (data[5] * 256) + data[4]; if (zGyro > 32767) zGyro -= 65536; xGyro = xGyro * 0.0038; // フルスケール= +/- 125度/秒 yGyro = yGyro * 0.0038; // フルスケール= +/- 125度/秒 zGyro = zGyro * 0.0038; // フルスケール= +/- 125度/秒 }

試したこと

関係があるかは分かりませんが、こちらのページ(リンク内容)を参照して0x14、0x0f、0x10のレジスタでソフトリセットというものも試しましたが効果はありませんでした。

data[0]~data5までの出力値(プログラムは一部のみ)
画像は左からdata[0]~data[5]となっています。
イメージ説明

void BMX055_Gyro() { int data[6]; for (int i = 0; i < 6; i++) { Wire.beginTransmission(Addr_Gyro); Wire.write((2 + i)); // データレジスタを選択 Wire.endTransmission(); Wire.requestFrom(Addr_Gyro, 1); // 1バイトのデータを要求する // 6バイトのデータを読み取る // xGyro lsb, xGyro msb, yGyro lsb, yGyro msb, zGyro lsb, zGyro msb if (Wire.available() == 1) data[i] = Wire.read(); Serial.print(data[0]); Serial.print(" ,"); Serial.print(data[1]); Serial.print(" ,"); Serial.print(data[2]); Serial.print(" ,"); Serial.print(data[3]); Serial.print(" ,"); Serial.print(data[4]); Serial.print(" ,"); Serial.print(data[5]); Serial.println(" ,"); } }

補足情報(FW/ツールのバージョンなど)

Arduinoはバージョン1.8.9です。
BMX055のデータシート(リンク内容)
購入先(リンク内容)
〇ハードウェア
イメージ説明
イメージ説明
イメージ説明

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

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

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

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

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

bjnes

2020/08/19 11:36

問題の切り分けが難しいです。ハードの異常も疑ってます。 どのようにずれ修正したいのでしょうか?  1.ハードは盲目的に正しいと見て、ソフトウェアのみで無理やり修正    N回値を取得してその平均をとってください。スパイク状のノイズは取り除けるはずです。  2.ハードウェア込で修正    チップだけは判別が付きません、基板モジュールのスマホ写真と部品購入先、型番を明記    してください。
thkana

2020/08/19 22:01

秋月の資料に 「ArduinoUNO で確認する際は電源選択用の JP6 と I2C プルアップ設定用の JP4,5 をショートします。」 とあります。 別に外付け抵抗でプルアップしてもいいですけれど、I2Cラインのプルアップはされていないのですか?
Helio

2020/08/19 23:07

jp4,5のプルアップがI2Cラインのプルアップではないのですか?
thkana

2020/08/19 23:33 編集

あぁ、4,5はそっちだったのか。ショートされてますね
ikadzuchi

2020/08/20 13:55

data[0]~[5]の値が見たいですね。 また、I2Cで正常に値が読めるかどうかを見たいので、値が既知の他のレジスタも同様に読んでみてください。
ikadzuchi

2020/08/23 12:19

data[0]~[5]の値から異常のようですね。 そして別のレジスタも読んでみて欲しいのですが。 とりあえず0x00~3Fまで全部読んでみて、データシートのReset Valueの値と比較してください。
guest

回答1

0

ずれを修正したい、とありますが、どう見ても正常な値を読み込んでいないようです。
ざっとコードを見ると、データ1バイトごとに読み出しコマンドを送ってるようですが、ここで一気に6バイトを読んでみて、値が変わるのか、状態が変わるのかを見てはどうでしょう。

投稿2020/08/19 12:31

y_waiwai

総合スコア87719

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

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

Helio

2020/08/19 16:48

回答ありがとうございます。先ほどから6バイト一気に読み込もうとしていますが、なかなかうまくいきません。もう少し詳しく教えていただけますか?
y_waiwai

2020/08/20 00:12

まずはI2C通信が正常に行われてるのかを確認してみてはどうでしょう。 オシロスコープでSDAとSCLをモニタし、センサのデータシートに記載されている通りの信号が流れているのかをまず確認します とくに、各コマンドのACK/NACKをみて、正常に応答してるのかをみてみましょう。
Helio

2020/08/20 17:32 編集

遅くなってすいません。オシロスコープは持っていないので見れないです。もしハードウェアの問題ならもう一度同じセンサーを購入することも考えています。
y_waiwai

2020/08/20 23:55

データ内容はどうあれ、何らかの通信が行われるってのは、ハード的には正常だと思いますよ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問