2011年12月23日 星期五

多台 Arduino 間的通訊 - 透過 I2C #3

在前面兩篇 (#1#2) 中,我們已經學會如何讓 Master 送資料給 Slave,其實也可以反其道而行,Slave 也可以送資料給 Master,接下來我們就來學習怎麼做。

接線

image

老樣子,這兩台 Arduino 一台是 Master,一台是 Slave,其中 Slave 所用的 address 為 1。

程式

要叫 Slave 送資料給 Master 會涉及兩個動作:

  1. Master 必須用 Wire.requestFrom() 發出 request 給 slave
  2. Slave 在收到 request 後就把資料傳給 Master

底下是 Master 的程式:

程式說明:

  • Master 使用 Wire.begin() 加入 I2C bus
  • 在 loop() 函式中,Master 首先會用 Wire.requestFrom(SLAVE_ADDRESS, 6) 發出 request 給指定的 slave 並且要求 6 個 bytes 的資料
  • 接著 Master 會用 Wire.available()  檢查有沒有收到資料,如果有就用 Wire.read() 讀取 slave 送過來的資料,然後再將資料印到 serial port 上

底下是 Slave 的程式:

程式說明:

  • Slave 一樣是使用 Wire.begin() 加入 I2C bus,但是必須傳入一個參數指定所用的 address
  • 利用 Wire.onRequest(requestEvent) 註冊事件,之後當 Master 發出 request 給 Slave 時,Arduino 就會自動呼叫 requestEvent()
  • 在 requestEvent() 中,Slave 做的事很簡單,只是把 "hello\n" 這 6 個 bytes 的資料傳給 Master 而已
執行結果

把兩支程式上傳到兩塊 Arduino 板子上後,打開 Master 的 Serial Monitor,你就會看到 Serial Monitor 上每 1 秒鐘會出現一行 "hello":

image_thumb[3]
▲ 這些是從 Slave 送過來的資料

參考資料

0 意見: