K230 Board

GPIOIntroduction

พื้นฐาน GPIO (General Purpose Input/Output) สำหรับ K230

GPIO Pinout

แผนผังขา GPIO ของบอร์ด K230

GPIO K230 Pinout
GPIOคืออะไร

GPIO (General Purpose Input / Output) คือขาพินที่ใช้รับสัญญาณ (Input) หรือส่งสัญญาณ (Output) ระหว่างบอร์ดไมโครคอนโทรลเลอร์กับอุปกรณ์ภายนอก

อุปกรณ์ที่นิยมใช้ร่วมกับ GPIO เช่น LED, ปุ่มกด, เซนเซอร์, รีเลย์, มอเตอร์ เป็นต้น

โหมดของ GPIO

INPUT

โหมด Input

ใช้รับสัญญาณจากภายนอก เช่น ปุ่มกด, เซนเซอร์

OUTPUT

โหมด Output

ใช้ส่งสัญญาณออก เช่น เปิด/ปิด LED, ขับมอเตอร์

GPIO Input (การรับข้อมูลแบบดิจิทัล)

Input คือการทำงานของขา GPIO ในโหมดรับข้อมูลจากอุปกรณ์ภายนอกเข้าสู่บอร์ดไมโครคอนโทรลเลอร์ โดยข้อมูลที่รับเข้ามาจะอยู่ในรูปแบบ สัญญาณดิจิทัล (Digital Signal) ซึ่งสามารถมีค่าได้เพียง 2 สถานะ

HIGHลอจิก 1

มีแรงดันไฟฟ้าอยู่ที่ขา GPIO (โดยทั่วไปประมาณ 3.3V)

LOWลอจิก 0

ไม่มีแรงดันไฟฟ้า หรือแรงดันใกล้เคียง 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)

1

ขา GPIO จะถูกดึงให้เป็น HIGH ตลอดเวลา

2

เมื่อกดสวิตช์ ขา GPIO จะถูกดึงลงเป็น LOW

Pull-up Resistor Circuit

ตัวอย่างแนวคิด (Pull-down)

1

ขา GPIO จะถูกดึงให้เป็น LOW ตลอดเวลา

2

เมื่อกดสวิตช์ ขา GPIO จะถูกดึงขึ้นเป็น HIGH

Pull-down Resistor Circuit

สรุป

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

ตัวอย่างโค้ด GPIO

External Pull-up

ตัวอย่าง Pull-up ภายนอก

External Pull-up Circuit
gpio_input.py
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())
Internal Pull-up

ตัวอย่าง Pull-up ภายใน

Internal Pull-up Circuit
gpio_internal_pull-up_input.py
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 สถานะ

HIGH

ลอจิก 1

มีแรงดันไฟฟ้าออกจากขา GPIO (ประมาณ 3.3V)

LOW

ลอจิก 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)

หลักการ

1

ขา GPIO ทำหน้าที่จ่ายไฟออก (Source Current)

2

HIGHติดLED จะติด เมื่อ GPIO เป็น

3

LOWดับLED จะดับ เมื่อ GPIO เป็น

Active HIGH LED Circuit

ตัวอย่างโค้ด GPIO Output

gpio_output.py
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)

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

LED Active HIGH Result

2แบบ Active LOW (Sink Current)

หลักการ

1

ขา GPIO ทำหน้าที่ดึงกระแสลงกราวด์ (Sink Current)

2

LOWติดLED จะติด เมื่อ GPIO เป็น

3

HIGHดับLED จะดับ เมื่อ GPIO เป็น

Active LOW LED Circuit

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

LED Active LOW Result

สรุป

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 รอบ

0%

LOW ตลอด → ไม่ทำงาน

50%

HIGH ครึ่ง / LOW ครึ่ง

100%

HIGH ตลอด → เต็มที่

ยิ่ง Duty Cycle สูง → พลังงานที่ส่งออกยิ่งมาก

การใช้งาน PWM ที่พบบ่อย

PWM นิยมใช้ในงานควบคุมที่ต้องการ "ปรับระดับ" เช่น

ปรับความสว่างของ LED

หรี่ไฟ / ปรับแสง

ควบคุมความเร็วรอบ มอเตอร์

ปรับความเร็ว

ควบคุมความดัง Buzzer / Speaker

ปรับเสียง

ควบคุมตำแหน่ง Servo Motor

ปรับมุมหมุน

PWM Signal Diagram
pwm_example.py
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)
pwm_example2.py
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 ถ้าลด แสงสว่างก็จะลดลง ถ้าเพิ่ม แสงสว่างก็จะเพิ่มขึ้นด้วย

LED PWM Circuit
pwm_dual.py
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)

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

จากโปรแกรมนี้เป็นโปรแกรมไฟกระพริบ แต่หลอดทั้งสองหลอดสว่างไม่เท่ากัน