ผู้เขียนบทความ : 062 นายธนพัฒน์ คงแก้ว COE#15
คณะวิศวกรรมศาสตร์ : สาขาวิศวกรรมคอมพิวเตอร์
วิชา : 04-513-201 การโปรแกรมคอมพิวเตอร์ชั้นสูง 1/2566
1.ความเป็นมา
ประเทศไทยมีภูมิประเทศเหมาะสำหรับทำเกษตรกรรม มีพื้นดินอุดมสมบูรณ์ปกคลุมไปด้วยวัชพืชเช่น หญ้า ที่นิยมนำมาปลูกเพื่อปกคลุมรักษาหน้าดิน หรือขึ้นเองก็ตาม ในปัจจุบันคนหันมารักษาสิ่งแวดล้อมและนิยมนา หญ้ามาปลูกตามสถานที่อาคาร บ้านเรือนต่าง ๆ หรือนำมาปลูกในสนามกีฬา เช่นสนามฟุตบอล ที่มีการเพิ่มจำนวนขึ้นอย่างรวดเร็ว สมัยปัจจุบันเทคโนโลยีทางด้านสิ่งอำนวยความสะดวกได้ถูกพัฒนาขึ้น เพื่อเพิ่มความสะดวกสบายให้กับมนุษย์โดยเฉพาะเครื่องตัดหญ้าที่ผลต่ออกมาก็มีหลายรูปแบบ ผู้ที่ใช้ต้องใช้วิธีการเข็นและวิธีการสะพายเครื่องตัดหญ้าท่ามกลางแดดร้อน และใช้ระยะเวลานานกว่าจะตัดหญ้าเสร็จ
จากปัญหาที่ได้พบดังกล่าว ผู้ประดิษฐ์จึงได้จัดทำ รถตัดหญ้าที่ควบคุมด้วยสมาร์ทโฟน โดยควบคุมการทำงานด้วยมือถือผ่านแอปพลิเคชั่น Blynk เพื่อสั่งการให้ Board esp32 ประมวลผล ที่สามารถควบคุมการเดินหน้าถอยหลังและเลี้ยวซ้ายเลี้ยวขวาได้ ซึ่งจะทำให้ผู้ใช้งานมีความสะดวกสบายมากยิ่งขึ้น ลดความเมื่อยล้าจากการเดินตามเครื่องตัดหญ้า และการอยู่กลางแดดเป็นเวลานานๆ
2.วัตถุประสงค์
1.เพื่อทำแบบจำลองเครื่องตัดหญ้าที่ใช้แอปพลิเคชั่นจากสมาร์ทโฟนควบคุมการทำงาน
2.เพื่อพัฒนาระบบป้องกันอันตราย
3.เรียนรู้ระบบควบคุมจากระยะไกล
3.ขอบเขต
1.ล้อจะทำงานก็ต่อเมื่อมีการควบคุมผ่านแอปพลิเคชั่น
2.สามารถความคุมการเดินหน้าถอยหลังและเลี้ยวซ้ายเลี้ยวขวาผ่านแอปพลิเคชั่น
3.ควบคุมการเปิด-ปิดใบตัดผ่านแอปพลิเคชั่น
4.รถจะไม่วิ่งชนสิ่งขีดขวางเพราะมีการตรวจจับและป้องกันการชนหรือการชนกับสิ่งกีดขวาง โดยจะทำการถอยหลังเมื่อเจอสิ่งขีดขวาง
4.ประโยชน์ที่คาดว่าจะได้รับ
1.ช่วยอำนวยความสะดวกในการตัดหญ้า
2.ลดการใช้เวลาและแรงงานของมนุษย์
3.ลดความเหนื่อยล้าจากการเดินตามเครื่องตัดหญ้าแบบปกติ และการอยู่กลางแดดเป็นเวลานานๆ
5.ความรู้ที่เกี่ยวข้อง
1.ESP 32 คือไมโครคอนโทรลเลอร์ ที่รองรับเชื่อมต่อ WiFi และ Bluetooth 4.2 BLE ในตัวเอง มีแรมในตัว 512KB มี GPIO จำนวน 32 ช่อง ใช้แรงดันไฟในการทำงาน 2.6V – 3V ESP32 ยังรองรับ
ฟังก์ชั่นเกี่ยวกับความปลอดภัยต่างๆ เช่น เข้ารหัส WiFi แบบ WEP และ WPA/WPA2 PSK/Enterprise
2.Sensor E18-D80NK เป็นเซนเซอร์ที่ใช้หลักการยิงแสงอินฟาเรดออกไป หากมีวัตถุขวางจะมีการสะท้อนกลับมาเพื่อใช้แทนสวิทช์เซนเซอร์ว่าขณะนี้มีสิ่งกีดขวาง หรือวัตถุอยู่หน้าเซนเซอร์หรือไม่ ซึ่งระยะทำการอยู่ที่ 3-80cm โดยใช้ไฟเลี้ยงแค่ 5v จาก arduino ได้ทันที ซึ่งให้ค่าออกมาเป็นสัญญาณ on-off โดย off คือมีสิ่งกีดขวาง, on คือไม่มีสิ่งกีดขวาง
ใช้ตรวจจับระยะทางด้วยหลักการของการสะท้อนแสง INFRAREDที่ตกกระทบวัตถุ และสะท้อนแสงกลับ สามารถปรับย่านการตรวจจับได้ตั้งแต่ 6 cm. – 80 cm.
เชื่อมต่อ Sensor E18-D80NK กับ ESP32:
- Sensor E18-D80NK มักมีขาต่อที่สำคัญอย่างน้อย 3 ขา: VCC (เส้นไฟเลี้ยง), GND (เส้นอีกา), OUT (เส้นสัญญาณ).
- ต่อขา VCC ของ Sensor E18-D80NK กับขาไฟเลี้ยง (5V) ของ ESP32.
- ต่อขา GND ของ Sensor E18-D80NK กับขา GND ของ ESP32.
- ต่อขา OUT ของ Sensor E18-D80NK กับขาที่เลือกของ ESP32 (เช่น GPIO)
3.Blynk App คือ แอปพลิเคชันสำเร็จรูปที่ใช้สำหรับงานที่เกี่ยวกับอินเทอร์เน็ตของสรรพสิ่ง (Internet of Things, IoT) ที่ทำให้เราสามารถเชื่อมต่ออุปกรณ์ต่าง ๆ เข้ากับอินเทอร์เน็ตในลักษณะการเชื่อมต่อเครื่องแม่ข่าย (Server) ไปยังอุปกรณ์ลูกข่าย (Client) เช่น Arduino, ESP-8266, ESP-32, NodeMCU และ Raspberry Pi ซึ่งแอปพลิเคชัน Blynk สามารถใช้งานได้ฟรีและใช้งานได้ทั้งบนระบบปฏิบัติการ IOS และ Android สามารถเชื่อมต่อ แสดงผล และ/หรือ ควบคุมด้วย Blynk App ได้การใช้งานนั้น ถือว่าไม่ซับซ้อน และง่ายต่อการเชื่อมต่อมาก ๆ เพราะเพียงแค่สมัคร แล้วเข้าสู่ระบบผ่าน Blynk ของเรา ก็สามารถเริ่มใช้งานได้ทันที ซึ่งวิธีการสร้าง blynk สำหรับการแจ้งเตือน มีดังนี้
1.เข้าไปที่เว็บไซต์ https://blynk.cloud/dashboard/login
2. เข้าสู่ระบบด้วยบัญชี Blynk ของคุณ
3. เลือกเมนู template แล้วคลิ๊ก New template จากนั้นกดสร้าง template
4. เลือก datastreams สร้างขาที่จะเชื่อมต่อกับESP32
5. เลือกเมนู Devices แล้วคลิ๊ก New Device เลือก from template เลือกtemplateที่สร้างไว้ จากนั้นกดสร้าง Device
6. ในdevice เลือก device info แล้ว copy “Template ID, Device Name, and AuthToken” ไปวางยังโค้ดArduino ของเรา
7.ในแอพพลิเคชั่น blynk สร้าง Device จากสร้าง UI สำหรับควบคุม แล้วเชื่อมต่อswitch เข้ากับpin ที่สร้างไว้ใน datastreams จากนั้นทดสอบการทำงาน
กฎ ทฤษฎีที่นำมาใช้ในหัวข้อวิจัย และนำหลักการ วิธีการ ที่นำมาใช้ในการพัฒนา
1.การควบคุมระยะไกล (Remote Control): การควบคุมระยะไกลเป็นหัวข้อที่สำคัญในการพัฒนารถที่ควบคุมด้วยสมาร์ทโฟน เนื่องจากการสื่อสารระหว่างสมาร์ทโฟนและรถตัดหญ้าจะต้องเป็นไปอย่างเรียบร้อยและเชื่อมต่ออย่างมีประสิทธิภาพ การพัฒนาโปรโตคอลและการสื่อสารที่มีความเชื่อถือสูงเป็นสิ่งสำคัญเพื่อให้ผู้ใช้สามารถควบคุมรถได้ในเวลาจริง
2.ความปลอดภัยและการจัดการอุปสรรค (Safety and Obstacle Handling): การจัดการกับอุปสรรคและการป้องกันอุบัติเหตุเป็นสิ่งสำคัญในการพัฒนารถตัดหญ้า รถจะต้องมีการตรวจจับและป้องกันการชนหรือการชนกับสิ่งกีดขวาง เช่น ต้นไม้หรือวัตถุอื่น ๆ ในพื้นที่ที่ต้องการตัดหญ้า
3.การปรับปรุงประสิทธิภาพพลังงาน: งานวิจัยเกี่ยวกับการเพิ่มประสิทธิภาพในการใช้พลังงานของรถ เช่น การพัฒนาแบตเตอรี่ที่ยาวนานขึ้น
4.การเครือข่ายและการสื่อสาร (Networking and Communication): การเชื่อมต่อรถตัดหญ้ากับอินเทอร์เน็ตและกันระยะทางจำเป็นในการส่งข้อมูลระหว่างรถและสมาร์ทโฟน นอกจากนี้ยังมีความสำคัญในการอัพเดตซอฟต์แวร์และการรับข้อมูลเพิ่มเติมจากเซนเซอร์หรือแหล่งข้อมูลอื่น ๆ
6.การดำเนินงาน
การทำงานของระบบนี้ จะทำงานแยกเป็น 3 ส่วน ดังนี้
ส่วนที่ 1 จะเป็นการทำงานเมื่อกดปุ่มบังคับการทำงานของชุดมอเตอร์ล้อ ในฺBlynk เช่น การเดินหน้า ถอยหลัง เลี้ยวซ้าย เลี้ยวขวา
ส่วนที่ 2 การทำงานของมอเตอร์ตัดหญ้า จะทำงานเมื่อได้รับคำสั่งการเปิด-ปิดผ่าน Blynk
ส่วนที่ 3 การทำงานของsensorเมื่อตรวจเจอสิ่งกีดขวาง เมื่อsensorเจอสิ่งกีดขวางมอเตอร์ล้อจะถอยหลังเป็นเวลา 1 วินาทีและมอเตอร์ใบตัดจะหยุดการทำงาน
โค้ดในส่วนของ Code
#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL6Y9H22E7C"
#define BLYNK_TEMPLATE_NAME "myproject"
#define BLYNK_AUTH_TOKEN "Ufmr1AE82WPh5qaJdhX3wRZXWT4QrySH"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
char ssid[] = "ball";
char pass[] = "xfkx1299";
class MotorControl {
private:
int pin1;
int pin2;
int pin3;
int pin4;
unsigned long motorStartTime;
int pwmChannel;
int pwmResolution;
int enable1Pin1;
int enable1Pin2;
int freq;
public:
MotorControl(int motor1Pin1, int motor1Pin2, int motor2Pin1, int motor2Pin2, int ena1, int ena2, int pwmChan, int pwmRes, int fre) {
pin1 = motor1Pin1;
pin2 = motor1Pin2;
pin3 = motor2Pin1;
pin4 = motor2Pin2;
motorStartTime = 0;
pwmChannel = pwmChan;
pwmResolution = pwmRes;
enable1Pin1 = ena1;
enable1Pin2 = ena2;
freq = fre;
init();
}
void init() {
pinMode(pin1, OUTPUT);
pinMode(pin2, OUTPUT);
pinMode(pin3, OUTPUT);
pinMode(pin4, OUTPUT);
digitalWrite(pin1, LOW);
digitalWrite(pin2, LOW);
digitalWrite(pin3, LOW);
digitalWrite(pin4, LOW);
// ติดตั้ง PWM
ledcSetup(pwmChannel, freq, pwmResolution);
ledcAttachPin(enable1Pin1, pwmChannel);
ledcAttachPin(enable1Pin2, pwmChannel);
}
void setDutyCycle(int dutyCycle) {
int mappedDuty = dutyCycle;
ledcWrite(pwmChannel, mappedDuty);
}
void forwardMotor() {
digitalWrite(pin1, HIGH);
digitalWrite(pin2, LOW);
digitalWrite(pin3, HIGH);
digitalWrite(pin4, LOW);
}
void backwardMotor() {
digitalWrite(pin1, LOW);
digitalWrite(pin2, HIGH);
digitalWrite(pin3, LOW);
digitalWrite(pin4, HIGH);
}
void leftMotor() {
digitalWrite(pin1, HIGH);
digitalWrite(pin2, LOW);
digitalWrite(pin3, LOW);
digitalWrite(pin4, LOW);
}
void rightMotor() {
digitalWrite(pin1, LOW);
digitalWrite(pin2, LOW);
digitalWrite(pin3, HIGH);
digitalWrite(pin4, LOW);
}
void crashMotor() {
digitalWrite(pin1, LOW);
digitalWrite(pin2, HIGH);
digitalWrite(pin3, LOW);
digitalWrite(pin4, HIGH);
}
void stopMotor() {
digitalWrite(pin1, LOW);
digitalWrite(pin2, LOW);
digitalWrite(pin3, LOW);
digitalWrite(pin4, LOW);
motorStartTime = 0;
}
void checkMotorState() {
if (motorStartTime > 0 && millis() - motorStartTime >= 1000) {
stopMotor();
}
}
};
class RelayControl {
private:
int relayPin;
public:
RelayControl(int rPin) {
relayPin = rPin;
init();
}
void init() {
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, LOW);
}
void toggleRelay(bool state) {
digitalWrite(relayPin, state ? HIGH : LOW);
}
};
MotorControl motorControl(16, 17, 5, 18, 19, 21, 0, 8, 250); // กำหนดพินของมอเตอร์และพารามิเตอร์ PWM
RelayControl relayControl(2); // กำหนดพินของรีเลย์
BlynkTimer timer;
void setup() {
Serial.begin(115200);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
}
void loop() {
Blynk.run();
timer.run();
int val = analogRead(34);
if (val < 4096) {
motorControl.crashMotor();
relayControl.toggleRelay(false);
} else {
motorControl.checkMotorState();
relayControl.toggleRelay(true);
}
Serial.println(val);
.
}
BLYNK_WRITE(V0) {
int value = param.asInt();
if (value == 1) {
motorControl.forwardMotor();
} else {
motorControl.stopMotor();
}
}
BLYNK_WRITE(V3) {
int value = param.asInt();
if (value == 1) {
motorControl.backwardMotor();
} else {
motorControl.stopMotor();
}
}
BLYNK_WRITE(V1) {
int value = param.asInt();
if (value == 1) {
motorControl.leftMotor();
} else {
motorControl.stopMotor();
}
}
BLYNK_WRITE(V2) {
int value = param.asInt();
if (value == 1) {
motorControl.rightMotor();
} else {
motorControl.stopMotor();
}
}
BLYNK_WRITE(V4) {
int sliderValue = param.asInt();
motorControl.setDutyCycle(sliderValue); // สร้างเมธอดเพื่อกำหนดค่าความเร็วของมอเตอร์
}
BLYNK_WRITE(V5) {
int relayValue = param.asInt();
relayControl.toggleRelay(relayValue == 1);
}
บันทึกผลการทดลองของการสั่งการผ่าน Arduino IoT Cloud
การทดสอบ | ความถูกต้อง |
ครั้งที่1 | 100% |
ครั้งที่2 | 100% |
ครั้งที่3 | 100% |
7.สรุปผลและข้อเสนอแนะ
จากการทดลองในส่วนต่างๆของอุปกรณ์ การสั่งงานผ่าน Blynk ซึ่งได้เปอร์เซ็นความถูกต้องอยู่ที่ 100% ไม่มีข้อผิดพลาด
ข้อเสนอแนะ / การนำไปต่อยอด
1.สามารถนำไปทำให้ชิ้นงานมีขนาดที่ใหญ่กว่านี้ได้ อาจจะเพิ่มความจุแบตเตอรี่ เพื่อเป็นการใช้งานที่ยาวนานขึ้น
2.เพิ่มการบอกปริมาณแบตเตอรี่ในฺblynk
3.สามารถนำไปพัฒนาต่อให้เป็นระบบอัตโนมัติ
8.ข้อมูลอ้างอิง
[1] cybertice.com .เซ็นเซอร์ตรวจจับวัตถุ.[ออนไลน์] 2566 .
[สืบค้นเมื่อ 26 กันยายน 2566].จาก
[2] cybertice.com . l298n-motor-drive-module.[ออนไลน์] 2566 .
[สืบค้นเมื่อ 20 กันยายน 2566].จาก
https://www.cybertice.com/product/42/l298n-motor-drive-module [3] C. D. Black, A. B. Green, and E. F. White, Book Title, 3rd ed. New York: McGraw-Hill, 2001.
[1] cybertice.com .เริ่มต้นใช้งานติดตั้งโปรแกรม-blynk-เบื้องต้น.[ออนไลน์] 2566 .
[สืบค้นเมื่อ 1 ตุลาคม 2566].จาก