Menguasai MPU6050: Tutorial Akselerometer & Giros untuk Arduino
Dalam tutorial ini kita akan mempelajari cara menggunakan sensor Akselerometer dan Giros MPU6050 dengan Arduino. Pertama, saya akan menjelaskan cara kerja MPU6050 dan cara membaca datanya, dan kemudian kita akan membuat dua contoh praktis.
Anda dapat menonton video berikut atau membaca tutorial tulisan di bawahnya.
Tinjauan Umum
Dalam contoh pertama, menggunakan lingkungan pengembangan Processing, kita akan membuat visualisasi 3D dari orientasi sensor, dan dalam contoh kedua kita akan membuat platform stabilisasi sendiri sederhana atau Gimbal DIY. Berdasarkan orientasi MPU6050 dan data terfusi akselerometer dan giro, kita mengontrol tiga servo yang menjaga platform tetap level.
Cara Kerja
IMU MPU6050 memiliki akselerometer 3-sumbu dan giro 3-sumbu yang terintegrasi pada satu chip.
Giro mengukur kecepatan rotasi atau laju perubahan posisi sudut seiring waktu, sepanjang sumbu X, Y dan Z. Ini menggunakan teknologi MEMS dan Efek Coriolis untuk pengukuran, tetapi untuk detail lebih lanjut Anda dapat memeriksa tutorial khusus saya Bagaimana Sensor MEMS Bekerja. Output giro adalah dalam derajat per detik, jadi untuk mendapatkan posisi sudut kita hanya perlu mengintegrasikan kecepatan sudut.
Di sisi lain, akselerometer MPU6050 mengukur percepatan dengan cara yang sama seperti yang dijelaskan dalam video sebelumnya untuk sensor akselerometer ADXL345. Singkatnya, ia dapat mengukur percepatan gravitasi 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 giro kita dapat mendapatkan informasi yang sangat akurat tentang orientasi sensor.
IMU MPU6050 juga disebut perangkat pelacakan gerakan enam-sumbu atau perangkat 6 DoF (enam Derajat Kebebasan), karena 6 outputnya, atau 3 output akselerometer dan 3 output giro.
Arduino dan MPU6050
Mari kita lihat bagaimana kita dapat terhubung dan membaca data dari sensor MPU6050 menggunakan Arduino. Kita menggunakan protokol I2C untuk komunikasi dengan Arduino jadi kita hanya perlu dua kabel untuk menghubungkannya, ditambah dua kabel untuk daya.
Anda dapat mendapatkan komponen yang dibutuhkan untuk tutorial Arduino ini dari tautan di bawah ini:
Berikut adalah 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 kita perlu menyertakan library Wire.h yang digunakan untuk komunikasi I2C dan menentukan beberapa variabel yang diperlukan untuk menyimpan data.
Pada bagian setup, kita perlu menginisialisasi library wire dan mereset sensor melalui register manajemen daya. Untuk melakukannya kita perlu melihat datasheet sensor dari mana kita dapat melihat alamat register.
Juga, jika kita ingin, kita dapat memilih Rentang Skala Penuh untuk akselerometer dan giro menggunakan register konfigurasi mereka. Untuk contoh ini, kita akan menggunakan rentang default +- 2g untuk akselerometer dan 250 derajat/s untuk giro, 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)
Pada bagian loop kita mulai dengan membaca data akselerometer. Data untuk setiap sumbu disimpan dalam dua byte atau register dan kita dapat melihat alamat register ini dari datasheet sensor.
Untuk membacanya semua, 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 setiap register, dan karena outputnya adalah komplement 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 output nilai dari -1g hingga +1g, yang cocok untuk menghitung sudut, kita membagi output dengan sensitivitas yang sebelumnya dipilih.
Terakhir, menggunakan dua rumus ini, kita 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, menggunakan metode yang sama kita mendapatkan data giro.
Kita membaca enam register giro, menggabungkan datanya dengan tepat dan membaginya dengan sensitivitas yang sebelumnya dipilih 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 memperhatikan bahwa saya memperbaiki nilai output dengan beberapa nilai error yang telah dihitung, yang akan saya jelaskan bagaimana kita mendapatkannya dalam sebentar. Jadi karena outputnya adalah dalam derajat per detik, sekarang kita perlu mengalikan mereka dengan waktu untuk hanya mendapatkan derajat. 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, kita menggabungkan data akselerometer dan giro menggunakan filter komplementer. Di sini, kita mengambil 96% data giro karena sangat akurat dan tidak menderita gaya eksternal. Sisi negatif giro adalah ia men-drift, atau memperkenalkan kesalahan dalam output seiring waktu. Oleh karena itu, pada jangka panjang, kita menggunakan data dari akselerometer, 4% dalam kasus ini, cukup untuk menghilangkan kesalahan drift giro.
Namun, karena kita tidak dapat menghitung Yaw dari data akselerometer, kita tidak dapat menerapkan filter komplementer padanya.
Sebelum kita melihat hasilnya, biarkan saya segera menjelaskan cara mendapatkan nilai koreksi error. Untuk menghitung error ini kita dapat memanggil fungsi khusus calculate_IMU_error() sementara sensor dalam posisi datar dan diam. Di sini kita melakukan 200 pembacaan untuk semua output, kita menjumlahkannya dan membaginya dengan 200. Karena kita memegang sensor dalam posisi datar dan diam, nilai output yang diharapkan harus 0. Jadi, dengan perhitungan ini kita dapat mendapatkan rata-rata error yang dibuat sensor.
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)
Kita hanya mencetak nilai pada serial monitor dan setelah kita mengetahuinya, kita dapat mengimplementasikannya dalam kode seperti yang ditunjukkan sebelumnya, baik untuk perhitungan roll dan pitch, maupun untuk 3 output giro.
Terakhir, 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 Processing. Berikut adalah kode Processing lengkap:
/* 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 masuk dari Arduino dan memasukkannya ke dalam variabel Roll, Pitch dan Yaw yang sesuai. Dalam loop draw utama, kita menggunakan nilai-nilai ini untuk memutar objek 3D, dalam hal ini itu adalah kotak sederhana dengan warna tertentu dan teks di atasnya.
Jika kita menjalankan sketsa ini, kita dapat melihat seberapa baik sensor MPU6050 untuk pelacakan orientasi. Objek 3D melacak orientasi sensor dengan cukup akurat dan juga sangat responsif.
Seperti yang saya sebutkan, satu sisi negatifnya adalah Yaw akan drift seiring waktu karena kita tidak dapat menggunakan filter komplementer untuk itu. Untuk memperbaiki ini kita perlu menggunakan sensor tambahan. Itu biasanya magnetometer yang dapat digunakan sebagai koreksi jangka panjang untuk drift Yaw giro. Namun, MPU6050 sebenarnya memiliki fitur yang disebut Digital Motion Processor yang digunakan untuk perhitungan data di papan dan mampu menghilangkan drift Yaw.
Berikut adalah contoh 3D yang sama dengan penggunaan Digital Motion Processor. Kita dapat melihat seberapa akurat pelacakan orientasi sekarang, tanpa drift Yaw. Prosesor di papan 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 mewakili orientasi yang juga tidak menderita Gimbal lock yang terjadi saat menggunakan sudut Euler.
Namun, mendapatkan data ini dari sensor sedikit lebih rumit daripada yang telah kami jelaskan sebelumnya. Pertama-tama, kita perlu menghubungkan kabel tambahan ke pin digital Arduino. Itu adalah pin interupsi yang digunakan untuk membaca tipe data ini dari MPU6050.
Kodenya juga sedikit lebih rumit jadi itulah sebabnya kita akan menggunakan library i2cdevlib oleh Jeff Rowberg. Library ini dapat diunduh dari GitHub dan saya akan menyertakan tautan ke dalamnya di artikel website.
Setelah kita menginstal library, kita dapat membuka contoh MPU6050_DMP6 dari library. Contoh ini dijelaskan dengan baik dengan komentar untuk setiap baris.
Di sini kita dapat memilih jenis output yang kita inginkan, quaternions, sudut Euler, yaw, pitch dan roll, nilai percepatan atau quaternions untuk visualisasi 3D. Library ini juga menyertakan sketsa Processing untuk contoh visualisasi 3D. Saya hanya memodifikasinya untuk mendapatkan bentuk kotak seperti dalam contoh sebelumnya. Berikut adalah kode Processing visualisasi 3D yang bekerja dengan contoh MPU6050_DPM6, untuk output yang dipilih "OUTPUT_TEAPOT":
/* 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() kita menerima quaternions yang datang dari Arduino, dan dalam loop draw utama kita menggunakannya untuk memutar objek 3D. Jika kita menjalankan sketsa ini, kita dapat melihat seberapa baik quaternions untuk memutar objek dalam tiga dimensi.
Agar tidak memberatkan tutorial ini, saya menempatkan contoh kedua, Gimbal Arduino DIY atau Platform Stabilisasi Sendiri, pada artikel terpisah.
Jangan ragu untuk bertanya apa pun terkait tutorial ini di bagian komentar di bawah dan jangan lupa untuk memeriksa koleksi Proyek Arduino saya.