Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Tutorial Akselerometer dan Giroskop Arduino dan MPU6050

Dalam tutorial ini kita akan belajar cara menggunakan sensor Accelerometer dan Giroskop MPU6050 dengan Arduino. Pertama, saya akan menjelaskan cara kerja MPU6050 dan cara membaca data darinya, lalu kami akan membuat dua contoh praktis.

Anda dapat menonton video berikut atau membaca tutorial tertulis di bawah ini.

Ringkasan

Pada contoh pertama, menggunakan lingkungan pengembangan Processing, kita akan membuat visualisasi 3D dari orientasi sensor, dan pada contoh kedua kita akan membuat platform self-stabilizing sederhana atau Gimbal DIY. Berdasarkan orientasi MPU6050 dan data akselerometer dan giroskop yang menyatu, kami mengontrol tiga servo yang menjaga level platform.

Cara Kerja

MPU6050 IMU memiliki akselerometer 3-Sumbu dan giroskop 3-Sumbu yang terintegrasi dalam satu chip.

Giroskop mengukur kecepatan rotasi atau laju perubahan posisi sudut dari waktu ke waktu, sepanjang sumbu X, Y dan Z. Ini menggunakan teknologi MEMS dan Efek Coriolis untuk mengukur, tetapi untuk detail lebih lanjut, Anda dapat memeriksa tutorial Cara Kerja Sensor MEMS saya. Keluaran giroskop dalam derajat per detik, jadi untuk mendapatkan posisi sudut kita hanya perlu mengintegrasikan kecepatan sudut.

Di sisi lain, akselerometer MPU6050 mengukur akselerasi dengan cara yang sama seperti yang dijelaskan dalam video sebelumnya untuk sensor akselerometer ADXL345. Secara singkat, itu dapat mengukur percepatan gravitasi di sepanjang 3 sumbu dan menggunakan beberapa matematika trigonometri kita dapat menghitung sudut di mana sensor diposisikan. Jadi, jika kita menggabungkan, atau menggabungkan data akselerometer dan giroskop, kita bisa mendapatkan informasi yang sangat akurat tentang orientasi sensor.

MPU6050 IMU juga disebut perangkat pelacak gerak enam sumbu atau perangkat 6 DoF (enam Derajat Kebebasan), karena 6 keluarannya, atau 3 keluaran akselerometer dan 3 keluaran giroskop.

Arduino dan MPU6050

Mari kita lihat bagaimana kita dapat menghubungkan dan membaca data dari sensor MPU6050 menggunakan Arduino. Kami menggunakan protokol I2C untuk komunikasi dengan Arduino sehingga kami hanya membutuhkan dua kabel untuk menghubungkannya, ditambah dua kabel untuk memberi daya.

Anda bisa mendapatkan komponen yang diperlukan untuk Tutorial Arduino ini dari link di bawah ini:

  • MPU6050 IMU …………………………..…. AmazonBanggood / AliExpress
  • Dewan Arduino ………………………….…..
  • Breadboard dan Kabel Lompat ………… 

Kode Arduino MPU6050

Berikut kode Arduino untuk membaca data dari sensor MPU6050. Di bawah kode Anda dapat menemukan deskripsi detailnya.

/*
   Arduino and MPU6050 Accelerometer and Gyroscope Sensor Tutorial
   by Dejan, https://howtomechatronics.com
*/
#include <Wire.h>
const int MPU = 0x68; // MPU6050 I2C address
float AccX, AccY, AccZ;
float GyroX, GyroY, GyroZ;
float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ;
float roll, pitch, yaw;
float AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ;
float elapsedTime, currentTime, previousTime;
int c = 0;
void setup() {
  Serial.begin(19200);
  Wire.begin();                      // Initialize comunication
  Wire.beginTransmission(MPU);       // Start communication with MPU6050 // MPU=0x68
  Wire.write(0x6B);                  // Talk to the register 6B
  Wire.write(0x00);                  // Make reset - place a 0 into the 6B register
  Wire.endTransmission(true);        //end the transmission
  /*
  // Configure Accelerometer Sensitivity - Full Scale Range (default +/- 2g)
  Wire.beginTransmission(MPU);
  Wire.write(0x1C);                  //Talk to the ACCEL_CONFIG register (1C hex)
  Wire.write(0x10);                  //Set the register bits as 00010000 (+/- 8g full scale range)
  Wire.endTransmission(true);
  // Configure Gyro Sensitivity - Full Scale Range (default +/- 250deg/s)
  Wire.beginTransmission(MPU);
  Wire.write(0x1B);                   // Talk to the GYRO_CONFIG register (1B hex)
  Wire.write(0x10);                   // Set the register bits as 00010000 (1000deg/s full scale)
  Wire.endTransmission(true);
  delay(20);
  */
  // Call this function if you need to get the IMU error values for your module
  calculate_IMU_error();
  delay(20);
}
void loop() {
  // === Read acceleromter data === //
  Wire.beginTransmission(MPU);
  Wire.write(0x3B); // Start with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU, 6, true); // Read 6 registers total, each axis value is stored in 2 registers
  //For a range of +-2g, we need to divide the raw values by 16384, according to the datasheet
  AccX = (Wire.read() << 8 | Wire.read()) / 16384.0; // X-axis value
  AccY = (Wire.read() << 8 | Wire.read()) / 16384.0; // Y-axis value
  AccZ = (Wire.read() << 8 | Wire.read()) / 16384.0; // Z-axis value
  // Calculating Roll and Pitch from the accelerometer data
  accAngleX = (atan(AccY / sqrt(pow(AccX, 2) + pow(AccZ, 2))) * 180 / PI) - 0.58; // AccErrorX ~(0.58) See the calculate_IMU_error()custom function for more details
  accAngleY = (atan(-1 * AccX / sqrt(pow(AccY, 2) + pow(AccZ, 2))) * 180 / PI) + 1.58; // AccErrorY ~(-1.58)
  // === Read gyroscope data === //
  previousTime = currentTime;        // Previous time is stored before the actual time read
  currentTime = millis();            // Current time actual time read
  elapsedTime = (currentTime - previousTime) / 1000; // Divide by 1000 to get seconds
  Wire.beginTransmission(MPU);
  Wire.write(0x43); // Gyro data first register address 0x43
  Wire.endTransmission(false);
  Wire.requestFrom(MPU, 6, true); // Read 4 registers total, each axis value is stored in 2 registers
  GyroX = (Wire.read() << 8 | Wire.read()) / 131.0; // For a 250deg/s range we have to divide first the raw value by 131.0, according to the datasheet
  GyroY = (Wire.read() << 8 | Wire.read()) / 131.0;
  GyroZ = (Wire.read() << 8 | Wire.read()) / 131.0;
  // Correct the outputs with the calculated error values
  GyroX = GyroX + 0.56; // GyroErrorX ~(-0.56)
  GyroY = GyroY - 2; // GyroErrorY ~(2)
  GyroZ = GyroZ + 0.79; // GyroErrorZ ~ (-0.8)
  // Currently the raw values are in degrees per seconds, deg/s, so we need to multiply by sendonds (s) to get the angle in degrees
  gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg/s * s = deg
  gyroAngleY = gyroAngleY + GyroY * elapsedTime;
  yaw =  yaw + GyroZ * elapsedTime;
  // Complementary filter - combine acceleromter and gyro angle values
  roll = 0.96 * gyroAngleX + 0.04 * accAngleX;
  pitch = 0.96 * gyroAngleY + 0.04 * accAngleY;
  
  // Print the values on the serial monitor
  Serial.print(roll);
  Serial.print("/");
  Serial.print(pitch);
  Serial.print("/");
  Serial.println(yaw);
}
void calculate_IMU_error() {
  // We can call this funtion in the setup section to calculate the accelerometer and gyro data error. From here we will get the error values used in the above equations printed on the Serial Monitor.
  // Note that we should place the IMU flat in order to get the proper values, so that we then can the correct values
  // Read accelerometer values 200 times
  while (c < 200) {
    Wire.beginTransmission(MPU);
    Wire.write(0x3B);
    Wire.endTransmission(false);
    Wire.requestFrom(MPU, 6, true);
    AccX = (Wire.read() << 8 | Wire.read()) / 16384.0 ;
    AccY = (Wire.read() << 8 | Wire.read()) / 16384.0 ;
    AccZ = (Wire.read() << 8 | Wire.read()) / 16384.0 ;
    // Sum all readings
    AccErrorX = AccErrorX + ((atan((AccY) / sqrt(pow((AccX), 2) + pow((AccZ), 2))) * 180 / PI));
    AccErrorY = AccErrorY + ((atan(-1 * (AccX) / sqrt(pow((AccY), 2) + pow((AccZ), 2))) * 180 / PI));
    c++;
  }
  //Divide the sum by 200 to get the error value
  AccErrorX = AccErrorX / 200;
  AccErrorY = AccErrorY / 200;
  c = 0;
  // Read gyro values 200 times
  while (c < 200) {
    Wire.beginTransmission(MPU);
    Wire.write(0x43);
    Wire.endTransmission(false);
    Wire.requestFrom(MPU, 6, true);
    GyroX = Wire.read() << 8 | Wire.read();
    GyroY = Wire.read() << 8 | Wire.read();
    GyroZ = Wire.read() << 8 | Wire.read();
    // Sum all readings
    GyroErrorX = GyroErrorX + (GyroX / 131.0);
    GyroErrorY = GyroErrorY + (GyroY / 131.0);
    GyroErrorZ = GyroErrorZ + (GyroZ / 131.0);
    c++;
  }
  //Divide the sum by 200 to get the error value
  GyroErrorX = GyroErrorX / 200;
  GyroErrorY = GyroErrorY / 200;
  GyroErrorZ = GyroErrorZ / 200;
  // Print the error values on the Serial Monitor
  Serial.print("AccErrorX: ");
  Serial.println(AccErrorX);
  Serial.print("AccErrorY: ");
  Serial.println(AccErrorY);
  Serial.print("GyroErrorX: ");
  Serial.println(GyroErrorX);
  Serial.print("GyroErrorY: ");
  Serial.println(GyroErrorY);
  Serial.print("GyroErrorZ: ");
  Serial.println(GyroErrorZ);
}Code language: Arduino (arduino)

Deskripsi Kode: Jadi pertama-tama kita perlu menyertakan library Wire.h yang digunakan untuk komunikasi I2C dan mendefinisikan beberapa variabel yang diperlukan untuk menyimpan data.

Di bagian pengaturan, kita perlu menginisialisasi perpustakaan kabel dan mengatur ulang sensor melalui register manajemen daya. Untuk melakukan itu, kita perlu melihat lembar data sensor dari mana kita dapat melihat alamat register.

Juga, jika kita mau, kita dapat memilih Rentang Skala Penuh untuk akselerometer dan giroskop menggunakan register konfigurasinya. Untuk contoh ini, kita akan menggunakan kisaran +- 2g default untuk akselerometer dan kisaran 250 derajat/dtk untuk giroskop, jadi saya akan membiarkan bagian kode ini dikomentari.

// Configure Accelerometer Sensitivity - Full Scale Range (default +/- 2g)
  Wire.beginTransmission(MPU);
  Wire.write(0x1C);                  //Talk to the ACCEL_CONFIG register (1C hex)
  Wire.write(0x10);                  //Set the register bits as 00010000 (+/- 8g full scale range)
  Wire.endTransmission(true);
  // Configure Gyro Sensitivity - Full Scale Range (default +/- 250deg/s)
  Wire.beginTransmission(MPU);
  Wire.write(0x1B);                   // Talk to the GYRO_CONFIG register (1B hex)
  Wire.write(0x10);                   // Set the register bits as 00010000 (1000deg/s full scale)
  Wire.endTransmission(true);
  */Code language: Arduino (arduino)

Di bagian loop kita mulai dengan membaca data accelerometer. Data untuk setiap sumbu disimpan dalam dua byte atau register dan kita dapat melihat alamat register ini dari lembar data sensor.

Untuk membaca semuanya, kita mulai dengan register pertama, dan menggunakan fungsi requiestFrom() kita meminta untuk membaca semua 6 register untuk sumbu X, Y dan Z. Kemudian kita membaca data dari masing-masing register, dan karena outputnya adalah komplemen dua, kita menggabungkannya dengan tepat untuk mendapatkan nilai yang benar.

// === Read acceleromter data === //
  Wire.beginTransmission(MPU);
  Wire.write(0x3B); // Start with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU, 6, true); // Read 6 registers total, each axis value is stored in 2 registers
  //For a range of +-2g, we need to divide the raw values by 16384, according to the datasheet
  AccX = (Wire.read() << 8 | Wire.read()) / 16384.0; // X-axis value
  AccY = (Wire.read() << 8 | Wire.read()) / 16384.0; // Y-axis value
  AccZ = (Wire.read() << 8 | Wire.read()) / 16384.0; // Z-axis valueCode language: Arduino (arduino)

Untuk mendapatkan nilai keluaran dari -1g hingga +1g, cocok untuk menghitung sudut, kami membagi keluaran dengan sensitivitas yang dipilih sebelumnya.

Terakhir, dengan menggunakan dua rumus ini, kami menghitung sudut roll dan pitch dari data akselerometer.

// Calculating Roll and Pitch from the accelerometer data
  accAngleX = (atan(AccY / sqrt(pow(AccX, 2) + pow(AccZ, 2))) * 180 / PI) - 0.58; // AccErrorX ~(0.58) See the calculate_IMU_error()custom function for more details
  accAngleY = (atan(-1 * AccX / sqrt(pow(AccY, 2) + pow(AccZ, 2))) * 180 / PI) + 1.58; // AccErrorY ~(-1.58)Code language: Arduino (arduino)

Selanjutnya, dengan menggunakan metode yang sama kita mendapatkan data giroskop.

Kami membaca enam register giroskop, menggabungkan datanya dengan tepat dan membaginya dengan sensitivitas yang dipilih sebelumnya untuk mendapatkan output dalam derajat per detik.

// === Read gyroscope data === //
  previousTime = currentTime;        // Previous time is stored before the actual time read
  currentTime = millis();            // Current time actual time read
  elapsedTime = (currentTime - previousTime) / 1000; // Divide by 1000 to get seconds
  Wire.beginTransmission(MPU);
  Wire.write(0x43); // Gyro data first register address 0x43
  Wire.endTransmission(false);
  Wire.requestFrom(MPU, 6, true); // Read 4 registers total, each axis value is stored in 2 registers
  GyroX = (Wire.read() << 8 | Wire.read()) / 131.0; // For a 250deg/s range we have to divide first the raw value by 131.0, according to the datasheet
  GyroY = (Wire.read() << 8 | Wire.read()) / 131.0;
  GyroZ = (Wire.read() << 8 | Wire.read()) / 131.0;Code language: Arduino (arduino)

Di sini Anda dapat melihat bahwa saya mengoreksi nilai output dengan beberapa nilai kesalahan kecil yang dihitung, yang akan saya jelaskan bagaimana kita mendapatkannya dalam satu menit. Jadi karena outputnya dalam derajat per detik, sekarang kita perlu mengalikannya dengan waktu untuk mendapatkan derajat yang adil. Nilai waktu ditangkap sebelum setiap iterasi pembacaan menggunakan fungsi millis().

// Correct the outputs with the calculated error values
  GyroX = GyroX + 0.56; // GyroErrorX ~(-0.56)
  GyroY = GyroY - 2; // GyroErrorY ~(2)
  GyroZ = GyroZ + 0.79; // GyroErrorZ ~ (-0.8)
  // Currently the raw values are in degrees per seconds, deg/s, so we need to multiply by sendonds (s) to get the angle in degrees
  gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg/s * s = deg
  gyroAngleY = gyroAngleY + GyroY * elapsedTime;
  yaw =  yaw + GyroZ * elapsedTime;Code language: Arduino (arduino)

Terakhir, kami menggabungkan data akselerometer dan giroskop menggunakan filter pelengkap. Di sini, kami mengambil 96% dari data giroskop karena sangat akurat dan tidak terpengaruh oleh gaya eksternal. Sisi bawah giroskop adalah bahwa ia melayang, atau memperkenalkan kesalahan dalam output seiring berjalannya waktu. Oleh karena itu, dalam jangka panjang, kami menggunakan data dari akselerometer, dalam hal ini 4%, cukup untuk menghilangkan kesalahan drift giroskop.

// Complementary filter - combine acceleromter and gyro angle values
  roll = 0.96 * gyroAngleX + 0.04 * accAngleX;
  pitch = 0.96 * gyroAngleY + 0.04 * accAngleY;Code language: Arduino (arduino)

Namun, karena kami tidak dapat menghitung Yaw dari data akselerometer, kami tidak dapat menerapkan filter pelengkap pada data tersebut.

Sebelum kita melihat hasilnya, izinkan saya menjelaskan dengan cepat cara mendapatkan nilai koreksi kesalahan. Untuk menghitung kesalahan ini, kita dapat memanggil fungsi kustom calate_IMU_error() saat sensor dalam posisi diam. Di sini kami melakukan 200 pembacaan untuk semua keluaran, kami menjumlahkannya dan membaginya dengan 200. Saat kami menahan sensor dalam posisi diam, nilai keluaran yang diharapkan harus 0. Jadi, dengan perhitungan ini kami bisa mendapatkan kesalahan rata-rata sensor membuat.

void calculate_IMU_error() {
  // We can call this funtion in the setup section to calculate the accelerometer and gyro data error. From here we will get the error values used in the above equations printed on the Serial Monitor.
  // Note that we should place the IMU flat in order to get the proper values, so that we then can the correct values
  // Read accelerometer values 200 times
  while (c < 200) {
    Wire.beginTransmission(MPU);
    Wire.write(0x3B);
    Wire.endTransmission(false);
    Wire.requestFrom(MPU, 6, true);
    AccX = (Wire.read() << 8 | Wire.read()) / 16384.0 ;
    AccY = (Wire.read() << 8 | Wire.read()) / 16384.0 ;
    AccZ = (Wire.read() << 8 | Wire.read()) / 16384.0 ;
    // Sum all readings
    AccErrorX = AccErrorX + ((atan((AccY) / sqrt(pow((AccX), 2) + pow((AccZ), 2))) * 180 / PI));
    AccErrorY = AccErrorY + ((atan(-1 * (AccX) / sqrt(pow((AccY), 2) + pow((AccZ), 2))) * 180 / PI));
    c++;
  }
  //Divide the sum by 200 to get the error value
  AccErrorX = AccErrorX / 200;
  AccErrorY = AccErrorY / 200;
  c = 0;
  // Read gyro values 200 times
  while (c < 200) {
    Wire.beginTransmission(MPU);
    Wire.write(0x43);
    Wire.endTransmission(false);
    Wire.requestFrom(MPU, 6, true);
    GyroX = Wire.read() << 8 | Wire.read();
    GyroY = Wire.read() << 8 | Wire.read();
    GyroZ = Wire.read() << 8 | Wire.read();
    // Sum all readings
    GyroErrorX = GyroErrorX + (GyroX / 131.0);
    GyroErrorY = GyroErrorY + (GyroY / 131.0);
    GyroErrorZ = GyroErrorZ + (GyroZ / 131.0);
    c++;
  }
  //Divide the sum by 200 to get the error value
  GyroErrorX = GyroErrorX / 200;
  GyroErrorY = GyroErrorY / 200;
  GyroErrorZ = GyroErrorZ / 200;
  // Print the error values on the Serial Monitor
  Serial.print("AccErrorX: ");
  Serial.println(AccErrorX);
  Serial.print("AccErrorY: ");
  Serial.println(AccErrorY);
  Serial.print("GyroErrorX: ");
  Serial.println(GyroErrorX);
  Serial.print("GyroErrorY: ");
  Serial.println(GyroErrorY);
  Serial.print("GyroErrorZ: ");
  Serial.println(GyroErrorZ);
}Code language: Arduino (arduino)

Kami hanya mencetak nilai pada monitor serial dan setelah kami mengetahuinya, kami dapat menerapkannya dalam kode seperti yang ditunjukkan sebelumnya, baik untuk perhitungan roll dan pitch, serta untuk 3 output giroskop.

Terakhir, dengan menggunakan fungsi Serial.print kita dapat mencetak nilai Roll, Pitch dan Yaw pada serial monitor dan melihat apakah sensor bekerja dengan baik.

Pelacakan Orientasi MPU6050 – Visualisasi 3D

Selanjutnya, untuk membuat contoh visualisasi 3D, kita hanya perlu menerima data yang dikirim Arduino melalui port serial di lingkungan pengembangan Pemrosesan. Berikut kode Processing lengkapnya:

/*
    Arduino and MPU6050 IMU - 3D Visualization Example 
     by Dejan, https://howtomechatronics.com
*/
import processing.serial.*;
import java.awt.event.KeyEvent;
import java.io.IOException;
Serial myPort;
String data="";
float roll, pitch,yaw;
void setup() {
  size (2560, 1440, P3D);
  myPort = new Serial(this, "COM7", 19200); // starts the serial communication
  myPort.bufferUntil('\n');
}
void draw() {
  translate(width/2, height/2, 0);
  background(233);
  textSize(22);
  text("Roll: " + int(roll) + "     Pitch: " + int(pitch), -100, 265);
  // Rotate the object
  rotateX(radians(-pitch));
  rotateZ(radians(roll));
  rotateY(radians(yaw));
  
  // 3D 0bject
  textSize(30);  
  fill(0, 76, 153);
  box (386, 40, 200); // Draw box
  textSize(25);
  fill(255, 255, 255);
  text("www.HowToMechatronics.com", -183, 10, 101);
  //delay(10);
  //println("ypr:\t" + angleX + "\t" + angleY); // Print the values to check whether we are getting proper values
}
// Read data from the Serial Port
void serialEvent (Serial myPort) { 
  // reads the data from the Serial Port up to the character '.' and puts it into the String variable "data".
  data = myPort.readStringUntil('\n');
  // if you got any bytes other than the linefeed:
  if (data != null) {
    data = trim(data);
    // split the string at "/"
    String items[] = split(data, '/');
    if (items.length > 1) {
      //--- Roll,Pitch in degrees
      roll = float(items[0]);
      pitch = float(items[1]);
      yaw = float(items[2]);
    }
  }
}Code language: Arduino (arduino)

Di sini kita membaca data yang masuk dari Arduino dan memasukkannya ke dalam variabel Roll, Pitch dan Yaw yang sesuai. Dalam loop gambar utama, kami menggunakan nilai-nilai ini untuk memutar objek 3D, dalam hal ini adalah kotak sederhana dengan warna dan teks tertentu di atasnya.

Jika kita menjalankan sketsa, kita dapat melihat seberapa baik sensor MPU6050 untuk orientasi pelacakan. Objek 3D melacak orientasi sensor dengan cukup akurat dan juga sangat responsif.

Seperti yang saya sebutkan, satu-satunya sisi negatifnya adalah Yaw akan melayang seiring waktu karena kita tidak dapat menggunakan filter pelengkap untuk itu. Untuk meningkatkan ini kita perlu menggunakan sensor tambahan. Itu biasanya magnetometer yang dapat digunakan sebagai koreksi jangka panjang untuk penyimpangan Yaw giroskop. Namun, MPU6050 sebenarnya memiliki fitur yang disebut Digital Motion Processor yang digunakan untuk penghitungan data onboard dan mampu menghilangkan penyimpangan Yaw.

Berikut adalah contoh 3D yang sama dengan Digital Motion Processor yang digunakan. Kita dapat melihat seberapa akurat pelacakan orientasi sekarang, tanpa penyimpangan Yaw. Prosesor onboard juga dapat menghitung dan mengeluarkan Quaternions yang digunakan untuk mewakili orientasi dan rotasi objek dalam tiga dimensi. Dalam contoh ini kita sebenarnya menggunakan quaternions untuk merepresentasikan orientasi yang juga tidak mengalami Gimbal lock yang terjadi saat menggunakan sudut Euler.

Namun demikian, mendapatkan data ini dari sensor sedikit lebih rumit daripada yang kami jelaskan sebelumnya. Pertama-tama, kita perlu menghubungkan dan menambahkan kabel ke pin digital Arduino. Itu adalah pin interupsi yang digunakan untuk membaca tipe data ini dari MPU6050.

Kodenya juga sedikit lebih rumit jadi itu sebabnya kami akan menggunakan perpustakaan i2cdevlib oleh Jeff Rowberg. Pustaka ini dapat diunduh dari GitHub dan saya akan menyertakan tautan ke dalam artikel situs web.

Setelah kami menginstal perpustakaan, kami dapat membuka contoh MPU6050_DMP6 dari perpustakaan. Contoh ini dijelaskan dengan baik dengan komentar untuk setiap baris.

Di sini kita dapat memilih output seperti apa yang kita inginkan, quaternions, Euler angle, yaw, pitch and roll, nilai akselerasi atau quaternions untuk visualisasi 3D. Pustaka ini juga menyertakan sketsa Pemrosesan untuk contoh visualisasi 3D. Saya hanya memodifikasinya untuk mendapatkan bentuk kotak seperti pada contoh sebelumnya. Berikut adalah kode Pemrosesan visualisasi 3D yang berfungsi dengan contoh MPU6050_DPM6, untuk keluaran “OUTPUT_TEAPOT” yang dipilih:

/*
    Arduino and MPU6050 IMU - 3D Visualization Example 
     by Dejan, https://howtomechatronics.com
*/
import processing.serial.*;
import java.awt.event.KeyEvent;
import java.io.IOException;
Serial myPort;
String data="";
float roll, pitch,yaw;
void setup() {
  size (2560, 1440, P3D);
  myPort = new Serial(this, "COM7", 19200); // starts the serial communication
  myPort.bufferUntil('\n');
}
void draw() {
  translate(width/2, height/2, 0);
  background(233);
  textSize(22);
  text("Roll: " + int(roll) + "     Pitch: " + int(pitch), -100, 265);
  // Rotate the object
  rotateX(radians(-pitch));
  rotateZ(radians(roll));
  rotateY(radians(yaw));
  
  // 3D 0bject
  textSize(30);  
  fill(0, 76, 153);
  box (386, 40, 200); // Draw box
  textSize(25);
  fill(255, 255, 255);
  text("www.HowToMechatronics.com", -183, 10, 101);
  //delay(10);
  //println("ypr:\t" + angleX + "\t" + angleY); // Print the values to check whether we are getting proper values
}
// Read data from the Serial Port
void serialEvent (Serial myPort) { 
  // reads the data from the Serial Port up to the character '.' and puts it into the String variable "data".
  data = myPort.readStringUntil('\n');
  // if you got any bytes other than the linefeed:
  if (data != null) {
    data = trim(data);
    // split the string at "/"
    String items[] = split(data, '/');
    if (items.length > 1) {
      //--- Roll,Pitch in degrees
      roll = float(items[0]);
      pitch = float(items[1]);
      yaw = float(items[2]);
    }
  }
}Code language: Arduino (arduino)

Jadi di sini menggunakan fungsi serialEvent() kami menerima angka empat yang berasal dari Arduino, dan di loop gambar utama kami menggunakannya untuk memutar objek 3D. Jika kita menjalankan sketsa, kita dapat melihat seberapa bagus quaternions untuk memutar objek dalam tiga dimensi.

Agar tutorial ini tidak membebani, saya menempatkan contoh kedua, platform DIY Arduino Gimbal atau Self-Stabilizing,  pada artikel terpisah.

Jangan ragu untuk mengajukan pertanyaan terkait tutorial ini di bagian komentar di bawah dan juga jangan lupa untuk memeriksa koleksi Proyek Arduino saya.


Proses manufaktur

  1. Tutorial Kunci RFID Arduino
  2. Animasi dan Permainan LCD
  3. Mengontrol Motor Servo dengan Arduino dan MPU6050
  4. Python3 dan Komunikasi Arduino
  5. Radio FM Menggunakan Arduino dan RDA8057M
  6. Konversi Akselerasi Ke Sudut Dari Sensor MPU6050 I2C
  7. Tutorial Sensor Sidik Jari Arduino
  8. Tutorial Arduino :Piano Mini
  9. Raspberry Pi dan Laptop Arduino
  10. Tutorial Arduino 01:Memulai