ผู้เขียน หัวข้อ: เรียนรู้ครั้งที่ 18 [การสร้างโปรแกรมควบคุมเซอร์โวมอเตอร์ด้วย Visual C#]  (อ่าน 5796 ครั้ง)

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์
การควบคุมการทำงานของเซอร์โวมอเตอร์ที่ต่ออยู่กับบอร์ด Arduino ซึ่งบอร์ดเชื่อมต่อกับคอมพิวเตอร์ผ่านพอร์ต USB ด้วยการสื่อสารของพอร์ตอนุกรม (ในบอร์ด Arduino มีวงจรแปลง USB to UART) ดังนั้นสามารถสร้างโปรแกรมวินโดว์ให้สามารถควบคุมการทำงานของเซอร์โวมอเตอร์ได้

การดำเนินการมีขั้นตอนดังนี้
1. วงจรที่ใช้ทดลอง เชื่อมต่อเซอร์โวมอเตอร์โดยขาสัญญาณควบคุมเข้าที่ขา D10 และต่อขาไฟบวกและกราวด์เข้าที่ 5V และ GND ดังรูป


2. ด้วยโครงสร้างของเซอร์โวมอเตอร์ใช้ โพเทนธิโอมิเตอร์เป็นอุปกรณ์ตรวจจับตำแหน่งส่งกลับเข้าวงจรควบคุม ดังนั้นมุมที่สุดทางทั้ง 2 ข้างเซอร์โวอาจทำงานได้ไม่สมบูรณ์ซึ่งตามหลักการเซอร์โวจะหมุนได้ตั้งแต่ 0-180 องศา ในทางปฏิบัติจะต้องลดมุมทั้ง 2 ข้าง ในการทดลองนี้บังคับให้เซอร์โวหมุนตั้งแต่ 5-175 องศา

*ภาพจากเวปไซต์ https://howtomechatronics.com/how-it-works/how-servo-motors-work-how-to-control-servos-using-arduino/

3. สัญญาณที่ใช้ควบคุมการเคลื่อนที่ไปยังมุมต่าง ๆ


4. สร้างโปรเจคไฟล์แล้ววางตัวคอนโทรลและแก้ไขชื่อดังรูป ซึ่งบางตัวไม่ได้แก้ชื่อใช้ชื่อเดิม (อักษรสีเขียว) ตัวคอนโทรลที่ใช้งานได้แก่
    -Button
    -ComboBox
    -GroupBox
    -Label
    -SerialPort
    -TextBox
    -trackBar
*กำหนดค่าสูงสุดของ trackBar1=175 และค่าต่ำสุด=5


5. คลิกเพิ่มรายการในคอมโบบ็อกที่ใช้เลือกความเร็วในการสื่อสาร

ความเร็วที่ให้เลือกใช้มีดังนี้
โค๊ด: [Select]
9600
19200
38400
57600
74880
115200

6. กดปุ่ม Shift ค้างไว้แล้วคลิกที่คอมโบบ็อกทั้ง 2 ตัวตั้งค่าคุณสมบัติเริ่มต้นให้ DropDownStyle ให้เป็น DropDownList เพื่อไม่ให้ผู้ใช้งานพิมพ์ทับลงในช่องขณะรันโปรแกรม (ให้เลือกอย่างเดียว)


7. คลิกที่ Text Box เลือกให้เป็น MultiLine แล้วลากปรับขนาดเพื่อให้แสดงข้อมูลที่รับมาได้หลายบรรทัด


8. ดับเบิลคลิกที่ฟอร์ม เขียนโค้ดเพื่อให้โปรแกรมสแกนหาพอร์ตอนุกรมที่คอมพิวเตอร์มองเห็น

โค้ด
โค๊ด: [Select]
using System.IO.Ports;
โค๊ด: [Select]
            baudrate_cbb.SelectedIndex = 0;
            string[] ports = SerialPort.GetPortNames();
            port_cbb.Items.AddRange(ports);
            port_cbb.SelectedIndex = 0;

9. คลิกที่คอมโบบ็อกที่ใช้เลือกพอร์ต แล้วคลิกเลือกเหตุการณ์กระตุ้นเป็น MouseClick (แล้วดับเบิลคลิก) เพื่อเขียนโค้ดให้ทำงานเมื่อมีเมาส์มาคลิกที่คอมโบบ็อกตัวนี้


10. เขียนโค้ดให้โปรแกรมสแกนหาพอร์ตอนุกรมใหม่ที่คอมพิวเตอร์มองเห็นในจังหวะที่มีการคลิกเมาส์ที่คอมโบบ็อกนี้

โค้ด
โค๊ด: [Select]
            port_cbb.Items.Clear();
            string[] ports = SerialPort.GetPortNames();
            port_cbb.Items.AddRange(ports);
            port_cbb.SelectedIndex = 0;

11. ดับเบิลคลิกที่ปุ่ม Connect (ปุ่มสำหรับเปิดการทำงานพอร์ตอนุกรม) แล้วเขียนโค้ด
  -เปิดการทำงานของปุ่ม Disconnect
  -ปิดการทำงานของปุ่ม Connect เพื่อป้องกันการเปิดพอร์ตซ้ำ
  -เปิดการทำงานพอร์ตอนุกรมโดยนำค่าหมายเลขพอร์ตและค่าความเร็วสื่อสารที่ปรากฎข้อความในคอมโบบ็อกมาใช้งาน

โค้ด
โค๊ด: [Select]
            con_btn.Enabled = false;
            dis_btn.Enabled = true;
            trackBar1.Enabled = true;

            if (serialPort1.IsOpen)
                serialPort1.Close();
            serialPort1.PortName = port_cbb.Text;
            serialPort1.BaudRate = Convert.ToInt32(baudrate_cbb.Text);
            try
            {
                serialPort1.Open();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

12. คลิกที่ปุ่ม Disconnect ตั้งค่าเริ่มต้นให้ Enable เป็น False


13. ดับเบิลคลิกที่ปุ่ม Disconnect เขียนคำสั่งปิดการใช้พอร์ต

โค้ด
โค๊ด: [Select]
            con_btn.Enabled = true;
            dis_btn.Enabled = false;
            trackBar1.Enabled = false;

            if (serialPort1.IsOpen)
                serialPort1.Close();

14. คลิกไอคอน Serial Port เลือกการกระตุ้นเป็น DataReceived แล้วเบิลคลิก


15. เขียนโค้ดเพื่อให้ทำงานเมื่อมีข้อมูลเข้ามาทางพอร์ตอนุกรม (แสดงข้อมูลที่รับเข้ามาไว้ที่ textBox1)

โค้ดส่วนที่ 1
โค๊ด: [Select]
private string DispString;   //used to store the values read

โค้ดส่วนที่ 2
โค๊ด: [Select]
            DispString = serialPort1.ReadExisting();
            this.Invoke(new EventHandler(DisplayText));

โค้ดส่วนที่ 3
โค๊ด: [Select]
        private void DisplayText(object sender, EventArgs e)
        {
            textBox1.AppendText(DispString);
        }

16. คลิกที่ trackBar1 เลือกการกระตุ้นดังรูป


17. เขียนโค้ดอ่านค่าจาก trackBar แสดงผลค่าที่อ่านได้พร้อมทั้งส่งค่าออกทางพอร์ตอนุกรม

โค้ด
โค๊ด: [Select]
            string x = trackBar1.Value.ToString();
            degree_lb.Text = x;
            serialPort1.WriteLine(x);

18. คลิกที่ฟอร์มเลือกเหตุการณ์กระตุ้นเป็น FormClosing


19. เขียนโค้ดให้ปิดการใช้งานพอร์ตอนุกรมก่อนปิดโปรแกรม

โค้ด
โค๊ด: [Select]
            if (serialPort1.IsOpen)
                serialPort1.Close();
            Application.Exit();

โค้ดสำหรับบอร์ด Arduino
โค๊ด: [Select]
#include <Servo.h>
Servo myservo;                    // create servo object to control a servo
String inputString = "";          // a String to hold incoming data
bool stringComplete = false;      // whether the string is complete
void setup() {
  Serial.begin(9600);             // initialize serial:
  myservo.attach(10);             // attaches the servo on pin 10 to the servo object
  inputString.reserve(200);       // reserve 200 bytes for the inputString:
}
void loop() {
  int x = inputString.length() - 1;

  int degree = inputString.substring(0, x).toInt();  //convert to int and delete '\n'

  if (stringComplete) {
    Serial.println(degree);
    myservo.write(degree);
    inputString = "";                    // clear the string:
    stringComplete = false;
  }
}

void serialEvent() {
  while (Serial.available()) {
    char inChar = (char)Serial.read();
    inputString += inChar;
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}

20. ส่วนที่ใช้คำนวณค่าข้อมูลที่รับเข้ามา
   (1) คำนวณจำนวนตัวอักษรที่รับเข้ามาที่ไม่นับตัวปิดท้าย (\n)
   (2) ตัดเอาเฉพาะข้อมูลที่เป็นตัวเลขโดยไม่เอาตัวปิดท้าย


21. ฟังก์ชั่นย่อยที่ทำงานอัตโนมัติเมื่อมีข้อมูลเข้าโดยรับค่าเข้าเก็บลงในตัวแปร inString


22. ทดสอบโปรแกรม แล้วสังเกตุผล
<a href="https://www.youtube.com/v/QrP91oObIGg" target="_blank" class="new_win">https://www.youtube.com/v/QrP91oObIGg</a>
« แก้ไขครั้งสุดท้าย: กุมภาพันธ์ 08, 2023, 01:35:22 PM โดย admin »

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์