MPU6050:api
MPU6050是一個六軸的運動傳感器,其中三個軸爲陀螺儀傳感器,讀取到的物理數值是角速度,方向分別爲繞x軸,繞y軸,繞z軸。另外三個軸爲加速度傳感器,方向爲沿x,y,z軸。函數
硬件鏈接:工具
手上正好有片廉價貨色,來看看它的構造開發工具
從圖中咱們看到有8個接口,其中,會用到的接口有VCC(3.3V),GND,和I2C接口SCL,SDA。其餘四個接口用於和其餘I2C設備鏈接,地址和中斷,通常不使用。spa
在本例中,將I2C接口SCL設置爲PC7,將I2C接口SDA設置爲PC8。code
RTThread實現快速開發orm
在本次開發中,使用的開發環境爲RTThread Studio(也可使用RTThread的Env開發工具)。blog
首先創立一個RTThread工程,並將時鐘改成HSE高速時鐘(此部分自主查看官方教程便可實現)。教程
而後咱們打開RTT Setting,看到以下界面:
接口
在圖中,能夠看到,軟件包部分已經添加了mpu6xxx(第一次使用時,在Add選項中搜索,點擊添加保存便可。)驅動層添加了I2C驅動(第一次使用時,點擊圖標添加保存便可)
添加好項目保存後,等待Studio添加完成,而後打開board.h頭文件,首先配置I2C驅動。
在board.h中,有這樣一段代碼
/*-------------------------- I2C CONFIG BEGIN --------------------------*/ /** if you want to use i2c bus(soft simulate) you can use the following instructions. * * STEP 1, open i2c driver framework(soft simulate) support in the RT-Thread Settings file * * STEP 2, define macro related to the i2c bus * such as #define BSP_USING_I2C1 * * STEP 3, according to the corresponding pin of i2c port, modify the related i2c port and pin information * such as #define BSP_I2C1_SCL_PIN GET_PIN(port, pin) -> GET_PIN(C, 11) * #define BSP_I2C1_SDA_PIN GET_PIN(port, pin) -> GET_PIN(C, 12) */ /*自主定義I2C SCL SDA 線接口*/ #define BSP_USING_I2C1 #ifdef BSP_USING_I2C1 #define BSP_I2C1_SCL_PIN GET_PIN(C, 7) #define BSP_I2C1_SDA_PIN GET_PIN(C, 8) #endif /*#define BSP_USING_I2C2*/ #ifdef BSP_USING_I2C2 #define BSP_I2C2_SCL_PIN GET_PIN(port, pin) #define BSP_I2C2_SDA_PIN GET_PIN(port, pin) #endif /*-------------------------- I2C CONFIG END --------------------------*/
經過自主定義SCL,SDA接口,便可配置I2C。
而後來配置MPU6xxx這個函數包,首先看下API接口說明,在函數包文件中,打開api.md。
能夠看到這個軟件包怎樣進行初始化和設定參數。如今來編寫main函數。
首先是一些頭文件和宏定義
#include <rtthread.h> #include <board.h> #include <rtdevice.h> #include "sensor_inven_mpu6xxx.h" #define DBG_TAG "main" #define DBG_LVL DBG_LOG #include <rtdbg.h> #define LED0_PIN GET_PIN(A,8) //led PIN定義 #define MPU6050_I2C_BUS_NAME "i2c1" //i2c總線設備名 #define MPU6050_ADDR 0x68 //MPU6050地址,既定的 struct mpu6xxx_device *i2c_bus; //6050控制句柄 struct mpu6xxx_3axes gyro1, accel1; //陀螺儀,加速度結構體
這裏咱們能夠看到:
設置了一個LED PIN,這個資源由自主根據開發板上的資源定義
設置了i2c的總線設備名,一會初始化時會用到。設置MPU6050的地址,這是默認的。
設置了兩個結構體,由剛纔查看API手冊得知,每一個結構體都有x,y,z三個成員
而後是main函數:
int main(void) { i2c_bus = (struct mpu6xxx_device *)mpu6xxx_init(MPU6050_I2C_BUS_NAME, MPU6050_ADDR); //初始化MPU6050,測量單位爲角速度,加速度 mpu6xxx_set_param(i2c_bus, MPU6XXX_ACCEL_RANGE, MPU6XXX_GYRO_RANGE_250DPS); //陀螺儀範圍配置 mpu6xxx_set_param(i2c_bus, MPU6XXX_ACCEL_RANGE, MPU6XXX_ACCEL_RANGE_2G); //加速度計 mpu6xxx_set_param(i2c_bus, MPU6XXX_DLPF_CONFIG, MPU6XXX_DLPF_188HZ); //低通濾波 mpu6xxx_set_param(i2c_bus, MPU6XXX_SAMPLE_RATE, 500); //採樣頻率 int count = 1; while (count++) { mpu6xxx_get_gyro(i2c_bus, &gyro1); mpu6xxx_get_accel(i2c_bus, &accel1); rt_pin_mode(LED0_PIN, count % 2); LOG_D("gyroX:%d",gyro1.x/10); LOG_D("accelX:%d",accel1.x); rt_thread_mdelay(500); } return RT_EOK; }
首先初始化,配置參數。而後開始循環,這裏加了一個LED控制函數,運行時,LED閃爍表明正在發送信號,能夠自主決定是否使用。
而後串口輸出x軸的角速度和加速度,運行後,打開串口,就能夠看到mpu6050讀取的參數了。
簡單晃了一下獲得的參數:
(幾塊錢的6050通常都會存在必定漂移,須要手動修正,手中這塊每次上電都會隨機漂移一個值 ¯_¯ ,因此想要實際使用的話仍是要買個上等貨色)