สืบเนื่องจากงานครั้งก่อน ที่จะทดลองต่อ ESP8266 กับ ToF10120 Laser Rangefinder จำนวน 2 ตัว เพื่อให้สามารถนับจำนวนคนเดินเข้า หรือออก แบบระบุทิศทางเดินได้
คราวนี้จึงซื้อ ToF10120 มา 2 ตัว (ประมาณตัวละ 300 บาท) เพื่อต่อกับ ESP8266 x 1 ตัว
Uhh!!! โชคดีจังครับ ToF10120 ทั้งสองตัวมีแอดแดรสเดียวกันเลย (I2C Address Duplicate) (0x52) หรือ 82 (ฐาน 10) ค่าเดียวกันตามใน Turtorial เลย ต้องค้นหาข้อมูลปรับปรุงทดลองต่อก็มี 2 แนวทาง ครับ
- flash เขียนแอดเดรสทับใหม่เลย
แนวทางตามนี้ -> https://www.youtube.com/watch?v=3VMYoVth-AI
2. ใช้ I2C multiplexer ตัวที่แนะนำคือ TCA9548A I2C Multiplexer (I2C Expander) ทำหน้าที่เชื่อมต่อและสลับสัญญาณอุปกรณ์ I2C หลายตัว ดังนั้นถึงแม้ I2C จะมีแอดเดรสเดียวกันก็ไม่เป็นปัญหาแล้วครับ
TCA9548A I2C Multiplexer ราคา 40 บาท ราคาถูกที่สุด ก็น่าจะเป็น[ร้านนี้]ครับ
แนะนำ TCA9548A I2C Multiplexer
TCA9548A จะรวมสัญญาณจากอุปกรณ์แบบ I2C ส่งผ่านวงจรนี้ ไปสู่บอร์ดควบคุมเช่น Arduino, NodeMCU
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 ตัว แม้ว่าจะพอร์ตแอดเดรสหมายเลขเดียวกัน แต่ก็สามารถทำงานแยกกันได้อย่างอิสระครับ :)