
Arduino | I2C練習(1):使用兩個Arduino做溝通
千里始於足下,動手做才知道Arduino的好玩
I2C的原理
I2C的原理請參見<I2C原理參考>,黑修斯此篇只有簡單介紹。I2C通訊是利用兩條實體線進行的通訊機制,分別為序列資料線(SDA) 與 序列時脈線(SCL),中間需要串聯上拉電阻。
- 主控端數量:可以多個
- 連線速率: 100kbps標準模式 400Kbps快速模式 3.4Mbps高速模式
- 確認機制:有,收到資料會發送通知資料
實驗器材
- Arduino UNO 開發板
- Arduino MEGA 2560 開發板
- 1.8K Ω 的電阻 2個
- 杜邦線6條
實驗項目
- 使用兩個Arduino 開發板做溝通---單方面回傳hello
- 使用兩個Arduino 開發板做溝通---透過指令回傳
1.使用兩個arduino做溝通---單方面回傳hello
程式是參考趙英傑老師的書<超圖解Arduino互動設計入門 第二版>,用來熟悉I2C的軟體端操作,另外I2C可不是只有透過程式可以操作,也可以使用硬體的方式才操作。動作設定
主從端設定Arduino UNO | 主端(Master) |
Arduino MEGA 2560 | 從端(Client) |
UNO GND <---> MEGA 2560 GND
UNO 5V <---> 1.8K Ω 的電阻 <---> UNO SDA <---> MEGA 2560 SDA
UNO 5V <---> 1.8K Ω 的電阻 <---> UNO SCL <---> MEGA 2560 SCL
動作說明
主端(Arduino UNO)不斷發送"hello"的字串,透過I2C給從端3號(為Arduino MEGA 2560,黑修斯設定為從端3號),並透過Serial印出。
開啟序列埠來觀察
將Arduino MEGA 2560與電腦連接,開啟序列埠觀察。主端(Arduino UNO)程式碼:本人是設定給Arduino UNO
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
時間:2018/05/24 | |
作者:黑修斯(陳建仲) | |
版本v1 | |
程式名稱:I2C測試程式---用於兩個arduino溝通---單方面回傳hello | |
說明:I2C主端的程式設定 | |
*/ | |
#include <Wire.h> //插入I2C函式庫<Wire> | |
void setup(){ | |
Wire.begin(); //I2C位址與連線設定,主端不用設 | |
} | |
void loop(){ | |
Wire.beginTransmission(3); //開始傳送,指定給從端3號 | |
Wire.write("hello \n"); //寫入訊息 hello \n | |
Wire.endTransmission(); //結束通訊 | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
時間:2018/05/24 | |
作者:黑修斯(陳建仲) | |
版本v1.01 | |
程式名稱:I2C測試程式---用於兩個arduino溝通---單方面回傳hello | |
說明:說明:I2C從端的程式設定 | |
*/ | |
#include <Wire.h> | |
void setup(){ | |
Wire.begin(3); //I2C位址與連線設定,這裡設定為3號 | |
Wire.onReceive(receiveEvent); //當收到I2C訊號時,啟動的動作 | |
Serial.begin(9600); //Serial輸出鮑率為9600 | |
} | |
void loop(){ | |
delay(100); //延遲0.1秒 | |
} | |
//自定義的接收後的啟動副程式 | |
void receiveEvent(int numBytes){ | |
while(Wire.available()){ //判斷Wire.available()有沒有訊號 | |
char c = Wire.read(); //將傳入的訊號Wire.read()指定給字串C | |
Serial.print(c); //透過Serial印出字串C的內容 | |
} | |
} |
最後,你可以觀察到,確定有收到主端Arduino UNO透過I2C發過來的訊號。

2.使用兩個arduino做溝通---透過指令回傳
實驗二與實驗一的線路接法相同,差別在這次將UNO跟MEGA2560上的USB通訊埠一同連接電腦,因為此次是透過電腦下達指令(透過serial port)給主端,主端發出對應訊號透過I2C給MEGA2560,而MEGA2560再透過serial port印出。動作說明
主端等待電腦端透過Serial發出訊號,若是接收到對應的指令,會透過I2C將相關指令發給從端3號,而主端會透過Serial回傳"指令1已經發送",而從端3號收到來至主端的指令會透過Serial印出。實驗二從端程式:跟實驗一程式一樣,主端發送什麼指令,從端就印出什麼指令。
(請複製實驗一的程式碼)
實驗二主端程式:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
時間:2018/05/24 | |
作者:黑修斯(陳建仲) | |
版本v2 | |
程式名稱:I2C測試程式---用於兩個arduino溝通---透過指令回傳 | |
說明:I2C主端程式 | |
*/ | |
#include <Wire.h> //插入I2C函式庫 | |
int val; //定義val為整數 | |
void setup(){ | |
Serial.begin(9600); //設定serial 鮑率為9600 | |
Wire.begin(); //I2C位址與連線設定,主端不用設 | |
} | |
void loop(){ | |
if(Serial.available()){ //判斷Serial.available())有沒有訊號 | |
val = Serial.read(); //將傳入的訊號Serial.read()指定給val | |
if(val == '1'){ //如果val == 字串1 執行內容 | |
Wire.beginTransmission(3); //開始傳送,指定給從端3號 | |
Wire.write("1"); //寫入訊息 "1" | |
Wire.endTransmission(); //結束通訊 | |
Serial.println("指令1已經發送"); //透過Serial印出 "指令1已經發送" | |
} | |
if(val == '0'){ //如果val == 字串0 執行內容 | |
Wire.beginTransmission(3); //開始傳送,指定給從端3號 | |
Wire.write("0"); //寫入訊息 "0" | |
Wire.endTransmission(); //結束通訊 | |
Serial.println("指令0已經發送"); //透過Serial印出 "指令0已經發送" | |
} | |
} | |
} |
開啟序列埠來觀察
開啟兩個序列埠來輸入與監測,對主端發送101010,看看結果。
確實程式的動作都有完美執行。

使用PuTTy連線測試
那我們來用看看PuTTy連線呢?動作也有完美執行。
關於PuTTy的操作,請見這篇

好書推薦
<超圖解Arduino互動設計入門 第三版,趙英傑,旗標>
對Arduino有濃厚的興趣,想要在深入了解原理的地方,請參考 "趙英傑"老師的書,目前出到第三版,而這本書是黑修斯大學時代,教授上課用的教科書本之一,這本書內容生動有趣,基礎原理講述清楚明白,非常適合入門初學與基礎打底。黑修斯自己更是從書中獲益良多,這本書被Arduino的創辦人看過之後,也連絡 "趙英傑"老師出版成國際英文版呢。
Reference
超圖解Arduino互動設計入門 第二版,趙英傑,旗標。(註:已經有第三版)I2C bus 簡介 (Inter-Integrated Circuit Bus) @ 傑克! 真是太神奇了! :: 痞客邦 ::
黑修斯的GitHub_ArduinoHC_I2C (相關程式碼都在此)
轉貼本文時,需註明來自黑修斯隨手札記原創作者 hughes chen(黑修斯),及附上原文連結,同時 禁止修改,禁止商業使用 。
0 留言
不一定能即時回覆問題,有時間會盡量答覆。