แก้ปัญหา Arduino UNO มีพอร์ต และ GPIO ไม่เพียงพอด้วยเทคนิคง่ายๆ
บทความตอนนี้ผู้เขียนอยากนำความรู้ที่ใช้อยู่มาแบ่งปันให้กับพี่ๆ เพื่อนๆ และน้องๆ ที่กำลังเรียนรู้และใช้งานบอร์ด Arduino UNO กันอยู่ครับ ปกติแล้วเวลาที่เราต้องการรับข้อมูล จากเซนเซอร์ต่างๆ เราจะใช้ 1 GPIO ต่อ 1 เซนเซอร์ ถูกต้องใช่ไหมครับ แต่ GPIO บนบอร์ด Arduino นั้นมีให้เราอย่างจำกัด ซึ่งปัญหาก็คือเวลาที่เราต้องการรับข้อมูลจากเซนเซอร์หลายๆ ตัว เราจะไม่สามารถทำได้ บางครั้งเราก็แก้ปัญหาโดยการไปหาซื้อบอร์ด Arduino รุ่นใหญ่กว่าอย่างบอร์ด Arduino Mega หรือ Due มาใช้แทน ซึ่งแน่นอนว่าราคาก็ต้องแพงขึ้นใช่ไหมครับ วันนี้เรามีเทคนิคที่ช่วยให้เราสามารถรับข้อมูลจากเซนเซอร์ได้มากสูงสุดถึง 80 ตัวโดยใช้บอร์ด Arduino UNO มาเริ่มกันเลยนะครับ
รูปที่ 1 ทดสอบรับข้อมูลจากเซนเซอร์บนบอร์ด Arduino
รูปที่ 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
http://www.ti.com/lit/ds/symlink/cd4052b.pdf
https://assets.nexperia.com/documents/data-sheet/74HC_HCT4067.pdf
บทความโดย รักการเขียนโค้ดดอทคอม lovecoding.com
ความคิดเห็น
แสดงความคิดเห็น