จุดประสงค์การเรียนรู้
- สามารถใช้โปรแกรมArduino IDEสั่งงานมอเตอร์กระแสตรงผ่านบอร์ด Lutus Nano Bot ได้
อุปกรณ์ในการใช้งานเบื้องต้น
1. บอร์ด Lotus Nano Bot
2. มอเตอร์กระแสตรง จำนวน 2 ตัว
สาระการเรียนรู้
1. DC Motor
DC Motor เป็นมอเตอร์กระแสตรงที่เปลี่ยนพลังงานไฟฟ้าไปเป็นพลังงานกล โดยอาศัยหลักการเมื่อมีกระแสไฟฟ้าไหลผ่านตัวนำที่วางอยู่ในสนามแม่เหล็ก จะมีแรงเกิดขึ้นที่ลวดเหนี่ยวนำ ทำให้ลวดตัวนำเกิดการเคลื่อนที่ ซึ่งหาค่าแรงนี้ได้จากสมการ F = BIL
เมื่อ F คือ แรงที่เกิดขึ้นจากลวดตัวนำ มีหน่วยเป็นนิวตัน
B คือ ค่าความหนาแน่นของเส้นแรงแม่เหล็ก มีหน่วยเป็นเทสลา
L คือ ความยาวของขดลวดเหนี่ยวนำมีหน่วยเป็นเมตร
การหาทิศทางของแรงมอเตอร์(แรงแม่เหล็กไฟฟ้า) โดยใช้กฎมือซ้าย โดยนิ้นชี้คือทิศของความหนาแน่นของเส้นแรงแม่เหล็ก (ฺB) นิ้วกลางคือทิศของการไหลกระแสไฟฟ้า(I) นิ้วหัวแม่มือคือทิศทางของแรงแม่เหล็กไฟฟ้าที่เป็นต้นกำเนิดให้DC Motorนั้นทำงาน ดังรูปข้างล่าง
PWM (Pulse-Width modulation) ซึ่งเป็นเทคนิคในการเข้ารหัสสัญญาณDigitalให้มีOuputเฉลี่ยคล้ายสัญญาณAnalog โดยจะสร้างLogic HIGH(5V) และ LOW(0V)สลับกันซึ่งจะทำให้คาบเวลาช่วงHIGHของหนึ่งลูกคลื่นมีหน่วยเป็นเปอร์เซนต์หรือที่เรียกกันว่าDuty Cycle หากใช้สัญญาณDigitalในการสั่งงานจะไม่สามารถทำให้DC Motorปรับความเร็วได้ ดังนั้นจึงจำเป็นต้องใช้สัญญาณPWMในการควบคุมความเร็วของมอเตอร์ เพื่อสั่งให้PWMทำงานตั้งแต่ 0 - 255 เทียบกับ 0 - 100 เปอร์เซนต์ของความต่างศักย์ที่จ่ายให้มอเตอร์นั่นเอง (ความต่างศักย์มากมอเตอร์หมุนเร็ว ความต่างศักย์น้อยมอเตอร์จะหมุนช้า) ซึ่งสามารถดูรายละเอียดและคำอธิบายสัญญาณ PWM ดังภาพประกอบข้างล่าง
คุณสมบัติโดยทั่วไปของไดซ์ควบคุมมอเตอร์ 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) มอเตอร์จะหมุนกลับทาง
*** การเช็คทิศทางของมอเตอร์
- เมื่อหมุนมอเตอร์ไปข้างหน้าไฟสีเขียวจะติด
- เมื่อหมุนมอเตอร์ถอยหลังไฟสีแดงจะติด
หลักการทำงานของโค้ดมอเตอร์กระแสตรงใน 1 ช่องสัญญาณ
วิธีทำการทดลอง
กรณีสถานการณ์การทำงาน :
- กดปุ่ม D2(ok) ให้มอเตอร์เดินหน้าด้วยกำลัง 100 เป็นเวลา 1 วินาที แล้วส่งเสียง
- มอเตอร์เลี้ยวขวาด้วยกำลัง 100 เป็นเวลา 1 วินาที หยุด แล้วส่งเสียง
- มอเตอร์ถอยหลังด้วยกำลัง 100 เป็นเวลา 1 วินาที หยุด แล้วส่งเสียง
- มอเตอร์เลี้ยวซ้ายด้วยกำลัง 100 เป็นเวลา 1 วินาที หยุด แล้วส่งเสียง
ตัวอย่างคำสั่งการควบคุมมอเตอร์กระแสตรง
Arduino IDE Code
///////////ตั้งค่าปุ่มกด///////////////////
int button = 2; /// กำหนดปุ่มกดสวิตซ์ขา 2
////////////ตั้งค่าพอร์ตมอเตอร์////////////////////
#define DR1 7 /// กำหนดสัญญาณดิจิตอลขวาที่ 1 พอร์ต 7
#define DR2 8 /// กำหนดสัญญาณดิจิตอลขวาที่ 2 พอร์ต 8
#define PWMR 6 /// กำหนดสัญญาณ PWM ขวาพอร์ต 6
/////////////////////////////////
#define DL1 9 // กำหนดสัญญาณดิจิตอลซ้ายที่ 1 พอร์ต 9
#define DL2 4 // กำหนดสัญญาณดิจิตอลซ้ายที่ 2 พอร์ต 4
#define PWML 5 /// กำหนดสัญญาณ PWM ซ้ายพอร์ต 5
void setup() {
Serial.begin(9600);
//////////////////////////////////////////////////
pinMode(2, INPUT); // ตั้งค่าขา 2 เป็น INPUT
////////กำหนดสัญญาณทุกขาเป็น OUTPUT ///////////////
pinMode(DL1, OUTPUT);
pinMode(DL2, OUTPUT);
pinMode(PWML, OUTPUT);
pinMode(DR1, OUTPUT);
pinMode(DR2, OUTPUT);
pinMode(PWMR, OUTPUT);
////////////////////////////
}
void loop() {
int sw = digitalRead(button);
if (sw == 0) {
tone(3, 1000, 500);
///////////////// เขียน Code ทดสอบที่นี่ /////////////
run(100, 100); delay(1000); run(0, 0);tone(3,1200,100);
run(100, 0); delay(1000); run(0, 0);tone(3,1200,100);
run(-100, -100); delay(1000); run(0, 0);tone(3,1200,100);
run(0, 100); delay(1000); run(0, 0);tone(3,1200,100);
}
///////////////////////////////////////////////
else {
run(0, 0);
}
Serial.println(sw);
}
////////////////////////////////////////
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, LOW);
digitalWrite(DL2, LOW);
analogWrite(PWML, -255);
}
//////////////////////////////////////
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, LOW);
digitalWrite(DR2, LOW);
analogWrite(PWMR, -255);
}
}
ต่อมอเตอร์เข้ากับบอร์ดLotus NanoBot พร้อมติดตั้งใส่ที่ล้อหุ่นยนต์ให้เรียบร้อย โดยเมื่อหมุนล้อไปข้างหน้าเมื่อไม่จ่ายไฟจากแบตเตอรี่หลอดLEDจะต้องขึ้นไฟสีเขียว และเมื่อหมุนล้อไปข้างล่างไฟLEDจะต้องขึ้นไฟสีแดง หากไม่ใช่ให้ทำการสลับขั้วมอเตอร์
ตัวอย่างวีดีโอสอนการใช้งาน
กลุ่มคำสั่งการทำงานมอเตอร์ โดยใช้ Library LotusNanoBot.h
1 run(ความเร็วมอเตอร์ซ้าย,ความเร็วมอเตอร์ขวา); // ความเร็วสามารถใช้ได้สูงสุด 255 ต่ำสุด -255 (เครื่องหมาย - จะกลับทาง)
2 fd(ความเร็วของมอเตอร์ทั้งสองข้าง); //เดินหน้าความเร็วเท่ากัน 2 ล้อ ความเร็วตั้งแต่ 0-255
3 fd2(ความเร็วมอเตอร์ซ้าย,ความเร็วมอเตอร์ขวา); // ความเร็วตั้งแต่ 0-255 สามารถใช้ได้สูงสุด 255 ต่ำสุด -255 (เครื่องหมาย - จะกลับทาง)
4 bk(ความเร็วของมอเตอร์ทั้งสองข้าง); //ถอยหลังความเร็วเท่ากัน 2 ล้อ ความเร็วตั้งแต่ 0-255
5 ao(); //หยุดมอเตอร์ทั้ง 2 ล้อ
6 tl(ความเร็วมอเตอร์ฝั่งขวา); //เลี้ยวซ้ายล้อเดียว ความเร็วตั้งแต่ 0-255
7 tr(ความเร็วมอเตอร์ฝั่งซ้าย); //เลี้ยวขวาล้อเดียว ความเร็วตั้งแต่ 0-255
8 sl(ความเร็วมอเตอร์ฝั่งซ้ายและฝั่งขวา); //เลี้ยวขวา 2 ล้อ ล้อขวาเดินหน้า ล้อซ้ายถอยหลัง ความเร็วตั้งแต่ 0-255
9 sr(ความเร็วมอเตอร์ฝั่งซ้ายและฝั่งขวา);//เลี้ยวขวา 2 ล้อ ล้อซ้ายเดินหน้า ล้อขวาถอยหลัง ความเร็วตั้งแต่ 0-255
ตัวอย่างที่การใช้งานควบคุมมอเตอร์กระแสตรง ผ่านการใช้ Library LotusNanoBot.h
Arduno IDE Library LotusNanoBot.h
#include <LotusNanoBot.h>
void setup() {
}
void loop() {
ok();
run(100,100);delay(1000);run(0,0);snd(1200,100);
run(100,0);delay(1000);run(0,0);snd(1200,100);
run(-100,-100);delay(1000);run(0,0);snd(1200,100);
run(0,100);delay(1000);run(0,0);snd(1200,100);
}