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

Cara Melacak Orientasi dengan Akselerometer Arduino dan ADXL345

Dalam tutorial ini kita akan belajar bagaimana mengukur sudut dan orientasi track menggunakan sensor Arduino dan Accelerometer ADXL345. Anda dapat menonton video berikut atau membaca tutorial tertulis di bawah ini untuk lebih jelasnya.

Ringkasan

Pertama, saya akan menjelaskan cara kerja sensor dan cara membaca data darinya, lalu menggunakan lingkungan pengembangan Processing, kita akan membuat visualisasi 3D dari orientasi akselerometer.

Cara Kerja Akselerometer ADXL345

Untuk memulainya, mari kita lihat cara kerja sensor ADXL345. Ini adalah akselerometer 3-sumbu yang dapat mengukur gaya akselerasi statis dan dinamis. Gaya gravitasi bumi merupakan contoh khas gaya statis, sedangkan gaya dinamis dapat disebabkan oleh getaran, gerakan, dan sebagainya.

Satuan besaran percepatan adalah meter per sekon kuadrat (m/s^2). Namun, sensor akselerometer biasanya menyatakan pengukuran dalam "g" atau gravitasi. Satu “g” adalah nilai gaya gravitasi bumi yang setara dengan 9,8 meter per detik kuadrat.

Jadi, jika kita memiliki akselerometer yang diposisikan datar, dengan sumbu Z mengarah ke atas, berlawanan dengan gaya gravitasi, output sumbu Z dari sensor akan menjadi 1g. Di sisi lain, keluaran X dan Y akan menjadi nol, karena gaya gravitasi tegak lurus terhadap sumbu-sumbu ini dan tidak mempengaruhinya sama sekali.

Jika kita membalikkan sensor, maka output sumbu Z akan menjadi -1 g. Ini berarti bahwa keluaran sensor karena orientasinya terhadap gravitasi dapat bervariasi dari -1g hingga +1g.

Jadi menurut data ini dan menggunakan beberapa matematika trigonometri, kita dapat menghitung sudut di mana sensor diposisikan.

Cara Membaca Data Akselerometer ADXL345 dengan Arduino

Ok, sekarang mari kita lihat bagaimana kita bisa membaca data accelerometer ADXL345 menggunakan Arduino. Sensor ini menggunakan protokol I2C untuk komunikasi dengan Arduino sehingga kita hanya membutuhkan dua kabel untuk menghubungkannya, ditambah dua kabel untuk menyalakannya.

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

  • Akselerometer ADXL345 ………………. Amazon / Bagus / AliExpress
  • Dewan Arduino …………………………….. 
  • Breadboard dan Kabel Lompat ………… 

Kode Arduino Akselerometer ADXL345

Berikut kode Arduino untuk membaca data akselerometer ADXL345.

/*
    Arduino and ADXL345 Accelerometer Tutorial
     by Dejan, https://howtomechatronics.com
*/

#include <Wire.h>  // Wire library - used for I2C communication

int ADXL345 = 0x53; // The ADXL345 sensor I2C address

float X_out, Y_out, Z_out;  // Outputs

void setup() {
  Serial.begin(9600); // Initiate serial communication for printing the results on the Serial monitor
  Wire.begin(); // Initiate the Wire library
  // Set ADXL345 in measuring mode
  Wire.beginTransmission(ADXL345); // Start communicating with the device 
  Wire.write(0x2D); // Access/ talk to POWER_CTL Register - 0x2D
  // Enable measurement
  Wire.write(8); // (8dec -> 0000 1000 binary) Bit D3 High for measuring enable 
  Wire.endTransmission();
  delay(10);
}

void loop() {
  // === Read acceleromter data === //
  Wire.beginTransmission(ADXL345);
  Wire.write(0x32); // Start with register 0x32 (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(ADXL345, 6, true); // Read 6 registers total, each axis value is stored in 2 registers
  X_out = ( Wire.read()| Wire.read() << 8); // X-axis value
  X_out = X_out/256; //For a range of +-2g, we need to divide the raw values by 256, according to the datasheet
  Y_out = ( Wire.read()| Wire.read() << 8); // Y-axis value
  Y_out = Y_out/256;
  Z_out = ( Wire.read()| Wire.read() << 8); // Z-axis value
  Z_out = Z_out/256;

  Serial.print("Xa= ");
  Serial.print(X_out);
  Serial.print("   Ya= ");
  Serial.print(Y_out);
  Serial.print("   Za= ");
  Serial.println(Z_out);
}Code language: Arduino (arduino)

Deskripsi: Jadi pertama-tama kita perlu menyertakan library Wire.h yang digunakan untuk komunikasi I2C. Jika Anda ingin mempelajari lebih lanjut tentang cara kerja komunikasi I2C dan cara menggunakannya dengan Arduino, Anda dapat melihat tutorial terperinci saya yang lain untuk itu.

Setiap perangkat yang menggunakan komunikasi I2C memiliki alamat I2C yang unik, dan alamat ini dapat ditemukan di lembar data sensor (Lembar Data ADXL345). Jadi, setelah kita menentukan alamat dan variabel untuk tiga keluaran, di bagian penyiapan, pertama-tama, kita perlu menginisialisasi pustaka kabel dan kemudian mengatur akselerometer dalam mode pengukuran. Untuk melakukan itu, jika kita melihat datasheet lagi, kita dapat melihat bahwa kita perlu mengatur bit D3 dari register POWER_CTL HIGH.

Jadi, dengan menggunakan fungsi beginTransmission() kita memulai komunikasi, kemudian menggunakan fungsi write() kita memberi tahu register mana yang ingin kita akses, dan sekali lagi menggunakan fungsi write() kita mengatur bit D3 HIGH, dengan menulis angka 8 di desimal yang sesuai dengan pengaturan bit D3 TINGGI.

// Set ADXL345 in measuring mode
  Wire.beginTransmission(ADXL345); // Start communicating with the device 
  Wire.write(0x2D); // Access/ talk to POWER_CTL Register - 0x2D
  // Enable measurement
  Wire.write(8); // (8dec -> 0000 1000 binary) Bit D3 High for measuring enable 
  Wire.endTransmission();Code language: Arduino (arduino)

Di bagian loop sekarang kita membaca data dari sensor. Data untuk setiap sumbu disimpan dalam dua byte atau register. Kita bisa melihat alamat register-register ini dari datasheet.

Untuk membaca semuanya, kita mulai dengan register pertama, dan menggunakan fungsi requestionFrom() kita meminta untuk membaca 6 register. Kemudian dengan menggunakan fungsi read(), kita membaca data dari setiap register, dan karena outputnya adalah komplemen dua, kita menggabungkannya dengan tepat untuk mendapatkan nilai yang benar.

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

Nilai keluaran dari sensor sebenarnya bergantung pada sensitivitas yang dipilih, yang dapat bervariasi dari +- 2g hingga +-16g. Sensitivitas default adalah +-2g jadi itu sebabnya kita perlu membagi output dengan 256 untuk mendapatkan nilai dari -1 hingga +1g. 256 LSB/g berarti kita memiliki 256 hitungan per g.

Tergantung pada aplikasinya, kita dapat memilih sensitivitas yang sesuai. Dalam hal ini, untuk orientasi pelacakan, sensitivitas +-2g baik-baik saja, tetapi untuk aplikasi di mana kita perlu merasakan gaya akselerasi yang lebih tinggi dari seperti gerakan tiba-tiba, guncangan, dan sebagainya, kita dapat memilih beberapa rentang sensitivitas lain menggunakan register DATA_FORMAT dan bit D1 dan D0-nya.

Kalibrasi Akselerometer ADXL345

Namun demikian, begitu kita membaca datanya, kita bisa langsung mencetaknya di serial monitor untuk memeriksa apakah nilainya sudah sesuai dengan yang diharapkan. Dalam kasus saya, nilai yang saya dapatkan tidak persis seperti yang seharusnya, terutama sumbu Z yang memiliki kesalahan nyata sebesar 0,1g.

Untuk mengatasi masalah ini, kita perlu mengkalibrasi akselerometer menggunakan 3 register kalibrasi offset, dan inilah cara kita melakukannya. Jadi, kita perlu memposisikan sensor datar, dan mencetak nilai RAW tanpa membaginya dengan 256.

Dari sini sekarang kita dapat melihat berapa banyak output yang mati, dalam kasus saya, output Z sekitar 283. Itu perbedaan 27 positif. Sekarang kita perlu membagi nilai ini dengan 4, dan itu akan memberikan penggunaan nomor yang kita perlukan untuk menulis ke register offset sumbu-Z. Jika kita mengupload kode sekarang, output sumbu Z akan persis 256, atau 1g sebagaimana mestinya.

// This code goes in the SETUP section
// Off-set Calibration
  //X-axis
  Wire.beginTransmission(ADXL345);
  Wire.write(0x1E);  // X-axis offset register
  Wire.write(1);
  Wire.endTransmission();
  delay(10);
  //Y-axis
  Wire.beginTransmission(ADXL345);
  Wire.write(0x1F); // Y-axis offset register
  Wire.write(-2);
  Wire.endTransmission();
  delay(10);
  
  //Z-axis
  Wire.beginTransmission(ADXL345);
  Wire.write(0x20); // Z-axis offset register
  Wire.write(-7);
  Wire.endTransmission();
  delay(10);Code language: Arduino (arduino)

Jika diperlukan kita harus mengkalibrasi sumbu lainnya menggunakan metode yang sama. Dan hanya catatan singkat bahwa kalibrasi ini tidak ditulis secara permanen ke register. Kita perlu menulis nilai-nilai ini ke register di setiap power up sensor.

Setelah selesai dengan kalibrasi, sekarang kita akhirnya dapat menghitung Roll and Pitch, atau rotasi di sekitar sumbu X dan rotasi di sekitar sumbu Y dalam derajat, menggunakan dua rumus ini.

// Calculate Roll and Pitch (rotation around X-axis, rotation around Y-axis)
  roll = atan(Y_out / sqrt(pow(X_out, 2) + pow(Z_out, 2))) * 180 / PI;
  pitch = atan(-1 * X_out / sqrt(pow(Y_out, 2) + pow(Z_out, 2))) * 180 / PI;Code language: Arduino (arduino)

Untuk detail lebih lanjut cara kerja formula ini, Anda dapat memeriksa catatan aplikasi Semikonduktor Skala Bebas ini.

Pelacakan Orientasi Akselerometer Arduino dan ADXL345 – Visualisasi 3D

Oke, sekarang mari kita buat contoh visualisasi 3D akselerometer.

Jadi, kami menggunakan kode yang sama, yang mengirimkan nilai Roll dan Pitch melalui port serial. Berikut kode lengkap Arduino:

/*
    Arduino and ADXL345 Accelerometer - 3D Visualization Example 
     by Dejan, https://howtomechatronics.com
*/
#include <Wire.h>  // Wire library - used for I2C communication

int ADXL345 = 0x53; // The ADXL345 sensor I2C address

float X_out, Y_out, Z_out;  // Outputs
float roll,pitch,rollF,pitchF=0;

void setup() {
  Serial.begin(9600); // Initiate serial communication for printing the results on the Serial monitor
 
  Wire.begin(); // Initiate the Wire library
  // Set ADXL345 in measuring mode
  Wire.beginTransmission(ADXL345); // Start communicating with the device
  Wire.write(0x2D); // Access/ talk to POWER_CTL Register - 0x2D
  // Enable measurement
  Wire.write(8); // Bit D3 High for measuring enable (8dec -> 0000 1000 binary)
  Wire.endTransmission();
  delay(10);

  //Off-set Calibration
  //X-axis
  Wire.beginTransmission(ADXL345);
  Wire.write(0x1E);
  Wire.write(1);
  Wire.endTransmission();
  delay(10);
  //Y-axis
  Wire.beginTransmission(ADXL345);
  Wire.write(0x1F);
  Wire.write(-2);
  Wire.endTransmission();
  delay(10);

  //Z-axis
  Wire.beginTransmission(ADXL345);
  Wire.write(0x20);
  Wire.write(-9);
  Wire.endTransmission();
  delay(10);
}

void loop() {
  // === Read acceleromter data === //
  Wire.beginTransmission(ADXL345);
  Wire.write(0x32); // Start with register 0x32 (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(ADXL345, 6, true); // Read 6 registers total, each axis value is stored in 2 registers
  X_out = ( Wire.read() | Wire.read() << 8); // X-axis value
  X_out = X_out / 256; //For a range of +-2g, we need to divide the raw values by 256, according to the datasheet
  Y_out = ( Wire.read() | Wire.read() << 8); // Y-axis value
  Y_out = Y_out / 256;
  Z_out = ( Wire.read() | Wire.read() << 8); // Z-axis value
  Z_out = Z_out / 256;

  // Calculate Roll and Pitch (rotation around X-axis, rotation around Y-axis)
  roll = atan(Y_out / sqrt(pow(X_out, 2) + pow(Z_out, 2))) * 180 / PI;
  pitch = atan(-1 * X_out / sqrt(pow(Y_out, 2) + pow(Z_out, 2))) * 180 / PI;

  // Low-pass filter
  rollF = 0.94 * rollF + 0.06 * roll;
  pitchF = 0.94 * pitchF + 0.06 * pitch;

  Serial.print(rollF);
  Serial.print("/");
  Serial.println(pitchF);
}Code language: Arduino (arduino)

Sekarang di lingkungan pengembangan Processing kita perlu menerima nilai-nilai ini dan menggunakannya untuk memutar objek 3D yang akan kita buat. Berikut kode Processing lengkapnya:

/*
    Arduino and ADXL345 Accelerometer - 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;

void setup() {
  size (960, 640, P3D);
  myPort = new Serial(this, "COM8", 9600); // starts the serial communication
  myPort.bufferUntil('\n');
}

void draw() {
  translate(width/2, height/2, 0);
  background(33);
  textSize(22);
  text("Roll: " + int(roll) + "     Pitch: " + int(pitch), -100, 265);

  // Rotate the object
  rotateX(radians(roll));
  rotateZ(radians(-pitch));
  
  // 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]);
    }
  }
}Code language: Arduino (arduino)

Deskripsi: Jadi di sini, kita perlu memasukkan perpustakaan serial, menentukan port serial dan baud rate yang harus sesuai dengan baud rate sketsa Arduino yang diunggah. Kemudian kami membaca data yang masuk dan memasukkannya ke dalam variabel roll and pitch yang sesuai. Dalam loop gambar utama, kami menggunakan nilai-nilai ini untuk memutar objek 3D, dan dalam hal ini kotak sederhana dengan warna dan teks tertentu di atasnya.

Jika kita menjalankan sketsa, objek 3D akan muncul dan akan melacak orientasi sensor accelerometer. Kita dapat melihat di sini bahwa objek sebenarnya agak goyah dan itu karena akselerometer tidak hanya menangkap gaya gravitasi, tetapi juga gaya kecil yang dihasilkan oleh gerakan tangan kita. Untuk mendapatkan hasil yang lebih halus, kita dapat menggunakan filter Low-pass sederhana. Di sini saya menerapkan filter seperti itu dalam kode Arduino, yang mengambil 94% dari status sebelumnya dan menambahkan 6% dari status atau sudut saat ini.

// Low-pass filter
  rollF = 0.94 * rollF + 0.06 * roll;
  pitchF = 0.94 * pitchF + 0.06 * pitch;Code language: Arduino (arduino)

Dengan filter ini, kita dapat melihat bahwa objek bergerak jauh lebih mulus sekarang, tetapi ada juga efek samping dan respons yang lebih lambat. Kita juga dapat melihat bahwa kita kehilangan Yaw, atau rotasi di sekitar sumbu Z. Dengan hanya menggunakan data akselerometer 3-sumbu, kami tidak dapat menghitung Yaw.

Untuk melakukannya dan meningkatkan kinerja keseluruhan sensor pelacakan orientasi, kita sebenarnya perlu menyertakan sensor tambahan, giroskop, dan menggabungkan datanya dengan akselerometer.

Jadi, kita dapat menggunakan akselerometer ADXL345 dalam kombinasi beberapa sensor giroskop, atau menggunakan IMU MPU6050 yang memiliki akselerometer 3-Axis dan giroskop 3-Axis yang terintegrasi dalam satu chip. Anda dapat menemukan tutorial lebih detail tentang sensor ini di video saya berikutnya.

Saya harap Anda menikmati tutorial ini dan belajar sesuatu yang baru. Jangan ragu untuk mengajukan pertanyaan apa pun di bagian komentar di bawah dan jangan lupa untuk memeriksa koleksi Proyek Arduino saya.


Proses manufaktur

  1. Mengontrol Motor Servo dengan Arduino dan MPU6050
  2. u-blox LEA-6H 02 Modul GPS dengan Arduino dan Python
  3. Cara membaca suhu dan kelembaban di Blynk dengan DHT11
  4. Pengenalan dan Sintesis Ucapan dengan Arduino
  5. Cara membuat musik dengan Arduino
  6. Cara Menggunakan NMEA-0183 dengan Arduino
  7. Cara Menggunakan Modbus dengan Arduino
  8. Mesin Kopi Cerdas dengan Arduino dan Bluetooth
  9. Animated Smart Light dengan Alexa dan Arduino
  10. Pengenalan Ucapan dengan Arduino dan Server BitVoicer