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

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

ただいまの
回答率

87.37%

9軸センサ(MPU-9250)のセンサ値をArduinoのSPI通信で取得したいです.

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,492

score 6

9軸センサ(MPU-9250)のセンサ値をArduinoのSPI通信で取得したいです.

表題の通りなのですが,下記のようなサンプルコードを使ってまして,何となく値は出るのですが加速度の値がどの姿勢でも最初の姿勢が0,0,1になってしまいます.
また地磁気も値は取れているのですがsetupの際にFailed connection to mag: B3と表示されてしまいます.
何が原因なのでしょうか.

ちなみにライブラリは,https://github.com/brianc118/MPU9250/blob/master/MPU9250.cpp
ここのものを使用しています.

/**
 * Sample program for the MPU9250 using SPI
 *
 * Sample rate of the AK8963 magnetometer is set at 100Hz. 
 * There are only two options: 8Hz or 100Hz so I've set it at 100Hz
 * in the library. This is set by writing to the CNTL1 register
 * during initialisation.
 *
 * Copyright (C) 2015 Brian Chen
 *
 * Open source under the MIT license. See LICENSE.txt.
 */

#include <SPI.h>
#include <MPU9250.h>

#define SPI_CLOCK 8000000  // 8MHz clock works.

#define SS_PIN   53 
#define INT_PIN  40
#define LED      13

#define WAITFORINPUT(){            \
    while(!Serial.available()){};  \
    while(Serial.available()){     \
        Serial.read();             \
    };                             \
}                                  \

MPU9250 mpu(SPI_CLOCK, SS_PIN);

void setup() {
    Serial.begin(9600);

    pinMode(INT_PIN, INPUT);
//    pinMode(LED, OUTPUT);
//    digitalWrite(LED, HIGH);

    SPI.begin();

//    Serial.println("Press any key to continue");
//    WAITFORINPUT();

    mpu.init(true);

    uint8_t wai = mpu.whoami();
    if (wai == 0x71){
        Serial.println("Successful connection");
    }
    else{
        Serial.print("Failed connection: ");
        Serial.println(wai, HEX);
    }

    uint8_t wai_AK8963 = mpu.AK8963_whoami();
    if (wai_AK8963 == 0x48){
        Serial.println("Successful connection to mag");
    }
    else{
        Serial.print("Failed connection to mag: ");
        Serial.println(wai_AK8963, HEX);
    }

    mpu.calib_acc();
    mpu.calib_mag();

//    Serial.println("Send any char to begin main loop.");
//    WAITFORINPUT();
}

void loop() {
    // various functions for reading
    // mpu.read_mag();
    // mpu.read_acc();
    // mpu.read_gyro();

    mpu.read_all();

    Serial.print(mpu.gyro_data[0]);   Serial.print('\t');
    Serial.print(mpu.gyro_data[1]);   Serial.print('\t');
    Serial.print(mpu.gyro_data[2]);   Serial.print('\t');
    Serial.print(mpu.accel_data[0]);  Serial.print('\t');
    Serial.print(mpu.accel_data[1]);  Serial.print('\t');
    Serial.print(mpu.accel_data[2]);  Serial.print('\t');
    Serial.print(mpu.mag_data[0]);    Serial.print('\t');
    Serial.print(mpu.mag_data[1]);    Serial.print('\t');
    Serial.print(mpu.mag_data[2]);    Serial.print('\t');
    Serial.println(mpu.temperature);

    delay(10);
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • wwbQzhMkhhgEmhU

    2019/01/21 21:23

    まるで理解していないで書きますが、Webで調べると、MPU-9250はいろんなライブラリが正しく機能しないって話がよく見つかります。↓のサイトはMPU-9250を使っているそうですが、コメントを見るとなんか動くらしいです。
    http://akiracing.com/2018/02/04/how_to_use_mpu9250/
    無断転載禁止だそうですので、ご注意ください。ご参考までに。

    キャンセル

  • rr0044is

    2019/01/22 08:13

    これはおそらくI2C通信用ではないでしょうか。

    キャンセル

  • wwbQzhMkhhgEmhU

    2019/01/22 08:36

    あ、SPIじゃなかったですね。失礼しました。

    キャンセル

回答 2

+2

ちょっと気になるところとしては、

#define SPI_CLOCK 8000000  // 8MHz clock works.

とありますが、これでは早すぎ&無意味です
せいぜい数百KHzにしておきましょう

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

MPU9250で地磁気センサを使う方法(SPIで) の記事が参考になるのではないかと思います。

この記事の中に「当然だが地磁気は100Hzの計測周期なので」と書かれています。
地磁気の値を取得する間隔を10ms以上にすると良いかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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