打造我的聊天機器人!
系列五:實作 I2C 機制讓兩片開發板相互溝通
在前一個系列:使用 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資料的指令如下:
- 第14行:初始化傳送I2C資料的連線,並指定要接收的I2C設備ID為1。
- 第17/20/23行:透過Wire.write()傳送one byte的資料,
- 第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範例可參考以下連結: