มอเตอร์ดีซีประกอบด้วยขั้วต่อใช้งาน 2 ขั้ว หากจ่ายไฟบวกเข้าที่ขั้วหนึ่ง และจ่ายไฟลบเข้าขั้วที่เหลือ จะทำให้มอเตอร์หมุนไปทิศทางหนึ่ง แต่เมื่อสลับขั้วการจ่ายไฟ จะทำให้มอเตอร์หมุนในทิศทางตรงกันข้าม
จุดประสงค์การเรียนรู้
สามารถเขียนCodeภาษาCในArduino IDEควบคุมการทำงานของDC Motorได้
สาระการเรียนรู้
1. DC Motor
เมื่อ F คือ แรงที่เกิดขึ้นจากลวดตัวนำ มีหน่วยเป็นนิวตัน
B คือ ค่าความหนาแน่นของเส้นแรงแม่เหล็ก มีหน่วยเป็นเทสลา
L คือ ความยาวของขดลวดเหนี่ยวนำมีหน่วยเป็นเมตร
การหาทิศทางของแรงมอเตอร์(แรงแม่เหล็กไฟฟ้า) โดยใช้กฎมือซ้าย โดยนิ้นชี้คือทิศของความหนาแน่นของเส้นแรงแม่เหล็ก (ฺB) นิ้วกลางคือทิศของการไหลกระแสไฟฟ้า(I) นิ้วหัวแม่มือคือทิศทางของแรงแม่เหล็กไฟฟ้าที่เป็นต้นกำเนิดให้DC Motorนั้นทำงาน ดังรูปข้างล่าง
ที่มาของภาพ : https://blog.rmutl.ac.th/montri/assets/dc06.pdf
PWM (Pulse-Width modulation) ซึ่งเป็นเทคนิคในการเข้ารหัสสัญญาณDigitalให้ัมีOuputเฉลี่ยคล้ายสัญญาณAnalog โดยจะสร้างLogic HIGH(3.3V) และ LOW(0V)สลับกันซึ่งจะทำให้คาบเวลาช่วงHIGHของหนึ่งลูกคลื่นมีหน่วยเป็นเปอร์เซนต์หรือที่เรียกกันว่าDuty Cycle หากใช้สัญญาณDigitalในการสั่งงานจะไม่สามารถทำให้DC Motorปรับความเร็วได้ ดังนั้นจึงจำเป็นต้องใช้สัญญาณPWMในการควบคุมความเร็วของมอเตอร์ ในที่นี้เราจะใช้ Library-> ESP32Servo.h ที่มีคำสั่ง analogWrite เพื่อสั่งให้PWMทำงานตั้งแต่ 0 - 255 เทียบกับ 0 - 100 เปอร์เซนต์ของความต่างศักย์ที่จ่ายให้มอเตอร์นั่นเอง (ความต่างศักย์มากมอเตอร์หมุนเร็ว ความต่างศักย์น้อยมอเตอร์จะหมุนช้า) ซึ่งสามารถดูรายละเอียดและคำอธิบายสัญญาณ PWM ดังภาพประกอบข้างล่าง
ที่มาของภาพดัดแปลงจาก : https://blog.thaieasyelec.com/espino32-ch6-how-to-use-analog-output/
คุณสมบัติโดยทั่วไปของไดซ์ควบคุมมอเตอร์ TB6612FNG
- รับค่าความต่างศักย์สูงสุดVMที่ใช้งานกับมอเตอร์สูงสุดที่ 15 V
- กระแสที่ขับได้อย่างต่อเนื่องสูงสุด 1.2A
- กระแสสูงสุดชั่วขณะไม่เกิน 3.2A
Datasheetการทำงานของขาสัญญาณ TB6612FNG
ชื่อขา
หน้าที่
VM
ไฟบวกจากแบตเตอรี่ที่ต้องการขับมอเตอร์ 5V-12 V
VCC
ไฟเลี้ยงจากบอร์ดสมองกลฝังตัว 2.7V-5.5V
GND
ไฟลบจากแบตเตอรี่ที่ต้องการขับมอเตอร์ โดยปกติจะต่อคร่อมร่วมกับขาGNDของบอร์ดสมองกลฝังตัวด้วย
A01
มอเตอร์ตัวที่1ขั้ว+
A02
มอเตอร์ตัวที่1ขั้ว-
B01
มอเตอร์ตัวที่2ขั้ว+
B02
มอเตอร์ตัวที่2ขั้ว-
PWMA
สัญญาณPWMA
AI1
สัญญาณดิจิตอล AI1
AI2
สัญญาณดิจิตอล AI2
PWMB
สัญญาณPWMB
BI1
สัญญาณดิจิตอล BI1
BI2
สัญญาณดิจิตอล BI2
STBY
ปกติให้ต่อเข้ากับพอร์ต5vหรือ3V3ในบอร์ดสมองกลฝังตัว
หลักการในการสั่งงานความเร็วและควบคุมทิศทางของมอเตอร์กระแสตรง โดยปกติจะใช้ 3 พอร์ตสัญญาณในการควบคุมมอเตอร์กระแสตรง 1 ตัว ดังนี้ พอร์ตดิจิตอล 2 พอร์ต และพอร์ตPWM1พอร์ต ดังนี้
- กรณีที่ 1 Digital AI1 เป็น HIGH -> Digital AI2 เป็น HIGH มอเตอร์จะหยุดโดยมีการจ่ายกระแสไฟฟ้าล้อจะเบรก
- กรณีที่ 2 Digital AI1 เป็น LOW - >Digital AI2 เป็น LOW มอเตอร์จะหยุดโดยไม่มีการจ่ายกระแสไฟฟ้าล้อจะฟรี
- กรณีที่ 3 Digital AI1 เป็น HIGH -> Digital AI2 เป็น LOW - > PWMA(ความเร็วจาก 0-255) มอเตอร์จะหมุนไปข้างหน้า
- กรณีที่ 4 Digital AI1 เป็น LOW - >Digital AI2 เป็น HIGH- > PWMA (ความเร็วจาก 0-255) มอเตอร์จะหมุนกลับทาง
4. คำสั่งการใช้งาน
รูปแบบการใช้งานคำสั่งในภาษาซีของArduino IDEในเนื้อหานี้ จะใช้คำสั่งดังต่อไปนี้
คำสั่งในArduino IDE
การทำงาน
void setup() {
//คำสั่ง
}
เป็นคำสั่งการประกาศฟังก์ชันการทำงานเพียงครั้งเดียวในตอนแรก
void loop() {
//คำสั่ง
}
เป็นคำสั่งประกาศฟังก์ชันการทำงานแบบวนรอบ
run(ความเร็วมอเตอร์ซ้าย,ความเร็วมอเตอร์ขวา);
เป็นฟังก์ชันที่ประกาศการใช้งานในการหมุนของมอเตอร์ โดยความเร็วของมอเตอร์ตามสัญญาณPWMมีค่าได้ระหว่าง0-255 เช่น
1.เดินหน้า 100 เปอร์เซนต์ จะใช้คำสั่ง run(255,255);
2.ถอยหลัง 100 เปอร์เซนต์ จะใช้คำสั่ง run(-255,-255);
3.เลี้ยวซ้าย 100 เปอร์เซนต์ จะใช้คำสั่ง run(-255,255);
4.เลี้ยวขวา 100 เปอร์เซนต์ จะใช้คำสั่ง run(255,-255);
5.หยุด 100 เปอร์เซนต์ จะใช้คำสั่ง run(0,0);
#include <ESP32Servo.h>
///////// motor/////////
#define DR1 17 //2
#define DR2 16 //15
#define PWMR 4 //13
/////////////////////////////////
#define DL1 2 //16
#define DL2 15//17
#define PWML 13 //4
int snd = 12 ;
int button = 34 ;
void setup() {
pinMode(button,INPUT);
pinMode(DL1, OUTPUT);
pinMode(DL2, OUTPUT);
pinMode(PWML, OUTPUT);
pinMode(DR1, OUTPUT);
pinMode(DR2, OUTPUT);
pinMode(PWMR, OUTPUT);
tone(snd,800,50);tone(snd,900,50);tone(snd,800,500);
}
void loop() {
if (digitalRead(button)==1){
///////// command //////////////////
run(150,150);delay(1000);run(0,0);delay(1000);tone(snd,800,50);
run(-150,-150);delay(1000);run(0,0);delay(1000);tone(snd,800,50);
run(-150,150);delay(1000);run(0,0);delay(1000);tone(snd,800,50);
run(150,-150);delay(1000);run(0,0);delay(1000);tone(snd,800,50);
run(0,0);
}
}
void run(int spl, int spr) // ประกาศฟังก์ชัน run(กำลังมอเตอร์ซ้าาย,กำลังมอเตอร์ขวา);
{
if (spl > 0)
{
digitalWrite(DL1, LOW);
digitalWrite(DL2, HIGH);
analogWrite(PWML, spl);
}
else if (spl < 0)
{
digitalWrite(DL1, HIGH);
digitalWrite(DL2, LOW);
analogWrite(PWML, -spl);
}
else
{
digitalWrite(DL1, HIGH);
digitalWrite(DL2, HIGH);
}
//////////////////////////////////////
if (spr > 0)
{
digitalWrite(DR1, LOW);
digitalWrite(DR2, HIGH);
analogWrite(PWMR, spr);
}
else if (spr < 0)
{
digitalWrite(DR1, HIGH);
digitalWrite(DR2, LOW);
analogWrite(PWMR, -spr);
}
else
{
digitalWrite(DR1, HIGH);
digitalWrite(DR2, HIGH);
}
}