ใครเคยต่อปุ่ม (Button) กับ Arduino ต้องเจอแผนภาพแบบนี้แน่ๆ:

ตอนแรกสับสน: "ทำไมต้องมีตัวต้านทาน? ผมแค่อยากรู้ว่ากดปุ่มหรือไม่กด"
เกิดอะไรขึ้นในวงจร?

ปุ่ม (Switch) มีสายจดจbeyเป็นรูป "H" แต่ตรงกลางไม่ต่อกัน จนกว่าจะกดปุ่ม
เราอยากให้ GPIO ของ Arduino อ่าน 0 เมื่อไม่ได้กด และ 1 เมื่อกด
ลองต่อตรงๆ (Diagram 2)

ต่อ VCC (5V/3.3V) เข้าด้านซ้าย กดปุ่ม -> GPIO อ่าน 1 ได้ แต่...
ปัญหาเมื่อไม่ได้กด (Diagram 3)

เมื่อไม่กด GPIO ไม่ได้ต่อกับอะไรเลย สถานะ "ลอย" (Floating) อาจอ่านเป็น 0 หรือ 1 แบบสุ่ม จากสัญญาณรบกวนแม่เหล็กไฟฟ้าในอากาศ ไม่ไช่ใจได้ว่าเป็น 0 จริง
ลองต่อ Ground ตรงๆ

ตอนไม่กด -> GPIO ต่อ Ground -> รับประกัน 0 ได้ แต่...
กดปุ่ม = Short Circuit!

VCC ต่อ Ground ตรงๆ ผ่านปุ่ม -> กระแสไหลมากเกินไป -> อุปกรณ์เสีย!
ที่มาของตัวต้านทาน (Resistor)

ตัวต้านทานจำกัดกระแส ไฟฟ้าเลือกทางที่ต้านทานน้อยที่สุด ตอนกดปุ่ม: กระแสไหลทางปุ่ม (ต้านทาน ~0) GPIO อ่าน 1 ตอนไม่กด: กระแสไหลทางตัวต้านทานไป Ground GPIO อ่าน 0


Pull-Up Resistor (แบบกลับกัน)
ไม่กด -> GPIO ต่อ VCC ผ่านตัวต้านทาน -> อ่าน 1 (Pull Up)
กด -> กระแสไหลไป Ground ทางปุ่ม -> GPIO ไม่ได้กระแส -> อ่าน 0


ทำไมเขียนบทความนี้?
ผมเข้าทำงานที่ Losant ปี 2016 โดยไม่มีประสบการณ์ฮาร์ดแวร์ ชุดเริ่มต้นทุกชุดให้ปุ่มมาแต่ไม่ได้อธิบายแนวคิดนี้ หวังว่าบทความนี้จะช่วยให้ "หลอดไฟในหัว" สว่างขึ้น!