จุดประสงค์การเรียนรู้
สามารถเขียน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
หลักการในการสั่งงานความเร็วและควบคุมทิศทางของมอเตอร์กระแสตรง โดยปกติจะใช้ 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
MB102 Breadboard
DC Motor
VM
VCC
GND
A01 หรือ A1
A02 หรือ A2
B01 หรือ B1
B02 หรือ B2
PWMA
AIN2
AIN1
STBY
BIN1
BIN2
PWMB
3V3
GND
D4
D17/TX2
D16/RX2
3V3
D2
D15
D13
+ (5V-OFF)
-
มอเตอร์ตัวที่1 +
มอเตอร์ตัวที่1 -
มอเตอร์ตัวที่2 +
มอเตอร์ตัวที่2 -
ภาพการต่อไดซ์มอเตอร์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);
}
}
** กรณีใช้งานใน 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 มิลลิวินาที
-หยุดการทำงาน