ภาพปกสี่เหลี่ยมจัตุรัสขนาด 1024x1024 แสดงอุปกรณ์ ESP32, โมดูลไดรเวอร์มอเตอร์ L298N และพัดลม DC วางเรียงด้านล่าง พื้นหลังโทนสีเขียวฟ้าแบบกราเดียนท์พร้อมลายวงจรและเส้นคลื่น PWM สีเหลือง ข้อความด้านบนเป็นตัวหนา “ESP32 + PWM” และ “ควบคุมพัดลม DC

ควบคุมความเร็วพัดลม DC ด้วย PWM บน ESP32 (LEDC ใหม่ ledcAttach) สำหรับมือใหม่

ควบคุมความเร็วพัดลม DC ด้วย PWM บน ESP32 (LEDC เวอร์ชันใหม่ ledcAttach())

อยากปรับ “แรงลม” ได้ตามใจ? ใช้ ESP32 ยิงสัญญาณ PWM เข้าขา ENA ของไดรเวอร์มอเตอร์ แล้วหมุนพัดลมเบา–แรงได้แบบเนียน ๆ เหมาะกับมือใหม่มาก บทความนี้ใช้ LEDC API แบบใหม่ เพื่อเขียนโค้ดสั้นและอ่านง่าย

อุปกรณ์ที่ใช้ (ตามภาพ)

  • ESP32 Dev Module
  • ไดรเวอร์ L298N (ใช้คุมพัดลม/มอเตอร์ DC 12V)
  • พัดลม/มอเตอร์ DC 12V (2 สาย)
  • แหล่งจ่าย 12VDC สำหรับ L298N
  • สายจัมเปอร์ + ไขควงเล็ก

หมายเหตุ: ถ้ามีพัดลม 2 สายธรรมดา ใช้ L298N ได้เลย (สะดวกสำหรับทดลอง) แต่ถ้าจะทำงานจริงระยะยาว แนะนำ MOSFET แบบ N‑channel + ไดโอดกันไฟย้อน จะร้อนน้อยกว่าครับ

ผังการต่ออย่างย่อ

12V+ / GND → เข้าขั้ว +12V / GND บน L298N

พัดลม 2 สาย → ต่อที่ OUT1 / OUT2 (ให้หมุนทิศเดียวก็พอ)

ESP32 GND → GND ของ L298N (กราวด์ร่วมกัน)

ESP32 GPIO (PWM) → ENA ของ L298N (รับ PWM)

ESP32 ขดควบคุมทิศทาง → IN1 = HIGH, IN2 = LOW (ให้หมุนทิศเดียวคงที่)

ตัวอย่างกำหนดพิน:

ENA ← GPIO 21

IN1 ← GPIO 18

IN2 ← GPIO 19

ศึกษาแผนผังขา ESP32 Pinout Devkit V1 เพื่อเลือกใช้งาน GPIO ได้อย่างถูกต้อง

เลือกค่า PWM ให้เนียนหู

  • ความถี่ (freq): 20–25 kHz ขึ้นไป → พ้นย่านหูคน (~20 kHz) ไม่หงุงหงิง
  • ความละเอียด (res): 8 บิตก็พอ (0–255) / ถ้าต้องละเอียดขึ้นใช้ 10 บิต (0–1023)

โค้ดตัวอย่าง (Arduino IDE, LEDC API แบบใหม่)

กรุณา เข้าสู่ระบบ เพื่อดาวน์โหลด

// ควบคุมความเร็วพัดลมด้วย ESP32 + L298N (LEDC new API)
// ใช้ ledcAttach(pin, freq, resolution_bits) เพื่อรับ channel อัตโนมัติ

// —– ปรับตามการต่อจริง —–
const int PIN_ENA = 21;  // ขา PWM → ENA
const int PIN_IN1 = 18;  // ทิศทาง
const int PIN_IN2 = 19;  // ทิศทาง

const uint32_t PWM_FREQ = 25000;  // 25 kHz หูคนไม่ได้ยิน
const uint8_t PWM_BITS = 10;      // 10 บิต (0-1024)

uint8_t pwmCh;  // channel ที่ระบบจองให้

void setup() {
  Serial.begin(115200);

  // ตั้งทิศทางให้หมุนทางเดียว
  pinMode(PIN_IN1, OUTPUT);
  pinMode(PIN_IN2, OUTPUT);
  digitalWrite(PIN_IN1, HIGH);
  digitalWrite(PIN_IN2, LOW);

  // แนวใหม่: แนบ PWM กับ “ขา” แล้วคืนค่า channel
  pwmCh = ledcAttach(PIN_ENA, PWM_FREQ, PWM_BITS);

  Serial.println(“Fan PWM ready.”);
}

void loop() {
  //เพิ่ม-ลดความเร็วแบบไล่ระดับ
  readControlfromUart();
  delay(600);
}

// ฟังก์ชันตั้งความเร็ว (0.0–1.0)
void motorSpeed(float speed01) {
  speed01 = constrain(speed01, 0.0f, 1.0f);
  int duty = (int)(speed01 * ((1 << PWM_BITS) – 1));
  ledcWrite(PIN_ENA, duty);
  Serial.println(“Duty “+ String(duty));
}

// ฟังก์ชันรับคำสั่งควบคุมความเร็วจาก Uart
void readControlfromUart() {
  String buffer = “”;
  while (Serial.available()) {
    char c = (char)Serial.read();
    if (c == ‘\r’) continue;  // ข้าม CR
    if (c == ‘\n’) {          // ได้ 1 บรรทัด
      buffer.trim();
      if (buffer.length()) {
        // ควบคุมความเร็วพดลม
        if (isNumber(buffer)) {
          float Speed = buffer.toFloat();
          Speed = Speed/10;
          Serial.println(“Data “+ String(Speed));
          motorSpeed(Speed);
        } else {
          Serial.println(“Data ไม่ใช่ตัวเลข”);
        }
      }
      buffer = “”;  // ล้างบัฟเฟอร์
    } else {
      // กัน overflow แบบง่าย ๆ
      if (buffer.length() < 64) buffer += c;
    }
  }
}

// ฟังก์ชันตรวจสอบ String เป็นตัวเลขหรือไม่
bool isNumber(const String &s) {
  if (s.length() == 0) return false;  // ว่าง = ไม่ใช่ตัวเลข
  for (unsigned int i = 0; i < s.length(); i++) {
    if (!isDigit(s[i])) return false;  // ถ้าไม่ใช่ ‘0’-‘9’
  }
  return true;
}
อยากเริ่มใช้งาน Arduino ไม่ยากอย่างที่คิด ลองดูวิธีดาวน์โหลดและติดตั้ง Arduino IDE ใน Arduino IDE Download & Install

ทำไมใช้ ledcAttach() ดี?

  • โค้ดสั้นกว่าเดิม (ไม่ต้อง ledcSetup() + ledcAttachPin() แยกบรรทัด)
  • ระบบจัดสรร channel ให้เอง ลดโอกาสชนกันเวลามีหลาย PWM

อธิบายโค้ด

pwmCh = ledcAttach(PIN_ENA, PWM_FREQ, PWM_BITS);
แนบ PWM เข้าขา ENA แล้วได้ “channel” กลับมาใช้กับ ledcWrite()

ledcWrite(pwmCh, duty);
กำหนด duty cycle (0–255 เมื่อ 8 บิต) ยิ่งมาก → ยิ่งแรง

ตั้ง IN1=HIGH, IN2=LOW เพื่อให้ L298N ป้อนไฟทิศเดียว (เหมาะกับพัดลม 2 สาย)

ทดสอบ & ปรับแต่ง

  • ถ้าพัดลม “สะดุด” ช่วงค่า duty ต่ำ ๆ ให้ลองเริ่มที่ ~40–60 ก่อน
  • ถ้ายังได้ยินเสียงหวีด → เพิ่ม PWM_FREQ เป็น 30–40 kHz (แต่อย่าลืมว่า ความถี่สูงมากอาจทำให้ช่วงปรับละเอียดลดลง)
  • วัดอุณหภูมิฮีตซิงก์ L298N ถ้าร้อนมาก → ใช้พัดลมเล็กช่วยเป่า หรือพิจารณาเปลี่ยนเป็น MOSFET

 

ความปลอดภัยที่ต้องจำ

  • กราวด์ร่วม ระหว่าง ESP32 กับ L298N สำคัญมาก
  • ใส่ ฟิวส์/เบรกเกอร์ DC กับสาย 12V ถ้าเป็นงานใช้งานจริง
  • เก็บสายให้แน่น ใช้หางปลา/สกรูให้แนบแน่น ลดประกายไฟ

FAQ (มือใหม่ถามบ่อย)

ใช้พัดลม 5V ได้ไหม?
ได้ แต่ L298N ต้องรับแรงดันนั้น และแหล่งจ่ายต้องตรงกับพัดลม

ทำไมพัดลมไม่หมุนที่ duty ต่ำ ๆ ?
แรงดันเฉลี่ยยังไม่พอ ให้ตั้งค่าเริ่มที่ ~25–30% ก่อนแล้วค่อยไล่

ตั้งความถี่เท่าไหร่ดี?
20–30 kHz กำลังสวย เงียบหูและลื่น

ใช้ analogWrite() ได้ไหม?
บน ESP32 แนะนำ LEDC (เช่น ledcAttach, ledcWrite) เสถียรกว่า

L298N ร้อนมาก ปกติไหม?
ปกติสำหรับไอซี H‑bridge รุ่นนี้ ถ้าใช้งานจริงนาน ๆ เปลี่ยนเป็น MOSFET จะเย็นและประหยัดกว่า

ต้องต่อไดโอดกันไฟย้อนเพิ่มไหม?
L298N มีภายในแล้ว แต่ถ้าใช้ MOSFET ต้องใส่ flyback diode เอง

พัดลม 3/4 สาย (มีสัญญาณ tach/PWM) ใช้ยังไง?
บทความนี้เน้น 2 สาย ถ้า 4 สาย ควรใช้สัญญาณ PWM ตามสเปกของพัดลม (ระดับ 5V, 25 kHz, open‑collector)

กินไฟจาก ESP32 ได้เลยไหม?
ห้าม! พัดลมต้องใช้ไฟเลี้ยงแยก (เช่น 12V) แล้ว GND ร่วม

จะคุมผ่านอินเทอร์เฟซเว็บ/มือถือได้ยังไง?
ต่อยอดด้วย ESPAsyncWebServer หรือแอป PoPo แล้วส่งค่าดิวตี้มาที่ ESP32 อยากควบคุม pwm ผ่านเว็บแนพนำอ่านบทความ — ESP32 Web Server ควบคุมความสว่างหลอดLED (PWM)

ถ้าจะกลับทิศหมุนทำยังไง?
สลับ IN1/IN2 (HIGH/LOW ↔ LOW/HIGH) แต่ พัดลมใบพัดส่วนใหญ่ไม่ออกแบบให้กลับทิศ ควรใช้ทิศเดียว

Shopping Cart
Scroll to Top