Arduino | I2C練習(1):使用兩個Arduino做溝通


Arduino | I2C練習(1):使用兩個Arduino做溝通


千里始於足下,動手做才知道Arduino的好玩

I2C的原理

I2C的原理請參見<I2C原理參考>,黑修斯此篇只有簡單介紹。
I2C通訊是利用兩條實體線進行的通訊機制,分別為序列資料線(SDA) 與 序列時脈線(SCL),中間需要串聯上拉電阻。
  • 主控端數量:可以多個  
  • 連線速率: 100kbps標準模式 400Kbps快速模式 3.4Mbps高速模式 
  • 確認機制:有,收到資料會發送通知資料 

實驗器材

  1. Arduino UNO 開發板
  2. Arduino MEGA 2560  開發板
  3. 1.8K Ω 的電阻 2個 
  4. 杜邦線6條 

實驗項目

  1. 使用兩個Arduino 開發板做溝通---單方面回傳hello 
  2. 使用兩個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
/*
時間: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(); //結束通訊
}
view raw I2C_Test_M1.ino hosted with ❤ by GitHub
從端(Arduino MEGA 2560)程式碼:本人是設定給Arduino MEGA 2560,並定址為3號從端
/*
時間: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的內容
}
}
view raw I2C_Test_S1.ino hosted with ❤ by GitHub

最後,你可以觀察到,確定有收到主端Arduino UNO透過I2C發過來的訊號。



2.使用兩個arduino做溝通---透過指令回傳

實驗二與實驗一的線路接法相同,差別在這次將UNO跟MEGA2560上的USB通訊埠一同連接電腦,因為此次是透過電腦下達指令(透過serial port)給主端,主端發出對應訊號透過I2C給MEGA2560,而MEGA2560再透過serial port印出。



動作說明

主端等待電腦端透過Serial發出訊號,若是接收到對應的指令,會透過I2C將相關指令發給從端3號,而主端會透過Serial回傳"指令1已經發送",而從端3號收到來至主端的指令會透過Serial印出。

實驗二從端程式:跟實驗一程式一樣,主端發送什麼指令,從端就印出什麼指令。
(請複製實驗一的程式碼)

實驗二主端程式:
/*
時間: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已經發送"
}
}
}
view raw I2C_Test_S2.ino hosted with ❤ by GitHub

開啟序列埠來觀察

開啟兩個序列埠來輸入與監測,對主端發送101010,看看結果。


確實程式的動作都有完美執行。



使用PuTTy連線測試

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



好書推薦

<超圖解Arduino互動設計入門 第三版,趙英傑,旗標>

對Arduino有濃厚的興趣,想要在深入了解原理的地方,請參考 "趙英傑"老師的書,目前出到第三版,而這本書是黑修斯大學時代,教授上課用的教科書本之一,這本書內容生動有趣,基礎原理講述清楚明白,非常適合入門初學與基礎打底。黑修斯自己更是從書中獲益良多,這本書被Arduino的創辦人看過之後,也連絡 "趙英傑"老師出版成國際英文版呢。

Reference

超圖解Arduino互動設計入門 第二版,趙英傑,旗標。(註:已經有第三版)
I2C bus 簡介 (Inter-Integrated Circuit Bus) @ 傑克! 真是太神奇了! :: 痞客邦 ::
黑修斯的GitHub_ArduinoHC_I2C (相關程式碼都在此)

轉貼本文時,需註明來自黑修斯隨手札記原創作者 hughes chen(黑修斯),及附上原文連結,同時 禁止修改,禁止商業使用 。

張貼留言

0 留言