Bahasa Inggris | 简体中文 | 繁體中文 | 日本語 | Jerman | 한국어
MPU6050 adalah perangkat MotionTracking 6-sumbu terintegrasi pertama di dunia yang menggabungkan giroskop 3-sumbu, akselerometer 3-sumbu, dan Digital Motion Processor™ (DMP) semuanya dalam paket kecil berukuran 4x4x0.9mm. Dengan bus sensor I2C khusus, ia langsung menerima masukan dari kompas 3 sumbu eksternal untuk menghasilkan keluaran MotionFusion™ 9 sumbu yang lengkap. Perangkat MotionTracking MPU6050, dengan integrasi 6 sumbu, MotionFusion™ on-board, dan firmware kalibrasi run-time, memungkinkan produsen menghilangkan seleksi, kualifikasi, dan integrasi tingkat sistem perangkat diskrit yang mahal dan rumit, menjamin kinerja gerakan yang optimal untuk konsumen. MPU6050 juga dirancang untuk berinteraksi dengan beberapa sensor digital non-inersia, seperti sensor tekanan, pada port I2C tambahannya. MPU6050 kompatibel dengan keluarga MPU30X0. MPU6050 dilengkapi tiga konverter analog-ke-digital (ADC) 16-bit untuk mendigitalkan keluaran giroskop dan tiga ADC 16-bit untuk mendigitalkan keluaran akselerometer. Untuk pelacakan presisi gerakan cepat dan lambat, bagian-bagiannya dilengkapi giroskop skala penuh yang dapat diprogram pengguna dengan kisaran ±250, ±500, ±1000, dan ±2000°/detik (dps) dan akselerometer skala penuh yang dapat diprogram pengguna. kisaran ±2g, ±4g, ±8g, dan ±16g.
LibDriver MPU6050 adalah driver fungsi penuh dari mpu6050 yang diluncurkan oleh LibDriver. Ini menyediakan pembacaan akselerasi, pembacaan kecepatan sudut, pembacaan sudut sikap, pembacaan dmp, deteksi ketukan, dan fungsi lainnya. LibDriver mematuhi MISRA.
/src menyertakan file sumber LibDriver MPU6050.
/antarmuka menyertakan templat independen platform LibDriver MPU6050 IIC.
/test menyertakan kode pengujian driver LibDriver MPU6050 dan kode ini dapat menguji fungsi chip yang diperlukan dengan sederhana.
/example menyertakan kode sampel LibDriver MPU6050.
/doc menyertakan dokumen offline LibDriver MPU6050.
/lembar data termasuk lembar data MPU6050.
/proyek menyertakan kode contoh papan pengembangan Linux dan MCU yang umum. Semua proyek menggunakan skrip shell untuk men-debug driver dan instruksi detail dapat ditemukan di README.md setiap proyek.
/misra menyertakan hasil pemindaian kode LibDriver MISRA.
Referensi / template independen platform IIC antarmuka dan selesaikan driver platform IIC Anda.
Tambahkan direktori /src, driver antarmuka untuk platform Anda, dan driver Anda sendiri ke proyek Anda, jika Anda ingin menggunakan driver contoh default, tambahkan direktori /example ke proyek Anda.
Anda dapat merujuk pada contoh di direktori /example untuk melengkapi driver Anda sendiri. Jika Anda ingin menggunakan contoh pemrograman default, berikut cara menggunakannya.
#include "driver_mpu6050_basic.h"
uint8_t res ;
uint32_t i ;
uint32_t times ;
float g [ 3 ];
float dps [ 3 ];
float degrees ;
mpu6050_address_t addr ;
/* init */
addr = MPU6050_ADDRESS_AD0_LOW ;
res = mpu6050_basic_init ( addr );
if ( res != 0 )
{
return 1 ;
}
...
/* read all */
times = 3 ;
for ( i = 0 ; i < times ; i ++ )
{
/* read */
if ( mpu6050_basic_read ( g , dps ) != 0 )
{
( void ) mpu6050_basic_deinit ();
return 1 ;
}
...
if ( mpu6050_basic_read_temperature ( & degrees ) != 0 )
{
( void ) mpu6050_basic_deinit ();
return 1 ;
}
...
/* output */
mpu6050_interface_debug_print ( "mpu6050: %d/%d.n" , i + 1 , times );
mpu6050_interface_debug_print ( "mpu6050: acc x is %0.2fg.n" , g [ 0 ]);
mpu6050_interface_debug_print ( "mpu6050: acc y is %0.2fg.n" , g [ 1 ]);
mpu6050_interface_debug_print ( "mpu6050: acc z is %0.2fg.n" , g [ 2 ]);
mpu6050_interface_debug_print ( "mpu6050: gyro x is %0.2fdps.n" , dps [ 0 ]);
mpu6050_interface_debug_print ( "mpu6050: gyro y is %0.2fdps.n" , dps [ 1 ]);
mpu6050_interface_debug_print ( "mpu6050: gyro z is %0.2fdps.n" , dps [ 2 ]);
mpu6050_interface_debug_print ( "mpu6050: temperature %0.2fC.n" , degrees );
...
/* delay 1000 ms */
mpu6050_interface_delay_ms ( 1000 );
...
}
...
/* deinit */
( void ) mpu6050_basic_deinit ();
return 0 ;
#include "driver_mpu6050_fifo.h"
uint32_t i ;
uint32_t times ;
uint16_t len ;
uint8_t ( * g_gpio_irq )( void ) = NULL ;
static int16_t gs_accel_raw [ 128 ][ 3 ];
static float gs_accel_g [ 128 ][ 3 ];
static int16_t gs_gyro_raw [ 128 ][ 3 ];
static float gs_gyro_dps [ 128 ][ 3 ];
mpu6050_address_t addr ;
/* gpio init */
if ( gpio_interrupt_init () != 0 )
{
return 1 ;
}
g_gpio_irq = mpu6050_fifo_irq_handler ;
/* init */
addr = MPU6050_ADDRESS_AD0_LOW ;
if ( mpu6050_fifo_init ( addr ) != 0 )
{
g_gpio_irq = NULL ;
( void ) gpio_interrupt_deinit ();
return 1 ;
}
/* delay 100 ms */
mpu6050_interface_delay_ms ( 100 );
...
times = 3 ;
for ( i = 0 ; i < times ; i ++ )
{
len = 128 ;
/* read */
if ( mpu6050_fifo_read ( gs_accel_raw , gs_accel_g ,
gs_gyro_raw , gs_gyro_dps , & len ) != 0 )
{
( void ) mpu6050_fifo_deinit ();
g_gpio_irq = NULL ;
( void ) gpio_interrupt_deinit ();
return 1 ;
}
...
/* output */
mpu6050_interface_debug_print ( "mpu6050: %d/%d.n" , i + 1 , times );
mpu6050_interface_debug_print ( "mpu6050: fifo %d.n" , len );
mpu6050_interface_debug_print ( "mpu6050: acc x[0] is %0.2fg.n" , gs_accel_g [ 0 ][ 0 ]);
mpu6050_interface_debug_print ( "mpu6050: acc y[0] is %0.2fg.n" , gs_accel_g [ 0 ][ 1 ]);
mpu6050_interface_debug_print ( "mpu6050: acc z[0] is %0.2fg.n" , gs_accel_g [ 0 ][ 2 ]);
mpu6050_interface_debug_print ( "mpu6050: gyro x[0] is %0.2fdps.n" , gs_gyro_dps [ 0 ][ 0 ]);
mpu6050_interface_debug_print ( "mpu6050: gyro y[0] is %0.2fdps.n" , gs_gyro_dps [ 0 ][ 1 ]);
mpu6050_interface_debug_print ( "mpu6050: gyro z[0] is %0.2fdps.n" , gs_gyro_dps [ 0 ][ 2 ]);
...
/* delay 100 ms */
mpu6050_interface_delay_ms ( 100 );
...
}
...
/* deinit */
( void ) mpu6050_fifo_deinit ();
g_gpio_irq = NULL ;
( void ) gpio_interrupt_deinit ();
return 0 ;
#include "driver_mpu6050_dmp.h"
uint32_t i ;
uint32_t times ;
uint32_t cnt ;
uint16_t len ;
uint8_t ( * g_gpio_irq )( void ) = NULL ;
static int16_t gs_accel_raw [ 128 ][ 3 ];
static float gs_accel_g [ 128 ][ 3 ];
static int16_t gs_gyro_raw [ 128 ][ 3 ];
static float gs_gyro_dps [ 128 ][ 3 ];
static int32_t gs_quat [ 128 ][ 4 ];
static float gs_pitch [ 128 ];
static float gs_roll [ 128 ];
static float gs_yaw [ 128 ];
mpu6050_address_t addr ;
static void a_receive_callback ( uint8_t type )
{
switch ( type )
{
case MPU6050_INTERRUPT_MOTION :
{
mpu6050_interface_debug_print ( "mpu6050: irq motion.n" );
break ;
}
case MPU6050_INTERRUPT_FIFO_OVERFLOW :
{
mpu6050_interface_debug_print ( "mpu6050: irq fifo overflow.n" );
break ;
}
case MPU6050_INTERRUPT_I2C_MAST :
{
mpu6050_interface_debug_print ( "mpu6050: irq i2c master.n" );
break ;
}
case MPU6050_INTERRUPT_DMP :
{
mpu6050_interface_debug_print ( "mpu6050: irq dmpn" );
break ;
}
case MPU6050_INTERRUPT_DATA_READY :
{
mpu6050_interface_debug_print ( "mpu6050: irq data readyn" );
break ;
}
default :
{
mpu6050_interface_debug_print ( "mpu6050: irq unknown code.n" );
break ;
}
}
}
static void a_dmp_tap_callback ( uint8_t count , uint8_t direction )
{
switch ( direction )
{
case MPU6050_DMP_TAP_X_UP :
{
mpu6050_interface_debug_print ( "mpu6050: tap irq x up with %d.n" , count );
break ;
}
case MPU6050_DMP_TAP_X_DOWN :
{
mpu6050_interface_debug_print ( "mpu6050: tap irq x down with %d.n" , count );
break ;
}
case MPU6050_DMP_TAP_Y_UP :
{
mpu6050_interface_debug_print ( "mpu6050: tap irq y up with %d.n" , count );
break ;
}
case MPU6050_DMP_TAP_Y_DOWN :
{
mpu6050_interface_debug_print ( "mpu6050: tap irq y down with %d.n" , count );
break ;
}
case MPU6050_DMP_TAP_Z_UP :
{
mpu6050_interface_debug_print ( "mpu6050: tap irq z up with %d.n" , count );
break ;
}
case MPU6050_DMP_TAP_Z_DOWN :
{
mpu6050_interface_debug_print ( "mpu6050: tap irq z down with %d.n" , count );
break ;
}
default :
{
mpu6050_interface_debug_print ( "mpu6050: tap irq unknown code.n" );
break ;
}
}
}
static void a_dmp_orient_callback ( uint8_t orientation )
{
switch ( orientation )
{
case MPU6050_DMP_ORIENT_PORTRAIT :
{
mpu6050_interface_debug_print ( "mpu6050: orient irq portrait.n" );
break ;
}
case MPU6050_DMP_ORIENT_LANDSCAPE :
{
mpu6050_interface_debug_print ( "mpu6050: orient irq landscape.n" );
break ;
}
case MPU6050_DMP_ORIENT_REVERSE_PORTRAIT :
{
mpu6050_interface_debug_print ( "mpu6050: orient irq reverse portrait.n" );
break ;
}
case MPU6050_DMP_ORIENT_REVERSE_LANDSCAPE :
{
mpu6050_interface_debug_print ( "mpu6050: orient irq reverse landscape.n" );
break ;
}
default :
{
mpu6050_interface_debug_print ( "mpu6050: orient irq unknown code.n" );
break ;
}
}
}
/* init */
if ( gpio_interrupt_init () != 0 )
{
return 1 ;
}
g_gpio_irq = mpu6050_dmp_irq_handler ;
/* run dmp function */
addr = MPU6050_ADDRESS_AD0_LOW ;
if ( mpu6050_dmp_init ( addr , a_receive_callback ,
a_dmp_tap_callback , a_dmp_orient_callback ) != 0 )
{
g_gpio_irq = NULL ;
( void ) gpio_interrupt_deinit ();
return 1 ;
}
/* delay 500 ms */
mpu6050_interface_delay_ms ( 500 );
...
times = 3 ;
for ( i = 0 ; i < times ; i ++ )
{
len = 128 ;
/* read */
if ( mpu6050_dmp_read_all ( gs_accel_raw , gs_accel_g ,
gs_gyro_raw , gs_gyro_dps ,
gs_quat ,
gs_pitch , gs_roll , gs_yaw ,
& len ) != 0 )
{
( void ) mpu6050_dmp_deinit ();
g_gpio_irq = NULL ;
( void ) gpio_interrupt_deinit ();
return 1 ;
}
/* output */
mpu6050_interface_debug_print ( "mpu6050: %d/%d.n" , i + 1 , times );
mpu6050_interface_debug_print ( "mpu6050: fifo %d.n" , len );
mpu6050_interface_debug_print ( "mpu6050: pitch[0] is %0.2fdeg.n" , gs_pitch [ 0 ]);
mpu6050_interface_debug_print ( "mpu6050: roll[0] is %0.2fdeg.n" , gs_roll [ 0 ]);
mpu6050_interface_debug_print ( "mpu6050: yaw[0] is %0.2fdeg.n" , gs_yaw [ 0 ]);
mpu6050_interface_debug_print ( "mpu6050: acc x[0] is %0.2fg.n" , gs_accel_g [ 0 ][ 0 ]);
mpu6050_interface_debug_print ( "mpu6050: acc y[0] is %0.2fg.n" , gs_accel_g [ 0 ][ 1 ]);
mpu6050_interface_debug_print ( "mpu6050: acc z[0] is %0.2fg.n" , gs_accel_g [ 0 ][ 2 ]);
mpu6050_interface_debug_print ( "mpu6050: gyro x[0] is %0.2fdps.n" , gs_gyro_dps [ 0 ][ 0 ]);
mpu6050_interface_debug_print ( "mpu6050: gyro y[0] is %0.2fdps.n" , gs_gyro_dps [ 0 ][ 1 ]);
mpu6050_interface_debug_print ( "mpu6050: gyro z[0] is %0.2fdps.n" , gs_gyro_dps [ 0 ][ 2 ]);
/* delay 500 ms */
mpu6050_interface_delay_ms ( 500 );
....
/* get the pedometer step count */
res = mpu6050_dmp_get_pedometer_counter ( & cnt );
if ( res != 0 )
{
( void ) mpu6050_dmp_deinit ();
g_gpio_irq = NULL ;
( void ) gpio_interrupt_deinit ();
return 1 ;
}
...
}
...
/* deinit */
( void ) mpu6050_dmp_deinit ();
g_gpio_irq = NULL ;
( void ) gpio_interrupt_deinit ();
return 0 ;
Dokumen daring: https://www.libdriver.com/docs/mpu6050/index.html.
Dokumen offline: /doc/html/index.html.
Silakan merujuk ke KONTRIBUSI.md.
Hak Cipta (c) 2015 - sekarang LibDriver Semua hak dilindungi undang-undang
Lisensi MIT (MIT)
Izin dengan ini diberikan, tanpa dipungut biaya, kepada siapa pun yang memperoleh salinannya
perangkat lunak ini dan file dokumentasi terkait ("Perangkat Lunak"), untuk ditangani
dalam Perangkat Lunak tanpa batasan, termasuk tanpa batasan hak
untuk menggunakan, menyalin, memodifikasi, menggabungkan, menerbitkan, mendistribusikan, mensublisensikan, dan/atau menjual
salinan Perangkat Lunak, dan untuk mengizinkan orang yang memiliki Perangkat Lunak tersebut
diperlengkapi untuk melakukannya, dengan syarat-syarat berikut:
Pemberitahuan hak cipta di atas dan pemberitahuan izin ini harus disertakan dalam keseluruhannya
salinan atau sebagian besar Perangkat Lunak.
PERANGKAT LUNAK INI DISEDIAKAN "APA ADANYA", TANPA JAMINAN APA PUN, SECARA TERSURAT MAUPUN
TERSIRAT, TERMASUK NAMUN TIDAK TERBATAS PADA JAMINAN KELAYAKAN UNTUK DIPERDAGANGKAN,
KESESUAIAN UNTUK TUJUAN TERTENTU DAN TIDAK PELANGGARAN. DALAM KEADAAN APA PUN
PENULIS ATAU PEMEGANG HAK CIPTA BERTANGGUNG JAWAB ATAS KLAIM, KERUSAKAN ATAU LAINNYA
TANGGUNG JAWAB, BAIK DALAM TINDAKAN KONTRAK, HUKUM ATAU LAINNYA, YANG TIMBUL DARI,
DILUAR ATAU SEHUBUNGAN DENGAN PERANGKAT LUNAK ATAU PENGGUNAAN ATAU HAL-HAL LAIN DALAM
PERANGKAT LUNAK.
Silakan kirim email ke [email protected].