กลับไปหน้ารวมไฟล์
led-bar-graph-and-switch-array-498ca2.md

*******

รายการอุปกรณ์ครบชุดสำหรับโปรเจคนี้ ไปเช็คได้ที่เว็บของเราเลยจ้า

*******

ภาพรวมโปรเจค

โปรเจค "High-Density I/O Interface" นี้คือการฝึกฝนขั้นเทพเพื่อใช้ทรัพยากรบนบอร์ด Arduino Uno Rev3 ให้เต็มประสิทธิภาพ! โดยเราจะเชื่อมต่อ LED Bar Graph 10 ตัว กับสวิตช์อีก 8 ตัว เข้ากับดิจิตอลพินของ Uno ทั้ง 14 พินพอดีเป๊ะ โปรเจคนี้จะสอนหลักการพื้นฐานทางวิศวะที่สำคัญ: การใช้ตัวต้านทานจำกัดกระแสเพื่อปกป้อง LED, การใช้ Pull-Down Resistor เพื่อให้สัญญาณอินพุตนิ่งๆ ไม่วอกแวก, และการใช้ Bussed Resistor Networks (SIP) เพื่อให้วงจรบนเบรดบอร์ดดูโปรและจัดวางได้ง่ายขึ้น มันคือบทเรียนสำคัญสำหรับคนที่อยากอัพสกิลจากวงจร LED ตัวเดียวธรรมดาๆ ไปสู่การออกแบบระบบที่มีหลายๆ ส่วนประกอบ

บทนำ

ถ้ายังไม่ได้อ่านคู่มือเริ่มต้นสำหรับ Arduino Uno Rev3 ของเรา แนะนำให้อ่านก่อนเลยนะ จะได้ไม่งง ไม่งั้นก็อ่านต่อได้เลยจ้า! ในบทสอนนี้ เราจะใช้ดิจิตอล I/O ของ Arduino Uno Rev3 (Uno) ให้เต็มพิกัด โดยเชื่อมต่อ LED Bar Graph 10 ตัว และสวิตช์อีก 8 ตัว (แต่เราจะใช้แค่ 9 LED และ 5 สวิตช์ รวมเป็น 14 พินพอดี) แต่ละ LED จะถูกควบคุมโดยพิน เอาต์พุต ของ Uno และแต่ละสวิตช์จะส่งสัญญาณไปยังพิน อินพุต ของ Uno

LED Bar Graph

LED Bar Graph ก็คือแถวของ LED หลายๆ ตัวที่อิสระต่อกัน จำนวนและสีอาจต่างกัน แต่ของเราใช้แบบสีแดง 10 ตัว วงจรภายในและการจัดขาแสดงในรูปด้านล่าง LED แต่ละตัววางทิศทางเดียวกันหมด ดังนั้นขาแอโนด (Anode) คือขาที่ 1-10 และขาแคโทด (Cathode) คือขาที่ 11-20

วงจรภายในของ LED Bar Graph

เพื่อจำกัดกระแสที่ไหลผ่าน LED แต่ละตัว เราจะใช้ตัวต้านทานแบบอาร์เรย์ 470 โอห์ม 9 ตัว ถ้าไม่ใส่ตัวต้านทานอนุกรมกับ LED เลย เท่ากับว่ากำลังลัดวงจรไฟลงกราวด์ อาจทำให้ LED หรือแหล่งจ่ายไฟเสียหายได้นะ ระวังตัวด้วย!

มีตัวเลขสำคัญ 2 ตัวใน datasheet ของ LED ที่ต้องดู ตัวแรกคือ แรงดันฟอร์เวิร์ด (Forward Voltage) ซึ่งคือแรงดันที่ตกคร่อม LED มักให้ค่าเป็นอัตราสูงสุด ดังนั้นต้องรักษาแรงดันให้ต่ำกว่าหรือเท่ากับค่านี้ ตัวที่สองคือ กระแสฟอร์เวิร์ด (Forward Current) ซึ่งคือกระแสสูงสุดที่ควรจ่ายให้ LED ตัวอย่างเช่น LED ในบาร์กราฟของเรามีแรงดันฟอร์เวิร์ด 2.6V และกระแสฟอร์เวิร์ด 25mA วงจรสำหรับ LED หนึ่งตัวแสดงดังรูปด้านล่าง

วงจร LED อย่างง่าย

คำนวณกระแส LED: LED แต่ละตัวในบาร์กราฟมี แรงดันฟอร์เวิร์ด ($V_f$) ประมาณ 2.6V และกระแสสูงสุด 25mA เมื่อใช้ตัวต้านทาน 470 โอห์มที่ไฟ 5V ระบบจะจำกัดกระแสได้ประมาณ: $I = (V_{source} - V_f) / R = (5V - 2.6V) / 470\Omega \approx 5.1\text{mA}$ ซึ่งทำให้ LED สว่างพอเห็นชัด แถมยังทำงานอยู่ในขีดจำกัดความปลอดภัยของทั้งตัว LED เองและพินของไมโครคอนโทรลเลอร์ ATMega328P อีกด้วย จัดไปวัยรุ่น!

ตัวต้านทาน 470 โอห์มที่เราใช้เนี่ย มันดูตัวใหญ่ไปนิดนึงเวลาเอาไปต่อกับแหล่งจ่าย 5V กระแสที่ไหลผ่าน LED จะอยู่ที่ประมาณ 5mA แต่ไฟ LED ก็ยังสว่างพอใช้อยู่ เราทำแบบนี้เพราะว่า FuelCan มันจ่ายไฟ +12V ออกมาจริงๆ นะว้อย! ถ้าน้องอยากใช้ไฟเส้นนั้นเลี้ยง LED ก็ยังไหวอยู่ ไม่เกินค่ากระแสสูงสุดที่ LED ทนได้

สวิตช์อาร์เรย์ (Switch Array)

สวิตช์อาร์เรย์เนี่ย มีหลายแบบทั้งจำนวนสวิตช์และประเภท – ที่เราจะใช้กันคือสไลด์สวิตช์แบบ 8 ตำแหน่ง SPST (single-pull double-throw) วงจรคร่าวๆ ของสวิตช์อาร์เรย์เป็นแบบในรูปข้างล่างเลย สังเกตนะว่าเมื่อสวิตช์อยู่ในตำแหน่ง OFF วงจรจะเปิด (เปิดวงจร) พอสวิตช์อยู่ในตำแหน่ง ON เช่น สวิตช์หมายเลข 5 วงจรก็จะปิด (ต่อวงจร) คล้ายๆ กับ LED นั่นแหละ เราก็ต้องจำกัดกระแสที่ไหลผ่านสวิตช์ด้วย เพื่อป้องกันความเสียหายและประหยัดพลังงานไปในตัว

วงจรภายในของสวิตช์อาร์เรย์

เวลาน้องอ่านข้อมูลสเปค (Datasheet) ของสวิตช์ สิ่งที่ต้องมองหาคือค่าสูงสุดของ แรงดันและกระแส (max voltage and current) ตัวอย่างเช่น สวิตช์อาร์เรย์ตัวนี้รับแรงดันสูงสุด 24V และกระแสสูงสุด 50mA เราจะใช้ตัวต้านทาน 1.2k โอห์มต่ออนุกรมกับสวิตช์อาร์เรย์แต่ละชุด และใช้ไฟ +5V จาก FuelCan นั่นหมายความว่ากระแสที่ไหลผ่านสวิตช์จะอยู่ที่ ~4.2mA (I = V/R = 5/1.2k) วงจรคร่าวๆ แสดงไว้ในรูปด้านล่างแล้วจ้า

วงจรสวิตช์แบบง่าย

ตรรกะการรับค่าจากสวิตช์อาร์เรย์: สวิตช์อาร์เรย์ 8 ตำแหน่ง SPST ถูกตั้งค่าโดยใช้ ตัวต้านทานดึงลงภายนอก (External Pull-Down Resistors) ขนาด 1.2k โอห์ม เมื่อสวิตช์เปิด (OFF) ขา Arduino จะถูกดึงลงกราวด์ ทำให้อ่านค่าได้เป็น "LOW" ที่เสถียร พอสวิตช์ปิด (ON) มันจะต่อกับไฟ +5V และจ่ายกระแสประมาณ 4.2mA การตั้งค่าแบบนี้ช่วยป้องกันปรากฏการณ์ "ขาลอย (Floating Pin)" ที่ทำให้วงจรดิจิทัลอ่านค่าผิดพลาดแบบมั่วๆ ได้

สมมติว่าเราเลือกใช้ตัวต้านทานที่ค่าต่ำกว่านี้ เช่น 680 โอห์ม กระแสที่ไหลผ่านสวิตช์จะอยู่ที่ ~7.4mA (I = 5/680) ซึ่งก็ยังต่ำกว่าค่ากระแสสูงสุดของสวิตช์อยู่ดี แต่ เราจะกินพลังงานมากขึ้น พลังงาน (P) เท่ากับ แรงดัน (V) คูณ กระแส (I) ดังนั้นพลังงานที่ใช้กับตัวต้านทาน 1.2k โอห์ม และ 680 โอห์ม จะเป็น 20.8mW และ 36.7mW ตามลำดับ ดูเผินๆ อาจไม่ต่างกันมาก แต่ เวลาออกแบบระบบที่ต้องประหยัดพลังงาน (Low-Power) ความต่างนี่แหละตัวดี!

วิศวะศาสตร์และการออกแบบระบบประหยัดพลังงาน

  • การแลกเปลี่ยนเรื่องการกินพลังงาน: โปรเจคนี้สอนให้รู้ว่า การเลือกค่าตัวต้านทานต้องดูงบประมาณพลังงานของระบบด้วย การเปลี่ยนจากตัวต้านทาน 680 โอห์ม เป็น 1.2k โอห์ม สำหรับสวิตช์ ลดการกินพลังงานต่อสวิตช์จาก 36.7mW เหลือ 20.8mW สำหรับโปรเจคบนโต๊ะอาจไม่เห็นผลชัด แต่การลดลง 43% นี่สำคัญมากสำหรับ ระบบฝังตัวที่ใช้แบตเตอรี่หรือระบบเคลื่อนที่
  • การป้องกันวงจร: เอกสารเน้นย้ำว่า ถ้าลืมใส่ตัวต้านทานอนุกรม จะเท่ากับสร้าง "วงจรลัดแบบฮาร์ดคอร์ (Hard Short)" จาก VCC ลงกราวด์ผ่านทางรอยต่อเซมิคอนดักเตอร์ของ LED ซึ่งอาจทำให้ขาออกของ Arduino พังได้แบบยกแผง
  • ความแม่นยำในการทำ原型 (Prototyping): การใช้ "FuelCan" หรือสถานีงานทำ原型ที่คล้ายกัน ช่วยให้มีแหล่งจ่ายไฟ 5V/12V ที่เสถียรและการจัดการสายไฟที่เป็นระเบียบ พาผู้ใช้ก้าวข้ามจากยุค "สายสปาเก็ตตี้" สู่แนวคิดการทำ原型แบบอุตสาหกรรมมากขึ้น

ตัวต้านทานแบบอาเรย์ (Resistor Array)

เจ้า "ตัวต้านทานแบบอาเรย์" เนี่ย มันคือการเอาตัวต้านทานหลายๆ ตัวมารวมกันในแพ็คเกจเดียว โดยขาใดขาหนึ่งของตัวต้านทานทุกตัวจะถูกต่อเข้าด้วยกันเป็นโหนดร่วม (bussed) ในกรณีนี้คือมี 9 ตัวต้านทานในแพ็คเดียว มันช่วยให้เราต่อตัวต้านทานอนุกรมเข้ากับชิ้นส่วนที่เหมือนกันหลายๆ ชิ้นได้ง่ายขึ้น เช่น กับ LED Bar Graph หรือสวิตช์แบบอาเรย์ แถมยังช่วยให้การเดินสายของเรา สะอาดตาและกระชับขึ้น อีกด้วย วงจรภายในของตัวต้านทานอาเรย์ 1.2k โอห์มจะประมาณรูปด้านล่างนี้ (ตัว 470 โอห์มก็โครงสร้างคล้ายๆ กัน) เวลาดูตัวอาเรย์บนบอร์ด ให้จำไว้ว่าขาที่ 1 จะมีจุดวงกลมเป็นตัวบอก ขานี้เราจะต่อกับไฟหรือกราวด์ก็ได้ แต่ถ้าต่อกับไฟ แนะนำให้เช็ค Datasheet เรื่องเรตติ้งแรงดันสูงสุดด้วยนะ อย่าเผลอไปช็อตมันล่ะ

วงจรภายในของตัวต้านทานอาเรย์ 9 ตัว

สถาปัตยกรรมของตัวต้านทานแบบ SIP: เพื่อประหยัดพื้นที่และทำให้การเดินสายง่ายขึ้น โปรเจคนี้เราใช้ ตัวต้านทานแบบอาเรย์แพ็คเกจ Single In-line (SIP) ตัวต้านทานอาเรย์แบบ "Bussed" (ที่ระบุด้วยจุดที่ขา 1) จะต่อขาหนึ่งของตัวต้านทานทุกตัวภายในเข้าด้วยกันเป็นโหนดร่วม ในวงจรนี้เราต่อขาที่ 1 ลงกราวด์ ทำให้เราสามารถจัดการแคโทดของ LED ทั้ง 9 ตัว หรือเป็น Pull-down ของสวิตช์ได้อย่างมีประสิทธิภาพ โดยไม่ต้องใช้จัมเปอร์แยกเป็นตัวๆ ให้วุ่นวาย

การเดินสาย

พี่ใช้เบรดบอร์ดแทน Modulus นะ เพราะเบรดบอร์ดมันหาง่ายกว่า เริ่มต้นเลย วาง LED Bar Graph กับสวิตช์อาเรย์ลงบนเบรดบอร์ดซะ วางให้ตัวมันคร่อมตรงร่องกลางของเบรดบอร์ด ระวังอย่าให้ขามันชอร์ตกันเองเพราะไปอยู่ในโหนดเดียวกันล่ะ ต่อไป วางตัวต้านทานอาเรย์ 470 โอห์มไว้ทางด้าน แคโทด ของ LED แล้วต่อขาที่ 1 ของอาเรย์ลงกราวด์ ต้องแน่ใจว่าขาที่ 1 ของตัวต้านทานอาเรย์ ไม่ได้ ต่อเข้ากับขาแคโทดของ LED Bar Graph นะ เพราะ Bar Graph มี LED 10 ตัว แต่ตัวต้านทานอาเรย์มีแค่ 9 ตัว เราก็เลยใช้ LED ได้แค่ 9 ตัวจาก 10 ตัวนั่นแหละ

ต่อมา ใช้จัมเปอร์ผู้-ผู้ (M/M) ต่อขา แอโนด ของ LED Bar Graph ไปยังพิน 0-8 ของ Arduino Uno ตัวอย่างเช่น ขาที่ 10 ของ Bar Graph ต่อไปที่พิน 0 ของ Uno, ขาที่ 9 ของ LED ต่อไปที่พิน 1 ของ Uno ไปเรื่อยๆ แบบนี้

การจัดการทรัพยากร I/O: บน Arduino Uno นะ พิน 0 กับ 1 มันแชร์กับ Hardware Serial (USB) อยู่ โปรเจคนี้จะแสดงให้เห็นว่าเรายังใช้พินพวกนี้เป็น GPIO ได้อยู่ ตราบใดที่น้องๆ รู้ตัวและระวังว่า บางครั้งอาจต้องถอดสายออกตอนอัพโหลดโค้ดเพื่อป้องกันความขัดแย้งของสัญญาณ

วางตัวต้านทานอาเรย์ 1.2k โอห์มตามรูปด้านล่าง ต่อขาที่ 1 ของมันลงกราวด์ และตรวจสอบให้ดีว่ามันไม่ได้ต่อเข้ากับขาของสวิตช์บนสวิตช์อาเรย์ ขาเบรดบอร์ดที่วงสีเหลืองไว้จะถูกต่อไปยังพิน 9-14 ของ Uno ตัวอย่างเช่น สวิตช์ตัวที่ 1 ต่อไปที่พิน 9, สวิตช์ตัวที่ 2 ต่อไปที่พิน 10 ไปเรื่อยๆ ส่วนขาอีกด้านของสวิตช์ (ขา 1-5) ให้ต่อเข้ากับ +5V

แผนภาพวงจร (Schematic)

ถ้ายังไม่ได้ติดตั้ง Uno ลงบนพื้นที่โปรโตไทป์ของ FuelCan ก็ไปติดตั้งได้เลย พี่วางเบรดบอร์ดไว้ในช่องเก็บของด้านล่างเพื่อให้ใช้จัมเปอร์สั้นๆ ได้ เราต้องจ่ายไฟ +5V และ GND ไปยังรางไฟบนเบรดบอร์ด ใช้สาย Banana Jack ต่อกับ Test Lead Clip ที่มีมาให้ ทำด้านเบรดบอร์ดต้องใช้พินเฮดเดอร์ผู้ (Male Header Pin) 2 อันเพื่อต่อกับคลิปเสียบสาย เสียบด้าน Type A ของสาย USB เข้ากับพอร์ต USB1 และด้าน Type B เข้ากับพอร์ตของ Uno จากนั้นก็เปิดไฟ FuelCan ด้วยอะแดปเตอร์ AC-DC ได้เลย จัดไปวัยรุ่น! สู้งานนะน้อง

ซอฟต์แวร์

เมื่อต่อสายครบและจ่ายไฟให้ FuelCan แล้ว ก็ถึงเวลาอัพโหลดสเก็ตช์ลง Uno ได้เลยจ้า! ถ้าอยากเปลี่ยนฟังก์ชันไฟ LED ก็แค่สลับสวิตช์ 1-5 ไปที่ตำแหน่ง ON ง่ายๆ แค่นั้นเอง

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

ลอจิกจัดลำดับความสำคัญ (Software Priority Logic): สเก็ตช์ที่ให้มาจะทำงานแบบ State Machine ที่มีลำดับความสำคัญ ถ้ามีหลายสวิตช์ถูกเปิดพร้อมกัน โค้ดจะตัดสินใจเลือกสวิตช์ที่มีดัชนีต่ำสุด (เช่น สวิตช์ 1 ชนะสวิตช์ 3) ซึ่งเป็นแพตเทิร์นที่ใช้บ่อยในระบบ PLC และระบบควบคุมอุตสาหกรรมเลยล่ะ

เซ็ตอัพขั้นสุดท้าย

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "1x Arduino IDE"
author: "ejshea"
category: "Lab Stuff"
components:
  - "1x Arduino Uno Rev3"
  - "1x 10-Segment LED Bar Graph"
  - "1x 8-Position SPST Switch Array"
  - "1x 470 Ohm 9-Resistor Bussed Array"
  - "1x 1.2k Ohm 9-Resistor Bussed Array"
description: "มา Max Out Digital I/O บน Arduino Uno Rev3 กัน! ใช้ Interrupt กับเซนเซอร์ให้ตึงๆ งานนี้ทั้งเทพและวัยรุ่น รับรองจัดไป!"
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles: []
encryptedPayload: "U2FsdGVkX19bLzxD2wx9youmHcZ9wyVbfCV95h7W3cGLt01NGrx/LHhaxK0vPjWPVJ6mSVI2f2w48/6h9RDRbWFo5+k6oaK4+4Oeokn8gaw="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/led-bar-graph-and-switch-array-498ca2_cover.jpg"
lang: "en"
likes: 1
passwordHash: "4123d95516406a01a77658c981d0db0a597cb671563374ddbb869fde11745c54"
price: 2450
seoDescription: "Maximize digital I/O on Arduino Uno Rev3 using an LED Bar Graph and Switch Array for advanced control projects."
tags:
  - "lights"
  - "control"
  - "io-management"
  - "resistor-networks"
title: "งานง่ายแต่หล่อ! ต่อ LED Bar กับ Switch Array จัดเต็มพอร์ต"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/Z2Hh852cqDU"
views: 13042