PWM Arduino คืออะไร ใช้หรี่ไฟ LED และควบคุมมอเตอร์อย่างไร
เตรียมของให้พร้อม!
โปรเจคนี้ต้องใช้: สายไฟคู่แดงดำ 24AWG ยาว20ซม. ทองแดง 50/100เส้น สำหรับงานอิเล็กทรอนิกส์ LED Arduino Drone DIY โมเดลรถ
PWM Arduino คืออะไร ทำไมต้องเข้าใจเรื่องนี้
ถ้าคุณเคยลองใช้ Arduino ควบคุม LED และอยากหรี่ไฟให้สว่างน้อยลง หรือปรับความเร็วมอเตอร์ให้ช้าลงบ้างเร็วลงบ้าง แต่ยังไม่แน่ใจว่าจะทำยังไง PWM Arduino คือสิ่งที่ต้องรู้
PWM ย่อมาจาก Pulse Width Modulation คือเทคนิคการส่งสัญญาณดิจิทัลแบบเปิด-ปิดเร็วๆ เพื่อเปลี่ยนค่าเฉลี่ยของไฟที่ออกมา วิธีนี้ใช้กันทั่วไปในงานควบคุมแสง ความเร็วมอเตอร์ และสร้างเสียง ถ้าเข้าใจเรื่องนี้แล้วจะทำโปรเจกต์ได้หลากหลายขึ้นมาก
[image: ภาพแสดงสัญญาณ PWM ที่ Duty Cycle ต่างกัน ตั้งแต่ 25% จนถึง 75%]
ทำความเข้าใจเรื่อง Duty Cycle ก่อนใช้ PWM
สัญญาณ PWM จะมีลักษณะเป็น cycle ซ้ำๆ ในแต่ละ cycle จะมีช่วง ON (ไฟขึ้น) และช่วง OFF (ไฟลง)
Duty Cycle คือเปอร์เซ็นต์ของเวลาที่สัญญาณ ON ใน 1 cycle
- Duty Cycle 0% = ไฟปิดตลอด
- Duty Cycle 50% = ไฟเปิดครึ่งเวลา ปิดครึ่งเวลา
- Duty Cycle 100% = ไฟเปิดตลอด
Arduino ส่งสัญญาณ PWM ที่ความถี่ประมาณ 490 Hz (บนขาส่วนใหญ่) ซึ่งเร็วพอจนตาเห็นแค่ความสว่างเฉลี่ย ไม่เห็นการกระพริบ
[image: ภาพเปรียบเทียบสัญญาณ PWM ที่ความถี่ต่างกัน]
ขา PWM บน Arduino มีขาไหนบ้าง
Arduino Uno มีขา PWM 6 ขา ได้แก่ D3, D5, D6, D9, D10, D11 สังเกตได้จากเครื่องหมาย ~ (tilde) ข้างหน้าตัวเลข เวลาต่อวงจรต้องต่อที่ขาเหล่านี้เท่านั้นถึงจะใช้ฟังก์ชัน analogWrite ได้
สำหรับ Arduino Mega มีขา PWM ถึง 15 ขา (D2-D13 และ D44-D46) ส่วน Nano ก็มี PWM 6 ขาเหมือน Uno
| บอร์ด | ขา PWM |
|---|---|
| Arduino Uno | D3, D5, D6, D9, D10, D11 |
| Arduino Nano | D3, D5, D6, D9, D10, D11 |
| Arduino Mega | D2-D13, D44-D46 |
วิธีใช้ PWM หรี่ไฟ LED ด้วย Arduino
วงจรที่ต้องเตรียม
- Arduino Uno/Nano
- LED 1 ตัว
- ตัวต้านทาน 220-330Ω 1 ตัว (ป้องกัน LED ขาด)
- สายไฟและบอร์ดทดลอง
[image: ภาพวงจรต่อ LED กับขา PWM ของ Arduino]
ตัวต้านทานจำเป็นไหม
จำเป็นมาก LED ถ้าไม่มีตัวต้านทานจะกินกระแสมากเกินไปจนขา Arduino พังได้ LED ทั่วไปกินกระแส 20mA ถ้าใช้ไฟ 5V จาก Arduino ใช้ R = (5-2)/0.02 = 150Ω ขึ้นไป 220-330Ω ก็ปลอดภัยและไม่สว่างเกิน
โค้ดหรี่ไฟ LED
int ledPin = 9; // ใช้ขา D9 ซึ่งเป็น PWM ขา
int brightness = 0; // ค่าความสว่างเริ่มต้น
int fadeAmount = 5; // ค่าที่เพิ่ม/ลดทีละเท่าไร
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
analogWrite(ledPin, brightness); // ส่งสัญญาณ PWM ค่า 0-255
brightness = brightness + fadeAmount;
// ถ้าถึงขอบเขตบนสุดหรือล่างสุดให้กลับทิศ
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
}
delay(30); // หน่วงเวลาให้เห็นการเปลี่ยนแปลง
}
โค้ดนี้จะทำให้ LED ค่อยๆ สว่างขึ้นจนถึงขั้นสูงสุดแล้วค่อยๆ มืดลงวนซ้ำ ฟังก์ชัน analogWrite() รับค่า 0-255 ซึ่ง 0 คือปิด (Duty Cycle 0%) และ 255 คือเปิดเต็มที่ (Duty Cycle 100%)
ปรับความสว่าง LED ด้วย Potentiometer
ถ้าอยากควบคุมความสว่างด้วยมือหมุน ใช้ potentiometer (ตัวต้านทานปรับค่าได้) อ่านค่าจากขา Analog แล้วส่งไปที่ขา PWM
int potPin = A0; // ขาอ่านค่าตัวต้านทานปรับค่า
int ledPin = 9; // ขา PWM ที่ต่อ LED
int potValue = 0; // ค่าที่อ่านได้จาก potentiometer
void setup() {
Serial.begin(9600);
}
void loop() {
potValue = analogRead(potPin); // อ่านค่า 0-1023
potValue = map(potValue, 0, 1023, 0, 255); // แปลงเป็น 0-255
analogWrite(ledPin, potValue); // ส่งไปควบคุม LED
Serial.println(potValue); // ดูค่าผ่าน Serial Monitor
delay(10);
}
[image: ภาพวงจรต่อ potentiometer และ LED กับ Arduino]
ปรับความเร็วมอเตอร์ DC ด้วย PWM
การควบคุมมอเตอร์ DC ต้องระวังเรื่องกระแสให้ดี มอเตอร์กินกระแสมากกว่า Arduino รับได้ (ประมาณ 40mA ต่อขา) ดังนั้นต้องใช้วงจรขับมอเตอร์ เช่น L298N, L293D หรือ MOSFET
วิธีต่อมอเตอร์กับ L298N
L298N เป็น motor driver ที่ใช้กันเยอะมาก รองรับมอเตอร์ 2 ตัว รับไฟจาก external power supply ได้ เหมาะสำหรับโปรเจกต์หุ่นยนต์หรือรถบังคับ
int motorPin = 3; // ขา PWM สำหรับควบคุมความเร็ว
int dirPin1 = 4; // ขากำหนดทิศทาง 1
int dirPin2 = 5; // ขากำหนดทิศทาง 2
void setup() {
pinMode(motorPin, OUTPUT);
pinMode(dirPin1, OUTPUT);
pinMode(dirPin2, OUTPUT);
}
void loop() {
// หมุนไปข้างหน้า
digitalWrite(dirPin1, HIGH);
digitalWrite(dirPin2, LOW);
// ปรับความเร็ว 0-255
analogWrite(motorPin, 128); // ความเร็ว 50%
delay(2000);
// หยุด
analogWrite(motorPin, 0);
delay(1000);
// หมุนถอยหลัง
digitalWrite(dirPin1, LOW);
digitalWrite(dirPin2, HIGH);
analogWrite(motorPin, 128);
delay(2000);
}
[image: ภาพวงจรต่อ L298N กับมอเตอร์ DC และ Arduino]
ข้อควรระวังเมื่อใช้ PWM กับมอเตอร์
จากประสบการณ์ที่เจอมาแล้ว มีจุดที่ต้องระวังดังนี้
1. อย่าต่อมอเตอร์โดยตรงเข้าขา Arduino
มอเตอร์กินกระแสสูงตอนเริ่มหมุน (stall current) ซึ่งอาจเกิน 200mA และทำลายขา Arduino ได้ ถ้าใช้มอเตอร์เล็กมากๆ อาจรอดแต่ไม่คุ้มความเสี่ยง
2. ใส่ flyback diode เสมอ
มอเตอร์สร้าง voltage spike ตอนหยุดหมุนเร็วมาก อาจถึงหลายร้อยโวลต์ ทำลาย Arduino ได้ ถ้าใช้ motor driver อย่าง L298N จะมี diode ภายในแล้ว แต่ถ้าควบคุมมอเตอร์เองด้วย MOSFET ต้องต่อ flyback diode ข้างมอเตอร์ด้วย
3. แหล่งจ่ายไฟต้องเสถียร
มอเตอร์กินไฟเยอะ ถ้าใช้ USB จ่ายไฟอาจไม่พอ โปรเจกต์ที่ฉันเคยทำต้องใช้ adapter 12V แยกจ่ายให้มอเตอร์ แล้วใช้วงจรลดแรงดันเหลือ 5V จ่ายให้ Arduino
4. มอเตอร์สั่น (vibration) แม้จะสั่งหยุดแล้ว
ถ้าใช้ PWM กับค่าต่ำๆ มอเตอร์อาจสั่นแทนที่จะหยุดเพราะ Duty Cycle ต่ำเกินไป ลองปรับดูว่าค่าต่ำสุดที่มอเตอร์ยังหมุนได้อยู่เท่าไร แล้วใช้ค่าต่ำกว่านั้นแทนการปิดด้วย digitalWrite(LOW)
ความถี่ PWM ของ Arduino ปรับเปลี่ยนได้
ค่าเริ่มต้น 490 Hz ของ Arduino เพียงพอสำหรับ LED และมอเตอร์ส่วนใหญ่ แต่ถ้าต้องการใช้ PWM ควบคุมเซอร์โวมอเตอร์ จะต้องใช้ความถี่ประมาณ 50 Hz ซึ่งต้องตั้งค่า timer registers ด้วยโค้ดเพิ่มเติม
สำหรับผู้เริ่มต้น ใช้ค่าเริ่มต้นไปก่อนก็เพียงพอ ยังไม่ต้องไปยุ่งกับ timer registers ในระดับนี้
ทางเลือกอื่นเมื่อขา PWM ไม่พอ
บางครั้งโปรเจกต์ใช้ขา PWM เกินจำนวนที่มี เช่น ต้องการควบคุม LED หลายตัวแบบอิสระ มีวิธีแก้ดังนี้
- ใช้ PCA9685 ขยายขา PWM ได้ 16 ขาต่อ IC และต่อขยายได้หลายตัวผ่าน I2C
- ใช้ LED driver อย่าง WS2812B (Neopixel) ควบคุม LED หลายตัวด้วยขาเพียง 1 ขา
- ใช้โครงสร้าง charlieplexing สำหรับ LED matrix ที่ต้องการประหยัดขาให้สุด
[image: ภาพบอร์ด PCA9685 พร้อมเชื่อมต่อกับ LED หลายตัว]
สรุป
PWM Arduino เป็นพื้นฐานที่ใช้บ่อยมากในโปรเจกต์อิเล็กทรอนิกส์ หลักการคือส่งสัญญาณเปิด-ปิดเร็วๆ แล้วใช้ค่า Duty Cycle (0-255) ควบคุมความสว่าง LED หรือความเร็วมอเตอร์ วิธีใช้ก็ง่ายแค่ใช้ analogWrite() กับขาที่มีเครื่องหมาย ~ ขอให้อย่าลืมใส่ตัวต้านทานป้องกัน LED และใช้ motor driver สำหรับมอเตอร์ก็ใช้งานได้แล้ว
ถ้าอยากเรียนรู้เพิ่มเติมเรื่อง Arduino พื้นฐาน อ่านบทความ Arduino คืออะไร? เริ่มต้นเรียนรู้ฉบับเข้าใจง่าย หรือถ้าสนใจบอร์ดที่แรงกว่าและมี PWM ขาเยอะกว่า ลองดู ESP32 คืออะไร? ซึ่งมี PWM แบบซอฟต์แวร์ได้ทุกขา
อยากทำโปรเจคแบบนี้?
รับทำโปรเจค Arduino / IoT จบงานไว ส่งงานครบ พร้อมสอน
หากต้องการ รับทำโปรเจคอาดูโน่ หรือระบบ IoT แบบเร่งด่วน สามารถดูรายละเอียดบริการได้ที่หน้าแรก
จ้างทำโปรเจคเลย