แก้ปัญหา Arduino UNO มีพอร์ต และ GPIO ไม่เพียงพอด้วยเทคนิคง่ายๆ

บทความตอนนี้ผู้เขียนอยากนำความรู้ที่ใช้อยู่มาแบ่งปันให้กับพี่ๆ เพื่อนๆ และน้องๆ ที่กำลังเรียนรู้และใช้งานบอร์ด Arduino UNO กันอยู่ครับ ปกติแล้วเวลาที่เราต้องการรับข้อมูล จากเซนเซอร์ต่างๆ เราจะใช้ 1 GPIO ต่อ 1 เซนเซอร์ ถูกต้องใช่ไหมครับ แต่ GPIO บนบอร์ด Arduino นั้นมีให้เราอย่างจำกัด ซึ่งปัญหาก็คือเวลาที่เราต้องการรับข้อมูลจากเซนเซอร์หลายๆ ตัว เราจะไม่สามารถทำได้ บางครั้งเราก็แก้ปัญหาโดยการไปหาซื้อบอร์ด Arduino รุ่นใหญ่กว่าอย่างบอร์ด Arduino Mega หรือ Due มาใช้แทน ซึ่งแน่นอนว่าราคาก็ต้องแพงขึ้นใช่ไหมครับ วันนี้เรามีเทคนิคที่ช่วยให้เราสามารถรับข้อมูลจากเซนเซอร์ได้มากสูงสุดถึง 80 ตัวโดยใช้บอร์ด Arduino UNO มาเริ่มกันเลยนะครับ



รูปที่ 1 ทดสอบรับข้อมูลจากเซนเซอร์บนบอร์ด Arduino

        เทคนิคที่ผู้เขียนกำลังพูดถึง นั่นก็คือการใช้เจ้าไอซีเบอร์ 4051 ตัวนี้เลยครับ เราเรียกไอซีตัวนี้ว่ามัลติเพล็กซ์เซอร์ (Multiplexer : MUX) หน้าตาของตัวไอซีที่เรากำลังพูดถึงอยู่ในรูปด้านล่างครับ
รูปที่ 2 ไอซีมัลติเพล็กซ์เซอร์ (Multiplexer : MUX)
ที่มา https://cityos.io/tutorial/1958/Use-multiplexer-with-Arduino

        ด้วยความสามารถพิเศษที่เราบอกว่าสามารถรับค่าจากเซนเซอร์ได้หลายตัว แล้วมันทำงานยังไงถึงอ่านค่าจากเซนเซอร์ได้มากมายขนาดนั้น เรามาดูหลักการทำงานกันครับ


รูปที่ 3 ชั้นวางของ
ที่มา https://www.freepik.com/

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

        การรับข้อมูลในแต่ละช่องสัญญาน เราจะมีตัวเลือกช่องสัญญานที่ต้องการอ่านค่า จากรูปที่ 4 เราจะเห็นได้ว่ามีตัวเลือก A B C เพื่อใช้ระบุว่าเราต้องการอ่านข้อมูลจากช่องสัญญานไหน ซึ่งสถานะของ A B C นั้นจะถูกกำหนดด้วยลอจิกทางไฟฟ้านั่นก็คือ LOW กับ HIGH หรือ 0 กับ 1 ดังแสดงในตารางด้านล่างครับ

C B A ช่องสัญญาน
0 0 0 ช่องที่ 0
0 0 1 ช่องที่ 1
0 1 0 ช่องที่ 2
0 1 1 ช่องที่ 3
1 0 0 ช่องที่ 4
1 0 1 ช่องที่ 5
1 1 0 ช่องที่ 6
1 1 1 ช่องที่ 7

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

รูปที่ 5 ตำแหน่งของขาไอซีมัลติเพล็กซ์เซอร์ 
ที่มา http://playground.arduino.cc/learning/4051

บนไอซีก็จะมีขาต่างๆ เยอะแยะไปหมดเลยใช่ไหมละครับ มาทำความเข้าใจทีละส่วนไปพร้อมๆ กันนะ

ชื่อขา
การเชื่อมต่อและหน้าที่
s0-s2  ตัวเลือกช่องสัญญานที่ต้องการอ่านค่า
y0-y7 ต่อเข้ากับเซนเซอร์ที่ต้องการอ่านค่า
z พอร์ตที่ใช้ในการรับข้อมูล เชื่อมต่อกับบอร์ด Arduino
Vcc ไฟเลี้ยง 5V
gnd กราวด์ 0V
Vee เชื่อมต่อกับ gnd
E สถานะการเปิดรับข้อมูล ให้เชื่อมต่อเข้ากับ gnd

พอเรารู้จักกับขาต่างๆ บนไอซีกันแล้ว เดี๋ยวเรามาเริ่มต่อวงจรให้ได้ตามภาพนี้กันก่อนนะครับ


รูปที่ 6 วงจรอ่านค่าจากเซนเซอร์โดยใช้ไอซีมัลติเพล็กซ์เซอร์

        จากรูปที่ 6 เซนเซอร์ต่างๆ ที่เราต้องการอ่านค่าจะต่อเข้ากับขา y0-y7 ของไอซี ส่วนตัวเลือกช่องสัญญาน s0 s1 s2 เราจะต่อเข้ากับพอร์ต 2 3 และ 4 ของบอร์ด Arduino ตามลำดับ เพื่อสลับอ่านค่าจากมัลติเพล็กซ์เซอร์ในแต่ละช่องสัญญาน โดยจะเริ่มตั้งแต่ช่องที่ 0 ถึง 7 ส่วนขา z ของไอซีซึ่งเป็นขาที่ใช้ในการอ่านข้อมูลเราจะเชื่อมต่อเข้ากับพอร์ต A0 ของบอร์ด Arduino
        ผู้เขียนได้ทดลองนำเซนเซอร์ต่างๆ ไม่ว่าจะเป็นการวัดค่าแสง การอ่านค่าอนาล็อกจากตัวต้านทานที่นำมาต่อกันตามกฏแบ่งแรงดัน รวมไปถึงการรับข้อมูลจากสวิตซ์ ทีนี้พอเราต่อวงจรตามรูปด้านบนเสร็จเรียบร้อย เดี๋ยวเรามาเขียนโปรแกรมเพื่ออ่านค่าจากเซนเซอร์ต่างๆ ที่ต่อเข้ากับไอซีมัลติเพล็กซ์เซอร์โดยใช้บอร์ด Arduino UNO กันนะครับ
       ให้เราเปิดโปรแกรม Arduino IDE ขึ้นมาจากนั้นให้เราเลือกบอร์ดและคอมพอร์ตให้ถูกต้อง จากนั้นให้เราก๊อปปี้โค้ดโปรแกรมที่อยู่ด้านล่างนี้ไปใช้งานได้เลยนะครับ ในส่วนรายละเอียดการทำงานต่างๆ ของโค้ดโปรแกรมผู้เขียนได้เขียนคำอธิบายไว้แล้วนะครับ


        หลังจากก๊อปปี้โค้ดเสร็จเรียบร้อยให้เราอัพโหลดโปรแกรมลงบอร์ด Arduino เลยนะครับ จากนั้นเราจะมาดูค่าเซนเซอร์ต่างๆ ที่รับมาจากไอซีมัลติเพล็กซ์เซอร์กัน โดยให้เราเปิดหน้าต่าง Serial Monitor ขึ้นมา เราจะเห็นข้อมูลปริ้นออกมาทางหน้าต่าง Serial Monitor ซึ่งก็คือค่าต่างๆ ที่อ่านได้จากเซนเซอร์นั่นเองครับ ถึงเจ้าไอซีตัวนี้จะจิ๋วแต่บอกได้เลยครับว่าความสามารถไม่ธรรมดาจริงๆ

รูปที่ 7 อ่านค่าเซนเซอร์ต่างๆ ที่รับมาจากไอซีมัลติเพล็กซ์เซอร์แสดงทางหน้าต่าง Serial Monitor

        สำหรับวันนี้ สิ่งที่ได้เขียนบรรยายไปก็คือความรู้ส่วนหนึ่งที่ได้มาจากการทำงาน สำหรับในบทความนี้เราจะเห็นได้ว่าเรารับข้อมูลจากเซนเซอร์เพียงแค่ 8 เซนเซอร์ แล้วถ้าเราต้องการมากกว่านั้นล่ะจะทำยังไง ง่ายที่สุดเลยเราก็ต้องหาไอซีมัลติเพล็กซ์เซอร์เพิ่ม ซึ่งการที่จะต่อไอซีมัลติเพล็กซ์เซอร์เพิ่มให้ประหยัดพอร์ต Arduino มากที่สุดก็คือการจั๊มสาย s0 s1 s2 เข้าด้วยกัน ส่วนพอร์ตที่ใช้ในการอ่านข้อมูลจากไอซีเราต้องเปลี่ยนนะครับไม่สามารถใช้ซ้ำกันได้  ไอซีมัลติเพล็กซ์เซอร์ 1 ตัวสามารถรับข้อมูลได้สูงสุดถึง 16 ช่องสัญญานลองคิดดูว่าเราจะรับข้อมูลจากเซนเซอร์ได้มากแค่ไหน?? 
        หวังว่าบทความนี้จะเป็นประโยชน์มากสำหรับพี่ๆ เพื่อนๆ และน้องๆ ที่กำลังเรียนรู้และใช้งานบอร์ด Arduino กันอยู่ บทความนี้เขียนขึ้นมาโดยใช้ความรู้ความเข้าใจของผู้เขียน ที่เคยทำการศึกษาและทดลองใช้งานมา หากมีข้อผิดพลาดประการไดสามารถเสนอแนะมาได้เลยนะครับ


แหล่งอ้างอิง
https://cityos.io/tutorial/1958/Use-multiplexer-with-Arduino
http://www.ti.com/lit/ds/symlink/cd4052b.pdf
https://assets.nexperia.com/documents/data-sheet/74HC_HCT4067.pdf

สอบถามข้อมูลเพิ่มเติม
Facebook: รักการเขียนโค้ด ดอทคอม 
Tell: 091-4782789

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

ทำ Web server เพื่อรับข้อมูลจาก Sensor และควบคุมอุปกรณ์ต่างๆ ตอนที่ 2 ส่งข้อมูลจากบอร์ด NodeMCU ขึ้น Web Server

การควบคุมมอเตอร์ Brushless ด้วย Arduino

เรียนรู้การออกแบบวงจรอิเล็กทรอนิกส์พื้นฐาน และใช้งานบอร์ด Arduino ตอนที่ 1 ทำความรู้จักกับโปรแกรม Tinkercad Circuits