Project 26.1 3軸ジャイロセンサー/Read a MPU6050 Sensor Module

前回は人感センサーについて学びました。

今回は3軸ジャイロセンサーについて学びましょう。

目次

MPU6050について

MPU6050センサーモジュールは、6軸モーションキャプチャー機能を持つ集積型デバイスです。3軸ジャイロスコープ、3軸加速度センサー、そしてDMP (Digital Motion Processor)を小さなパッケージ内に搭載しています。MPU6050の加速度センサーとジャイロスコープの設定は変更可能です。また、温度によるデータ誤差を補正するための高精度・広範囲のデジタル温度センサーも内蔵されており、温度値を読むこともできます。MPU6050モジュールはI2C通信プロトコルを採用し、デフォルトの通信アドレスは0x68です。

MPU6050は、車両、ロボット、航空機、携帯電話など、安定性や姿勢制御が必要な製品で広く使用されています。

各ポートは以下のようになっています

より詳細な情報はデータシートを確認しましょう。

回路図

接続図

ライブラリのインストール

以下のライブラリをインストールしましょう。
ライブラリ:MPU6050_tockn

コード

/**********************************************************************
  Filename    : Acceleration detection
  Description : Read the MPU6050 data and print it out through the serial port
  Auther      : www.freenove.com
  Modification: 2022/10/26
**********************************************************************/
#include <MPU6050_tockn.h>
#include <Wire.h>

#define SDA 13
#define SCL 14

MPU6050 mpu6050(Wire);//Attach the IIC
int16_t ax,ay,az;//define acceleration values of 3 axes
int16_t gx,gy,gz;//define variables to save the values in 3 axes of gyroscope

long timer = 0;

void setup() {
  Serial.begin(115200);
  Wire.begin(SDA, SCL);          //attach the IIC pin
  mpu6050.begin();               //initialize the MPU6050
  mpu6050.calcGyroOffsets(true); //get the offsets value
}

void loop() {
  if(millis() - timer > 1000){   //each second printf the data
    mpu6050.update();            //update the MPU6050
    getMotion6();                //gain the values of Acceleration and Gyroscope value
    Serial.print("\na/g:\t");
    Serial.print(ax); Serial.print("\t");
    Serial.print(ay); Serial.print("\t");
    Serial.print(az); Serial.print("\t");
    Serial.print(gx); Serial.print("\t\t");
    Serial.print(gy); Serial.print("\t\t");
    Serial.println(gz);
    Serial.print("a/g:\t");
    Serial.print((float)ax / 16384); Serial.print("g\t");
    Serial.print((float)ay / 16384); Serial.print("g\t");
    Serial.print((float)az / 16384); Serial.print("g\t");
    Serial.print((float)gx / 131); Serial.print("d/s \t");
    Serial.print((float)gy / 131); Serial.print("d/s \t");
    Serial.print((float)gz / 131); Serial.print("d/s \n");
    timer = millis();
  }
}
void getMotion6(void){
  ax=mpu6050.getRawAccX();//gain the values of X axis acceleration raw data
  ay=mpu6050.getRawAccY();//gain the values of Y axis acceleration raw data
  az=mpu6050.getRawAccZ();//gain the values of Z axis acceleration raw data
  gx=mpu6050.getRawGyroX();//gain the values of X axis Gyroscope raw data
  gy=mpu6050.getRawGyroX();//gain the values of Y axis Gyroscope raw data
  gz=mpu6050.getRawGyroX();//gain the values of Z axis Gyroscope raw data
}

今回は27行目と44行目に注目してみましょう。過去にも出てきた書き方ですが、44行目で今の時刻を取得しています。そこからメインループをグルグルと回していくのですが、前回に画面出力した時(timer)から1000ms経過していたらif文の中身の値の取得からシリアルモニターへの出力までを実行しています。1000ms経過していなければ何もせずにグルグル回るだけです。この書き方の何がいいかというと、delayだと全ての処理が止まってしまいますが、この書き方だと複数の処理をそれぞれ別の間隔で回すことができるというところが良いところです。擬似的なマルチスレッド処理ができるということですね。

次回はBluetoothによるデータ通信を試してみましょう!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

金重総合研究所の主席研究員。
子供の頃から研究者を目指し、ライフワークとして日々様々な研究をしています。
経営・マネジメント・金融・DXあたりが本職です。
私を採用したい人、私と一緒に働きたい人、一緒に知識を肥やしていきたい人はぜひお声がけ下さい。

コメント

コメントする

目次