พื้นฐาน GPIO (General Purpose Input/Output) สำหรับ K230
GPIO Pinout
แผนผังขา GPIO ของบอร์ด K230

GPIO (General Purpose Input / Output) คือขาพินที่ใช้รับสัญญาณ (Input) หรือส่งสัญญาณ (Output) ระหว่างบอร์ดไมโครคอนโทรลเลอร์กับอุปกรณ์ภายนอก
อุปกรณ์ที่นิยมใช้ร่วมกับ GPIO เช่น LED, ปุ่มกด, เซนเซอร์, รีเลย์, มอเตอร์ เป็นต้น
โหมดของ GPIO
โหมด Input
ใช้รับสัญญาณจากภายนอก เช่น ปุ่มกด, เซนเซอร์
โหมด Output
ใช้ส่งสัญญาณออก เช่น เปิด/ปิด LED, ขับมอเตอร์
GPIO Input (การรับข้อมูลแบบดิจิทัล)
Input คือการทำงานของขา GPIO ในโหมดรับข้อมูลจากอุปกรณ์ภายนอกเข้าสู่บอร์ดไมโครคอนโทรลเลอร์ โดยข้อมูลที่รับเข้ามาจะอยู่ในรูปแบบ สัญญาณดิจิทัล (Digital Signal) ซึ่งสามารถมีค่าได้เพียง 2 สถานะ
มีแรงดันไฟฟ้าอยู่ที่ขา GPIO (โดยทั่วไปประมาณ 3.3V)
ไม่มีแรงดันไฟฟ้า หรือแรงดันใกล้เคียง 0V
หมายเหตุ: เมื่อกำหนด GPIO ให้เป็นโหมด Input ขานั้นจะ ไม่จ่ายไฟออกไปยังภายนอก แต่จะทำหน้าที่ตรวจสอบและอ่านสถานะของแรงดันไฟฟ้าที่ถูกป้อนเข้ามาเท่านั้น
การรับสัญญาณ Input จากสวิตช์ (Switch)
หนึ่งในอุปกรณ์ที่นิยมใช้กับ GPIO Input มากที่สุดคือ สวิตช์หรือปุ่มกด (Push Button) ซึ่งทำหน้าที่เปิด–ปิดวงจรไฟฟ้า
หลักการทำงานของสวิตช์
ไม่กดสวิตช์ (Open Circuit)
วงจรจะอยู่ในสถานะเปิด ทำให้ขา GPIO อ่านค่าเป็น
LOWกดสวิตช์ (Closed Circuit)
วงจรถูกปิด แรงดันไฟฟ้าจะถูกส่งเข้าสู่ขา GPIO ทำให้อ่านค่าเป็น
HIGHวงจรพื้นฐานของ GPIO Input + สวิตช์
การต่อสวิตช์เข้ากับ GPIO จะต้องคำนึงถึงความเสถียรของสัญญาณ เนื่องจากหากไม่มีการกำหนดแรงดันอ้างอิง ขา GPIO อาจเกิดสถานะลอย (Floating) ทำให้ค่าที่อ่านได้ไม่แน่นอน
ดังนั้นจึงนิยมใช้ ตัวต้านทาน Pull-up หรือ Pull-down ร่วมกับสวิตช์
ตัวอย่างแนวคิด (Pull-up)
ขา GPIO จะถูกดึงให้เป็น HIGH ตลอดเวลา
เมื่อกดสวิตช์ ขา GPIO จะถูกดึงลงเป็น LOW

ตัวอย่างแนวคิด (Pull-down)
ขา GPIO จะถูกดึงให้เป็น LOW ตลอดเวลา
เมื่อกดสวิตช์ ขา GPIO จะถูกดึงขึ้นเป็น HIGH

สรุป
GPIO Input คือการรับข้อมูลแบบดิจิทัลจากอุปกรณ์ภายนอกเข้าสู่บอร์ด โดยสามารถรับค่าได้เพียง HIGH หรือ LOW เท่านั้น การใช้งานร่วมกับสวิตช์จำเป็นต้องออกแบบวงจรให้เหมาะสม เพื่อหลีกเลี่ยงปัญหาสัญญาณลอยและทำให้การอ่านค่าสถานะมีความแม่นยำ
ตัวอย่างโค้ด GPIO
ตัวอย่าง Pull-up ภายนอก

1# Source: https://github.com/apinuntong/CMM-K230/blob/main/gpio_input.py
2from machine import Pin
3from machine import FPIOA
4
5fpioa = FPIOA()
6fpioa.set_function(3, FPIOA.GPIO3)
7
8pin = Pin(3, Pin.IN, pull=Pin.PULL_NONE, drive=7)
9print("out = ", pin.value())ตัวอย่าง Pull-up ภายใน

1# https://github.com/apinuntong/CMM-K230/blob/main/gpio_internal_pull-up_input.py
2from machine import Pin
3from machine import FPIOA
4fpioa = FPIOA()
5fpioa.set_function(3, FPIOA.GPIO3)
6pin = Pin(3, Pin.IN, pull=Pin.PULL_UP, drive=7)
7print("out = ",pin.value())สรุปการใช้งาน
การใช้งาน input สามารถใช้ขา 3, 4, 42, 43, 46, 47, 12, 11, 14, 15, 16, 17 ได้
ภายนอก
ใช้ตัวต้านทานภายนอก
✓ สัญญาณรบกวนน้อย
ภายใน
ใช้ตัวต้านทานภายในบอร์ด
✓ วงจรกระชับ
วงจรพื้นฐานของ GPIO Output + LED
GPIO Output คือโหมดการทำงานของขา GPIO ที่ใช้สำหรับส่งสัญญาณออกจากบอร์ดไปควบคุมอุปกรณ์ภายนอก โดยสัญญาณที่ส่งออกเป็นแบบดิจิทัลซึ่งมีได้เพียง 2 สถานะ
ลอจิก 1
มีแรงดันไฟฟ้าออกจากขา GPIO (ประมาณ 3.3V)
ลอจิก 0
ไม่มีแรงดันไฟฟ้าออกจากขา GPIO (0V)
หนึ่งในอุปกรณ์พื้นฐานที่นิยมใช้ทดสอบ GPIO Output คือ LED (Light Emitting Diode)
หลักการทำงานของ LED กับ GPIO Output
LED เป็นอุปกรณ์ที่ยอมให้กระแสไฟไหลได้เพียงทิศทางเดียว และจะเปล่งแสงเมื่อมีกระแสไฟฟ้าไหลผ่านในทิศทางที่ถูกต้อง
หาก GPIO ส่งค่า HIGH
มีกระแสไฟไหล → LED ติด
หาก GPIO ส่งค่า LOW
ไม่มีกระแสไฟไหล → LED ดับ
องค์ประกอบของวงจร
วงจร GPIO Output + LED พื้นฐานจะประกอบด้วย:
ขา GPIO ของบอร์ด
ทำหน้าที่จ่ายสัญญาณ HIGH / LOW
LED
อุปกรณ์แสดงผลที่ทำงานเมื่อมีกระแสไฟ
ตัวต้านทาน (Resistor)
จำกัดกระแสไฟฟ้าที่ไหลผ่าน
GND (กราวด์)
จุดวงจรไฟฟ้าภาคพื้นดิน
ข้อควรระวัง: ตัวต้านทานเป็นอุปกรณ์ที่จำเป็นต้องใช้เสมอ เพื่อจำกัดกระแสไฟ ไม่ให้ LED และขา GPIO เสียหาย
1แบบ Active HIGH (Source Current)
หลักการ
ขา GPIO ทำหน้าที่จ่ายไฟออก (Source Current)
HIGHติดLED จะติด เมื่อ GPIO เป็น
LOWดับLED จะดับ เมื่อ GPIO เป็น

ตัวอย่างโค้ด GPIO Output
1from machine import Pin
2from machine import FPIOA
3import time
4fpioa = FPIOA()
5fpioa.set_function(3, FPIOA.GPIO3)
6pin = Pin(3, Pin.OUT, pull=Pin.PULL_NONE, drive=7)
7while 1 :
8 pin.value(1)
9 print("LED ON")
10 time.sleep(1)
11 pin.value(0)
12 print("LED OFF")
13 time.sleep(1)ผลลัพธ์การรันโปรแกรม

2แบบ Active LOW (Sink Current)
หลักการ
ขา GPIO ทำหน้าที่ดึงกระแสลงกราวด์ (Sink Current)
LOWติดLED จะติด เมื่อ GPIO เป็น
HIGHดับLED จะดับ เมื่อ GPIO เป็น

ผลลัพธ์การรันโปรแกรม

สรุป
GPIO Output นั้นสามารถต่อวงจรได้ 2 แบบ แต่ละแบบมีการใช้งานที่ไม่เหมือนกันแล้วแต่งาน สามารถใช้ขา 3, 4, 42, 43, 46, 47, 12, 11, 14, 15, 16, 17 ได้
PWM (Pulse Width Modulation) คืออะไร
PWM (Pulse Width Modulation) คือเทคนิคการควบคุมสัญญาณไฟฟ้าแบบดิจิทัล โดยใช้การเปิด–ปิดสัญญาณอย่างรวดเร็วเพื่อควบคุมค่าเฉลี่ยของแรงดันไฟฟ้า หรือกำลังไฟฟ้าที่ส่งไปยังอุปกรณ์
PWM สามารถทำให้แรงดันดูเหมือนเปลี่ยนค่าได้หลายระดับ เช่น หรี่ไฟ LED หรือควบคุมความเร็วรอบมอเตอร์
ความถี่ (Frequency)
จำนวนรอบของสัญญาณต่อวินาที
Duty Cycle
สัดส่วนของช่วงเวลาที่สัญญาณเป็น HIGH
Duty Cycle คืออะไร
Duty Cycle คือสัดส่วนของช่วงเวลาที่สัญญาณอยู่ในสถานะ HIGHเมื่อเทียบกับเวลาทั้งหมดใน 1 รอบ
LOW ตลอด → ไม่ทำงาน
HIGH ครึ่ง / LOW ครึ่ง
HIGH ตลอด → เต็มที่
ยิ่ง Duty Cycle สูง → พลังงานที่ส่งออกยิ่งมาก
การใช้งาน PWM ที่พบบ่อย
PWM นิยมใช้ในงานควบคุมที่ต้องการ "ปรับระดับ" เช่น
ปรับความสว่างของ LED
หรี่ไฟ / ปรับแสง
ควบคุมความเร็วรอบ มอเตอร์
ปรับความเร็ว
ควบคุมความดัง Buzzer / Speaker
ปรับเสียง
ควบคุมตำแหน่ง Servo Motor
ปรับมุมหมุน

1from machine import Pin, FPIOA, PWM
2
3# ตั้งค่า GPIO 42 ให้เป็น PWM0
4fpioa = FPIOA()
5fpioa.set_function(42, fpioa.PWM0)
6
7# ตั้งค่า pwm0 ความถี่ 1000Hz duty 50%
8pwm0 = PWM(0, freq=1000, duty=50)
9
10# เปลี่ยนค่า duty เป็น 40%
11pwm0.duty(40)
12
13# เปลี่ยนค่า duty เป็น 10000 (0-65535)
14pwm0.duty_u16(10000)
15
16# เปลี่ยนค่า duty เป็น 10000ns (0-1000000000)
17pwm0.duty_ns(10000)
18
19# เปลี่ยนค่าความถี่เป็น 2000Hz
20pwm0.freq(2000)1from machine import PWM
2
3from machine import FPIOA
4
5fpioa = FPIOA()
6
7fpioa.set_function(60, fpioa.PWM0)
8
9pwm0 = PWM(0, freq=1000, duty=50)
10
11pwm0.duty(40)พอรันโปรแกรม จะเห็นได้ว่า หลอดไฟจะติด แล้วมีแสงสว่างเป็น 40% สามารถลองเปลี่ยนตัวเลข 40 ถ้าลด แสงสว่างก็จะลดลง ถ้าเพิ่ม แสงสว่างก็จะเพิ่มขึ้นด้วย

1from machine import PWM
2
3from machine import FPIOA
4
5import time
6
7
8fpioa = FPIOA()
9
10fpioa.set_function(42, fpioa.PWM0)
11
12fpioa.set_function(43, fpioa.PWM1)
13
14pwm0 = PWM(0, freq=1000, duty=40)
15
16pwm1 = PWM(1, freq=1000, duty=10)
17
18pwm0.duty(0)
19
20pwm1.duty(0)
21
22while 1 :
23
24 pwm0.duty(10)
25
26 pwm1.duty(20)
27
28 time.sleep(1)
29
30 pwm0.duty(0)
31
32 pwm1.duty(0)
33
34 time.sleep(1)ผลลัพธ์การรันโปรแกรม
จากโปรแกรมนี้เป็นโปรแกรมไฟกระพริบ แต่หลอดทั้งสองหลอดสว่างไม่เท่ากัน