Lab 9 DC Motor

จุดประสงค์การเรียนรู้

สามารถเขียนCodeภาษาCในArduino IDEควบคุมการทำงานของDC Motorได้


สาระการเรียนรู้

1. DC Motor

DC Motor เป็นมอเตอร์กระแสตรงที่เปลี่ยนพลังงานไฟฟ้าไปเป็นพลังงานกล โดยอาศัยหลักการเมื่อมีกระแสไฟฟ้าไหลผ่านตัวนำที่วางอยู่ในสนามแม่เหล็ก จะมีแรงเกิดขึ้นที่ลวดเหนี่ยวนำ ทำให้ลวดตัวนำเกิดการเคลื่อนที่ ซึ่งหาค่าแรงนี้ได้จากสมการ F = BIL

เมื่อ F คือ แรงที่เกิดขึ้นจากลวดตัวนำ มีหน่วยเป็นนิวตัน

B คือ ค่าความหนาแน่นของเส้นแรงแม่เหล็ก มีหน่วยเป็นเทสลา

L คือ ความยาวของขดลวดเหนี่ยวนำมีหน่วยเป็นเมตร

การหาทิศทางของแรงมอเตอร์(แรงแม่เหล็กไฟฟ้า) โดยใช้กฎมือซ้าย โดยนิ้นชี้คือทิศของความหนาแน่นของเส้นแรงแม่เหล็ก (ฺB) นิ้วกลางคือทิศของการไหลกระแสไฟฟ้า(I) นิ้วหัวแม่มือคือทิศทางของแรงแม่เหล็กไฟฟ้าที่เป็นต้นกำเนิดให้DC Motorนั้นทำงาน ดังรูปข้างล่าง

ที่มาของภาพ : https://blog.rmutl.ac.th/montri/assets/dc06.pdf

2. สัญญาณ PWM


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/

3. ไดซ์ควบคุมมอเตอร์TB6612FNG

คุณสมบัติโดยทั่วไปของไดซ์ควบคุมมอเตอร์ TB6612FNG

- รับค่าความต่างศักย์สูงสุดVMที่ใช้งานกับมอเตอร์สูงสุดที่ 15 V

- กระแสที่ขับได้อย่างต่อเนื่องสูงสุด 1.2A

- กระแสสูงสุดชั่วขณะไม่เกิน 3.2A

Datasheetการทำงานของขาสัญญาณ TB6612FNG

หลักการในการสั่งงานความเร็วและควบคุมทิศทางของมอเตอร์กระแสตรง โดยปกติจะใช้ 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ในเนื้อหานี้ จะใช้คำสั่งดังต่อไปนี้

วัสดุอุปกรณ์

1. ไมโครสวิตซ์ ชนิดกดติดปล่อยดับ จำนวน 1 ตัว

2. ตัวต้านทาน 10 กิโลโอห์ม จำนวน 1 ตัว

3. บอร์ด ESP32 Devkit V.1 จำนวน 1 บอร์ด

4. สายMicro USB จำนวน 1 เส้น

5. Breadboard

6. สายแพร Male-Male

7. หลอด LED จำนวน 3 หลอด

8. ตัวต้านทาน 220 โอห์ม จำนวน 3 ตัว

9. ตัวต้านทานปรับค่าได้ Potentiometer จำนวน 1 ตัว

10. ลำโพงBuzzer จำนวน 1 อัน

11. จอแสดงผล OLED I2C จำนวน 1 อัน

12. Servo Motor จำนวน 1 ตัว

13. โมดูลMb 102 Breadboard จำนวน 1 ตัว

14. Adaptor 9Vdc จำนวน 1 ตัว

15. ไดซ์มอเตอร์ TB6612 FNG จำนวน 1 ตัว

16. มอเตอร์กระแสตรง จำนวน 2 ตัว

วิธีทำการทดลอง

1. ต่อวงจรเพิ่มเติมจากLab1-Lab9 โดยไดซ์มอเตอร์TB6612FNG จำนวน 1 ตัว และมอเตอร์กระแสตรงจำนวน 2 ตัว ต่อเพิ่มเติมตามDatasheetและรูปการต่อวงจรด้านล่าง

ตาราง Datasheet การต่อวงจร

ภาพการต่อไดซ์มอเตอร์TB6612FNGร่วมกับESP32,Mb102BreadboardและDC Motor

ภาพการต่อ Mb102Breadboardร่วมกับ Adaptor

2. ทำการCopy Codeด้านล่างก่อนUpload code Arduino IDE ลงไปใบนบอร์ด ESP32 Devkit v1

ควรเลือกที่Tool -> Board -> ESP32 Arduino ->ESP32 Dev Module (ดังภาพประกอบด้านล่าง)

Arduino IDE Code

#include <ESP32Servo.h>

///////// motor/////////

#define DR1 2

#define DR2 15

#define PWMR 13

/////////////////////////////////

#define DL1 16

#define DL2 17

#define PWML 4


int snd = 18 ;

int button = 27 ;

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)==0){

///////// 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);


}

}

3.หลังจากนั้นให้เข้ามาที่ Tool ->Port แล้วเลือกพอร์ตC om portที่เชื่อมกับUSB ดังรูปข้างล่าง

** กรณีใช้งานใน Ubuntu พอร์ตที่ใช้อาจจะเป็นพอร์ตttyUSB0 ซึ่งจะต้องเลือกเป็นพอร์ตชื่อนี้แทนCom port และก่อนกดUpload ให้ทำการเปิดTerminal โดยเข้าไปที่desktop คลิกขวาตรงพื้นที่ว่าง แล้วเลือก Open Terminal หลังจากนั้นให้พิมพ์ข้อความในTerminalดังนี้เพื่อทำการเปิดพอร์ตUSB : sudo chmod 666 /dev/ttyUSB0 หลังจากนั้นให้กดEnter และทำการกรอกรหัสผ่านของเครื่องพร้อมกับกดปุ่มEnterอีกครั้ง หลังจากนั้นก็Upload codeในArduino IDE

4.ทำการกดปุ่มUpload ที่เป็นรูปหัวลูกษร หรือจะกด Ctrl+u ที่คีย์บอร์ดเพื่อทำการUploadโปรแกรมไปที่บอร์ดESP32 ดังรูปข้างล่าง

5.หลังจากที่Uploadโปรแกรมแล้ว ให้กดที่ไมโครสวิตซ์เพื่อเริ่มการทำงานของมอเตอร์ดังนี้

-เดินหน้า1วินาที หยุด1วินาที มีเสียงความถี่ 800Hz ยาว 50 มิลลิวินาที

-ถอยหลัง1วินาที หยุด1วินาที มีเสียงความถี่ 800Hz ยาว 50 มิลลิวินาที

-เลี้ยวซ้าย1วินาที หยุด1วินาที มีเสียงความถี่ 800Hz ยาว 50 มิลลิวินาที

-เลี้ยวขวา1วินาที หยุด1วินาที มีเสียงความถี่ 800Hz ยาว 50 มิลลิวินาที

-หยุดการทำงาน