Blog

ESP32 GPIO & MicroPython: เจาะลึกขาไหนรุ่ง ขาไหนร่วง!

การสั่งงาน GPIO (General Purpose Input/Output) บนบอร์ด ESP32 ด้วย MicroPython นั้นง่ายมากก็จริง แต่ความปราบเซียนของ ESP32 คือ "ทุกขาไม่ได้ถูกสร้างมาเท่าเทียมกัน" ครับ



อ้างอิงมาจาก ArtronShop ที่ได้สรุปไว้เป็นอย่างดี เราสามารถแบ่งประเภทของขา ESP32 สำหรับการใช้งานดิจิทัล (Digital Input/Output) ออกเป็นกลุ่มต่างๆ เพื่อให้คุณวางวงจรได้แบบไม่ต้องกลัวบอร์ดพังหรือบูตไม่ขึ้น ดังนี้ครับ:


กลุ่มที่ 1: ขาที่ "ห้ามใช้" หรือ "ไม่ควรใช้" เป็น Output พื้นฐาน

ถ้าคุณกำลังหาขาไปต่อกับ LED หรือรีเลย์ ห้าม เลือกขาพวกนี้เด็ดขาดครับ!

1. ขาที่ต่อกับชิป Flash (ทำบอร์ดค้าง 100%): GPIO6, GPIO7, GPIO8, GPIO9, GPIO10, GPIO11

2. ขาที่เป็น Input-only (รับได้อย่างเดียว สั่งจ่ายไฟไม่ได้): GPIO34, GPIO35, GPIO36, GPIO39

3. ขา Strapping & UART (เสี่ยงต่อการอัปโหลดโค้ดหรือบูตไม่ขึ้น): GPIO0, GPIO2, RX (GPIO3), TX (GPIO1) (หมายเหตุ: ขา 2 บางบอร์ดต่อกับ LED ภายใน แต่ถ้าเอาไปต่อวงจรภายนอกผิดวิธี อาจทำให้บอร์ดเข้าโหมดอัปโหลดโปรแกรมไม่ได้ครับ)


กลุ่มที่ 2: ขาที่ "ปลอดภัย สบายใจ 100%" (Safe to use)

กลุ่มนี้คือ "ที่เหลือใช้ได้หมด" ครับ เหมาะมากสำหรับการเขียนคำสั่ง Pin.OUT หรือ Pin.IN ประกอบไปด้วย: GPIO4, 5, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 32, 33


ลองของจริง: สั่งงาน GPIO ด้วย MicroPython

เมื่อเรารู้แล้วว่าขาไหนปลอดภัย เรามาลองเขียนโค้ดคลาสสิก 2 โปรเจกต์ผ่านโมดูล machine กันครับ


โปรเจกต์ 1: Digital Output (สั่ง LED กระพริบ)

เราจะสั่งให้ LED ที่ต่ออยู่กับขา GPIO 2 (ซึ่งมักจะเป็น LED สีฟ้าที่ติดมาบนบอร์ด ESP32) กระพริบสลับไปมา


from machine import Pin # นำเข้าคลาส Pin สำหรับจัดการ GPIO
import time # นำเข้าโมดูล time สำหรับการหน่วงเวลา

# กำหนดให้ขา GPIO 2 เป็นขาออก (OUT)
led = Pin(2, Pin.OUT)

while True:
led.value(1) # สั่งจ่ายไฟ (HIGH) -> LED ติด
print("LED ON")
time.sleep(1) # หน่วงเวลา 1 วินาที

led.value(0) # สั่งหยุดจ่ายไฟ (LOW) -> LED ดับ
print("LED OFF")
time.sleep(1) # หน่วงเวลา 1 วินาที


Tip: นอกจากคำสั่ง led.value(1) หรือ 0 แล้ว เรายังใช้คำสั่งสั้นๆ อย่าง led.on() และ led.off() ได้ด้วยนะ!


โปรเจกต์ 2: Digital Input (อ่านค่าจากการกดปุ่ม)

คราวนี้เราจะเอาปุ่มกด (Push Button) มาต่อกับขา GPIO 4 เพื่ออ่านสถานะว่ามีคนกดปุ่มหรือไม่ ความเจ๋งคือเราสามารถเปิดใช้ "ตัวต้านทานภายใน" (Internal Pull-up) ผ่านโค้ดได้เลย ไม่ต้องต่อ R ภายนอกให้วุ่นวายบนเบรดบอร์ดครับ!


from machine import Pin
import time

# กำหนดขา GPIO 4 เป็นขาเข้า (IN) และเปิดใช้ Pull-up ภายใน
button = Pin(4, Pin.IN, Pin.PULL_UP)

while True:
button_state = button.value()

if button_state == 0: # เมื่อกดปุ่ม ไฟจะไหลลงกราวด์ (ค่าเป็น 0)
print("???? Button is PRESSED!")
else:
print("... Waiting for press ...")

time.sleep(0.1) # หน่วงเวลาสั้นๆ เพื่อลดอาการปุ่มเบิ้ล (Debounce)


จะเห็นได้ว่าการตั้งค่าขานั้นจบในบรรทัดเดียว Pin(หมายเลขขา, โหมด, ตัวต้านทานเสริม) ไม่ต้องมีฟังก์ชัน pinMode() แยกต่างหากแบบภาษา C ทำให้โค้ดของเราดูสะอาดตาและจัดการได้ง่ายมากๆ


บทสรุป

เคล็ดลับสำหรับชาว IoT คือ "ก่อนต่อสาย ให้เช็ก Pinout เสมอ" ขอบคุณข้อมูลอ้างอิงดีๆ จาก ArtronShop ที่ช่วยให้เราจัดกลุ่มขา ESP32 ได้ง่ายขึ้น เมื่อรวมกับการเขียนโค้ดแบบสั้นกระชับของ MicroPython แล้ว การทำโปรเจกต์ของคุณจะรวดเร็วและไร้บั๊กกวนใจแน่นอนครับ!

ก้าวต่อไป: ตอนนี้เราแยกออกแล้วว่าขาไหนเป็น Input/Output ธรรมดา คุณอยากให้ผมเขียนเจาะลึกไปที่ กลุ่มขา ADC (อ่านค่าเซนเซอร์แบบ Analog) ที่มีข้อควรระวังเรื่อง Wi-Fi รบกวนสัญญาณไหมครับ? บอกผมได้เลยนะ!

บทความนี้มีประโยชน์หรือไม่? (2)
Share
Share Facbook Share Twitter
 

e-Profile RMUTL

เว็บไซต์สำหรับแสดงโปรไฟล์ ผลงาน และข้อมูลวิชาการของบุคลากร

มหาวิทยาลัยเทคโนโลยีราชมงคลล้านนา