วันเสาร์ที่ 12 มีนาคม พ.ศ. 2559

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



สวัสดีครับ ผมเซเรฟ พบกันอีกแล้วนะครับ 555+ หลังจากจบซีรีย์บทความ IoT ไป
วันนี้ก็จะมาพาทำเรื่องง่ายๆ สบายๆ แบบ Back to Basic นะครับ ในเรื่องของ

การสื่อสารระหว่างบอร์ด ด้วย I2C 

(Inter-Integrated Circuit)


(พูดง่ายๆก็คือ เราจะมาลองทำให้บอร์ด Arduino มันสามารถคุยกันได้นั่นเองครับผม)

I2C คืออะไร???

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

พูดๆไปก็อาจจะยังไม่รู้เรื่องมากนะครับ เรามาทำเลยดีกว่า 555+

สำหรับตัวอย่างที่ผมจะทำให้ดูนะครับ จะเป็นการสื่อสารระหว่างบอร์ด 
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 ของเราครับผม
^____^ สำหรับวันนี้ก็ขอจบบทความไว้เพียงเท่านี้นะครับ

พบกันใหม่บทความหน้าครับผม สวัสดีครับ...

เซเรฟ....


3 ความคิดเห็น:

  1. คุณ นาริน มีเบอร์ติดต่อกลับไหมครับ มีเรื่องปรึกษาการใช้ netpie เพิ่มเติมครับ

    ตอบลบ
  2. คุณ นาริน มีเบอร์ติดต่อกลับไหมครับ มีเรื่องปรึกษาการใช้ netpie เพิ่มเติมครับ

    ตอบลบ
  3. Arduino สื่อสารอย่างไรครับ แล้วข้อมูลใช้ร่วมกันทั้งหมดเลยหรือว่าแค่ข้อมูลสุดท้ายครับ

    ตอบลบ