這裡介紹如何更改 Arduino 內建的 Wire 函式庫,提高 I2C 傳輸協定的 baud rate 到 400 KHz,增加資料傳輸的速度。
一般市面上的感測器(sensors)中,如果傳輸的資料量不大的話,大概都會使用 I2C 這種傳輸協定,而 Arduino 內建的 Wire 函式庫本身就有支援 I2C,這種傳輸協定的特色就是接線簡單,它只需要串列資料(SDA)及串列時脈(SCL)兩條線就可以進行資料的傳輸,再加上供應電源的 VCC 與 GND,總共只需要接四條線,不過缺點就是資料傳輸的速率比較慢一些。
Wire
函式庫中預設是使用最慢的 100KHz,如果您的感測器需要比較快的傳輸速度,可以稍微修改一下 Wire
的 twi.h
標頭檔,將 baud rate 提高以加速資料的傳輸。
twi.h
標頭檔在各種不同的系統中路徑有些小差異,Windows 中的路徑為
C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\utility\twi.h
在 Mac OS X 中如果您是直接按照正常的安裝方式將 Arduino 拖進 Applications 中的話,路徑就是
/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/libraries/Wire/utility/twi.h
若在 Linux 系統之下,twi.h
的路徑則為 Arduino 的安裝路徑再加上
hardware/arduino/avr/libraries/Wire/utility/twi.h
開啟 twi.h
這個標頭檔之後,找尋定義 TWI_FREQ
的地方:
#ifndef TWI_FREQ #define TWI_FREQ 100000L #endif
這個 TWI_FREQ
所指定的值就是 I2C 的 baud rate,其預設值為 100000L
(也就是 100KHz),如果要提高資料的傳輸速率,可以將這個值改為 400000L
(亦即 400KHz)。
修改完成之後,再刪除 hardware/libraries/Wire/Wire.o
、 hardware/libraries/Wire/utility/twi.o
這兩個檔案,強迫 Wire
函式庫重新編譯(或是直接關閉 Arduino IDE 再重新開啟也可以,Arduino IDE 會自動檢查並且重新編譯必要的部份)。
如果您的感測器支援高於 400KHz 的 baud rate,也可以依照感測器所支援的速度來設定,例如 MPU-6050 這個加速度計與陀螺儀六軸感測器就有支援到 500KHz,所以如果 Arduino 的 I2C 匯流排只有連接 MPU-6050 的話,也可以直接設定為 500000L
。
設定 baud rate 時,一定要先看看自己的 I2C 裝置(通常就是各種感測器)支援到多快的速度,如果設定的速度超過了裝置本身支援的速度上限的話,就會無法跟該設備連線。100KHz 是最基本的速度,一般的 I2C 裝置應該都可以使用這個速度,如果您發現您的 I2C 裝置無法連線,可以調回這個速度測試看看。
如果您對於 Arduino 的相關應用有興趣,建議您可以繼續閱讀物聯網的文章。
參考資料:Arduino