ระบบจำลองรถตัดหญ้าควบคุมผ่านสมาร์ทโฟน (Lawn mowing simulation system controlled via smartphone)

ผู้เขียนบทความ : 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 คือไม่มีสิ่งกีดขวาง

ระบบจำลองรถตัดหญ้าควบคุมผ่านสมาร์ทโฟน (Lawn mowing simulation system controlled via smartphone) - มทร.ศรีวิชัย (RMUTSV)

ใช้ตรวจจับระยะทางด้วยหลักการของการสะท้อนแสง 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

ระบบจำลองรถตัดหญ้าควบคุมผ่านสมาร์ทโฟน (Lawn mowing simulation system controlled via smartphone) - มทร.ศรีวิชัย (RMUTSV)

4. เลือก datastreams สร้างขาที่จะเชื่อมต่อกับESP32

ระบบจำลองรถตัดหญ้าควบคุมผ่านสมาร์ทโฟน (Lawn mowing simulation system controlled via smartphone) - มทร.ศรีวิชัย (RMUTSV)

5. เลือกเมนู Devices แล้วคลิ๊ก New Device เลือก from template เลือกtemplateที่สร้างไว้ จากนั้นกดสร้าง Device

ระบบจำลองรถตัดหญ้าควบคุมผ่านสมาร์ทโฟน (Lawn mowing simulation system controlled via smartphone) - มทร.ศรีวิชัย (RMUTSV)

6. ในdevice เลือก device info แล้ว copy “Template ID, Device Name, and AuthToken” ไปวางยังโค้ดArduino ของเรา

ระบบจำลองรถตัดหญ้าควบคุมผ่านสมาร์ทโฟน (Lawn mowing simulation system controlled via smartphone) - มทร.ศรีวิชัย (RMUTSV)

7.ในแอพพลิเคชั่น blynk สร้าง Device จากสร้าง UI สำหรับควบคุม แล้วเชื่อมต่อswitch เข้ากับpin ที่สร้างไว้ใน datastreams จากนั้นทดสอบการทำงาน

ระบบจำลองรถตัดหญ้าควบคุมผ่านสมาร์ทโฟน (Lawn mowing simulation system controlled via smartphone) - มทร.ศรีวิชัย (RMUTSV)

กฎ ทฤษฎีที่นำมาใช้ในหัวข้อวิจัย และนำหลักการ วิธีการ ที่นำมาใช้ในการพัฒนา

       1.การควบคุมระยะไกล (Remote Control): การควบคุมระยะไกลเป็นหัวข้อที่สำคัญในการพัฒนารถที่ควบคุมด้วยสมาร์ทโฟน เนื่องจากการสื่อสารระหว่างสมาร์ทโฟนและรถตัดหญ้าจะต้องเป็นไปอย่างเรียบร้อยและเชื่อมต่ออย่างมีประสิทธิภาพ การพัฒนาโปรโตคอลและการสื่อสารที่มีความเชื่อถือสูงเป็นสิ่งสำคัญเพื่อให้ผู้ใช้สามารถควบคุมรถได้ในเวลาจริง

       2.ความปลอดภัยและการจัดการอุปสรรค (Safety and Obstacle Handling): การจัดการกับอุปสรรคและการป้องกันอุบัติเหตุเป็นสิ่งสำคัญในการพัฒนารถตัดหญ้า รถจะต้องมีการตรวจจับและป้องกันการชนหรือการชนกับสิ่งกีดขวาง เช่น ต้นไม้หรือวัตถุอื่น ๆ ในพื้นที่ที่ต้องการตัดหญ้า

       3.การปรับปรุงประสิทธิภาพพลังงาน: งานวิจัยเกี่ยวกับการเพิ่มประสิทธิภาพในการใช้พลังงานของรถ เช่น การพัฒนาแบตเตอรี่ที่ยาวนานขึ้น

       4.การเครือข่ายและการสื่อสาร (Networking and Communication): การเชื่อมต่อรถตัดหญ้ากับอินเทอร์เน็ตและกันระยะทางจำเป็นในการส่งข้อมูลระหว่างรถและสมาร์ทโฟน นอกจากนี้ยังมีความสำคัญในการอัพเดตซอฟต์แวร์และการรับข้อมูลเพิ่มเติมจากเซนเซอร์หรือแหล่งข้อมูลอื่น ๆ

6.การดำเนินงาน

ระบบจำลองรถตัดหญ้าควบคุมผ่านสมาร์ทโฟน (Lawn mowing simulation system controlled via smartphone) - มทร.ศรีวิชัย (RMUTSV)

การทำงานของระบบนี้ จะทำงานแยกเป็น 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

การทดสอบความถูกต้อง
ครั้งที่1100%
ครั้งที่2100%
ครั้งที่3100%

7.สรุปผลและข้อเสนอแนะ

จากการทดลองในส่วนต่างๆของอุปกรณ์ การสั่งงานผ่าน Blynk ซึ่งได้เปอร์เซ็นความถูกต้องอยู่ที่ 100% ไม่มีข้อผิดพลาด

ข้อเสนอแนะ / การนำไปต่อยอด

1.สามารถนำไปทำให้ชิ้นงานมีขนาดที่ใหญ่กว่านี้ได้ อาจจะเพิ่มความจุแบตเตอรี่ เพื่อเป็นการใช้งานที่ยาวนานขึ้น

2.เพิ่มการบอกปริมาณแบตเตอรี่ในฺblynk

3.สามารถนำไปพัฒนาต่อให้เป็นระบบอัตโนมัติ

8.ข้อมูลอ้างอิง

[1] cybertice.com .เซ็นเซอร์ตรวจจับวัตถุ.[ออนไลน์] 2566 .

[สืบค้นเมื่อ 26 กันยายน 2566].จาก

https://www.cybertice.com/product/493/เซ็นเซอร์ตรวจจับวัตถุ-infrared-photoelectric-switch-sensor-e18-d80nk

 [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].จาก

https://www.cybertice.com/article/238/สอนใช้งาน-nodemcu-esp8266-เริ่มต้นใช้งานติดตั้งโปรแกรม-blynk-เบื้องต้น?gad_source=1&gclid=Cj0KCQjwtJKqBhCaARIsAN_yS_m4P_Sj8dRtuvbc72q0ZbKOE_GSqz2lSYVUninTD2Ay5REHqHIH0WAaAoLREALw_wcB

You may also like...