打造我的聊天機器人!

系列五:實作 I2C 機制讓兩片開發板相互溝通

wesleyboy42
Maker Cup
Published in
5 min readJun 27, 2016

--

在前一個系列:使用 IBM IoT 平台和 MQTT 操控機器人動作有提到直接在7688 duo開發版上直接操作步進馬達,在本文將會介紹使用I2C的方式操控另外一片開發版。

I2C指的是兩片開發版能透過兩根Pin來直接溝通,分別是SCL和SDA,每個開發版通常都會有定義這兩根Pin,以下將用Arduino NANO和7688 Duo當範例。

Arduino NANO中是使用A4作為SDA,A5作為SCL;在7688 Duo中是使用D2作為SDA,D3作為SCL,接線方式如下,就是將SDA接SDA(藍),SCL接SCL(黃),GND接GND(黑),5V接5V(紅):

如果你是使用7688 duo breakout的話,可以直接接在擴充版的SCL和SDA腳位:

備註:7688和7688 Duo的SCL和SDA腳位不在同個地方,如果想接7688可參考官網

接好Pin腳後,首先會撰寫I2C的Master程式,Master指的是控制方,在本文範例中指的Master就是7688 Duo,意思是7688 Duo從MQTT收到動作指令(Action)後,再透過I2C傳送指令到另外一片開發版(Arduino NANO)。

我們將會修改系列四的Arduino範例:

在第一行加上I2C會用到的函式庫(Wire.h),然後在setup()中初始化I2C,也就是第七行Wire.begin()。

初始化完就可以在loop()中傳送I2C資料到Slave,也就是另外一片開發版。

傳送I2C資料前,要先初始化傳送資料的連線,傳送完畢也要記得關閉連線,傳送I2C資料的指令如下:

  1. 第14行:初始化傳送I2C資料的連線,並指定要接收的I2C設備ID為1。
  2. 第17/20/23行:透過Wire.write()傳送one byte的資料,
  3. 第28行:結束與I2C設備ID為1的連線。

初始化連線時,指定I2C設備ID的原因是,I2C的Master最多可以接128個Slave設備ID,因此每次傳送I2C資料的時候都要先指定Slave設備ID。

如果想更深入的話,還能實作多個Master和多個Slave,但在本文將只會用到一個Master和一個Slave。

以上就完成了I2C Master的範例,完整的程式可參考以下連結:

寫完Master範例後,接下來是Slave,也就是被控制方,在本文範例中指的就是機器人。

但為什麼我們的機器人不直接接在7688 Duo上就好了呢?因為機器人上的元件太多或是所需的Pin腳太多,一個7688 Duo可能都接不完,因此需要額外一片開發版來做控制,類似以下兩個範例:

機器人範例是太多元件,所以單獨用一個的Arduino NANO來控制所有馬達的轉動;兩個LED燈矩陣組成眼睛表情,也會把一個Arduino NANO的Pin腳都用光。

所以以上兩個範例都需要獨立用一個Arduino NANO來控制機器人行為。

Slave範例一樣要先在第一行加上I2C會用到的函式庫(Wire.h),然後在setup()中初始化I2C。

初始化I2C的時候先定義Slave設備ID 1,意思是將會監聽來自Mater發送指定設備ID為1的I2C資料。

如果監聽到I2C資料會透過onReceive函數來執行receiveEvent(Callback)函數,而這個receiveEvent將是自己定義的函數,稍後將會介紹這部分。

其中第三行和第四行則是定義兩個變數,一個是Action,意思是如果有監聽到I2C資料則把Action設為True;motion則是儲存接收到的動作指令。

在receiveEvent(Callback)函數中,我們將在第33行判斷是否有I2C資料可以讀取,如果有的話,在第34行透過Wire.read()讀取one byte並儲存在motion變數中,而且在第35行把Action設為true,代表機器人要開始動作。

最後在loop()中,透過Action和motion的變數來執行相對應的機器人動作。

詳細的Slave範例可參考以下連結:

--

--