แก้ปัญหาอุปกรณ์ I2C แอดเดรสซ้ำ

Ekkachai
3 min readJan 29, 2021

--

สืบเนื่องจากงานครั้งก่อน ที่จะทดลองต่อ ESP8266 กับ ToF10120 Laser Rangefinder จำนวน 2 ตัว เพื่อให้สามารถนับจำนวนคนเดินเข้า หรือออก แบบระบุทิศทางเดินได้

คราวนี้จึงซื้อ ToF10120 มา 2 ตัว (ประมาณตัวละ 300 บาท) เพื่อต่อกับ ESP8266 x 1 ตัว

Uhh!!! โชคดีจังครับ ToF10120 ทั้งสองตัวมีแอดแดรสเดียวกันเลย (I2C Address Duplicate) (0x52) หรือ 82 (ฐาน 10) ค่าเดียวกันตามใน Turtorial เลย ต้องค้นหาข้อมูลปรับปรุงทดลองต่อก็มี 2 แนวทาง ครับ

  1. flash เขียนแอดเดรสทับใหม่เลย
    แนวทางตามนี้ -> https://www.youtube.com/watch?v=3VMYoVth-AI
Core Device Interface Module

2. ใช้ I2C multiplexer ตัวที่แนะนำคือ TCA9548A I2C Multiplexer (I2C Expander) ทำหน้าที่เชื่อมต่อและสลับสัญญาณอุปกรณ์ I2C หลายตัว ดังนั้นถึงแม้ I2C จะมีแอดเดรสเดียวกันก็ไม่เป็นปัญหาแล้วครับ

TCA9548A I2C Multiplexer ราคา 40 บาท ราคาถูกที่สุด ก็น่าจะเป็น[ร้านนี้]ครับ

https://trybotics.com/project/Arduino-on-I2c-Multiplexer-Tca9548a-1-35082

แนะนำ TCA9548A I2C Multiplexer

TCA9548A จะรวมสัญญาณจากอุปกรณ์แบบ I2C ส่งผ่านวงจรนี้ ไปสู่บอร์ดควบคุมเช่น Arduino, NodeMCU

https://dronebotworkshop.com/multiple-i2c-bus/

TCA9548A โดยปกติจะทำงานที่พอร์ตแอดเดรสหมายเลข 0x70 [ datasheet ] แต่ก็สามารถเปลี่ยนแอดเดรสได้ที่ขา A0 ถึง A2 อยู่ในช่วงระหว่าง 0x70 ถึง 0x77

เริ่มต่อวงจร TCA9548A I2C Multiplexer กับ TOF10120

เซนเซอร์แสง TOF10120 เป็นอุปกรณ์แบบ I2C มีขา Data กับขา Clock สำหรับโจทย์นี้มี 2 ตัวครับ ก็ต่อไฟเลี้ยง แล้วก็ต่อคู่ Souce เป็นให้ถูก จากรูปได้ต่อ

  • เซนเซอร์ A เข้า Source คู่ #0
  • เซนเซอร์ B เข้า Source คู่ #4

เขียนโค้ดตรวจสอบพอร์ต #1

ทดลองรันโค้ดก่อนว่า Multiplexer จะเจอเซนเซอร์ทั้ง 2 ตัวไหม ด้วยโค้ด [download]

สังเกตที่โค้ดบรรทัดที่ 10 : ฟังก์ชั่น tcaselect(i) จะทำการเลือกอุปกรณ์ที่ต้องการติดต่อด้วย ซึ่งมีอุปกรณ์มากที่สุด 8 ตัว ดังนั้น i จะมีค่าได้ 0 ถึง 7 สำหรับวิธีเรียกใช้งาน ตัวอย่าง ดังนี้ครับ

  • tcaselect(0); // เรียกอุปกรณ์ ที่ต่อกับ souce คู่#0
  • tcaselect(4); // เรียกอุปกรณ์ ที่ต่อกับ souce คู่#4

ผลลัพธ์ #1

การตรวจหาอุปกรณ์ก็จะพบว่ามีอุปกรณ์ 2 ตัว ต่ออยู่ที่พอร์ตเบอร์ #0 กับ #4 โดยพอร์ตเบอร์ #0 มีอุปกรณ์หมายเลข 0x52 ส่วนพอร์ตเบอร์ #4 ก็แสดงค่าเช่นเดียวกัน

เขียนโค้ดวัดระยะด้วยเซนเซอร์ 2 ตัว #2

อธิบายโค้ด

  • บรรทัดที่ 17 กับ 23 เป็นการเลือกอุปกรณ์ว่าจะให้ multiplexer เลือกอุปกรณ์ตัวใด
  • บรรทัดที่ 35 กับ 43 เป็นพอร์ตของเซนเซอร์ ซึ่งใช้หมายเลขของอุปกรณ์เดิมได้เลย คือ 82 (ฐาน 10)

ผลลัพธ์ #2

สำเร็จครับ เซนเซอร์ทั้ง 2 ตัว แม้ว่าจะพอร์ตแอดเดรสหมายเลขเดียวกัน แต่ก็สามารถทำงานแยกกันได้อย่างอิสระครับ :)

--

--

No responses yet