
HaaS EDU場景式應用整體介紹
1、實驗介紹
手機上的“重力感應”想必大家都不陌生,基于重力感應可以實作飛車、輔助瞄準等各種體感非常強的互動功能,所謂的“重力感應”,其實就可以使用“加速度計及陀螺儀傳感器”來實作,
本節實驗中,我們將會基于 MPU-6050 實作一個根據開發板姿態滾動的小球,當我們傾斜 HaaS EDU K1 時,會看見小球根據我們的傾斜方向發生相對應的偏移,

2、涉及知識點
- MPU-6050 的驅動和使用
- OLED繪圖
3、軟硬體環境準備
3.1、硬體
開發用電腦一臺
HAAS EDU K1 開發板一塊 (開發板內置 MPU-6050 傳感器)
USB2TypeC 資料線一根
3.2、軟體
"陀螺儀小球"功能已經包含在edu_demo應用中,并且包含在發布版本中,
3.2.1、韌體版本
韌體版本:V1.0.0
3.2.2、代碼路徑
git clone https://gitee.com/alios-things/AliOS-Things.git -b dev_3.1.0_haas
cd AliOS-Things/application/example/edu_demo/k1_apps/gyroscope
3.2.3、編譯
進入代碼的頂層目錄如AliOS-Things進行編譯,直接編譯application/example/目錄下的edu_demo應用,
兩種方法進行編譯
命令列方式
aos make distclean
aos make edu_demo@haaseduk1 -c config
aos make
AliOS Studio IDE方式


3.2.4、燒錄
見開發環境章節
4、硬體介紹 - MPU-6050
4.1、硬體規格
MPU-60X0是世界上第一款集成 6 軸MotionTracking設備,它集成了3軸MEMS陀螺儀,3軸MEMS加速度計,以及一個可擴展的數字運動處理器 DMP( DigitalMotion Processor),可用I2C介面連接一個第三方的數字傳感器,比如磁力計,
MPU-6050具有三個用于將陀螺儀輸出數字化的16位模數轉換器(ADC)和三個用于將加速度計輸出數字化的16位ADC, 為了精確跟蹤快速和慢速運動,這些部件具有用戶可編程的陀螺儀滿量程范圍,范圍為±250,±500,±1000和±2000°/ sec(dps),以及用戶可編程的加速度計滿量程范圍 范圍為±2g,±4g,±8g和±16g,使用400kHz的I2C與設備的所有暫存器進行通信,其他功能包括嵌入式溫度傳感器和片上振蕩器,在整個作業溫度范圍內誤差±1%,
更多硬體規格請參考 DataSheet,
4.2、傳感原理
陀螺儀由1850年法國物理學家萊昂·傅科在研究地球自傳中獲得靈感而發明出來的,類似像是把一個高速旋轉的陀螺放到一個萬向支架上,靠陀螺的方向來計算角速度,和現在小巧的芯片造型大相徑庭,
|
|
|
| 早期的機械陀螺儀[1] | 目前常見的電子陀螺儀 |
那么如何將這么龐大的機械設備,塞進小小的芯片當中呢?以目前廣泛使用的MPU-6050為例,它屬于傳感MEMS分支,傳感MEMS技術是指用微電子微機械加工出來的、用敏感元件如電容、壓電、壓阻、熱電耦、諧振、隧道電流等來感受轉換電信號的器件和系統,感興趣的同學可以來這里學習亞德諾半導體的公開課 —— MEMS傳感器2:加速,旋轉——陀螺儀作業原理,
我們使用的MPU-6050是一款經典的MEMS陀螺儀,即硅微機電陀螺儀,MEMS(Micro-Electro-Mechanical System)是指集機械元素、微型傳感器、微型執行器以及信號處理和控制電路、介面電路、通信和電源于一體的完整微型機電系統,絕大多數的MEMS陀螺儀依賴于相互正交的振動和轉動引起的交變科里奧利力,在MPU-6050內部,存在一質量塊,當器件上電后,會觸發質量塊以固定頻率橫向運動,當器件遭受外力具備加速度時,就會觸發質量塊的縱向運動,從而改變四周梳齒之間的距離,改變輸出的電容,進而通過ADC將模擬信號轉換為數字信號,輸出給外部[2],

4.3、原理圖

在原理圖中我們可以看出,器件使用I2C通訊介面,并且,器件支持使用過INT引腳,當資料到來時可以在該引腳上觸發中斷,需要注意的是,AD0引腳決定了器件地址的第 0 bit,當AD0連接高電平,即AD0 = 1,此時器件地址為0x69,
4.4、驅動方式
4.4.1、通訊介面
由DataSheet可知,MPU-6050采用的通訊方式為I2C,默認7bit設備地址:0x69 (DataSheet P33 9.2)
在 AliOS Things 中,開發者只需要關心器件的設備地址即可,因為只要知道了設備地址,讀寫地址也可以計算出,AliOS Things 會自動處理這些計算,如果我們需要為了 MPU-6050 初始化I2C介面,那么對應的代碼為:
// components\peripherals\sensor\drv\drv_mag_honeywell_qmc5883l.c
static i2c_dev_t i2c_dev;
i2c_dev.port = 1; // HaaS EDK 默認使用I2C 1
i2c_dev.config.address_width = I2C_HAL_ADDRESS_WIDTH_7BIT;
i2c_dev.config.freq = I2C_BUS_BIT_RATES_400K;
i2c_dev.config.mode = I2C_MODE_MASTER;
i2c_dev.config.dev_addr = MPU_ADDR; // MPU_ADDR 0X69
hal_i2c_init(&i2c_dev);
4.4.2、暫存器
一般,使用I2C通訊的器件,都是通過讀寫暫存器的方式來完成對設備的讀取和配置,因此了解暫存器的分布就非常重要,由于 MPU-6050 的暫存器數量較多,建議讀者們查閱 Regsiter Map 檔案來獲取這些資訊,我們進列出部分較為關鍵的暫存器,

0x3B-0x40 三軸加速度暫存器 每軸資料2Byte
0x41-0x42 溫度暫存器 2Byte
0x43-0x48 三軸陀螺儀暫存器 每軸資料2Byte
4.4.3、驅動實作
uint8_t MPU_Init(void)
器件初始化,
// components/peripherals/sensor/drv/drv_acc_gyro_inv_mpu6050.c
uint8_t MPU_Init(void)
{
uint8_t device_id = 0;
// 初始化I2C
i2c_dev.port = 1;
i2c_dev.config.address_width = I2C_HAL_ADDRESS_WIDTH_7BIT;
i2c_dev.config.freq = I2C_BUS_BIT_RATES_100K;
i2c_dev.config.mode = I2C_MODE_MASTER;
i2c_dev.config.dev_addr = MPU_ADDR;
hal_i2c_init(&i2c_dev);
// 復位MPU6050
MPU_Write_Byte(MPU_PWR_MGMT1_REG, 0X80);
aos_msleep(100);
// 喚醒MPU6050
MPU_Write_Byte(MPU_PWR_MGMT1_REG, 0X00);
// 設定陀螺儀傳感器量程,±2000dps
MPU_Set_Gyro_Fsr(3);
// 設定加速度傳感器量程,±2g
MPU_Set_Accel_Fsr(0);
// 關閉所有中斷
MPU_Write_Byte(MPU_INT_EN_REG, 0X00);
// I2C主模式關閉
MPU_Write_Byte(MPU_USER_CTRL_REG, 0X00);
// 關閉FIFO
MPU_Write_Byte(MPU_FIFO_EN_REG, 0X00);
// 讀取器件ID
device_id = MPU_Read_Byte(MPU_DEVICE_ID_REG);
// 如果讀取的器件ID與預期一致
if (device_id == MPU_DEV_ID)
{
LOGI("APP", "MPU init OK\n");
//設定CLKSEL,PLL X軸為參考
MPU_Write_Byte(MPU_PWR_MGMT1_REG, 0X01);
//加速度與陀螺儀都作業
MPU_Write_Byte(MPU_PWR_MGMT2_REG, 0X00);
//設定采樣率為50Hz
MPU_Set_Rate(50);
}
else
{
LOGI("APP", "MPU init Error -- %x\n", device_id);
return 1;
}
return 0;
}
void MPU_Get_Gyroscope(short *gx, short *gy, short *gz)
讀取三軸陀螺儀資料,由Register Map得知,只需要從GYRO_XOUTH向后依次讀出6個暫存器內容即可,
// components/peripherals/sensor/drv/drv_acc_gyro_inv_mpu6050.c
void MPU_Get_Gyroscope(short *gx, short *gy, short *gz)
{
uint8_t buf[6];
MPU_Read_Len(MPU_GYRO_XOUTH_REG, 6, buf);
*gx = ((u16)buf[0] << 8) | buf[1];
*gy = ((u16)buf[2] << 8) | buf[3];
*gz = ((u16)buf[4] << 8) | buf[5];
}
void MPU_Get_Accelerometer(short *ax, short *ay, short *az)
讀取三軸加速度資料,由Register Map得知,只需要從ACCEL_XOUTH向后依次讀出6個暫存器內容即可,
// components/peripherals/sensor/drv/drv_acc_gyro_inv_mpu6050.c
void MPU_Get_Accelerometer(short *ax, short *ay, short *az)
{
uint8_t buf[6];
MPU_Read_Len(MPU_ACCEL_XOUTH_REG, 6, buf);
*ax = ((u16)buf[0] << 8) | buf[1];
*ay = ((u16)buf[2] << 8) | buf[3];
*az = ((u16)buf[4] << 8) | buf[5];
}
5、應用開發
本實驗的應用較為簡單,只需要讀出加速度資料,并顯示在螢屏上即可,OLED的相關介面中已經給出了豐富的繪圖函式,具體實作如下,
void gyroscope_task(void)
{
while (1)
{
// 清除螢屏memory
OLED_Clear();
// 獲取三軸加速度資訊
MPU_Get_Accelerometer(&r_ax, &r_ay, &r_az);
// 畫出固定的圓形邊框
OLED_DrawCircle(66, 32, 10, 1, 1);
// 畫出填充的圓
OLED_FillCircle(66 - r_ax / 250, 32 + r_ay / 500, 8, 1);
// 將螢屏memory顯示出來
OLED_Refresh_GRAM();
// 暫停20ms
aos_msleep(20);
}
}
6、更多應用
本實驗展示的僅是六軸傳感器的一個非常簡單的應用,隨著類似傳感器的體積越來越小,精度越來越高,它們也被應用在各種消費類電子產品,如穿戴設備、手機上,
使用它們可以進行一些非常有趣的應用,例如,手環中經常會使用到的計步演算法,運動狀態檢測演算法,都是基于其中的六軸傳感器資料,近年來,還有很多學術界的作業,使用手環中的六軸傳感器來實作空中寫字的識別,
除此之外,它也廣泛應用于輔助定位、飛行設備的姿態檢測,攝像機云臺的水平保持等等,期待讀者們能夠發掘出更多有價值的使用場景,
7、參考
[1] Gyroscope invented by Léon Foucault in 1852. Replica built by Dumoulin-Froment for the Exposition universelle in 1867. National Conservatory of Arts and Crafts museum, Paris.
By Stéphane Magnenat - Own work by uploader, subject public domain, Public Domain, https://commons.wikimedia.org/w/index.php?curid=4302903
[2] 圖片來自 https://www.analog.com/cn/education/education-library/videos/5996766351001.html
8、開發者技術支持
如需更多技術支持,可加入釘釘開發者群,或者關注微信公眾號

更多技術與解決方案介紹,請訪問阿里云AIoT首頁https://iot.aliyun.com/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/263904.html
標籤:其他
上一篇:撰寫函式,接受三個string引數,s,oldVal,newVal.使用迭代器和erase和insert函式,將所有oldVal替換為newVal
下一篇:MQTT協議入門


