一、介紹
?? MPU6050是世界上第一款也是唯一一款專為智能手機、平板電腦和可穿戴傳感器的低功耗、低成本和高性能要求而設計的6軸運動跟蹤設備。
?? 它集成了3軸MEMS陀螺儀,3軸MEMS加速度計,以及一個可擴展的數(shù)字運動處理器 DMP( DigitalMotion Processor),可用I2C接口連接一個第三方的數(shù)字傳感器,比如磁力計。擴展之后就可以通過其 I2C或SPI接口輸出一個9軸的信號( SPI接口僅在MPU-6000可用)。 MPU-60X0也可以通過其I2C接口連接非慣性的數(shù)字傳感器,比如壓力傳感器。
??其它I2C總線實驗可以查看前面的PCF8591相關實驗,如:
??樹莓派基礎實驗12:PCF8591模數(shù)轉換器實驗
二、組件
★Raspberry Pi主板*1
★樹莓派電源*1
★40P軟排線*1
★MPU6050陀螺儀加速度傳感器模塊*1
★面包板*1
★跳線若干
三、實驗原理
?? MPU6050的工作原理比較復雜,需要深度學習最好是學習官方手冊,本文只做簡單介紹。
?? 詳細資料可在官網(wǎng)下載最新的芯片手冊:
https://invensense.tdk.com/products/motion-tracking/6-axis/mpu-6050/
1.傳感器
?? ①陀螺儀傳感器:
?? 陀螺儀的原理就是,一個旋轉物體的旋轉軸所指的方向在不受外力影響時,是不會改變的。人們根據(jù)這個道理,用它來保持方向。然后用多種方法讀取軸所指示的方向,并自動將數(shù)據(jù)信號傳給控制系統(tǒng)。我們騎自行車其實也是利用了這個原理。輪子轉得越快越不容易倒,因為車軸有一股保持水平的力量。
??現(xiàn)代陀螺儀可以精確地確定運動物體的方位的儀器,它在現(xiàn)代航空,航海,航天和國防工業(yè)中廣泛使用的一種慣性導航儀器。傳統(tǒng)的慣性陀螺儀主要部分有機械式的陀螺儀,而機械式的陀螺儀對工藝結構的要求很高。
??70年代提出了現(xiàn)代光纖陀螺儀的基本設想,到八十年代以后,光纖陀螺儀就得到了非常迅速的發(fā)展,激光諧振陀螺儀也有了很大的發(fā)展。光纖陀螺儀具有結構緊湊,靈敏度高,工作可靠。光纖陀螺儀在很多的領域已經(jīng)完全取代了機械式的傳統(tǒng)的陀螺儀,成為現(xiàn)代導航儀器中的關鍵部件。光纖陀螺儀同時發(fā)展的除了環(huán)式激光陀螺儀外。
??MPU-60X0由三個獨立的振動MEMS速率陀螺儀組成,可檢測旋轉角度X軸,Y軸和Z軸。 當陀螺儀圍繞任何感應軸旋轉時,科里奧利效應就會產(chǎn)生電容式傳感器檢測到的振動。 所得到的信號被放大,解調(diào)和濾波產(chǎn)生與角速度成比例的電壓。 該電壓使用單獨的片內(nèi)數(shù)字化16位模數(shù)轉換器(ADC)對每個軸進行采樣。 陀螺儀傳感器可以全面范圍的被數(shù)字編程為每秒±250,±500,±1000或±2000度(dps)。 ADC樣本速率可以從每秒8,000個采樣點編程到每秒3.9個采樣點,并且可由用戶選擇低通濾波器可實現(xiàn)廣泛的截止頻率。
??②加速度傳感器:
??加速度傳感器是一種能夠測量加速度的傳感器。通常由質(zhì)量塊、阻尼器、彈性元件、敏感元件和適調(diào)電路等部分組成。傳感器在加速過程中,通過對質(zhì)量塊所受慣性力的測量,利用牛頓第二定律獲得加速度值。根據(jù)傳感器敏感元件的不同,常見的加速度傳感器包括電容式、電感式、應變式、壓阻式、壓電式等。
??MPU-60X0的3軸加速度計為每個軸使用單獨的檢測質(zhì)量。 加速沿著一條特定軸在相應的檢測質(zhì)量上引起位移,并且電容式傳感器檢測到該位移位移有差別。 MPU-60X0的架構降低了加速度計的敏感度制造變化以及熱漂移。 當設備放置在平坦的表面上時,將進行測量在X和Y軸上為 0g,在Z軸上為+ 1g。 加速度計的比例因子在工廠進行校準并且在名義上與電源電壓無關。 每個傳感器都有一個專用的sigma-delta ADC來提供數(shù)字輸出。 數(shù)字輸出的滿量程范圍可以調(diào)整到±2g,±4g,±8g或±16g。
??其實說簡單點,在mpu6050中我們用陀螺儀傳感器測角度,用加速度傳感器測加速度。
?? MPU-60X0是全球首例9軸運動處理傳感器。它集成了3軸MEMS陀螺儀, 3軸MEMS 加速度計,以及一個可擴展的數(shù)字運動處理器 DMP(DigitalMotion Processor),可用 I2C 接口連接一個第三方的數(shù)字傳感器,比如磁力計。擴展之后就可以通過其 I2C 或 SPI 接口 輸出一個 9 軸的信號(SPI 接口僅在 MPU-6000 可用)。MPU-60X0 也可以通過其 I2C 接口連接非慣性的數(shù)字傳感器,比如壓力傳感器。
數(shù)字運動處理器(DMP):
??嵌入式數(shù)字運動處理器(DMP)位于MPU-60X0內(nèi)部,可從主機處理器中卸載運動處理算法的運算。 DMP從加速度計,陀螺儀以及其他第三方傳感器(如磁力計)獲取數(shù)據(jù),并處理數(shù)據(jù)。結果數(shù)據(jù)可以從DMP的寄存器中讀取,或者可以在FIFO中緩沖。 DMP可以訪問其中的一個MPU的外部引腳,可用于產(chǎn)生中斷。
??DMP的目的是卸載主機處理器的時序要求和處理能力。通常,運動處理算法應該以高速運行,通常在200Hz左右,以提供低延遲的精確結果。即使應用程序以更低的速率更新,這也是必需的。例如,一個低功率的用戶界面可能會以5Hz的速度更新,但運動處理仍然應該以200Hz運行。 DMP可以作為一種工具使用,以最大限度地降低功耗,簡化定時,簡化軟件架構,并在主機處理器上節(jié)省寶貴的MIPS,以便在應用中使用。
2.數(shù)據(jù)分析
(1)加速度計
??下圖標明了傳感器的參考坐標系( XYZ組成右手系)以及 3個測量軸和旋轉方向。旋轉的正向可用右手螺旋定則判斷:
三軸加速度計:
ACCEL_XOUT 16位二進制補碼值。存儲最近的X軸加速計測量值。
ACCEL_YOUT 16位二進制補碼值。存儲最近的Y軸加速度計測量值。
ACCEL_ZOUT 16位二進制補碼值。存儲最近的Z軸加速計測量值。
??三個加速度分量均以重力加速度 g 的倍數(shù)為單位,能夠表示的加速度范圍,即倍率可以統(tǒng)一設定,有4個可選倍率:±2g、±4g、±8g、±16g。初始化MPU6050設置加速度計輸出的滿量程范圍為± 2g,加速度計每個 LSB 的靈敏度應為 16384 LSB/g。
滿量程范圍± 2g和靈敏度16384 LSB/g有啥關系?
??上面說了這三個加速度分量是16位的二進制補碼值,且是有符號的。故而其輸出范圍 -32768~32767。((2^16)/2)
??32767/2 = 16384 即加速度計的靈敏度。
那這個靈敏度又有啥用呢?我們拿一組數(shù)據(jù)來舉個例子:
??A X: 03702 Y: 12456 Z: 06268 G X:-00023 Y:-00059 Z: 00005
??加速度計 X 軸獲取原始數(shù)據(jù)位 03702,那么它對應的加速度數(shù)據(jù)是:03702/16384 = 0.23g.
??g為加速度的單位,重力加速度定義為1g, 等于9.8米每平方秒。
??具體的加速度公式:加速度數(shù)據(jù) = 加速度軸原始數(shù)據(jù) / 加速度靈敏度
??或者:加速度數(shù)據(jù) = (加速度軸原始數(shù)據(jù) / 32767) X 可選倍率(即±2g、±4g、±8g、±16g)
(2)陀螺儀
三軸陀螺儀:
GYRO_XOUT 16位二進制補碼值。存儲最新的X軸陀螺儀測量。
GYRO_YOUT 16位二進制補碼值。存儲最新的Y軸陀螺儀測量結果。
GYRO_ZOUT 16位二進制補碼值。存儲最新的Z軸陀螺儀測量結果。
??三個角速度分量均以“度/秒”為單位,能夠表示的角速度范圍,即倍率可統(tǒng)一設定,有4個可選倍率:±250°/s, ±500°/s, ±1000°/s, ±2000°/s。初始化MPU6050設置陀螺儀輸出滿量程范圍為 ± 2000 °/s,陀螺儀每個 LSB 的靈敏度為 16.4 LSB/°/s。
滿量程范圍± 2000 °/s和靈敏度16.4 LSB/°/s有啥關系?
??上面說了這三個陀螺儀分量是16位的二進制補碼值,且是有符號的。故而其輸出范圍 -32768~32767。((2^16)/2)
??32767/2000 = 16.4 即陀螺儀的靈敏度。
那這個靈敏度又有啥用呢?我們用一組數(shù)據(jù)來舉個例子:
??A X: 03702 Y: 12456 Z: 06268 G X:-00023 Y:-00059 Z: 00005
??陀螺儀 X 軸獲取原始數(shù)據(jù)位 -00023,那么它對應的陀螺儀數(shù)據(jù)是:-00023/16.4 = -1.4°/s
??請注意,負號表示設備的旋轉方向與傳統(tǒng)的正方向相反。
??具體的陀螺儀公式:陀螺儀數(shù)據(jù) = 陀螺儀軸原始數(shù)據(jù)/陀螺儀靈敏度
??或者:陀螺儀數(shù)據(jù) = (陀螺儀軸原始數(shù)據(jù) / 32767) X 可選倍率(即±250°/s, ±500°/s, ±1000°/s, ±2000°/s)
??MPU6050 是一款姿態(tài)傳感器,使用它就是為了得到待測物體(如四軸、平衡小車) x、y、z 軸的傾角(俯仰角 Pitch、滾轉角 Roll、偏航角 Yaw) 。我們通過 I2C 讀取到 MPU6050 的六個數(shù)據(jù)(三軸加速度 AD 值、三軸角速度 AD 值)經(jīng)過姿態(tài)融合后就可以得到 Pitch、Roll、Yaw 角。
??更多姿態(tài)融合等資料,可以參考MPU6050開發(fā)的帖子:
https://blog.csdn.net/qq_29350001/category_7303760.html
3.MPU6050寄存器
??這里說明幾個重要的寄存器,詳情查閱官方文檔。
(1)寄存器25 - 采樣速率分頻器(SMPRT_DIV)
參數(shù):
??SMPLRT_DIV 為8位無符號值。 采樣率是通過將陀螺儀輸出速率除以該值來確定的。
描述:
??該寄存器指定用于產(chǎn)生MPU-60X0采樣率的陀螺儀輸出速率的分頻器。傳感器寄存器輸出,F(xiàn)IFO輸出和DMP采樣都基于采樣率。采樣率是通過將陀螺儀輸出速率除以 SMPLRT_DIV 產(chǎn)生的:
采樣率=陀螺儀輸出速率/(1 + SMPLRT_DIV)
當DLPF禁用(DLPF_CFG = 0或7)時,陀螺儀輸出速率= 8kHz,當DLPF使能時(見寄存器26)為1kHz。
??注意:加速度計輸出速率是1kHz。 這意味著對于大于1kHz的采樣率,同一個加速度計采樣可能會不止一次輸出到FIFO,DMP和傳感器寄存器。
(2)寄存器26 - 配置(CONFIG)
注:位7和位6保留
參數(shù):
??EXT_SYNC_SET3位無符號值。 配置FSYNC引腳采樣。
??DLPF_CFG3位無符號值。 配置DLPF設置
描述:
??該寄存器為陀螺儀和加速度計配置外部幀同步(FSYNC)引腳采樣和數(shù)字低通濾波器(DLPF)設置。
??連接到FSYNC引腳的外部信號可以通過配置 EXT_SYNC_SET 進行采樣。
??FSYNC 引腳的信號變化被鎖存,以便捕獲短閃光燈。 鎖存的FSYNC信號將按照寄存器 25 中定義的采樣速率進行采樣。采樣后,鎖存器將復位為當前的 FSYNC 信號狀態(tài)。
??根據(jù)下表,取樣值將被報告在由 EXT_SYNC_SET 的值確定的傳感器數(shù)據(jù)寄存器中的最低有效位的位置。
??DLPF由 DLPF_CFG 配置,加速度計和陀螺儀根據(jù) DLPF_CFG 的值進行過濾,如下表所示。
(3)寄存器27 - 陀螺儀配置(GYRO_CONFIG)
注:位2到位0被保留。
參數(shù):
??XG_ST設置此位將導致X軸陀螺儀執(zhí)行自檢。
??YG_ST設置此位將使Y軸陀螺儀執(zhí)行自檢。
??ZG_ST 設置該位使Z軸陀螺儀執(zhí)行自檢。
??FS_SEL 2位無符號值。 選擇陀螺儀的全量程范圍。
描述:
??該寄存器用于觸發(fā)陀螺儀自檢并配置陀螺儀的滿量程范圍。
??陀螺儀自檢允許用戶測試機械和電氣部分陀螺儀。每個陀螺儀軸的自檢可通過控制該寄存器的XG_ST,YG_ST和ZG_ST位來激活。每個軸的自檢可以獨立進行,也可以同時進行。
??當自檢被激活時,車載電子裝置將啟動適當?shù)膫鞲衅鳌_@種驅動將使傳感器的檢測質(zhì)量移動一段相當于預先確定的科里奧利力的距離。這種檢測質(zhì)量位移導致傳感器輸出發(fā)生變化,這反映在輸出信號中。輸出信號用于觀察自檢響應。
自檢響應定義如下:
??自檢響應=啟用自檢的傳感器輸出 - 未啟用自檢的傳感器輸出
??每個陀螺儀軸的自檢限制在MPU-6000 / MPU-6050產(chǎn)品規(guī)格文件。當自檢的價值響應在產(chǎn)品規(guī)格的最小/最大范圍內(nèi),零件已通過自??檢。當自檢響應超過文檔中指定的最小/最大值時,該部分被認為是自檢失敗。
??FS_SEL根據(jù)下表選擇陀螺儀輸出的滿量程范圍。
(4)寄存器28 - 加速度計配置(ACCEL_CONFIG)
參數(shù):
??XA_ST 當設置為1時,X軸加速度計執(zhí)行自檢。
??YA_ST當設置為1時,Y軸加速度計執(zhí)行自檢。
??ZA_ST設置為1時,Z軸加速計執(zhí)行自檢。
??AFS_SEL 2位無符號值。 選擇加速度計的全量程范圍。
描述:
??該寄存器用于觸發(fā)加速度計自檢并配置加速度計滿量程范圍。該寄存器還配置數(shù)字高通濾波器(DHPF)。
??加速度計自檢允許用戶測試加速度計的機械和電子部分。每個加速度計軸的自檢可通過控制該寄存器的XA_ST,YA_ST和ZA_ST位來激活。每個軸的自檢可以獨立進行,也可以同時進行。
??當自檢被激活時,車載電子裝置將啟動適當?shù)膫鞲衅鳌_@種致動模擬外力。被驅動的傳感器又將產(chǎn)生相應的輸出信號。輸出信號用于觀察自檢響應。
自測響應定義如下:
??自檢響應=啟用自檢的傳感器輸出 - 未啟用自檢的傳感器輸出
??MPU-6000 / MPU-6050產(chǎn)品規(guī)格文檔的電氣特性表中提供了每個加速度計軸的自檢限制。當自檢響應值在產(chǎn)品規(guī)格的最小/最大范圍內(nèi)時,該部件已通過自??檢。當自測響應超過文檔中指定的最小/最大值時,該部分被認為是自檢失敗。
??AFS_SEL 根據(jù)下表選擇加速度計輸出的滿量程范圍。
(5)寄存器59到64 - 加速度計測量
參數(shù):
??ACCEL_XOUT 16位二進制補碼值。存儲最近的X軸加速計測量值。
??ACCEL_YOUT 16位二進制補碼值。存儲最近的Y軸加速度計測量值。
??ACCEL_ZOUT 16位二進制補碼值。存儲最近的Z軸加速計測量值。
描述:
??這些寄存器存儲最新的加速度計測量結果。
??按照 寄存器25 中定義的采樣率將加速度計測量值寫入這些寄存器。
??加速度計測量寄存器以及溫度測量寄存器,陀螺儀測量寄存器和外部傳感器數(shù)據(jù)寄存器由兩組寄存器組成:內(nèi)部寄存器組和面向用戶的讀取寄存器組。
??加速度計傳感器內(nèi)部寄存器組內(nèi)的數(shù)據(jù)總是以采樣率更新。同時,只要串行接口空閑,面向用戶的讀取寄存器組就會復制內(nèi)部寄存器組的數(shù)據(jù)值。這保證了傳感器寄存器的突發(fā)讀取將從相同的采樣時刻讀取測量結果。請注意,如果不使用突發(fā)讀取,則用戶負責通過檢查數(shù)據(jù)就緒中斷來確保一組單個字節(jié)的讀取對應于單個采樣時刻。
??每個16位加速度計的測量結果都在 ACCEL_FS(寄存器28)中定義了一個滿量程。對于每個滿量程設置,ACCEL_xOUT 中的每個 LSB 的加速度計靈敏度如下表所示。
(6)寄存器65和66 - 溫度測量(TEMP_OUT_H和TEMP_OUT_L)
參數(shù):
??TEMP_OUT 16位有符號值。存儲最近的溫度傳感器測量值。
描述:
??這些寄存器存儲最新的溫度傳感器測量值。
??溫度測量值按照 寄存器25 中定義的采樣率寫入這些寄存器。
??這些溫度測量寄存器以及加速度計測量寄存器,陀螺儀測量寄存器和外部傳感器數(shù)據(jù)寄存器由兩組寄存器組成:內(nèi)部寄存器組和面向用戶的讀取寄存器組。
??溫度傳感器內(nèi)部寄存器組內(nèi)的數(shù)據(jù)始終以采樣率進行更新。
??同時,只要串行接口空閑,面向用戶的讀取寄存器組就會復制內(nèi)部寄存器組的數(shù)據(jù)值。這保證了傳感器寄存器的突發(fā)讀取將從相同的采樣時刻讀取測量結果。請注意,如果不使用突發(fā)讀取,則用戶負責通過檢查數(shù)據(jù)就緒中斷來確保一組單個字節(jié)的讀取對應于單個采樣時刻。
??電氣規(guī)格表(MPU-6000 / MPU-6050產(chǎn)品規(guī)格文檔第6.4節(jié))中提供了溫度傳感器的比例因子和偏移量。
??對于給定的寄存器值,溫度(攝氏度)可以被計算為:
以℃為單位的溫度=(TEMP_OUT寄存器值作為有符號數(shù)量)/ 340 + 36.53
??請注意,上述公式中的數(shù)學是十進制的。
(7)寄存器67至72 - 陀螺儀測量
參數(shù):
??GYRO_XOUT 16位二進制補碼值。存儲最新的X軸陀螺儀測量。
??GYRO_YOUT 16位二進制補碼值。存儲最新的Y軸陀螺儀測量結果。
??GYRO_ZOUT16位二進制補碼值。存儲最新的Z軸陀螺儀測量結果。
描述:
??這些寄存器存儲最近的陀螺儀測量結果。
??陀螺儀測量值按寄存器25中定義的采樣率寫入這些寄存器。
這些陀螺儀測量寄存器以及加速度計測量寄存器,溫度測量寄存器和外部傳感器數(shù)據(jù)寄存器由兩組寄存器組成:內(nèi)部寄存器組和面向用戶的讀取寄存器組。
??陀螺儀傳感器內(nèi)部寄存器組內(nèi)的數(shù)據(jù)總是以采樣率更新。
??同時,只要串行接口空閑,面向用戶的讀取寄存器組就會復制內(nèi)部寄存器組的數(shù)據(jù)值。這保證了傳感器寄存器的突發(fā)讀取將從相同的采樣時刻讀取測量結果。請注意,如果不使用突發(fā)讀取,則用戶負責通過檢查數(shù)據(jù)就緒中斷來確保一組單個字節(jié)的讀取對應于單個采樣時刻。
??每個16位陀螺儀測量具有在 FS_SEL(寄存器27)中定義的滿量程。對于每個滿量程設置,GYRO_xOUT中陀螺儀每個LSB的靈敏度如下表所示:
(8)寄存器107 - 電源管理1 (PWR_MGMT_1)
注:位4保留。
參數(shù):
??DEVICE_RESET設置為1時,該位將所有內(nèi)部寄存器復位為默認值。一旦復位完成,該位自動清零。每個寄存器的默認值可以在第3節(jié)找到。
??SLEEP當該位置1時,該位將MPU-60X0置于睡眠模式。
??CYCLE當該位設置為1且SLEEP被禁止時,MPU-60X0將循環(huán)。在睡眠模式和喚醒之間以LP_WAKE_CTRL(寄存器108)確定的速率從活動傳感器獲取單個樣本數(shù)據(jù)。
??TEMP_DIS設置為1時,該位禁用溫度傳感器。
??CLKSEL 3位無符號值。 指定設備的時鐘源。
描述:
??該寄存器允許用戶配置電源模式和時鐘源。它還提供了一些重置整個設備,以及一些禁用溫度傳感器。
??通過將 SLEEP 設置為1,MPU-60X0 可以進入低功耗睡眠模式。當 CYCLE 設置為1而睡眠模式被禁用時,MPU-60X0 將進入循環(huán)模式。在周期模式下,器件在休眠模式和喚醒之間循環(huán),以由 LP_WAKE_CTRL(寄存器108)確定的速率從加速計獲取單個采樣。要配置喚醒頻率,請使用 電源管理2寄存器(寄存器108)內(nèi)的 LP_WAKE_CTRL。
??MPU-60X0 時鐘源可選擇內(nèi)部 8MHz 振蕩器,基于陀螺儀的時鐘或外部時鐘源。當選擇內(nèi)部 8MHz 振蕩器或外部時鐘源作為時鐘源時,MPU-60X0 可以在陀螺儀禁用的低功耗模式下工作。
??上電時,MPU-60X0 時鐘源默認為內(nèi)部振蕩器。但是,強烈建議將器件配置為使用其中一個陀螺儀(或外部時鐘源)作為時鐘參考,以提高穩(wěn)定性。時鐘源可以按照下表進行選擇。
(9)寄存器117 - 我是誰(WHO_AM_I)
注:位0和7保留。 (硬編碼為0)
參數(shù):
??WHO_AM_I包含MPU-60X0的6位I2C地址。
??位6:位1的上電復位值為110 100。
描述:
??**該寄存器用于驗證設備的身份。 **WHO_AM_I的內(nèi)容是MPU-60X0的7位I2C地址的高6位。 MPU-60X0的I2C地址的最低有效位由AD0引腳的值決定。 該寄存器不反映AD0引腳的值。
??該寄存器的默認值是0x68。
四、實驗步驟
??第1步:連接電路。
樹莓派 | T型轉接板 | BMP180氣壓傳感器 |
---|---|---|
SCL | SCL | SCL |
SDA | SDA | SDA |
5V | 5V | VCC |
GND | GND | GND |
??第2步:PCF8591模塊采用的是I2C(IIC)總線進行通信的,但是在樹莓派的鏡像中默認是關閉的,在使用該傳感器的時候,我們必須首先允許IIC總線通信。
??第3步:查詢MPU6050的地址。得出地址為0x68。
pi@raspberrypi:~ $ sudo i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
??第4步:編寫控制程序。使用Python 2編寫的程序比C++簡潔許多,smbus函數(shù)請在之前的I2C文章中查閱。
??樹莓派基礎實驗12:PCF8591模數(shù)轉換器實驗
??實驗結果示例:
gyro_xout : -546 scaled: -5
gyro_yout : -26 scaled: -1
gyro_zout : 82 scaled: 0
accel_xout: 1132 scaled: 0.069091796875
accel_yout: 3912 scaled: 0.23876953125
accel_zout: 14324 scaled: 0.874267578125
x rotation: 15.2301539313
y rotation: -4.35957842715
??控制程序:
#!/usr/bin/python
import smbus
import math
import time
# 電源管理寄存器地址
power_mgmt_1 = 0x6b
power_mgmt_2 = 0x6c
def read_byte(adr):
return bus.read_byte_data(address, adr)
def read_word(adr):
high = bus.read_byte_data(address, adr)
low = bus.read_byte_data(address, adr+1)
val = (high << 8) + low
return val
def read_word_2c(adr):
val = read_word(adr)
if (val >= 0x8000):
return -((65535 - val) + 1)
else:
return val
def dist(a,b):
return math.sqrt((a*a)+(b*b))
#math.sqrt(x) 方法返回數(shù)字x的平方根。
def get_y_rotation(x,y,z):
radians = math.atan2(x, dist(y,z))
#math.atan2(y, x) 返回給定的 X 及 Y 坐標值的反正切值。
return -math.degrees(radians)
#math.degrees(x) 將弧度x轉換為角度。
def get_x_rotation(x,y,z):
radians = math.atan2(y, dist(x,z))
return math.degrees(radians)
bus = smbus.SMBus(1) # or bus = smbus.SMBus(1) for Revision 2 boards
address = 0x68 # This is the address value read via the i2cdetect command
# Now wake the 6050 up as it starts in sleep mode
bus.write_byte_data(address, power_mgmt_1, 0)
while True:
time.sleep(0.1)
gyro_xout = read_word_2c(0x43)
gyro_yout = read_word_2c(0x45)
gyro_zout = read_word_2c(0x47)
print ' '
print "gyro_xout : ", gyro_xout, " scaled: ", (gyro_xout / 131) #倍率:±250°/s
print "gyro_yout : ", gyro_yout, " scaled: ", (gyro_yout / 131)
print "gyro_zout : ", gyro_zout, " scaled: ", (gyro_zout / 131)
accel_xout = read_word_2c(0x3b)
accel_yout = read_word_2c(0x3d)
accel_zout = read_word_2c(0x3f)
accel_xout_scaled = accel_xout / 16384.0 #倍率:±2g
accel_yout_scaled = accel_yout / 16384.0
accel_zout_scaled = accel_zout / 16384.0
print "accel_xout: ", accel_xout, " scaled: ", accel_xout_scaled
print "accel_yout: ", accel_yout, " scaled: ", accel_yout_scaled
print "accel_zout: ", accel_zout, " scaled: ", accel_zout_scaled
print "x rotation: " , get_x_rotation(accel_xout_scaled, accel_yout_scaled, accel_zout_scaled)
print "y rotation: " , get_y_rotation(accel_xout_scaled, accel_yout_scaled, accel_zout_scaled)
time.sleep(0.5)