ผู้เขียน หัวข้อ: เรียนรู้ครั้งที่ 16 [การสร้างโปรแกรมควบคุม LED ผ่าน Arduino ด้วย Visual C#]  (อ่าน 8498 ครั้ง)

admin

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

สิ่งสำคัญในการเขียนโปรแกรมสื่อสารผ่านพอร์ตอนุกรม
1. เปิดการใช้งานพอร์ตอนุกรมซ้ำในพอร์ตที่เคยเปิดแล้วไม่ได้
2. ก่อนปิดโปรแกรมพอร์ตอนุกรมจะต้องถูกสั่งปิดการใช้งาน

การดำเนินการมีขั้นตอนดังนี้
1. วงจรที่ใช้ทดลอง เชื่อมต่อ LED อนุกรมกับตัวต้านทาน 220 โอห์มเข้าที่ขา D13 กับกราวด์ดังรูป


2. สร้างโปรเจคไฟล์แล้ววางตัวคอนโทรลและแก้ไขชื่อดังรูป ตัวคอนโทรลที่ใช้งานได้แก่
    -Button
    -ComboBox
    -GroupBox
    -Label
    -SerialPort


3. กดปุ่ม Shift ค้างไว้แล้วคลิกที่ปุ่ม Close, ON, OFF ตั้งค่าคุณสมบัติเริ่มต้นให้ Enable เป็น False เพื่อไม่ให้ปุ่มนี้ทำงาน (เพื่อไม่ให้ถูกใช้งานในกรณีที่พอร์ตอนุกรมยังไม่ถูกเปิด)


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


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

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

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

โค้ด
โค๊ด: [Select]
            baudrate_cbb.SelectedIndex = 0;
            string[] ports = SerialPort.GetPortNames();
            try
            {
                port_cbb.Items.AddRange(ports);
                port_cbb.SelectedIndex = 0;
            }
            catch
            {

            }

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


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

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

            }

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

โค้ด
โค๊ด: [Select]
            if (serialPort1.IsOpen)
                serialPort1.Close();
            try
            {
                serialPort1.PortName = port_cbb.Text;
                serialPort1.BaudRate = Convert.ToInt32(baudrate_cbb.Text);
                serialPort1.Open();
                on_btn.Enabled = true;
                off_btn.Enabled = true;
                close_btn.Enabled = true;
                open_btn.Enabled = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

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

โค้ด
โค๊ด: [Select]
            on_btn.Enabled =false;
            off_btn.Enabled = false;
            close_btn.Enabled = false;
            open_btn.Enabled = true;
            if (serialPort1.IsOpen)
                serialPort1.Close();

11. ดับเบิลคลิกที่ปุ่ม ON และ OFF เพื่อเขียนโค้ด
   -ปุ่ม ON เขียนโค้ดให้ส่งตัวอักษร 'a'
   -ปุ่ม OFF เขียนโค้ดให้ส่งตัวอักษร 'A'

โค้ดปุ่ม ON
โค๊ด: [Select]
            try
            {
                serialPort1.Write("a");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

โค้ดปุ่ม OFF
โค๊ด: [Select]
            try
            {
                serialPort1.Write("A");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

12. คลิกที่ฟอร์มเลือกเหตุการณ์กระตุ้นเป็น FormClosing เขียนโค้ดให้ปิดการใช้งานพอร์ตอนุกรมก่อนปิดโปรแกรม


13. โค้ดให้ปิดการใช้งานพอร์ตอนุกรมก่อนปิดโปรแกรม

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

14. หน้าตาโปรแกรมเมื่อรัน


15. เขียนโค้ดในฝั่ง Arduino เพื่อให้รับค่า a, A ที่เข้ามาทางพอร์ตอนุกรมเพื่อมาควบคุมการติดดับของ LED

โค้ด
โค๊ด: [Select]
#define LED 13
char income;
void setup() {
  pinMode(13, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  if (Serial.available() > 0) {
    income = Serial.read();
    switch (income) {
      case 'a':
        digitalWrite(LED, HIGH);
        break;
      case 'A':
        digitalWrite(LED, LOW);
        break;
    }
  }
}

16. ผลการรัน
<a href="https://www.youtube.com/v/cs7ChNoUS3k" target="_blank" class="new_win">https://www.youtube.com/v/cs7ChNoUS3k</a>
« แก้ไขครั้งสุดท้าย: มกราคม 26, 2023, 10:26:16 AM โดย admin »

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์
เวอร์ชั่นที่ไม่มีปุ่ม Open, Close (ปุ่มเปิด/ปิดพอร์ต)
สำหรับผู้ที่ต้องการลดปุ่มใช้งาน แต่ต้องอาศัยเทคนิคการเขียนโปรแกรมโดยเวอร์ชั่นนี้ต่างจากเวอร์ชั่นข้างต้นกล่าวคือจะใช้การเปิดพอร์ตทุกครั้งเมื่อมีการกดปุ่มส่งค่า (ปุ่ม ON, OFF) โดยเขียนคำสั่งไว้ที่ปุ่มแทนการสร้างปุ่ม Open และเมื่อส่งค่าเสร็จให้ทำการปิดพอร์ตทันที ขั้นตอนมีดังนี้

1. ปรับปรุงหน้าต่างโปรแกรมโดยตัดปุม Open, Close ออกไป และแก้คุณสมบัติเริ่มต้นปุ่ม ON, OFF ในส่วน Enable เป็น True


2. แก้ไขโค้ดปุ่ม ON โดย
   (1) การตรวจสอบพอร์ตเปิดอยู่หรือไม่หากไม่ได้เปิดให้ทำการเปิดพอร์ต
   (2) ส่งค่าออกพอร์ตเมื่อส่งเสร็จให้ปิดพอร์ตทันที

โค้ด
โค๊ด: [Select]
            if (!serialPort1.IsOpen)
            {
                serialPort1.PortName = port_cbb.Text;
                serialPort1.BaudRate = Convert.ToInt32(baudrate_cbb.Text);
                try
                {
                    serialPort1.Open();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            try
            {
                serialPort1.Write("a");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            serialPort1.Close();

3. แก้ไขโค้ดปุ่ม OFF เช่นเดียวกับปุ่ม ON

โค้ด
โค๊ด: [Select]
            if (!serialPort1.IsOpen)
            {
                serialPort1.PortName = port_cbb.Text;
                serialPort1.BaudRate = Convert.ToInt32(baudrate_cbb.Text);
                try
                {
                    serialPort1.Open();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            try
            {
                serialPort1.Write("A");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            serialPort1.Close();
« แก้ไขครั้งสุดท้าย: กันยายน 29, 2018, 10:26:17 PM โดย admin »

admin

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

admin

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