【貂蝉がプログラミングを学ぶ】Arduinoハンズオン(108)---GY-521三軸センサーモジュール実験オープンソースLinkboyシミュレーションプログラミング3件

ここに画像の説明を挿入

37 個のセンサーとアクチュエーターに関する言及はインターネット上で広く広まっていますが、実際には、Arduino と互換性のあるセンサー モジュールは 37 個以上あるはずです。手持ちのセンサーとアクチュエーターモジュールがいくつかあるという事実を考慮して、学習とコミュニケーションを目的として、真の知識を得るために実践する(やらなければならない)というコンセプトに従って、一連の実験を試みるつもりです成功(プログラムが完了する)かどうかに関係なく、小さな進歩や解決できない問題など、他の人にインスピレーションを与えることを期待して、それらが一つずつ記録されます。

【Arduino】168センサーモジュールシリーズ実験(データコード+シミュレーションプログラミング+グラフィックプログラミング)

実験108:MPU-6050モジュール3軸加速度電子ジャイロスコープ6DOF GY-521センサー(3軸ジャイロスコープ+3軸加速度)

ここに画像の説明を挿入
モジュールの電気回路図

ここに画像の説明を挿入

実験用配線図

ここに画像の説明を挿入

【Arduino】168種類のセンサーモジュールシリーズ実験(データコード+シミュレーションプログラミング+グラフィックスプログラミング)
実験108:MPU-6050モジュール 3軸加速度電子ジャイロスコープ 6DOF GY-521センサー(3軸ジャイロスコープ+3軸加速度)
プロジェクト1: MPU6050 の例をテストする
実験配線:
Arduino-----MPU 6050
5V---------------VCC
GND-----------GND
A4-- --------SDA IIC データライン
A5----------SCL IIC クロックライン
D2-----------INT 割り込みピン

/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百零八:MPU-6050模块 三轴加速度 电子陀螺仪6DOF GY-521传感器(三轴陀螺仪 + 三轴加速度)

项目之一:测试MPU6050示例

实验接线:

Arduino------MPU 6050

5V-------------VCC

GND-----------GND

A4-----------SDA IIC 数据线

A5-----------SCL IIC 时钟线

D2-----------INT 中断脚

*/



#include "I2Cdev.h"

#include "MPU6050_6Axis_MotionApps20.h"

//#include "MPU6050.h" 

#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE

  #include "Wire.h"

  #endif

MPU6050 mpu;

#define OUTPUT_READABLE_YAWPITCHROLL

#define LED_PIN 13 

bool blinkState = false;

// MPU control/status vars

bool dmpReady = false;  

uint8_t mpuIntStatus;  

uint8_t devStatus;    

uint16_t packetSize;   

uint16_t fifoCount;   

uint8_t fifoBuffer[64]; 

Quaternion q;      

VectorInt16 aa;     

VectorInt16 aaReal;   

VectorInt16 aaWorld;   

VectorFloat gravity;  

float euler[3];     

float ypr[3];      

uint8_t teapotPacket[14] = {
    
     '

, 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, '\r', '\n' };

volatile bool mpuInterrupt = false;   

void dmpDataReady() {
    
    

  mpuInterrupt = true;

}

void setup() {
    
    

  #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE

    Wire.begin();

    TWBR = 24; // 400kHz I2C clock (200kHz if CPU is 8MHz)

  #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE

    Fastwire::setup(400, true);

  #endif

  Serial.begin(115200);

  while (!Serial); 

  Serial.println(F("Initializing I2C devices..."));

  mpu.initialize();

  Serial.println(F("Testing device connections..."));

  Serial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed"));

  Serial.println(F("\nSend any character to begin DMP programming and demo: "));

  while (Serial.available() && Serial.read()); 

  while (!Serial.available());         

  while (Serial.available() && Serial.read()); 

  Serial.println(F("Initializing DMP..."));

  devStatus = mpu.dmpInitialize();

  mpu.setXGyroOffset(220);

  mpu.setYGyroOffset(76);

  mpu.setZGyroOffset(-85);

  mpu.setZAccelOffset(1788); 

  if (devStatus == 0) {
    
    

  

    Serial.println(F("Enabling DMP..."));

    mpu.setDMPEnabled(true);

    Serial.println(F("Enabling interrupt detection (Arduino external interrupt 0)..."));

    attachInterrupt(0, dmpDataReady, RISING);

    mpuIntStatus = mpu.getIntStatus();

    Serial.println(F("DMP ready! Waiting for first interrupt..."));

    dmpReady = true;

    packetSize = mpu.dmpGetFIFOPacketSize();

  } 

  else {
    
    

     

    Serial.print(F("DMP Initialization failed (code "));

    Serial.print(devStatus);

    Serial.println(F(")"));

  }

  // configure LED for output

  pinMode(LED_PIN, OUTPUT);

}

void loop() {
    
    

  if (!dmpReady) return;

  while (!mpuInterrupt && fifoCount < packetSize) {
    
    

  }

  mpuInterrupt = false;

  mpuIntStatus = mpu.getIntStatus();

  fifoCount = mpu.getFIFOCount();

  if ((mpuIntStatus & 0x10) || fifoCount == 1024) {
    
    

     

    mpu.resetFIFO();

    Serial.println(F("FIFO overflow!"));

  } else if (mpuIntStatus & 0x02) {
    
    

    while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();

    mpu.getFIFOBytes(fifoBuffer, packetSize);

     

    fifoCount -= packetSize;

    #ifdef OUTPUT_READABLE_QUATERNION

      

      mpu.dmpGetQuaternion(&q, fifoBuffer);

      Serial.print("quat\t");

      Serial.print(q.w);

      Serial.print("\t");

      Serial.print(q.x);

      Serial.print("\t");

      Serial.print(q.y);

      Serial.print("\t");

      Serial.println(q.z);

    #endif

    #ifdef OUTPUT_READABLE_EULER

      

      mpu.dmpGetQuaternion(&q, fifoBuffer);

      mpu.dmpGetEuler(euler, &q);

      Serial.print("euler\t");

      Serial.print(euler[0] * 180/M_PI);

      Serial.print("\t");

      Serial.print(euler[1] * 180/M_PI);

      Serial.print("\t");

      Serial.println(euler[2] * 180/M_PI);

    #endif

    #ifdef OUTPUT_READABLE_YAWPITCHROLL

     

      mpu.dmpGetQuaternion(&q, fifoBuffer);

      mpu.dmpGetGravity(&gravity, &q);

      mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);

      Serial.print("ypr\t");

      Serial.print(ypr[0] * 180/M_PI);

      Serial.print("\t");

      Serial.print(ypr[1] * 180/M_PI);

      Serial.print("\t");

      Serial.println(ypr[2] * 180/M_PI);

    #endif

    #ifdef OUTPUT_READABLE_REALACCEL

       

      mpu.dmpGetQuaternion(&q, fifoBuffer);

      mpu.dmpGetAccel(&aa, fifoBuffer);

      mpu.dmpGetGravity(&gravity, &q);

      mpu.dmpGetLinearAccel(&aaReal, &aa, &gravity);

      Serial.print("areal\t");

      Serial.print(aaReal.x);

      Serial.print("\t");

      Serial.print(aaReal.y);

      Serial.print("\t");

      Serial.println(aaReal.z);

    #endif

    #ifdef OUTPUT_READABLE_WORLDACCEL

      

      mpu.dmpGetQuaternion(&q, fifoBuffer);

      mpu.dmpGetAccel(&aa, fifoBuffer);

      mpu.dmpGetGravity(&gravity, &q);

      mpu.dmpGetLinearAccel(&aaReal, &aa, &gravity);

      mpu.dmpGetLinearAccelInWorld(&aaWorld, &aaReal, &q);

      Serial.print("aworld\t");

      Serial.print(aaWorld.x);

      Serial.print("\t");

      Serial.print(aaWorld.y);

      Serial.print("\t");

      Serial.println(aaWorld.z);

    #endif

   

    #ifdef OUTPUT_TEAPOT

       

      teapotPacket[2] = fifoBuffer[0];

      teapotPacket[3] = fifoBuffer[1];

      teapotPacket[4] = fifoBuffer[4];

      teapotPacket[5] = fifoBuffer[5];

      teapotPacket[6] = fifoBuffer[8];

      teapotPacket[7] = fifoBuffer[9];

      teapotPacket[8] = fifoBuffer[12];

      teapotPacket[9] = fifoBuffer[13];

      Serial.write(teapotPacket, 14);

      teapotPacket[11]++; 

    #endif

    blinkState = !blinkState;

    digitalWrite(LED_PIN, blinkState);

    delay(1000);

  }

}


試験的なシリアルポートの復帰

ここに画像の説明を挿入
シリアル ポート プロンプトの変換 (D2 が接続されていない場合)
は I2C デバイスを初期化しています...
デバイス接続をテストしています...
MPU6050 接続は成功しました

任意の文字を送信して DMP プログラミングとデモンストレーションを開始します。
DMP の初期化...
DMP の有効化...
割り込み検出の有効化 (Arduino 外部割り込み 0...)
DMP 準備完了! 最初の割り込みを待っています...

ここに画像の説明を挿入

実験的なオープンソース シミュレーション プログラミング (Linkboy V4.63)

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

試験的なシリアルポートの復帰

ここに画像の説明を挿入

オレンジ、紫、黒の線はX\Y\Z軸の加速度値で非常に敏感で、ちょっとした動きで大きく変化します値は-32000~32000の間です

ここに画像の説明を挿入

実験シーングラフ

ここに画像の説明を挿入

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_41659040/article/details/132487510