Perpustakaan Arduino untuk berkomunikasi dengan Unit Pengukuran Inersia (IMU) enam sumbu ICM42688.
InvenSense ICM42688 mendukung I2C, hingga 400 kHz, dan komunikasi SPI, hingga 1 MHz untuk pengaturan register dan 24 MHz untuk pembacaan data. Tersedia rentang sensor skala penuh yang dapat dipilih berikut ini:
Rentang Skala Penuh Giroskop | Rentang Skala Penuh Akselerometer |
---|---|
+/- 15,6 (derajat/dtk) | - |
+/- 31,2 (derajat/dtk) | - |
+/- 62,5 (derajat/dtk) | - |
+/- 125 (derajat/dtk) | - |
+/- 250 (derajat/dtk) | +/- 2 (g) |
+/- 500 (derajat/dtk) | +/- 4 (g) |
+/- 1000 (derajat/dtk) | +/- 8 (g) |
+/- 2000 (derajat/dtk) | +/- 16 (g) |
ICM42688 mengambil sampel giroskop, dan akselerometer dengan konverter analog ke digital 16 bit. Ia juga dilengkapi filter digital yang dapat diprogram, jam presisi, sensor suhu tertanam, interupsi yang dapat diprogram (termasuk bangun saat bergerak), dan buffer FIFO 512 byte.
Perpustakaan ini mendukung komunikasi I2C dan SPI dengan ICM42688.
Cukup kloning atau unduh perpustakaan ini ke folder Arduino/perpustakaan Anda.
Perpustakaan ini mendukung komunikasi I2C dan SPI dengan ICM42688. Deklarasi objek ICM42688 dipenuhi dengan deklarasi berbeda untuk komunikasi I2C dan SPI. Semua fungsi lainnya tetap sama. Selain itu, kelas turunan, ICM42688FIFO , disertakan, yang menyediakan fungsionalitas penyiapan FIFO dan pengumpulan data selain semua fungsi yang disertakan dalam kelas dasar ICM42688 .
ICM42688(TwoWire &bus, alamat uint8_t) Objek ICM42688 harus dideklarasikan, menentukan bus I2C dan alamat I2C ICM42688. Alamat ICM42688 I2C akan menjadi 0x68 jika pin AD0 di-ground atau 0x69 jika pin AD0 ditarik tinggi. Misalnya, kode berikut mendeklarasikan objek ICM42688 yang disebut IMU dengan sensor ICM42688 yang terletak di bus I2C 0 dengan alamat sensor 0x68 (AD0 ground).
ICM42688 IMU (Wire, 0x68 );
ICM42688(TwoWire &bus, alamat uint8_t) Objek ICM42688 harus dideklarasikan, menentukan bus I2C dan alamat I2C ICM42688. Alamat ICM42688 I2C akan menjadi 0x68 jika pin AD0 di-ground atau 0x69 jika pin AD0 ditarik tinggi. Misalnya, kode berikut mendeklarasikan objek ICM42688 yang disebut IMU dengan sensor ICM42688 yang terletak di bus I2C 0 dengan alamat sensor 0x68 (AD0 ground). Anda harus menentukan pin SDA dan SCL untuk koneksi I2C Anda (default untuk Arduino adalah SDA=18, SCL=19, ESP32 adalah SDA=21, SCL=22)
ICM42688 IMU (Wire, 0x68 , _sda_pin, _scl_pin);
ICM42688FIFO(SPIClass &bus, uint8_t csPin, uint32_t SPI_HS_CLK=8000000) Objek ICM42688 harus dideklarasikan, menentukan bus SPI dan pin pemilihan chip yang digunakan. Beberapa ICM42688 atau objek SPI lainnya dapat digunakan pada bus SPI yang sama, masing-masing dengan pin pilihan chipnya sendiri. Pin pemilihan chip dapat berupa pin digital apa pun yang tersedia. Misalnya, kode berikut mendeklarasikan objek ICM42688 yang disebut IMU dengan sensor ICM42688 yang terletak di SPI bus 0 dengan chip select pin 10.
ICM42688 IMU (SPI, 10 );
Perhatikan bahwa jam bus SPI kecepatan tinggi default diatur ke 8 MHz, tetapi ICM 42688-p mendukung jam SPI hingga 24 MHz. Gunakan jam yang lebih cepat untuk transfer data SPI yang lebih cepat saat membaca data.
Fungsi berikut digunakan untuk mengatur sensor ICM42688. Ini harus dipanggil satu kali sebelum pengumpulan data, biasanya ini dilakukan di fungsi Arduino setup()
. Fungsi begin()
harus selalu digunakan. Secara opsional, fungsi setAccelFS
dan setGyroFS
, setAccelODR
, dan setGyroODR
dapat digunakan untuk mengatur rentang skala penuh akselerometer dan giroskop serta menghasilkan kecepatan data ke nilai selain default. enableDataReadyInterrupt
disableDataReadyInterrupt
mengontrol apakah ICM42688 menghasilkan interupsi pada data siap pakai. enableFifo
mengatur dan mengaktifkan buffer FIFO. Fungsi-fungsi ini dijelaskan secara rinci di bawah ini.
int mulai() Ini harus dipanggil dalam fungsi pengaturan Anda. Ini menginisialisasi komunikasi dengan ICM42688, menyiapkan sensor untuk membaca data, dan memperkirakan bias gyro, yang dihapus dari data sensor. Fungsi ini mengembalikan nilai positif jika inisialisasi berhasil dan mengembalikan nilai negatif jika inisialisasi gagal. Jika tidak berhasil, periksa kabel Anda atau coba atur ulang daya ke sensor. Berikut ini contoh pengaturan ICM42688.
int status = IMU.begin();
(opsional) int setAccelRange(AccelRange range) Fungsi ini menyetel rentang skala penuh akselerometer ke nilai yang ditentukan. Secara default, jika fungsi ini tidak dipanggil, rentang skala penuh +/- 16 g akan digunakan. Rentang skala penuh akselerometer yang disebutkan adalah:
Nama Akselerometer | Rentang Skala Penuh Akselerometer |
---|---|
gpm2 | +/- 2 (g) |
gpm4 | +/- 4 (g) |
gpm8 | +/- 8 (g) |
gpm16 | +/- 16 (g) |
Fungsi ini mengembalikan nilai positif jika berhasil dan nilai negatif jika gagal. Silakan lihat contoh Advanced_I2C . Berikut ini adalah contoh pemilihan accelerometer rentang skala penuh +/- 8g.
status = IMU.setAccelFS(ICM42688::gpm2);
(opsional) int setGyroRange(Rentang GyroRange) Fungsi ini menyetel rentang skala penuh giroskop ke nilai yang ditentukan. Secara default, jika fungsi ini tidak dipanggil, rentang skala penuh +/- 2000 derajat/s akan digunakan. Rentang skala penuh giroskop yang disebutkan adalah:
Nama Giroskop | Rentang Skala Penuh Giroskop |
---|---|
dps15_625 | +/- 15,625 (derajat/dtk) |
dps31_25 | +/- 31,25 (derajat/dtk) |
dps62_5 | +/- 62,5 (derajat/dtk) |
dps125 | +/- 125 (derajat/dtk) |
dps250 | +/- 250 (derajat/dtk) |
dps500 | +/- 500 (derajat/dtk) |
dps1000 | +/- 1000 (derajat/dtk) |
dps2000 | +/- 2000 (derajat/dtk) |
Fungsi ini mengembalikan nilai positif jika berhasil dan nilai negatif jika gagal. Silakan lihat contoh Advanced_I2C . Berikut adalah contoh pemilihan giroskop rentang skala penuh +/- 250 derajat/s.
status = IMU.setGyroFS(ICM42688::dps250);
(opsional) int setFilters(bool gyroFilters, bool accFilters) Ini adalah fungsi opsional untuk mengatur Filter yang dapat diprogram (Filter Takik, Filter Anti-Alias, Blok Filter UI). Secara default, Semua filter diaktifkan. Gambar berikut menunjukkan diagram blok jalur sinyal untuk ICM42688:
Fungsi ini mengembalikan nilai positif jika berhasil dan nilai negatif jika gagal. Berikut ini adalah contoh pengaktifan filter.
status = IMU.setFilters( true , true );
(opsional) int aktifkanDataReadyInterrupt() Interupsi terkait dengan kecepatan output data. Pin INT ICM42688 akan mengeluarkan pulsa 50us saat data sudah siap. Ini sangat berguna untuk menggunakan interupsi untuk mencatat pengumpulan data yang harus dilakukan secara berkala. Silakan lihat contoh Interrupt_SPI . Fungsi ini mengaktifkan interupsi ini, yang akan terjadi pada frekuensi yang diberikan oleh SRD. Fungsi ini mengembalikan nilai positif jika berhasil dan nilai negatif jika gagal. Berikut ini adalah contoh pengaktifan interupsi data ready.
status = IMU.enableDataReadyInterrupt();
(opsional) intdisableDataReadyInterrupt() Fungsi ini menonaktifkan interupsi data siap pakai, yang dijelaskan di atas. Fungsi ini mengembalikan nilai positif jika berhasil dan nilai negatif jika gagal. Berikut ini adalah contoh menonaktifkan interupsi data ready.
status = IMU.disableDataReadyInterrupt();
(opsional) uin8_t isInterrupted() Fungsi ini membaca register interupsi siap data. Fungsi ini mengembalikan nilai true ketika diinterupsi. Berikut ini adalah contoh pembacaan register interupsi siap data.
status = IMU.isInterrupted();
(opsional) int calibrateGyro() Bias gyro secara otomatis diperkirakan selama fungsi start() dan dihapus dari pengukuran sensor. Fungsi ini akan memperkirakan ulang bias gyro dan menghilangkan bias baru dari pengukuran sensor di masa depan. Sensor harus diam selama proses ini. Fungsi ini mengembalikan nilai positif jika berhasil dan nilai negatif jika gagal. Berikut ini adalah contoh estimasi bias gyro baru.
status = IMU.calibrateGyro();
(opsional) float getGyroBiasX() Fungsi ini mengembalikan bias gyro saat ini dalam arah X dalam satuan derajat/s.
float gxb;
gxb = IMU.getGyroBiasX();
(opsional) float getGyroBiasY() Fungsi ini mengembalikan bias gyro saat ini dalam arah Y dalam satuan derajat/s.
float gyb;
gyb = IMU.getGyroBiasY();
(opsional) float getGyroBiasZ() Fungsi ini mengembalikan bias gyro saat ini dalam arah Z dalam satuan derajat/s.
float gzb;
gzb = IMU.getGyroBiasZ();
(opsional) void setGyroBiasX(float bias) Fungsi ini mengatur bias gyro yang digunakan dalam arah X ke nilai input dalam satuan derajat/s.
float gxb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasX(gxb);
(opsional) void setGyroBiasY(float bias) Fungsi ini mengatur bias gyro yang digunakan dalam arah Y ke nilai input dalam satuan derajat/s.
float gyb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasY(gyb);
(opsional) void setGyroBiasZ(float bias) Fungsi ini mengatur bias gyro yang digunakan dalam arah Z ke nilai input dalam satuan derajat/s.
float gzb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasZ(gzb);
(opsional) int calibrateAccel() Fungsi ini akan memperkirakan bias dan faktor skala yang diperlukan untuk mengkalibrasi akselerometer. Fungsi ini bekerja satu sumbu pada satu waktu dan perlu dijalankan untuk keenam orientasi sensor. Setelah mengumpulkan cukup data sensor, ia akan memperkirakan bias dan faktor skala untuk ketiga saluran akselerometer dan menerapkan koreksi ini pada data yang diukur. Kalibrasi akselerometer hanya perlu dilakukan satu kali di IMU, fungsi dapatkan dan setel yang dirinci di bawah ini dapat digunakan untuk mengambil perkiraan bias dan faktor skala dan menggunakannya selama siklus daya atau operasi di masa mendatang dengan IMU. Fungsi ini mengembalikan nilai positif jika berhasil dan nilai negatif jika gagal.
status = IMU.calibrateAccel();
(opsional) float getAccelBiasX_mss() Fungsi ini mengembalikan bias akselerometer saat ini dalam arah X dalam satuan m/s/s.
float axb;
axb = IMU.getAccelBiasX_mss();
(opsional) float getAccelScaleFactorX() Fungsi ini mengembalikan faktor skala akselerometer saat ini dalam arah X.
float axs;
axs = IMU.getAccelScaleFactorX();
(opsional) float getAccelBiasY_mss() Fungsi ini mengembalikan bias akselerometer saat ini dalam arah Y dalam satuan m/s/s.
float ayb;
ayb = IMU.getAccelBiasY_mss();
(opsional) float getAccelScaleFactorY() Fungsi ini mengembalikan faktor skala akselerometer saat ini dalam arah Y.
float ays;
ays = IMU.getAccelScaleFactorY();
(opsional) float getAccelBiasZ_mss() Fungsi ini mengembalikan bias akselerometer saat ini dalam arah Z dalam satuan m/s/s.
float azb;
azb = IMU.getAccelBiasZ_mss();
(opsional) float getAccelScaleFactorZ() Fungsi ini mengembalikan faktor skala akselerometer saat ini dalam arah Z.
float azs;
azs = IMU.getAccelScaleFactorZ();
(opsional) void setAccelCalX(float bias,float scaleFactor) Fungsi ini mengatur bias akselerometer (m/s/s) dan faktor skala yang digunakan dalam arah X ke nilai input.
float axb = 0.01 ; // accel bias of 0.01 m/s/s
float axs = 0.97 ; // accel scale factor of 0.97
IMU.setAccelCalX(axb,axs);
(opsional) void setAccelCalY(float bias,float scaleFactor) Fungsi ini mengatur bias akselerometer (m/s/s) dan faktor skala yang digunakan dalam arah Y ke nilai input.
float ayb = 0.01 ; // accel bias of 0.01 m/s/s
float ays = 0.97 ; // accel scale factor of 0.97
IMU.setAccelCalY(ayb,ays);
(opsional) void setAccelCalZ(float bias,float scaleFactor) Fungsi ini mengatur bias akselerometer (m/s/s) dan faktor skala yang digunakan dalam arah Z ke nilai input.
float azb = 0.01 ; // accel bias of 0.01 m/s/s
float azs = 0.97 ; // accel scale factor of 0.97
IMU.setAccelCalZ(azb,azs);
Fungsi di bawah ini digunakan untuk mengumpulkan data dari sensor ICM42688. Silakan lihat lembar data Bagian 10.1 untuk orientasi sumbu sensitif.
int getAGT() membaca sensor dan menyimpan data terbaru dalam buffer, ini harus dipanggil setiap kali Anda ingin mengambil data dari sensor. Fungsi ini mengembalikan nilai positif jika berhasil dan nilai negatif jika gagal.
IMU.getAGT();
float accX() mendapatkan nilai akselerometer dari buffer data dalam arah X dan mengembalikannya dalam satuan g.
float ax = IMU.accX();
float accY() mendapatkan nilai akselerometer dari buffer data dalam arah Y dan mengembalikannya dalam satuan g.
float ay = IMU.accY();
float accZ() mendapatkan nilai akselerometer dari buffer data dalam arah Z dan mengembalikannya dalam satuan g.
float az = IMU.accZ();
float gyrX() mendapatkan nilai giroskop dari buffer data dalam arah X dan mengembalikannya dalam satuan derajat/s.
float gx = IMU.gyrX();
float gyrY() mendapatkan nilai giroskop dari buffer data dalam arah Y dan mengembalikannya dalam satuan derajat/s.
float gy = IMU.gyrY();
float gyrZ() mendapatkan nilai giroskop dari buffer data dalam arah Z dan mengembalikannya dalam satuan derajat/s.
float gz = IMU.gyrZ();
float temp() mendapatkan nilai suhu die dari buffer data dan mengembalikannya dalam satuan C.
float temperature = IMU.temp();
Kelas turunan ICM42688FIFO memperluas fungsionalitas yang disediakan oleh kelas dasar ICM42688 dengan memberikan dukungan untuk menyiapkan dan membaca buffer ICM42688FIFO. Semua fungsi yang dijelaskan di atas, sebagai bagian dari kelas ICM42688, juga tersedia untuk kelas ICM42688FIFO .
ICM42688FIFO(TwoWire &bus, alamat uint8_t) Objek ICM42688FIFO harus dideklarasikan, menentukan bus I2C dan alamat I2C ICM42688. Alamat ICM42688 I2C akan menjadi 0x68 jika pin AD0 di-ground atau 0x69 jika pin AD0 ditarik tinggi. Misalnya, kode berikut mendeklarasikan objek ICM42688FIFO yang disebut IMU dengan sensor ICM42688 yang terletak di bus I2C 0 dengan alamat sensor 0x68 (AD0 ground).
ICM42688FIFO IMU (Wire, 0x68 );
ICM42688FIFO(SPIClass &bus, uint8_t csPin, uint32_t SPI_HS_CLK=8000000) Objek ICM42688FIFO harus dideklarasikan, menentukan bus SPI dan pin pemilihan chip yang digunakan. Beberapa ICM42688 atau objek SPI lainnya dapat digunakan pada bus SPI yang sama, masing-masing dengan pin pilihan chipnya sendiri. Pin pemilihan chip dapat berupa pin digital apa pun yang tersedia. Misalnya, kode berikut mendeklarasikan objek ICM42688FIFO yang disebut IMU dengan sensor ICM42688 yang terletak di SPI bus 0 dengan chip select pin 10.
ICM42688FIFO IMU (SPI, 10 );
Perhatikan bahwa jam bus SPI kecepatan tinggi default diatur ke 8 MHz, tetapi ICM 42688-p mendukung jam SPI hingga 24 MHz. Gunakan jam yang lebih cepat untuk transfer data SPI yang lebih cepat saat membaca data.
(opsional) int aktifkanFifo(bool accel,bool gyro,bool temp) Fungsi ini mengkonfigurasi dan mengaktifkan buffer FIFO ICM42688. Buffer 512 byte ini mengambil sampel data pada kecepatan keluaran data yang ditetapkan oleh SRD dan memungkinkan pengontrol mikro membaca data secara massal, sehingga mengurangi beban kerja pengontrol mikro untuk aplikasi tertentu. Ini dikonfigurasikan dengan serangkaian nilai boolean yang menjelaskan data mana yang akan di-buffer di FIFO: akselerometer, giroskop, atau suhu. Data akselerometer dan giroskop masing-masing membutuhkan ruang 6 byte per sampel dan suhu 2 byte. Penting untuk memilih hanya sumber data yang diinginkan untuk memastikan FIFO tidak kewalahan saat membacanya. Misalnya, mengaktifkan semua sumber data akan memerlukan 21 byte per sampel sehingga FIFO hanya dapat menampung 24 sampel sebelum meluap. Jika hanya data akselerometer yang diperlukan, jumlah ini akan bertambah menjadi 85 sampel sebelum meluap. Fungsi ini mengembalikan nilai positif jika berhasil dan nilai negatif jika gagal. Silakan lihat contoh FIFO_SPI . Berikut ini adalah contoh pengaktifan FIFO untuk melakukan buffering data akselerometer dan giroskop.
status = IMU.enableFifo( true , true , false , false );
int readFifo() membaca buffer FIFO dari ICM42688, menguraikannya dan menyimpan data dalam buffer pada pengontrol mikro. Ini harus dipanggil setiap kali Anda ingin mengambil data dari buffer FIFO. Fungsi ini mengembalikan nilai positif jika berhasil dan nilai negatif jika gagal.
IMU.readFifo();
void getFifoAccelX_mss(size_t size,float data) mendapatkan nilai akselerometer dari buffer data dalam arah X dan mengembalikannya dalam satuan m/s/s. Data dikembalikan sebagai array beserta jumlah elemen dalam array tersebut. Pastikan buffer tempat Anda mentransfer memiliki kapasitas yang cukup untuk menyimpan data.
float ax[ 100 ];
size_t samples;
IMU.getFifoAccelX_mss(&samples,ax);
void getFifoAccelY_mss(size_t size,float data) mendapatkan nilai akselerometer dari buffer data dalam arah Y dan mengembalikannya dalam satuan m/s/s. Data dikembalikan sebagai array beserta jumlah elemen dalam array tersebut. Pastikan buffer tempat Anda mentransfer memiliki kapasitas yang cukup untuk menyimpan data.
float ay[ 100 ];
size_t samples;
IMU.getFifoAccelY_mss(&samples,ay);
void getFifoAccelZ_mss(size_t size,float data) mendapatkan nilai akselerometer dari buffer data dalam arah Z dan mengembalikannya dalam satuan m/s/s. Data dikembalikan sebagai array beserta jumlah elemen dalam array tersebut. Pastikan buffer tempat Anda mentransfer memiliki kapasitas yang cukup untuk menyimpan data.
float az[ 100 ];
size_t samples;
IMU.getFifoAccelZ_mss(&samples,az);
void getFifoGyroX(size_t size,float data) mendapatkan nilai giroskop dari buffer data dalam arah X dan mengembalikannya dalam satuan derajat/s. Data dikembalikan sebagai array beserta jumlah elemen dalam array tersebut. Pastikan buffer tempat Anda mentransfer memiliki kapasitas yang cukup untuk menyimpan data.
float gx[ 100 ];
size_t samples;
IMU.getFifoGyroX(&samples,gx);
void getFifoGyroY(size_t size,float data) mendapatkan nilai giroskop dari buffer data dalam arah Y dan mengembalikannya dalam satuan derajat/s. Data dikembalikan sebagai array beserta jumlah elemen dalam array tersebut. Pastikan buffer tempat Anda mentransfer memiliki kapasitas yang cukup untuk menyimpan data.
float gy[ 100 ];
size_t samples;
IMU.getFifoGyroY(&samples,gy);
void getFifoGyroZ(size_t size,float data) mendapatkan nilai giroskop dari buffer data dalam arah Z dan mengembalikannya dalam satuan derajat/s. Data dikembalikan sebagai array beserta jumlah elemen dalam array tersebut. Pastikan buffer tempat Anda mentransfer memiliki kapasitas yang cukup untuk menyimpan data.
float gz[ 100 ];
size_t samples;
IMU.getFifoGyroZ(&samples,gx);
void getFifoTemperature_C(size_t size,float data) mendapatkan nilai suhu die dari buffer data dan mengembalikannya dalam satuan C. Data dikembalikan sebagai array beserta jumlah elemen di dalam array tersebut. Pastikan buffer tempat Anda mentransfer memiliki kapasitas yang cukup untuk menyimpan data.
float temp[ 100 ];
size_t samples;
IMU.getFifoTemperature_C(&samples,temp);
Silakan merujuk ke lembar data ICM42688. Pustaka ini seharusnya berfungsi dengan baik untuk papan breakout lain atau sensor tertanam, silakan merujuk ke diagram pinout vendor Anda.
Pin ICM42688 harus dihubungkan sebagai:
Resistor 4,7 kOhm harus digunakan sebagai pullup pada SDA dan SCL, resistor ini harus pullup dengan sumber 3,3V.
Pin ICM42688 harus dihubungkan sebagai:
Beberapa papan breakout, termasuk papan breakout Master Tertanam, memerlukan sedikit modifikasi untuk mengaktifkan SPI. Silakan merujuk ke dokumentasi vendor Anda.