สื่อสารระหว่างบอร์ดด้วย I2C (Inter-Integrated Circuit)

I2C คืออะไร???
 
I2C Bus ย่อมาจาก Inter Integrate Circuit Bus (IIC) นิยมเรียกสั้นๆว่า I2C Bus (ไอ-สแควร์-ซี-บัส) 
เป็นการสื่อสารอนุกรม แบบซิงโครนัส (Synchronous) เพื่อใช้ติดต่อสื่อสาร ระหว่าง
ไมโครคอนโทรลเลอร์กับอุปกรณ์ภายนอก ซึ่งถูกพัฒนาขึ้นโดยบริษัท Philips Semiconductors
โดยใช้สายสัญญาณเพียง 2 เส้นเท่านั้น คือ Serial Data (SDA) และสาย Serial Clock (SCL) 
ซึ่งสามารถ เชื่อมต่ออุปกรณ์ จำนวนหลายๆ ตัว เข้าด้วยกันได้ ด้วยพอร์ตเพียง 2 พอร์ตเท่านั้น!!!

สำหรับตัวอย่างที่ผมจะทำให้ดูนะครับ จะเป็นการสื่อสารระหว่างบอร์ด
i-Duino UNO กับ Arduino Mega 2560 นะครับ
เริ่มกันเลยนะครับ
ก่อนอื่นก็ ทำการต่อสายออกจากบอร์ด i-Duino UNO ก่อนนะครับ
โดยผมจะต่อสายจาก GND (กราวด์) ร่วมกันกับ Arduino MEGA2560
และต่อสายจาก พอร์ต A4 (ซึ่งทำหน้าที่เป็นพอร์ต SDA; Serial Data)
และพอร์ต A5 (ซึ่งทำหน้าที่เป็นพอร์ต SCL; Serial Clock) ครับ
ที่ฝั่ง Arduino MEGA 2560 :
ก็ทำการต่อสาย SDA (ซึ่งต่อมากพอร์ต A4 ของ i-Duino UNO)
เข้ากับพอร์ต 20 (ซึ่งเป็นพอร์ต SDA ของ Arduino MEGA2560) 
และตามด้วยต่อสาย SCL (ซึ่งต่อมาจากพอรต์ A5 ของ i-Duino UNO)
เข้ากับพอร์ต 21 (ซึ่งเป็นพอร์ด SCL ของ Arduino MEGA2560) ครับ
สำหรับข้อมูลขา SDA และ SCL ของบอร์ดต่างๆในเครือ Arduino ก็ประมาณนี้นะครับ
Arduino UNO และ Arduino Pro Mini
 SDA = A4 , SCL = A5 
 
Arduino Mega และ Arduino Due 
SDA = 20 , SCL = 21
 
Arduino Leonardo และ Arduino Yun 
SDA = 2 , SCL = 3
ทีนี้ก็ แชร์ Ground (GND) จากบอร์ด i-Duino UNO มาให้ Arduino MEGA2560 ครับ
ตามด้วย จิ้มหลอด LED แบบที่ใช้ไฟ 5V ลงไปที่ขา 13 และ GND เหมือนในภาพนะครับ
(เสียบให้ถูกขั้วนะครับ ถ้าเสียบแล้วไม่ติดแสดงว่าผิดขั้ว หรือไม่ก็หลอดขาดครับ 5555+
จะต่อตัวต้านทานเพื่อจำกัดปริมาณกระแสกันนิดนึงก็ได้นะครับ)
เท่านี้ก็พร้อมแล้วครับ เสียบสาย USB 
และเตรียมอัพโหลดโค้ดลงบอร์ดกันได้เลย ^_^
 
ทีนี้เรามาดูโค้ดกันบ้างนะครับ
ในการทดลองนี้ผมจะให้ i-Duino UNO จะเป็นคนส่งค่าของตัวแปร x
ซึ่งจะมีค่าเป็น 0,1,2,3,4,5 และกลับมาเริ่มต้นที่ 0 ใหม่แล้วก็วนไปเรื่อยๆ นะครับ
ซึ่งบอร์ด i-Duino UNO นี้ผมจะให้เขามีสถานะเป็น Master ซึ่งก็คือ ตัวหลัก (ผู้ส่งข้อมูล) 
นั่นเอง ซึ่งสำหรับโค้ดของตัวที่เป็น Master ก็จะมีรายละเอียดดังนี้นะครับ
ก็ให้ทำการอัพโหลดโค้ดนี้ลงไปบนบอร์ดฝั่งที่จะเป็น Master นะครับ
แล้วทีนี้ ทางฝั่ง Arduino MEGA2560 ในที่นี้จะมีสถานะเป็น Slave ครับ (เป็นตัวรอง)
ซึ่งจะเป็น ผู้รับข้อมูลจาก Master โดยในการทดลองนี้ผมจะให้ Arduino MEGA2560
ของเรารับค่า x ที่ถูกส่งมาจาก master มาเช็คว่าเท่ากับเท่าไหร่ แล้วทำการปรับความสว่าง
ของหลอดไฟ LED ด้วยสัญญาณ PWM (ผ่านคำสั่ง analogWrite) โดยจะมีทั้งหมด 5 ระดับ
ตามในโค้ดเลยครับผม (ถ้า x มีค่าเป็น 0 จะสั่งให้ LED ดับนะครับ)
ก็ให้ทำการอัพโหลดโค้ดนี้ลงไปบนบอร์ดฝั่งที่จะเป็น Slave เลยครับ
ทีนี้ก็พร้อมสำหรับการทดสอบ
และดูผลลัพธ์ที่เกิดขึ้นแล้วครับ ^___^
 
================================
 
ผลการทดลอง!!!
 
สำหรับการทดลองของผมก็ตามคลิปนี้ครับ
 
 
เป็นไงบ้างครับกับการทดลองใช้ I2C Bus 
ในการสื่อสารระหว่างบอร์ด 555+ อันนี้เป็น Basic พื้นๆ จริงๆนะครับ
แล้วตอนนี้หากเราหันมอง Module รอบๆตัวเรา
เช่น Clock Module, Gyro Module หรือพวก LCD Module
เราก็จะเห็นพอร์ตที่ขาเขียนว่า SDA และ SCL อยู่ด้วยครับ

 

ถูกต้องแล้วครับ!!! มันเป็นระบบเดียวกันเลยครับ
กับที่ Module ต่างๆเหล่านั้นใช้ติดต่อกับ Arduino ของเราครับผม
^____^ สำหรับวันนี้ก็ขอจบบทความไว้เพียงเท่านี้นะครับ