ต่อเซนเซอร์ I2C เพิ่มแล้วทำไมมองเห็นไม่ครบ

ต่อเซนเซอร์ I2C เพิ่มแล้วทำไมมองเห็นไม่ครบ - Image 1
03/08/2025•Admin Team•
IoTSensorTutorial

เวลาเริ่มต่อเซนเซอร์กับบอร์ด เรามักชอบ I2C ตรงที่อุปกรณ์หลายตัวใช้สาย SDA กับ SCL ร่วมกันได้ พออ่านอุณหภูมิได้แล้วก็เลยอยากเพิ่มจอหรือเซนเซอร์อีกตัวเข้าไป โดยคิดว่าน่าจะต่อพ่วงบนสายชุดเดิมได้เลย

แต่เมื่อเพิ่มอุปกรณ์แล้ว ผลที่เห็นอาจไม่ตรงไปตรงมา บางครั้งโปรแกรมมองเห็นเพียงตัวเดียว บางครั้งเจอ address ครบแต่พออ่านจริงกลับมี timeout ซึ่งสองอาการนี้อาจเกิดคนละเรื่องกัน ถ้ารีบแก้ด้วยการเปลี่ยนไลบรารีอย่างเดียว เราก็อาจยังวนอยู่กับจุดเดิม

ก่อนรวมทุกอย่างเข้าด้วยกัน แอดอยากชวนแยกดูทีละส่วนครับ ว่าอุปกรณ์แต่ละตัวใช้ชื่ออะไรบนบัส และเมื่อเอามาต่อร่วมกันแล้ว สภาพสายกับวงจรยังเหมาะกับการสื่อสารอยู่หรือเปล่า

เริ่มจากรู้ว่า address ไหนเป็นของใคร

I2C ใช้ address เพื่อเลือกอุปกรณ์ปลายทาง แต่การมีอุปกรณ์สองชิ้นไม่ได้รับประกันว่าทั้งสองชิ้นจะได้ address คนละตัว โดยเฉพาะเมื่อเป็นโมดูลรุ่นเดียวกันจากร้านเดียวกัน ค่าตั้งต้นก็มักเหมือนกันด้วย

ลองถอดให้เหลือทีละตัว แล้วใช้โปรแกรมสแกนบนขาที่ตั้งไว้จริง จดชื่อโมดูลกับ address ที่ตอบกลับก่อน วิธีนี้ช่วยแยกได้ว่าตัวที่เพิ่มเข้ามามี address ซ้ำ หรือเดิมทีตัวใดตัวหนึ่งยังไม่ได้สื่อสารตั้งแต่ต่อเดี่ยวแล้ว ส่วนการพบ address หมายถึงมีการตอบรับบนบัส ยังไม่ได้ยืนยันว่าทุกคำสั่งในไลบรารีใช้กับชิปตัวนั้นได้ถูกต้อง

ถ้าต่อเดี่ยวแล้วเห็นทั้งสองตัว แต่พอต่อรวมกลับเห็นชื่อเดียว ก็ยังสรุปไม่ได้ว่ามีตัวหนึ่งหายไป เพราะอุปกรณ์ที่ใช้ address เดียวกันอาจตอบพร้อมกันอยู่ เบอร์ที่โปรแกรมสแกนพิมพ์ออกมาจึงไม่ใช่จำนวนชิ้นอุปกรณ์จริงเสมอไป

ตัวอย่างเซนเซอร์ I2C สองตัวใช้ address เดียวกันบนบัสร่วม จึงนับอุปกรณ์จากจำนวน address ไม่ได้

อีกจุดที่ควรตรวจคือเอกสารบางชุดเขียน address แบบ 7 บิต ขณะที่บางตัวอย่างรวมบิตอ่านเขียนไปแล้ว ถ้าเอาตัวเลขต่างรูปแบบมาเทียบกันทันทีอาจดูเหมือนเป็นคนละ address ทั้งที่หมายถึงอุปกรณ์เดียวกัน จึงควรดูรูปแบบที่ driver รับก่อนใส่ค่าในโค้ด

ถ้าชื่อซ้ำ ต้องเปลี่ยนที่วงจรหรือแยกเส้นทาง

โมดูลบางรุ่นมีขาเลือก address หรือจุดบัดกรีให้เปลี่ยนค่าได้ ซึ่งต้องดูจากวงจรและเอกสารของโมดูลจริง ไม่ใช่ดูเพียงชื่อเซนเซอร์ เพราะบอร์ดสำเร็จรูปแต่ละเจ้าสามารถต่อขาเหล่านี้ไว้ต่างกัน

ถ้าเปลี่ยนได้ ก็จดให้ชัดว่าตัวที่ติดตั้งจุดใดใช้ค่าไหน แล้วตั้งซอฟต์แวร์ให้ตรงกัน แต่ถ้าชิปกำหนด address ตายตัว การเปลี่ยนตัวเลขฝั่งโค้ดอย่างเดียวก็ไม่ได้ทำให้ตัวชิปตอบชื่อใหม่ เราต้องเลือกว่าจะใช้บัสอีกชุด หรือใช้ multiplexer เพื่อแยกช่องที่คุยกับอุปกรณ์แต่ละตัว

ตัว multiplexer เองก็เป็นส่วนประกอบที่ต้องตั้งค่าและดูแลเพิ่ม การอ่านเซนเซอร์จึงกลายเป็นการเลือกช่องก่อนแล้วค่อยอ่านอุปกรณ์บนช่องนั้น ถ้าลืมขั้นเลือกช่อง หรือมีหลายงานสลับช่องพร้อมกันโดยไม่มีการจัดลำดับ ก็อาจอ่านผิดตัวได้แม้ address จะไม่ชนกันบนเส้นทางที่เปิดใช้อยู่

ทางเลือกจึงควรอิงกับจำนวนอุปกรณ์และวิธีดูแลต่อด้วย งานที่มีเพียงสองตัวอาจแยกบัสได้ง่าย ขณะที่งานหลายตัวอาจได้ประโยชน์จากการแยกช่อง แต่ทั้งสองแบบควรมีรายการจับคู่ระหว่างจุดติดตั้ง ช่อง และ address ให้ย้อนดูได้

address ไม่ซ้ำแล้ว ยังต้องดูสัญญาณ

สาย SDA และ SCL ต้องมีตัวต้านทาน pull-up ที่เหมาะกับวงจร โมดูลสำเร็จรูปบางตัวใส่มาให้แล้ว พอเอาหลายตัวมารวมกันจึงเป็นการต่อตัวต้านทานเหล่านั้นขนานกันด้วย ไม่ใช่เพิ่มเฉพาะเซนเซอร์เข้าไปบนสายเฉยๆ

ผลที่ต้องดูจึงมีทั้งแรงดันที่สายถูกดึงขึ้น ความสามารถในการดึงสายลง และความเร็วที่ระดับสัญญาณเปลี่ยนได้ ความยาวสาย ความจุบนบัส และจำนวนจุดต่อก็มีส่วนเกี่ยวข้อง การเห็นวงจรตัวอย่างใช้ค่าหนึ่งจึงยังไม่พอจะสรุปว่าค่านั้นเหมาะกับสายของเราทุกแบบ

ถ้ามีทั้งโมดูลที่รับสัญญาณต่างแรงดัน ต้องตรวจว่าขา I/O ของแต่ละฝั่งรองรับระดับที่อยู่บนบัสจริงหรือไม่ โดยเฉพาะบอร์ดที่รับไฟเลี้ยงได้หลายระดับ เพราะความสามารถในการรับไฟเข้าบอร์ดไม่ได้แปลว่าขาสัญญาณจะรับแรงดันเท่ากันได้เสมอ

ลำดับตรวจ I2C แยกอุปกรณ์เดี่ยว ชื่อซ้ำ คุณภาพสัญญาณ และทดสอบอ่านค่าจริง

การลดความเร็วชั่วคราวหรือใช้สายสั้นลงช่วยแยกสาเหตุได้ แต่ไม่ควรจบเพียงว่าเปลี่ยนแล้วอ่านผ่านครั้งหนึ่ง ลองอ่านซ้ำและสังเกตจำนวนครั้งที่ล้มเหลว รวมถึงทดสอบในสภาพที่อุปกรณ์อื่นทำงานพร้อมกัน เพื่อดูว่าปัญหากลับมาเมื่อวงจรมีภาระจริงหรือไม่

แยกการสื่อสารออกจากการตีความข้อมูล

เมื่อสแกนเจอครบแล้ว ขั้นถัดไปคืออ่านข้อมูลของอุปกรณ์แต่ละตัวตามวิธีที่ผู้ผลิตกำหนด บางตัวต้องรอหลังเริ่มวัด บางตัวมีสถานะให้ตรวจ และบางไลบรารีต้องกำหนด address ตอนสร้าง object หากยังใช้ค่าตั้งต้นเดิมทั้งสอง object ก็อาจกำลังอ่านตัวเดียวกันอยู่

ลองพิมพ์ทั้ง address ผลการเรียก และค่าที่อ่านในช่วงตรวจระบบ จะเห็นได้ง่ายกว่าการส่งเฉพาะตัวเลขสุดท้ายขึ้น Dashboard เพราะถ้าทุกกรณีผิดพลาดถูกแทนเป็นศูนย์เหมือนกัน เราจะไม่รู้ว่าค่าเป็นศูนย์จริงหรืออ่านไม่สำเร็จ

เมื่อแก้จนทำงานได้แล้ว ควรเก็บเหตุผลการตั้งค่าไว้ใกล้โค้ดด้วย เช่น ขานี้เป็นบัสของอุปกรณ์กลุ่มไหน และเหตุใดจึงเลือกความเร็วระดับนั้น คนที่กลับมาเพิ่มเซนเซอร์รอบถัดไปจะได้ไม่ต้องเริ่มไล่จากสายทุกเส้นใหม่

ลองตรวจด้วยรายการที่เปลี่ยนทีละจุด

สมมติว่ามีเซนเซอร์เหมือนกันสองตัวและจอหนึ่งตัว ขั้นแรกจดผลตอนต่อเซนเซอร์ A ตัวเดียว จากนั้นแทนด้วย B แล้วค่อยทดสอบจอ เมื่อรู้ว่าทุกชิ้นทำงานเดี่ยวได้ จึงรวม A กับจอก่อน แล้วเพิ่ม B เป็นชิ้นสุดท้าย ลำดับนี้ทำให้เห็นว่าข้อจำกัดเกิดจากคู่ใด ไม่ต้องเดาว่าอุปกรณ์ทั้งหมดเสียพร้อมกัน

ในแต่ละรอบให้คงขา ความเร็ว และวิธีจ่ายไฟไว้เหมือนเดิมก่อน ถ้าต้องเปลี่ยนค่าใดก็จดคู่กับผลที่ได้ด้วย ส่วนระบบที่มีหลาย task ควรจัดการสิทธิ์ใช้บัสและการเลือกช่องให้เป็นชุดเดียวกัน เพราะผลอ่านผิดตัวอาจเกิดจากงานอื่นสลับช่องระหว่างคำสั่ง ไม่ใช่ความผิดของตัวเซนเซอร์ครับ

สรุป

เวลาเพิ่มอุปกรณ์ I2C แล้วมองเห็นไม่ครบ ให้เริ่มจากตรวจทีละตัวและจด address ก่อน จากนั้นค่อยจัดการชื่อซ้ำด้วยวิธีที่ฮาร์ดแวร์รองรับ แล้วตรวจ pull-up แรงดัน และสภาพสายต่อ การแยกเรื่องชื่ออุปกรณ์ออกจากคุณภาพสัญญาณจะช่วยให้แก้ตรงจุด และทำให้การเพิ่มอุปกรณ์ครั้งต่อไปมีข้อมูลเดิมให้ตามต่อได้ครับ

Command Eng Logo
CMD yourNgineers
เลขประจำตัวผู้เสียภาษี0805564000814
บทความ
ติดต่อบริษัท คอมมานด์ เอ็นจ์ จำกัด
81/36 เพอร์เฟค พาร์คบางนาตำบลบางเสาธง อำเภอบางเสาธงจังหวัดสมุทรปราการ 10570
team@commandeng.in.th+66 89 393 5191
Facebook Page | Command EngLine | Command Eng Official
© Copyright 2022-2026 Command Eng Co., Ltd.v1.0.4 · 0d556ab · 2026-11-03 15:23