อังกฤษ | 简体中文 | 繁體中文 | ภาษาญี่ปุ่น | เยอรมัน | เกาหลี
MPU6050 เป็นอุปกรณ์ MotionTracking แบบ 6 แกนแบบบูรณาการเครื่องแรกของโลกที่รวมไจโรสโคปแบบ 3 แกน ตัวตรวจวัดความเร่งแบบ 3 แกน และ Digital Motion Processor™ (DMP) เข้าด้วยกันในแพ็คเกจขนาดเล็กขนาด 4x4x0.9 มม. ด้วยบัสเซ็นเซอร์ I2C โดยเฉพาะ สามารถรับอินพุตจากเข็มทิศ 3 แกนภายนอกได้โดยตรง เพื่อให้ได้เอาต์พุต MotionFusion™ 9 แกนที่สมบูรณ์ อุปกรณ์ MPU6050 MotionTracking ที่มีการบูรณาการ 6 แกน, MotionFusion™ ในตัว และเฟิร์มแวร์การสอบเทียบรันไทม์ ช่วยให้ผู้ผลิตสามารถขจัดการเลือกที่มีราคาแพงและซับซ้อน คุณสมบัติ และการบูรณาการระดับระบบของอุปกรณ์แยกกัน รับประกันประสิทธิภาพการเคลื่อนไหวที่ดีที่สุดสำหรับ ผู้บริโภค MPU6050 ยังได้รับการออกแบบให้เชื่อมต่อกับเซ็นเซอร์ดิจิทัลแบบไม่เฉื่อยหลายตัว เช่น เซ็นเซอร์ความดัน บนพอร์ต I2C เสริม MPU6050 สามารถใช้งานร่วมกับตระกูล MPU30X0 ได้ MPU6050 มีตัวแปลงแอนะล็อกเป็นดิจิทัล (ADC) 16 บิต 3 ตัวสำหรับการแปลงเอาท์พุตไจโรสโคปเป็นดิจิทัล และ ADC 16 บิต 3 ตัวสำหรับแปลงเอาท์พุตตัวตรวจวัดความเร่งให้เป็นดิจิทัล สำหรับการติดตามที่แม่นยำทั้งการเคลื่อนไหวเร็วและช้า ชิ้นส่วนต่างๆ มีไจโรสโคปที่ผู้ใช้ตั้งโปรแกรมได้เต็มสเกล ±250, ±500, ±1000 และ ±2000°/วินาที (dps) และมาตรความเร่งที่ผู้ใช้ตั้งโปรแกรมได้เต็มสเกล ช่วง ±2g, ±4g, ±8g และ ±16g
LibDriver MPU6050 เป็นไดรเวอร์ฟังก์ชันเต็มรูปแบบของ mpu6050 ที่เปิดตัวโดย LibDriver โดยให้การอ่านค่าความเร่ง การอ่านความเร็วเชิงมุม การอ่านมุมทัศนคติ การอ่าน dmp การตรวจจับการแตะ และฟังก์ชันอื่นๆ LibDriver เป็นไปตามมาตรฐาน MISRA
/src รวมไฟล์ต้นฉบับ LibDriver MPU6050
/interface มีเทมเพลตอิสระของแพลตฟอร์ม LibDriver MPU6050 IIC
/test มีโค้ดทดสอบไดรเวอร์ LibDriver MPU6050 และโค้ดนี้สามารถทดสอบฟังก์ชันที่จำเป็นของชิปได้ง่ายๆ
/example รวมโค้ดตัวอย่าง LibDriver MPU6050
/doc รวมเอกสารออฟไลน์ LibDriver MPU6050
/datasheet รวมถึงเอกสารข้อมูล MPU6050
/project รวมโค้ดตัวอย่างบอร์ดพัฒนา Linux และ MCU ทั่วไป ทุกโปรเจ็กต์ใช้เชลล์สคริปต์เพื่อดีบักไดรเวอร์ และรายละเอียดคำแนะนำสามารถพบได้ใน README.md ของแต่ละโปรเจ็กต์
/misra รวมผลการสแกนโค้ด LibDriver MISRA
อ้างอิง /interface เทมเพลตอิสระของแพลตฟอร์ม IIC และเสร็จสิ้นไดรเวอร์ IIC ของแพลตฟอร์มของคุณ
เพิ่มไดเร็กทอรี /src ไดรเวอร์อินเทอร์เฟซสำหรับแพลตฟอร์มของคุณ และไดรเวอร์ของคุณเองลงในโปรเจ็กต์ของคุณ หากคุณต้องการใช้ไดรเวอร์ตัวอย่างเริ่มต้น ให้เพิ่มไดเร็กทอรี /example ให้กับโปรเจ็กต์ของคุณ
คุณสามารถดูตัวอย่างในไดเร็กทอรี /example เพื่อจัดทำไดรเวอร์ของคุณเอง หากคุณต้องการใช้ตัวอย่างการเขียนโปรแกรมเริ่มต้น ต่อไปนี้เป็นวิธีการใช้งาน
#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 ;
เอกสารออนไลน์: https://www.libdriver.com/docs/mpu6050/index.html
เอกสารออฟไลน์: /doc/html/index.html
โปรดดูที่ CONTRIBUTING.md
ลิขสิทธิ์ (c) 2015 - ปัจจุบัน LibDriver สงวนลิขสิทธิ์
ใบอนุญาต MIT (MIT)
อนุญาตให้บุคคลใด ๆ ที่ได้รับสำเนาอนุญาตโดยไม่คิดค่าใช้จ่าย
ของซอฟต์แวร์นี้และไฟล์เอกสารที่เกี่ยวข้อง ("ซอฟต์แวร์") เพื่อจัดการ
ในซอฟต์แวร์โดยไม่มีข้อจำกัด รวมถึงแต่ไม่จำกัดเพียงสิทธิ์
เพื่อใช้ คัดลอก แก้ไข รวม เผยแพร่ แจกจ่าย ให้อนุญาตช่วง และ/หรือขาย
สำเนาของซอฟต์แวร์ และเพื่ออนุญาตบุคคลที่เป็นเจ้าของซอฟต์แวร์
ได้รับการตกแต่งให้ทำเช่นนั้นได้ โดยมีเงื่อนไขดังต่อไปนี้
ประกาศเกี่ยวกับลิขสิทธิ์ข้างต้นและประกาศการอนุญาตนี้จะรวมอยู่ในทั้งหมด
สำเนาหรือส่วนสำคัญของซอฟต์แวร์
ซอฟต์แวร์นี้มีให้ "ตามที่เป็น" โดยไม่มีการรับประกันใดๆ ทั้งโดยชัดแจ้งหรือ
โดยนัย รวมถึงแต่ไม่จำกัดเพียงการรับประกันความสามารถในการซื้อขาย
ความเหมาะสมสำหรับวัตถุประสงค์เฉพาะและการไม่ละเมิด ไม่ว่าในกรณีใดก็ตาม
ผู้เขียนหรือผู้ถือลิขสิทธิ์จะต้องรับผิดต่อการเรียกร้องค่าเสียหายหรืออื่น ๆ
ความรับผิดไม่ว่าในการกระทำของสัญญา การละเมิด หรืออย่างอื่นที่เกิดจาก
ออกจากหรือเกี่ยวข้องกับซอฟต์แวร์หรือการใช้งานหรือข้อตกลงอื่น ๆ ใน
ซอฟต์แวร์.
กรุณาส่งอีเมลไปที่ [email protected]