🎯 เกี่ยวกับโปรเจกต์นี้

ในบทความนี้ คุณจะได้เรียนรู้วิธีสร้างรถหุ่นยนต์ที่ควบคุมผ่าน Wi-Fi โดยใช้ ESP32 และ Arduino IDE คุณสามารถควบคุมรถผ่าน Web Browser บนสมาร์ทโฟนหรือคอมพิวเตอร์ได้อย่างง่ายดาย โปรเจกต์นี้เหมาะสำหรับผู้เริ่มต้นที่ต้องการเรียนรู้การควบคุมมอเตอร์ DC และการสร้าง Web Server ด้วย ESP32

1️⃣ เตรียม Arduino IDE

ก่อนเริ่มโปรเจกต์ คุณต้องติดตั้ง Arduino IDE และเพิ่ม ESP32 boards เข้าไปก่อน หากคุณยังไม่ได้ติดตั้ง สามารถทำตามคู่มือด้านล่างนี้:

💡 ติดตั้ง ESP32 บน Arduino IDE

Arduino IDE เป็นโปรแกรมที่เราจะใช้เขียนโค้ดและอัปโหลดไปยัง ESP32 การติดตั้ง ESP32 boards จะทำให้เราสามารถเลือก ESP32 เป็น board ที่ต้องการใช้งานได้

📖 คู่มือติดตั้ง ESP32 บน Arduino IDE

✅ เช็คลิสต์ก่อนเริ่ม

  • ติดตั้ง Arduino IDE เวอร์ชันล่าสุดแล้ว
  • เพิ่ม ESP32 boards ใน Arduino IDE แล้ว
  • ทดสอบอัปโหลดโค้ดง่ายๆ ไปยัง ESP32 ได้สำเร็จ

2️⃣ อุปกรณ์ที่ต้องใช้

นี่คือรายการอุปกรณ์ทั้งหมดที่คุณต้องใช้ในการสร้างรถหุ่นยนต์ควบคุมผ่าน Wi-Fi:

🛒
หาซื้ออุปกรณ์ได้ที่ GlobalByte Shop!

อุปกรณ์ครบ คุณภาพดี พร้อมส่งทันใจ

ช้อปเลย! →
🔷
ESP32 DOIT DEVKIT V1

บอร์ดหลักที่ใช้ควบคุมรถและสร้าง Wi-Fi Web Server

🤖
Smart Robot Chassis Kit

ชุดโครงรถพร้อมมอเตอร์ DC 2 ตัวและล้อ

L298N Motor Driver

ตัวขับมอเตอร์สำหรับควบคุมความเร็วและทิศทาง

🔋
Power Bank

สำหรับจ่ายไฟให้ ESP32 (แบบชาร์จมือถือ)

🔋
4x AA Batteries (1.5V)

สำหรับจ่ายไฟให้มอเตอร์ DC

🔌
2x Ceramic Capacitors (100nF)

ช่วยลดสัญญาณรบกวนจากมอเตอร์

🔘
SPDT Slide Switch

สวิตช์เปิด-ปิดไฟ

🔗
Jumper Wires

สายจั๊มเปอร์สำหรับต่อวงจร

📟
Breadboard / Stripboard

บอร์ดทดลองสำหรับต่อวงจร

📎
Velcro Tape

เทปกาวสำหรับติดอุปกรณ์บนรถ

⚠️ หมายเหตุสำคัญ

แบตเตอรี่ AA 1.5V จำนวน 4 ก้อน จะให้แรงดัน 6V ซึ่งเหมาะสำหรับมอเตอร์ DC ส่วนใหญ่ คุณอาจพิจารณาใช้แบตเตอรี่แบบชาร์จได้ (rechargeable) เพื่อประหยัดค่าใช้จ่ายในระยะยาว

3️⃣ มอเตอร์ DC และ L298N Motor Driver

ในโปรเจกต์นี้ เราจะใช้มอเตอร์ DC 2 ตัวควบคุมผ่าน L298N Motor Driver ซึ่งช่วยให้เราสามารถควบคุมความเร็วและทิศทางของมอเตอร์ได้อย่างง่ายดาย

L298N Motor Driver Module
L298N Motor Driver - ตัวขับมอเตอร์ที่ใช้ควบคุมมอเตอร์ DC 2 ตัว
L298N Motor Driver Module

ตัวขับมอเตอร์คุณภาพดี รองรับมอเตอร์ DC 2 ตัว

ดูสินค้า →

ทำความรู้จักกับ L298N Motor Driver

L298N เป็น Motor Driver ที่ได้รับความนิยมมากในการควบคุมมอเตอร์ DC เพราะ:

  • ควบคุมได้ 2 มอเตอร์: สามารถควบคุมมอเตอร์ DC ได้ถึง 2 ตัวพร้อมกัน
  • ควบคุมความเร็ว: ใช้ PWM ในการปรับความเร็วมอเตอร์
  • ควบคุมทิศทาง: สามารถสั่งให้มอเตอร์หมุนไปข้างหน้าหรือถอยหลังได้
  • แรงดันสูง: รองรับแรงดัน 5V-35V และกระแสสูงสุด 2A ต่อช่อง

📚 เรียนรู้เพิ่มเติม

ก่อนเริ่มโปรเจกต์ เราแนะนำให้คุณทำความเข้าใจวิธีการควบคุมมอเตอร์ DC ด้วย ESP32 และ L298N ก่อน:

📖 คู่มือควบคุมมอเตอร์ DC ด้วย ESP32

4️⃣ ชุดโครงรถหุ่นยนต์ (Robot Chassis Kit)

ในโปรเจกต์นี้ เราจะใช้ Smart Robot Chassis Kit ซึ่งเป็นชุดโครงรถที่มาพร้อมกับมอเตอร์ DC 2 ตัว ล้อ และอุปกรณ์ประกอบต่างๆ

Smart Robot Chassis Kit
Smart Robot Chassis Kit - ชุดโครงรถพร้อมมอเตอร์และล้อ
🤖
2WD Smart Robot Car Chassis

ชุดโครงรถหุ่นยนต์ 2 ล้อ พร้อมมอเตอร์และอุปกรณ์ครบชุด

ดูสินค้า →

ประกอบชุดโครงรถ

หากคุณยังไม่เคยประกอบชุดโครงรถมาก่อน สามารถดูคู่มือการประกอบได้จากลิงก์ด้านล่าง:

🔧 คู่มือการประกอบ

คู่มือแสดงขั้นตอนการประกอบชุดโครงรถอย่างละเอียด ตั้งแต่การติดตั้งมอเตอร์ ล้อ และที่ใส่แบตเตอรี่:

📖 คู่มือประกอบ Robot Chassis Kit

✅ เคล็ดลับการประกอบ

  • ใช้ไขควงที่มีขนาดเหมาะสมกับสกรู
  • ตรวจสอบว่ามอเตอร์ติดแน่นกับโครงรถ
  • ทดสอบหมุนล้อให้แน่ใจว่าไม่มีอะไรขัดขวาง
  • ติดเทปกาวใต้ที่ใส่แบตเตอรี่เพื่อไม่ให้เลื่อน

5️⃣ ภาพรวมโปรเจกต์

การทำงานของระบบ Wi-Fi

ESP32 จะสร้าง Wi-Fi Access Point ขึ้นมา คุณสามารถเชื่อมต่อสมาร์ทโฟนหรือคอมพิวเตอร์เข้ากับ Wi-Fi นี้ แล้วเปิด Web Browser เพื่อควบคุมรถผ่านหน้าเว็บที่ ESP32 สร้างขึ้น

ESP32 Web Server Control Interface
หน้าจอควบคุมรถผ่าน Web Browser

ปุ่มควบคุมรถ

หน้าเว็บจะมีปุ่มควบคุมต่างๆ ดังนี้:

  • ไปข้างหน้า (Forward): มอเตอร์ทั้งสองหมุนไปข้างหน้า
  • ถอยหลัง (Backward): มอเตอร์ทั้งสองหมุนถอยหลัง
  • เลี้ยวซ้าย (Left): มอเตอร์ขวาหมุนเร็วกว่าซ้าย
  • เลี้ยวขวา (Right): มอเตอร์ซ้ายหมุนเร็วกว่าขวา
  • หยุด (Stop): มอเตอร์ทั้งสองหยุดหมุน

แหล่งจ่ายไฟ (Power Supply)

มอเตอร์ DC ใช้กระแสไฟสูง ดังนั้นเราต้องใช้แหล่งจ่ายไฟแยกกัน 2 แหล่ง:

1

จ่ายไฟให้ ESP32

ใช้ Power Bank (แบบชาร์จมือถือ) เชื่อมต่อผ่านสาย USB กับ ESP32 วิธีนี้สะดวกและปลอดภัย

Portable Power Bank for ESP32
Power Bank สำหรับจ่ายไฟให้ ESP32
2

จ่ายไฟให้มอเตอร์ DC

ใช้แบตเตอรี่ AA 1.5V จำนวน 4 ก้อน (รวม 6V) เชื่อมต่อกับ L298N Motor Driver คุณอาจพิจารณาใช้แบตเตอรี่แบบชาร์จได้เพื่อประหยัดค่าใช้จ่าย

AA Batteries for DC Motors
แบตเตอรี่ AA 4 ก้อนสำหรับจ่ายไฟให้มอเตอร์

⚠️ ข้อควรระวัง

ห้ามใช้แหล่งจ่ายไฟเดียวกัน! หากคุณจ่ายไฟให้ทั้ง ESP32 และมอเตอร์จากแหล่งเดียวกัน มอเตอร์จะดึงกระแสมากเกินไปทำให้ ESP32 รีสตาร์ทหรือทำงานผิดพลาดได้

6️⃣ ควบคุมมอเตอร์ DC ด้วย L298N

ก่อนเริ่มประกอบรถ เราแนะนำให้คุณทำความเข้าใจวิธีการควบคุมมอเตอร์ DC ด้วย L298N Motor Driver ก่อน

L298N Motor Driver Module

ตัวขับมอเตอร์ที่จำเป็นสำหรับโปรเจกต์นี้

ดูสินค้า →

การควบคุมความเร็วและทิศทาง

L298N Motor Driver ใช้หลักการดังนี้:

1

ควบคุมทิศทาง

ใช้พิน IN1, IN2 สำหรับมอเตอร์ A และ IN3, IN4 สำหรับมอเตอร์ B โดยการส่งสัญญาณ HIGH/LOW เพื่อกำหนดทิศทางการหมุน

2

ควบคุมความเร็ว

ใช้พิน ENA และ ENB ด้วยสัญญาณ PWM (Pulse Width Modulation) เพื่อปรับความเร็วของมอเตอร์ ค่า PWM 0-255 (0 = หยุด, 255 = เร็วสุด)

📚 คู่มือเรียนรู้

เรียนรู้วิธีการควบคุมความเร็วและทิศทางของมอเตอร์ DC อย่างละเอียด พร้อมตัวอย่างโค้ด:

📖 ESP32 with DC Motor and L298N - Control Speed and Direction

รายละเอียดพิน L298N Motor Driver

L298N Motor Driver Pin Labels
รายละเอียดพินของ L298N Motor Driver

พิน Enable (ENA และ ENB)

พิน Enable ทำหน้าที่เหมือนสวิตช์เปิด-ปิดสำหรับมอเตอร์ของคุณ:

⚡ การทำงานของพิน Enable

  • ส่งสัญญาณ HIGH: มอเตอร์พร้อมทำงานที่ความเร็วสูงสุด
  • ส่งสัญญาณ LOW: มอเตอร์ปิดการทำงาน
  • ส่งสัญญาณ PWM: ควบคุมความเร็วมอเตอร์ได้ (ความเร็วแปรผันตาม duty cycle)

⚠️ หมายเหตุ

สำหรับค่า duty cycle ที่ต่ำมาก มอเตอร์อาจไม่หมุน และอาจมีเสียงหึ่งๆ ต่อเนื่อง ควรใช้ค่า PWM ที่เหมาะสมเพื่อให้มอเตอร์หมุนได้อย่างราบรื่น

พิน Input (IN1, IN2, IN3, IN4)

พิน Input ควบคุมทิศทางการหมุนของมอเตอร์:

  • Input 1 และ Input 2: ควบคุมมอเตอร์ A
  • Input 3 และ Input 4: ควบคุมมอเตอร์ B

🔄 ตัวอย่างการควบคุมทิศทาง

มอเตอร์ A หมุนไปข้างหน้า: Input 1 = LOW, Input 2 = HIGH
มอเตอร์ A หมุนถอยหลัง: Input 1 = HIGH, Input 2 = LOW

มอเตอร์ B ใช้หลักการเดียวกัน โดยใช้ Input 3 และ Input 4

ตารางการควบคุมทิศทางรถ

เพื่อให้รถเคลื่อนที่ไปในทิศทางต่างๆ เราต้องควบคุมมอเตอร์ทั้งสองข้างดังนี้:

⬆️

ไปข้างหน้า (Forward)

IN1 = 0, IN2 = 1, IN3 = 0, IN4 = 1
มอเตอร์ทั้งสองหมุนไปข้างหน้าด้วยความเร็วเท่ากัน

⬇️

ถอยหลัง (Backward)

IN1 = 1, IN2 = 0, IN3 = 1, IN4 = 0
มอเตอร์ทั้งสองหมุนถอยหลังด้วยความเร็วเท่ากัน

➡️

เลี้ยวขวา (Right)

IN1 = 0, IN2 = 1, IN3 = 0, IN4 = 0
เปิดมอเตอร์ซ้าย ปิดมอเตอร์ขวา ทำให้รถเลี้ยวขวา

⬅️

เลี้ยวซ้าย (Left)

IN1 = 0, IN2 = 0, IN3 = 0, IN4 = 1
ปิดมอเตอร์ซ้าย เปิดมอเตอร์ขวา ทำให้รถเลี้ยวซ้าย

⏹️

หยุด (Stop)

IN1 = 0, IN2 = 0, IN3 = 0, IN4 = 0
มอเตอร์ทั้งสองหยุดทำงาน

7️⃣ การต่อวงจร (Wiring)

หลังจากประกอบโครงรถเสร็จแล้ว ให้ทำการต่อวงจรตามแผนผังด้านล่าง:

ESP32 Robot Car Wiring Diagram
แผนผังการต่อวงจร ESP32 กับ L298N Motor Driver

ตารางการต่อสาย

🔌 การเชื่อมต่อ ESP32 กับ L298N

  • IN1 → GPIO 27: ควบคุมทิศทางมอเตอร์ A
  • IN2 → GPIO 26: ควบคุมทิศทางมอเตอร์ A
  • ENA → GPIO 14: ควบคุมความเร็วมอเตอร์ A
  • IN3 → GPIO 33: ควบคุมทิศทางมอเตอร์ B
  • IN4 → GPIO 25: ควบคุมทิศทางมอเตอร์ B
  • ENB → GPIO 32: ควบคุมความเร็วมอเตอร์ B

ขั้นตอนการต่อวงจร

1

ต่อ ESP32 กับ Motor Driver

เริ่มต้นด้วยการเชื่อมต่อ ESP32 กับ L298N Motor Driver ตามแผนผังที่แสดง คุณสามารถใช้ breadboard ขนาดเล็กหรือ stripboard เพื่อวาง ESP32 และสร้างวงจร

ESP32 on Stripboard
ESP32 ติดตั้งบน Stripboard พร้อมการต่อสาย
2

ต่อมอเตอร์เข้ากับ Terminal Blocks

ต่อมอเตอร์แต่ละตัวเข้ากับ terminal blocks ของ L298N เราแนะนำให้บัดกรีตัวเก็บประจุเซรามิก 0.1 µF (100nF) เข้ากับขั้วบวกและลบของมอเตอร์แต่ละตัว เพื่อช่วยลดสัญญาณรบกวนและแรงดันกระชาก

3

ติดตั้งสวิตช์เปิด-ปิด

คุณสามารถบัดกรีสวิตช์แบบสไลด์เข้ากับสายสีแดงที่มาจากที่ใส่แบตเตอรี่ วิธีนี้จะช่วยให้คุณสามารถเปิด-ปิดไฟให้กับมอเตอร์และ motor driver ได้สะดวก

4

เชื่อมต่อแบตเตอรี่

จ่ายไฟให้มอเตอร์โดยเชื่อมต่อที่ใส่แบตเตอรี่ AA 4 ก้อนเข้ากับ power blocks ของ motor driver เนื่องจากคุณต้องการให้รถเคลื่อนที่ได้ ESP32 จะได้รับไฟจาก power bank แทน

ESP32 Robot Circuit on Chassis
วงจรสมบูรณ์ติดตั้งบนโครงรถ
5

ติด Power Bank

ใช้เทปกาว Velcro ติด power bank เข้ากับโครงรถ แล้วเชื่อมต่อกับ ESP32 ผ่านสาย USB อย่าเชื่อมต่อ power bank ตอนนี้! เพราะคุณต้องอัปโหลดโค้ดไปยัง ESP32 ก่อน

⚠️ ข้อควรระวัง

  • ตรวจสอบขั้วบวก-ลบของแบตเตอรี่ให้ถูกต้อง
  • ห้ามต่อสายผิดขั้ว อาจทำให้อุปกรณ์เสียหายได้
  • ตรวจสอบการต่อสายทุกจุดก่อนเปิดไฟ
  • ใช้สายจั๊มเปอร์ที่มีคุณภาพดีเพื่อป้องกันการหลุด

รถหุ่นยนต์ที่ประกอบเสร็จแล้ว

รถหุ่นยนต์ของคุณควรมีหน้าตาคล้ายกับรูปด้านล่าง:

ESP32 Robot Car Fully Assembled
รถหุ่นยนต์ ESP32 ที่ประกอบเสร็จสมบูรณ์

✅ เช็คลิสต์ก่อนทดสอบ

  • ตรวจสอบการต่อสายทั้งหมดว่าถูกต้องตามแผนผัง
  • ตรวจสอบว่าตัวเก็บประจุติดกับมอเตอร์แล้ว
  • ตรวจสอบว่าสวิตช์ทำงานได้ปกติ
  • ตรวจสอบว่าแบตเตอรี่มีไฟเพียงพอ
  • ยังไม่ต้องเชื่อมต่อ power bank (รออัปโหลดโค้ดก่อน)

8️⃣ Arduino Code – ESP32 Remote-Controlled Wi-Fi Car Robot

ตอนนี้เรามาดูโค้ด Arduino สำหรับควบคุมรถผ่าน Wi-Fi กัน โค้ดนี้จะสร้าง Web Server บน ESP32 และให้คุณควบคุมรถผ่าน Browser

💻 โครงสร้างโค้ด

โค้ดนี้ประกอบด้วยส่วนสำคัญดังนี้:

  • การตั้งค่าพิน GPIO: กำหนดพินที่ใช้ควบคุมมอเตอร์
  • การสร้าง Access Point: ESP32 สร้าง Wi-Fi ให้เชื่อมต่อ
  • Web Server: สร้างหน้าเว็บพร้อมปุ่มควบคุม
  • ฟังก์ชันควบคุมมอเตอร์: ฟังก์ชันสำหรับเคลื่อนที่ไปข้างหน้า ถอยหลัง เลี้ยว และหยุด
  • HTML/CSS: ออกแบบหน้าเว็บให้สวยงามและใช้งานง่าย
💾 ESP32_WiFi_Car_Robot.ino
Arduino C++
// ESP32 Wi-Fi Car Robot - Complete Code // ควบคุมรถหุ่นยนต์ผ่าน Wi-Fi Web Server #include <WiFi.h> #include <WebServer.h> // ตั้งค่า Wi-Fi Access Point const char* ssid = "ESP32-Robot-Car"; // ชื่อ Wi-Fi (เปลี่ยนได้) const char* password = "12345678"; // รหัสผ่าน (ต้องมีอย่างน้อย 8 ตัว) // สร้าง Web Server ที่ port 80 WebServer server(80); // กำหนดพิน GPIO สำหรับควบคุมมอเตอร์ const int motor1Pin1 = 27; // IN1 const int motor1Pin2 = 26; // IN2 const int enable1Pin = 14; // ENA const int motor2Pin1 = 33; // IN3 const int motor2Pin2 = 25; // IN4 const int enable2Pin = 32; // ENB // ตั้งค่า PWM const int freq = 30000; const int pwmChannel1 = 0; const int pwmChannel2 = 1; const int resolution = 8; int dutyCycle = 200; // ความเร็ว (0-255) // HTML สำหรับหน้าเว็บควบคุม const char index_html[] PROGMEM = R"rawliteral( <!DOCTYPE HTML> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>ESP32 Robot Car</title> <style> body { font-family: Arial, sans-serif; text-align: center; margin: 0; padding: 20px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); min-height: 100vh; } h1 { color: white; font-size: 2.5rem; margin-bottom: 10px; text-shadow: 2px 2px 4px rgba(0,0,0,0.3); } .subtitle { color: rgba(255,255,255,0.9); font-size: 1.2rem; margin-bottom: 40px; } .container { max-width: 500px; margin: 0 auto; background: white; padding: 40px; border-radius: 20px; box-shadow: 0 10px 40px rgba(0,0,0,0.3); } .control-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 15px; margin: 30px 0; } button { background: linear-gradient(135deg, #00c6ff 0%, #0072ff 100%); border: none; color: white; padding: 30px; font-size: 2rem; border-radius: 15px; cursor: pointer; transition: all 0.3s ease; box-shadow: 0 4px 15px rgba(0,114,255,0.3); } button:hover { transform: translateY(-5px); box-shadow: 0 6px 20px rgba(0,114,255,0.5); } button:active { transform: translateY(-2px); } .stop-btn { background: linear-gradient(135deg, #ff416c 0%, #ff4b2b 100%); grid-column: 2; font-size: 1.5rem; } .forward-btn { grid-column: 2; } .left-btn { grid-column: 1; grid-row: 2; } .right-btn { grid-column: 3; grid-row: 2; } .backward-btn { grid-column: 2; grid-row: 3; } .speed-control { margin-top: 30px; padding: 20px; background: #f8f9fa; border-radius: 10px; } .speed-label { font-size: 1.2rem; color: #2c3e50; margin-bottom: 10px; font-weight: bold; } input[type="range"] { width: 100%; height: 8px; border-radius: 5px; background: #ddd; outline: none; } .speed-value { font-size: 1.5rem; color: #0072ff; font-weight: bold; margin-top: 10px; } </style> </head> <body> <h1>🤖 ESP32 Robot Car</h1> <p class="subtitle">ควบคุมรถหุ่นยนต์ผ่าน Wi-Fi</p> <div class="container"> <div class="control-grid"> <button class="forward-btn" onclick="sendCommand('forward')">⬆️</button> <button class="left-btn" onclick="sendCommand('left')">⬅️</button> <button class="stop-btn" onclick="sendCommand('stop')">⏹️ STOP</button> <button class="right-btn" onclick="sendCommand('right')">➡️</button> <button class="backward-btn" onclick="sendCommand('backward')">⬇️</button> </div> <div class="speed-control"> <div class="speed-label">⚡ ความเร็ว</div> <input type="range" min="0" max="255" value="200" id="speedSlider" onchange="updateSpeed(this.value)"> <div class="speed-value" id="speedValue">200</div> </div> </div> <script> function sendCommand(cmd) { fetch('/' + cmd) .then(response => response.text()) .then(data => console.log(data)) .catch(error => console.error('Error:', error)); } function updateSpeed(value) { document.getElementById('speedValue').textContent = value; fetch('/speed?value=' + value) .then(response => response.text()) .then(data => console.log(data)) .catch(error => console.error('Error:', error)); } </script> </body> </html> )rawliteral"; // ฟังก์ชันควบคุมมอเตอร์ void moveForward() { digitalWrite(motor1Pin1, LOW); digitalWrite(motor1Pin2, HIGH); digitalWrite(motor2Pin1, LOW); digitalWrite(motor2Pin2, HIGH); } void moveBackward() { digitalWrite(motor1Pin1, HIGH); digitalWrite(motor1Pin2, LOW); digitalWrite(motor2Pin1, HIGH); digitalWrite(motor2Pin2, LOW); } void turnLeft() { digitalWrite(motor1Pin1, LOW); digitalWrite(motor1Pin2, LOW); digitalWrite(motor2Pin1, LOW); digitalWrite(motor2Pin2, HIGH); } void turnRight() { digitalWrite(motor1Pin1, LOW); digitalWrite(motor1Pin2, HIGH); digitalWrite(motor2Pin1, LOW); digitalWrite(motor2Pin2, LOW); } void stopMotors() { digitalWrite(motor1Pin1, LOW); digitalWrite(motor1Pin2, LOW); digitalWrite(motor2Pin1, LOW); digitalWrite(motor2Pin2, LOW); } // ฟังก์ชัน Handler สำหรับ Web Server void handleRoot() { server.send(200, "text/html", index_html); } void handleForward() { moveForward(); server.send(200, "text/plain", "Moving Forward"); } void handleBackward() { moveBackward(); server.send(200, "text/plain", "Moving Backward"); } void handleLeft() { turnLeft(); server.send(200, "text/plain", "Turning Left"); } void handleRight() { turnRight(); server.send(200, "text/plain", "Turning Right"); } void handleStop() { stopMotors(); server.send(200, "text/plain", "Stopped"); } void handleSpeed() { if (server.hasArg("value")) { dutyCycle = server.arg("value").toInt(); ledcWrite(pwmChannel1, dutyCycle); ledcWrite(pwmChannel2, dutyCycle); server.send(200, "text/plain", "Speed updated to " + String(dutyCycle)); } else { server.send(400, "text/plain", "Bad Request"); } } void setup() { Serial.begin(115200); // ตั้งค่าพิน GPIO pinMode(motor1Pin1, OUTPUT); pinMode(motor1Pin2, OUTPUT); pinMode(motor2Pin1, OUTPUT); pinMode(motor2Pin2, OUTPUT); // ตั้งค่า PWM ledcSetup(pwmChannel1, freq, resolution); ledcSetup(pwmChannel2, freq, resolution); ledcAttachPin(enable1Pin, pwmChannel1); ledcAttachPin(enable2Pin, pwmChannel2); ledcWrite(pwmChannel1, dutyCycle); ledcWrite(pwmChannel2, dutyCycle); // สร้าง Wi-Fi Access Point WiFi.softAP(ssid, password); IPAddress IP = WiFi.softAPIP(); Serial.println("Access Point Started"); Serial.print("SSID: "); Serial.println(ssid); Serial.print("IP Address: "); Serial.println(IP); // ตั้งค่า Web Server Routes server.on("/", handleRoot); server.on("/forward", handleForward); server.on("/backward", handleBackward); server.on("/left", handleLeft); server.on("/right", handleRight); server.on("/stop", handleStop); server.on("/speed", handleSpeed); // เริ่ม Web Server server.begin(); Serial.println("HTTP server started"); } void loop() { server.handleClient(); }

📝 สิ่งที่ต้องแก้ไขในโค้ด

  • SSID: เปลี่ยนเป็นชื่อ Wi-Fi ที่คุณต้องการ (เช่น "ESP32-Robot-Car")
  • Password: ตั้งรหัสผ่าน Wi-Fi (ต้องมีอย่างน้อย 8 ตัวอักษร)
  • GPIO Pins: ตรวจสอบว่าหมายเลขพินตรงกับการต่อสายของคุณ
  • dutyCycle: ปรับความเร็วเริ่มต้น (0-255)

✅ ขั้นตอนการอัปโหลดโค้ด

  • เปิด Arduino IDE และคัดลอกโค้ดทั้งหมด
  • เลือก Board: "ESP32 Dev Module" หรือ "DOIT ESP32 DEVKIT V1"
  • เลือก Port ที่เชื่อมต่อกับ ESP32
  • กดปุ่ม Upload และรอจนกว่าจะอัปโหลดเสร็จ
  • เปิด Serial Monitor ที่ baud rate 115200 เพื่อดู IP Address

🔍 วิธีการทำงานของโค้ด

1. การตั้งค่าพิน: กำหนดพิน GPIO สำหรับควบคุมมอเตอร์และตั้งค่า PWM

2. สร้าง Access Point: ESP32 สร้าง Wi-Fi ที่คุณสามารถเชื่อมต่อได้

3. Web Server: สร้างหน้าเว็บพร้อมปุ่มควบคุมที่สวยงาม

4. ฟังก์ชันควบคุม: แต่ละปุ่มจะเรียกฟังก์ชันที่ควบคุมมอเตอร์

5. ปรับความเร็ว: Slider ช่วยให้คุณปรับความเร็วได้แบบ Real-time

9️⃣ ทดสอบ Web Server

หลังจากอัปโหลดโค้ดเสร็จแล้ว ให้ทำตามขั้นตอนเหล่านี้เพื่อทดสอบรถของคุณ:

1

เปิด Serial Monitor

เปิด Serial Monitor ใน Arduino IDE (Ctrl+Shift+M) และตั้งค่า baud rate เป็น 115200 คุณจะเห็น IP Address ของ ESP32 (มักจะเป็น 192.168.4.1)

ESP32 Serial Monitor Output
Serial Monitor แสดง IP Address ของ ESP32
2

เชื่อมต่อ Power Bank

ถอดสาย USB จากคอมพิวเตอร์ แล้วเชื่อมต่อ ESP32 กับ Power Bank เปิดสวิตช์แบตเตอรี่สำหรับมอเตอร์

Powering ESP32 Robot with Power Bank
เชื่อมต่อ Power Bank กับ ESP32
3

เชื่อมต่อ Wi-Fi

เปิดการตั้งค่า Wi-Fi บนสมาร์ทโฟนหรือคอมพิวเตอร์ของคุณ ค้นหาและเชื่อมต่อกับ Wi-Fi ที่ชื่อ "ESP32-Robot-Car" (หรือชื่อที่คุณตั้งไว้) ใส่รหัสผ่านที่คุณกำหนดในโค้ด

4

เปิด Web Browser

เปิด Web Browser และพิมพ์ IP Address ที่เห็นใน Serial Monitor (มักจะเป็น 192.168.4.1) คุณจะเห็นหน้าเว็บควบคุมรถ

ESP32 Robot Control Web Interface
หน้าเว็บควบคุมรถบนสมาร์ทโฟน
5

ทดสอบควบคุมรถ

ลองกดปุ่มต่างๆ เพื่อควบคุมรถ: ⬆️ ไปข้างหน้า, ⬇️ ถอยหลัง, ⬅️ เลี้ยวซ้าย, ➡️ เลี้ยวขวา, ⏹️ หยุด คุณสามารถปรับความเร็วได้ด้วย Slider

✅ เคล็ดลับการใช้งาน

  • เริ่มต้นด้วยความเร็วต่ำเพื่อทดสอบการทำงาน
  • ทดสอบในพื้นที่โล่งก่อนเพื่อความปลอดภัย
  • หากรถเคลื่อนที่ผิดทิศทาง ให้สลับสายมอเตอร์
  • ตรวจสอบแบตเตอรี่เป็นประจำ
  • บันทึก IP Address ไว้เพื่อใช้งานครั้งต่อไป

⚠️ การแก้ปัญหา

  • เชื่อมต่อ Wi-Fi ไม่ได้: ตรวจสอบว่า ESP32 ได้รับไฟและรีสตาร์ท
  • รถไม่เคลื่อนที่: ตรวจสอบแบตเตอรี่และการต่อสาย
  • รถเคลื่อนที่ผิดทิศทาง: สลับสายมอเตอร์ที่ terminal blocks
  • เว็บไม่แสดง: ตรวจสอบ IP Address และการเชื่อมต่อ Wi-Fi

🎬 ผลลัพธ์สุดท้าย

เมื่อทำตามขั้นตอนทั้งหมดแล้ว คุณจะได้รถหุ่นยนต์ที่ควบคุมผ่าน Wi-Fi ที่สามารถเคลื่อนที่ไปข้างหน้า ถอยหลัง เลี้ยวซ้าย เลี้ยวขวา และหยุดได้ตามต้องการ!

ESP32 Robot Car Final Result
รถหุ่นยนต์ ESP32 ที่พร้อมใช้งาน

🎉 ยินดีด้วย!

คุณได้สร้างรถหุ่นยนต์ควบคุมผ่าน Wi-Fi ด้วย ESP32 สำเร็จแล้ว! ตอนนี้คุณสามารถ:

  • ควบคุมรถผ่าน Web Browser บนสมาร์ทโฟนหรือคอมพิวเตอร์
  • ปรับความเร็วได้แบบ Real-time
  • เคลื่อนที่ไปในทุกทิศทาง
  • พัฒนาต่อยอดเพิ่มฟีเจอร์ใหม่ๆ

🚀 ไอเดียพัฒนาต่อ

  • เพิ่มเซ็นเซอร์: ติดตั้งเซ็นเซอร์อัลตราโซนิกเพื่อหลีกเลี่ยงสิ่งกีดขวาง
  • กล้อง: เพิ่มกล้อง ESP32-CAM เพื่อดูภาพแบบ Real-time
  • ไฟ LED: เพิ่มไฟ LED สำหรับไฟหน้าและไฟท้าย
  • เซ็นเซอร์เส้น: ทำให้รถวิ่งตามเส้นได้อัตโนมัติ
  • Joystick: เพิ่ม Virtual Joystick บนหน้าเว็บ