ปรึกษา IoT
Internet of Things • Chapter 09

บทที่ 9 Arduino และ Motor

เรียนรู้การควบคุมมอเตอร์ไฟฟ้าด้วย Arduino ครอบคลุม DC Motor ร่วมกับ L298N Motor Driver, SG90 Micro Servo Motor และ Stepper Motor ร่วมกับ ULN2003 Driver Board พร้อมตัวอย่างโค้ดและภาพประกอบการต่อวงจร

DC Motor L298N Driver Servo SG90 Stepper Motor ULN2003 Serial Control

หัวข้อสำคัญในสไลด์

  • อุปกรณ์ที่ต้องใช้สำหรับการควบคุม Motor
  • โปรแกรม DC Motor หมุนซ้าย-ขวา
  • โปรแกรม Servo Motor หมุน 360 องศา
  • โปรแกรมควบคุม Stepper Motor
  • ตัวอย่างถังขยะอัตโนมัติและบ้านแมว
อ้างอิงสไลด์บทที่ 9
DC Motor + L298N
Servo SG90
Stepper + ULN2003

ภาพรวมบทเรียน

บทที่ 9 Arduino และ Motor เป็นบทเรียนเกี่ยวกับการควบคุมการเคลื่อนที่ในระบบ IoT โดยมอเตอร์แต่ละประเภทมีลักษณะการใช้งานต่างกัน เช่น DC Motor เหมาะกับงานหมุนต่อเนื่อง, Servo Motor เหมาะกับงานควบคุมตำแหน่งหรือทิศทาง และ Stepper Motor เหมาะกับงานควบคุมตำแหน่งอย่างละเอียด

จากสไลด์ บทนี้แบ่งเป็น 4 หัวข้อหลัก ได้แก่ อุปกรณ์ที่ต้องใช้, โปรแกรมมอเตอร์ DC หมุนซ้าย-ขวา, โปรแกรมมอเตอร์ Servo หมุน 360 องศา และโปรแกรมควบคุมการหมุนด้วยสเต็ปมอเตอร์

Learning Objectives

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

อธิบายหน้าที่ของ L298N, SG90 Servo, ULN2003 และ Stepper Motor ได้
ต่อวงจรและเขียนโปรแกรมให้ DC Motor หมุนซ้าย หยุด และหมุนขวาได้
ใช้ไลบรารี Servo เพื่อควบคุม Servo Motor แบบหมุนต่อเนื่องได้
ควบคุม Stepper Motor ผ่าน Serial Monitor ด้วยคำสั่ง 0, 1 และ 2 ได้

ภาพรวมการควบคุมมอเตอร์ด้วย Arduino

Arduino UNO ควบคุมสัญญาณ L298N DC Motor Driver ULN2003 Stepper Driver Motor Output DC Motor: หมุนซ้าย/ขวา Servo: ควบคุมทิศทาง Stepper: ควบคุม Step Arduino ใช้สัญญาณ Digital/PWM ร่วมกับ Driver เพื่อควบคุมการหมุนของ Motor

9.1 อุปกรณ์ที่ต้องใช้

สไลด์เริ่มจากการทบทวนอุปกรณ์พื้นฐาน เช่น Arduino Uno R3, Breadboard และสาย Jumper จากนั้นเพิ่มอุปกรณ์เฉพาะสำหรับการควบคุมมอเตอร์ ได้แก่ L298N Motor Drive Module, DC Motor, SG90 Micro Servo Motor, ULN2003 Driver Board และ 5V 4-phase Stepper Motor

Arduino Uno R3

บอร์ดควบคุมหลัก ใช้ส่งสัญญาณไปยัง Driver หรือมอเตอร์

Breadboard

ใช้ทดลองวงจรเบื้องต้นโดยไม่ต้องบัดกรี

Jumper Wire

ใช้เชื่อมต่อ Arduino, Motor Driver และอุปกรณ์ต่าง ๆ

L298N Motor Drive Module

รับคำสั่งจาก Arduino เพื่อควบคุมทิศทางและความเร็วของ DC Motor

DC Motor

มอเตอร์ที่หมุนได้ทั้งซ้ายและขวา ควบคุมความเร็วด้วยค่าสัญญาณ 0–255

SG90 Micro Servo Motor

ใช้ควบคุมทิศทางการหมุนซ้าย ขวา หยุด และปรับความเร็วด้วย Pulse Width

ULN2003 Driver Board

บอร์ดขับ Stepper Motor สำหรับควบคุมการจ่ายไฟไปยังขดลวดแต่ละเฟส

5V 4-phase Stepper Motor

มอเตอร์ที่หมุนเป็น Step เหมาะกับงานควบคุมตำแหน่งและมุมอย่างแม่นยำ

9.2 ประเภทมอเตอร์และแนวคิดการควบคุม

มอเตอร์ในบทนี้แบ่งได้เป็น 3 กลุ่มหลัก โดยแต่ละกลุ่มเหมาะกับงานที่แตกต่างกัน

ชนิดมอเตอร์ลักษณะเด่นอุปกรณ์ขับตัวอย่างงาน
DC Motorหมุนต่อเนื่อง ควบคุมทิศทางซ้าย/ขวาและความเร็วได้L298Nพัดลม รถหุ่นยนต์ สายพาน
Servo Motorควบคุมทิศทางหรือการหมุนด้วยสัญญาณ Pulseต่อกับ Arduino โดยตรงในงานขนาดเล็กแขนกล ฝาถังขยะ ประตูสัตว์เลี้ยง
Stepper Motorควบคุมตำแหน่งและมุมได้ละเอียด หมุนเป็น StepULN2003เครื่องพิมพ์ สแกนเนอร์ งานควบคุมตำแหน่ง

9.3 โปรแกรม DC Motor หมุนซ้าย–ขวา

สไลด์ตัวอย่าง 9.1 ใช้ Arduino UNO R3 ควบคุม DC Motor ผ่าน L298N Motor Drive Module โดยต่อขา Arduino 2 ไปยัง IN3 และขา 3 ไปยัง IN4 ของ Motor Driver จากนั้นต่อ OUT3/OUT4 ไปยังสายของ DC Motor

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

  • Arduino UNO R3
  • บอร์ดทดลอง
  • สายไฟ Jumper ผู้–ผู้ และ ผู้–เมีย
  • L298N Motor Drive Module
  • DC Motor พร้อมใบพัด 80 mm

ภาพประกอบการต่อ Arduino + L298N + DC Motor

Arduino UNO D2 D3 GND 5V L298N Driver IN3 IN4 GND 5V OUT3 OUT4 DC Motor + ใบพัด D2/D3 กำหนดทิศทางการจ่ายไฟผ่าน L298N ทำให้ DC Motor หมุนซ้ายหรือขวา

9.4 Code โปรแกรม DC Motor

โค้ดจากสไลด์กำหนดให้ขา 2 และ 3 ของ Arduino ควบคุมทิศทางมอเตอร์ เมื่อขา 2 เป็น HIGH และขา 3 เป็น LOW มอเตอร์จะหมุนทิศหนึ่ง จากนั้นหยุด และสลับทิศทางโดยให้ขา 2 เป็น LOW และขา 3 เป็น HIGH

int Motor_Pin2 = 2;
int Motor_Pin3 = 3;

void setup() {
  pinMode(Motor_Pin2, OUTPUT);
  pinMode(Motor_Pin3, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  digitalWrite(Motor_Pin2, HIGH);
  digitalWrite(Motor_Pin3, LOW);
  delay(3000);

  digitalWrite(Motor_Pin2, LOW);
  digitalWrite(Motor_Pin3, LOW);
  delay(3000);

  digitalWrite(Motor_Pin2, LOW);
  digitalWrite(Motor_Pin3, HIGH);
  delay(3000);
}
ผลลัพธ์: DC Motor จะหมุนไปด้านขวา 3 วินาที หยุด 3 วินาที แล้วหมุนไปด้านซ้าย 3 วินาที ตามที่สไลด์อธิบาย

9.5 โปรแกรม Servo Motor หมุน 360 องศา

สไลด์ตัวอย่าง 9.2 ใช้ SG90 Micro Servo Motor แบบหมุนต่อเนื่อง 360 องศา โดยควบคุมด้วยคำสั่ง writeMicroseconds() ซึ่งช่วงค่าประมาณ 1500 microseconds จะหยุดหมุน ค่าน้อยกว่า 1500 จะหมุนทิศหนึ่ง และค่ามากกว่า 1500 จะหมุนอีกทิศหนึ่ง

ค่า Pulse โดยประมาณผลลัพธ์
0–1500 microsecondsหมุนทิศทางหนึ่ง ค่ายิ่งน้อยยิ่งหมุนเร็ว
ประมาณ 1500 microsecondsหยุดหมุน
1500–3000 microsecondsหมุนอีกทิศทางหนึ่ง ค่ายิ่งมากยิ่งหมุนเร็ว

วิธีการต่อวงจรตามสไลด์

  • ต่อขา 3 ของ Arduino เข้ากับสายสีส้มของ Servo
  • ต่อขา A5 เข้ากับสายสีแดง
  • ต่อขา GND เข้ากับสายสีน้ำตาล

ภาพประกอบการต่อ Arduino + SG90 Servo

Arduino UNO D3 A5 GND SG90 Servo สายสีส้ม = Signal, สีแดง = VCC, สีน้ำตาล = GND

9.6 Code โปรแกรม Servo

#include <Servo.h>

Servo servo_pin;

void setup() {
  servo_pin.attach(3);
}

void loop() {
  servo_pin.writeMicroseconds(0);
  delay(3000);

  servo_pin.writeMicroseconds(1450);
  delay(3000);

  servo_pin.writeMicroseconds(3000);
  delay(3000);
}
ผลลัพธ์: โปรแกรมจะสั่งให้ Servo Motor หมุนไปทางขวา 3 วินาที หยุด 3 วินาที แล้วหมุนวนซ้าย 3 วินาที

9.7 โปรแกรมควบคุมการหมุนด้วย Stepper Motor

Stepper Motor เป็นมอเตอร์ที่เหมาะกับการควบคุมตำแหน่งและมุมอย่างแม่นยำ เพราะหมุนเป็นจังหวะหรือ Step โดยหลักการคือจ่ายไฟให้ขดลวดทีละชุดเพื่อสร้างสนามแม่เหล็กผลักแกนกลางให้หมุน

สไลด์อธิบายว่าการจ่ายไฟให้ขดลวดทั้ง 4 มุมอย่างถูกลำดับจะทำให้มอเตอร์หมุนได้ และหากเปลี่ยนวิธีจ่ายไฟสามารถเพิ่มความละเอียดของการหมุนได้ เช่น จาก 90 องศาเป็น 45 องศา

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

  • Arduino UNO R3
  • สายไฟ Jumper ผู้–เมีย
  • Driver Board ULN2003
  • 5V 4-phase Stepper Motor

ภาพประกอบการต่อ Arduino + ULN2003 + Stepper Motor

Arduino UNO D8 D9 D10 D11 ULN2003 Driver IN1 IN2 IN3 IN4 5V 4-phase Stepper Motor Arduino ส่งลำดับสัญญาณไปยัง ULN2003 เพื่อจ่ายไฟให้ขดลวดของ Stepper ตามจังหวะ

9.8 Code โปรแกรม Stepper Motor

โค้ดจากสไลด์ใช้ Serial Monitor รับคำสั่งจากผู้ใช้ โดยกำหนดให้พิมพ์ 0 เพื่อหยุดหมุน, 1 เพื่อหมุนขวา และ 2 เพื่อหมุนซ้าย

int Motor_Pin1 = 8;
int Motor_Pin2 = 9;
int Motor_Pin3 = 10;
int Motor_Pin4 = 11;
int Motor_Speed = 4;
char val = '0';

void setup() {
  pinMode(Motor_Pin1, OUTPUT);
  pinMode(Motor_Pin2, OUTPUT);
  pinMode(Motor_Pin3, OUTPUT);
  pinMode(Motor_Pin4, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  if (Serial.available() > 0) {
    val = Serial.read();
    Serial.println(val);
  }

  if (val == '1') {
    rightspin();   // หมุนวนขวา
  }

  if (val == '2') {
    leftspin();    // หมุนวนซ้าย
  }

  if (val == '0') {
    digitalWrite(Motor_Pin1, LOW);
    digitalWrite(Motor_Pin2, LOW);
    digitalWrite(Motor_Pin3, LOW);
    digitalWrite(Motor_Pin4, LOW);
  }
}

void rightspin() {
  digitalWrite(Motor_Pin1, HIGH);
  digitalWrite(Motor_Pin2, LOW);
  digitalWrite(Motor_Pin3, LOW);
  digitalWrite(Motor_Pin4, LOW);
  delay(Motor_Speed);

  digitalWrite(Motor_Pin1, LOW);
  digitalWrite(Motor_Pin2, HIGH);
  digitalWrite(Motor_Pin3, LOW);
  digitalWrite(Motor_Pin4, LOW);
  delay(Motor_Speed);

  digitalWrite(Motor_Pin1, LOW);
  digitalWrite(Motor_Pin2, LOW);
  digitalWrite(Motor_Pin3, HIGH);
  digitalWrite(Motor_Pin4, LOW);
  delay(Motor_Speed);

  digitalWrite(Motor_Pin1, LOW);
  digitalWrite(Motor_Pin2, LOW);
  digitalWrite(Motor_Pin3, LOW);
  digitalWrite(Motor_Pin4, HIGH);
  delay(Motor_Speed);
}

void leftspin() {
  digitalWrite(Motor_Pin1, LOW);
  digitalWrite(Motor_Pin2, LOW);
  digitalWrite(Motor_Pin3, LOW);
  digitalWrite(Motor_Pin4, HIGH);
  delay(Motor_Speed);

  digitalWrite(Motor_Pin1, LOW);
  digitalWrite(Motor_Pin2, LOW);
  digitalWrite(Motor_Pin3, HIGH);
  digitalWrite(Motor_Pin4, LOW);
  delay(Motor_Speed);

  digitalWrite(Motor_Pin1, LOW);
  digitalWrite(Motor_Pin2, HIGH);
  digitalWrite(Motor_Pin3, LOW);
  digitalWrite(Motor_Pin4, LOW);
  delay(Motor_Speed);

  digitalWrite(Motor_Pin1, HIGH);
  digitalWrite(Motor_Pin2, LOW);
  digitalWrite(Motor_Pin3, LOW);
  digitalWrite(Motor_Pin4, LOW);
  delay(Motor_Speed);
}
ผลลัพธ์: เมื่อเปิด Serial Monitor แล้วพิมพ์ 0 มอเตอร์จะหยุดหมุน, พิมพ์ 1 มอเตอร์จะหมุนขวา และพิมพ์ 2 มอเตอร์จะหมุนซ้าย

ภาพประกอบ: คำสั่งผ่าน Serial Monitor

Serial Monitor > 0 // Stop > 1 // Right spin > 2 // Left spin Stepper Motor ทำงานตามคำสั่ง 0 / 1 / 2

9.9 ตัวอย่างการประยุกต์ใช้ Motor ในโครงงาน IoT

ช่วงท้ายสไลด์มีตัวอย่างการนำมอเตอร์ไปประยุกต์ใช้ในโครงงานจริง เช่น ถังขยะอัตโนมัติ และ บ้านแมว โดยใช้ Sensor ตรวจจับสถานะ แล้วใช้ Servo Motor ควบคุมการเปิด–ปิด พร้อมแจ้งเตือนผ่าน LINE Notify หรือระบบแจ้งเตือนอื่น

ภาพประกอบ: ถังขยะอัตโนมัติ

ถังขยะอัตโนมัติ Ultrasonic-1ตรวจคนเข้าใกล้ Ultrasonic-2ตรวจระดับขยะ Servoเปิด/ปิดฝา LEDแสดงสถานะ LINE Alertใกล้เต็ม / เต็มแล้ว

ภาพประกอบ: บ้านแมวอัจฉริยะ

บ้านแมว Motion Sensorแมวอยู่ / ไม่อยู่ Servo Motorควบคุมประตู LEDแสดงสถานะ LINE Alertแจ้งเตือน

ต้องการทำโครงงาน IoT ที่มี Motor ใช้งานจริง?

Siam2Dev ช่วยออกแบบระบบควบคุม Motor, Servo, Stepper, Relay, Sensor, Dashboard และระบบแจ้งเตือน สำหรับ Smart Home, Smart Farm, หุ่นยนต์ และงานวิจัยเชิงประยุกต์

สรุปบทเรียน

บทที่ 9 ช่วยให้ผู้เรียนเข้าใจการควบคุมมอเตอร์ไฟฟ้าหลายชนิดด้วย Arduino ตั้งแต่ DC Motor ที่ต้องใช้ L298N เพื่อควบคุมทิศทาง, Servo Motor ที่ควบคุมด้วย Pulse และ Stepper Motor ที่ควบคุมตำแหน่งด้วยลำดับการจ่ายไฟให้ขดลวด ซึ่งเป็นพื้นฐานสำคัญของหุ่นยนต์ ระบบอัตโนมัติ และโครงงาน IoT ที่มีการเคลื่อนไหว

แบบฝึกหัดท้ายบท

  1. อธิบายหน้าที่ของ L298N Motor Drive Module ในการควบคุม DC Motor
  2. เขียนตารางการต่อขา Arduino กับ L298N และ DC Motor ตามตัวอย่างในบทเรียน
  3. ปรับโค้ด DC Motor ให้หมุนซ้าย 5 วินาที หยุด 2 วินาที แล้วหมุนขวา 5 วินาที
  4. อธิบายความหมายของค่า writeMicroseconds(0), 1450 และ 3000 ในโปรแกรม Servo
  5. อธิบายหลักการทำงานของ Stepper Motor และเหตุผลที่ควบคุมตำแหน่งได้แม่นยำ
  6. แก้โค้ด Stepper Motor ให้รับคำสั่งจาก Serial Monitor เป็นตัวอักษร R, L และ S แทน 1, 2 และ 0
  7. ออกแบบโครงงานถังขยะอัตโนมัติ โดยระบุ Sensor, Motor, Output และระบบแจ้งเตือนที่ต้องใช้
  8. เปรียบเทียบว่า DC Motor, Servo Motor และ Stepper Motor เหมาะกับงานแบบใดบ้าง

คำถามที่พบบ่อยเกี่ยวกับบทที่ 9

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

Servo ทั่วไปควบคุมตำแหน่งมุม เช่น 0–180 องศา แต่ Servo 360 องศาหรือ Continuous Rotation Servo จะควบคุมทิศทางและความเร็วในการหมุนต่อเนื่องมากกว่าการควบคุมตำแหน่งมุมแบบแน่นอน

เหมาะกับงานที่ต้องการควบคุมตำแหน่งหรือมุมอย่างแม่นยำ เช่น เครื่องพิมพ์ สแกนเนอร์ เครื่อง CNC ขนาดเล็ก แขนกล หรือระบบหมุนจาน/ถาดตามตำแหน่งที่กำหนด

ไม่แนะนำสำหรับมอเตอร์ที่กินกระแสสูง ควรใช้แหล่งจ่ายไฟแยกที่เหมาะสมกับมอเตอร์ และต่อ GND ร่วมกับ Arduino เพื่อให้สัญญาณควบคุมอ้างอิงกันได้ถูกต้อง
อ่านต่อ

ต่อยอดจากบทที่ 9

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