2015年7月31日 星期五

Arduino 之間的 I2C 通訊 (序) 簡單介紹

一直有興趣用不同的方式把細小的 arduino 系統組成一個大系統, 剛剛看了 幻生幻灭 大大 的 世界最小的Arduino——ATTiny13上手全攻略1A简介, 心思思想買回來試試.
初步的目標, 是用 ATTiny13 把 一般舵機改成 總線舵機.  雖然已有 PCA9685 之顃 經 i2c 通訊的控制板, 但每個舵機還是直接連到控制板上, 接線相對比較長而且混亂.  如果可以做出總線舵機的效果, 每個舵機之間以三根線連上, 可以一個一個連開去, 又可以中途分開幾個, 又或者直接連到主板.  變化比較大, 而且方便很多.  所以, 還是值得嘗試的.

在未有 ATTiny13 之前, 先研究一下 arduino 之間的 I2C 通訊吧.

在網上不難找到教學, 但很多都只是以一個 byte 通訊, 不足以滿足我的要求, 所以嘗試自己做一些簡單的應用例子, 將來或許用得著, 希望對大家有幫助.

由於網上有不少資源, 太深入的未必人人有興趣, 而且我自己也不慬, 所以, 嘗試用簡單的例子把一些重點拿出來討論.  如果說錯了什麼, 還望大家幫忙指證.

I2C 通訊的特性

首先 要了解 I2C 跟其他通訊(例如串口) 的分別

  • I2C 是 master & slave 的設計
  • 整個線路上只有一個 master, 其他的都是 slave
  • 只有 master 可以 向 slave 進行通訊
  • slave 與 slave 之間是不可以通訊的
  • 只有 master 可以主動向 slave 發送資料或提出請求
  • slave 只可因應 master 的請求而回傳資料, 不可以主動發送資料給 master


I2C 通訊有什麼好處?


  • 可以同時以 1 master 連接多個 slave 設備 
  • 速度快
  • 不需另外購買通訊模塊, 可以說是完全免費的
  • 只需三根線連通就可以, 不用複雜的連線


I2C 通訊有什麼缺點?


  • 由於 I2C 是 master 主導, 所有 slave 板子都不能主動提出通訊要求, 亦不能跟其他 slave 通訊.  程式設定上, 就要有一個主控制板, 其他都只是分工.  
  • slave 板子不能用來連接其他 i2c 設備 (除非大神們另外寫一個 Wire 庫, 用其他接口吧)

因此, 分工的時間, slave 只可以分擔非 i2c 的設備, 對於 i2c 的設備, 還是要靠 master 自己負責.
所以 master 除了要管理 slave 的分工外, 還要處理 i2c 設備.



準備功夫:

要做的 I2C 通訊, 只需要 Wire 庫就可以了 (當然, 對於大神來說, Wire 庫也可以不需要, 自己完全做出來也可以.), 所以基本上不需要再找什麼庫.

當然, 如果配合 I2Cdev 之顃的庫, 一定程度上可以簡單一點.  但為了方便大家了解, 還是用最基本的 Wire 指令.   將來大家想用什麼庫也沒限制.

我嘗試做一個 I2C 通訊系統的例子, 由簡單的一步步建立, 每一個段落的例子都可以獨立進行測試, 希望大家可以一步步了解.

由於是通訊系統,  最少要準備 兩塊 arduino 板子, 不需要是相同的, 任何組合也可以 (UNO, Nano, Mini, Mega 也沒關係).
三根杜邦線, 把 GND, A4, A5 都連上.  連接方法就是 相同的連起來.  GND-GND, A4-A4, A5-A5, 有多少塊都是接在一起就可以了.

為了方便之後的討論, 請選定一個作為 master, 其他都是 slave.  以後會用 master 板子, 及 slave 板子作稱呼.


暫定會有以下的題目, 將會一步一步發出, 完成後, 希望大家都可以做出一個簡單的 i2c 通訊系統.

(1) I2C 地址設定 及 I2C 地址掃瞄
(2) 由 master 向 slave 發送資料/發出指令 [slave 直接處理]
(3) 由 master 向 slave 發送資料/發出指令 [slave 延遲處理]
(4) 由 master 向 slave 要求資料回傳
(5) master 向 slave 要求不同資料
(6) 由 master 提供參數, 再由 slave 作出相應的回復
(7) 單片機有效傳送數據的選擇
(8) 浮點的傳送
(9) I2C 通訊實例(一) 簡單傳感數據收集 (把非 i2c 傳感變成 i2c)
(10) I2C 通訊實例(二) PM2.5 數據收集 (把較長時間的收集由 slave 完成)
(11) I2C 通訊實例(三) 總線舵機 (由 master 向 slave 發送指令)


以上只耍 (1) -  (4) 就可以了作出基本通訊, 而 (5), (6) 是加入一些簡單通訊協定, 讓 slave 有更多功能, 之後是一些實例, 用來演示 i2c 通訊的應用.

相關程式只在演示通訊的功能, 對 Wire 的錯誤完是沒有處理的, 有興趣可自己加入錯誤處理的程序.

1 則留言: