ผู้เขียน หัวข้อ: เรียนรู้ครั้งที่ 21 [การสร้างโปรแกรมแสดงสถานะขาบอร์ด Arduino ด้วย Visual C#]  (อ่าน 5592 ครั้ง)

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์
บอร์ดไมโครคอนโทรลเลอร์ Arduino ที่เชื่อมต่อกับคอมพิวเตอร์อยู่จะสื่อสารกันด้วยพอร์ตอนุกรม สามารถส่งสถานะของขาพอร์ตที่อยู่บนบอร์ด Arduino ไม่ว่าขานั้นจะต่อกับ LED หรือสวิตช์ก็ตามไปแสดงค่าบนจอคอมพิวเตอร์ด้วยโปรแกรมที่สร้างขึ้นด้วย Visual C#

คอนเซปของการสร้าง
   -บอร์ด Arduino ส่งข้อมูลที่บอกสถานะของขาโดยให้ส่งเฉพาะเวลาที่มีสถานะขาพอร์ตเปลี่ยนแปลงจากเดิมเท่านั้น ข้อมูลที่ส่งออกทางพอร์ตอนุกรมจะเป็นข้อมูล 1 ชุดภายในประกอบด้วยสถานะของขาพอร์ต (ทุกขาที่ต้องการส่งค่า) ที่คั้นด้วยเครื่องหมาย ,
   -โปรแกรมอินเตอร์เฟสที่สร้างขึ้นด้วย Visual C# รับข้อมูลเข้ามาทางพอร์ตอนุกรมแล้วทำการแยกข้อมูลที่เข้ามาออกเป็นส่วน ๆ โดยอาศัยเครื่องหมาย , เป็นตัวแยก แล้วนำค่าที่ได้ไปแสดงผล

มีขั้นตอนดังนี้

1. วงจรที่ใช้ทดลอง โดยวงจรประกอบด้วยส่วนเอาต์พุตแสดงผลด้วย LED และส่วนอินพุทใช้สวิตช์ ดังรูป


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


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


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

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

5. คลิกที่ RichTextBox เลือกให้อ่านได้อ่านเดียวดังรูป


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

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

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


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

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

9. ดับเบิลคลิกที่ปุ่ม Connect เพื่อเขียนโค้ดให้โปรแกรมเปิดพอร์ตเชื่อมต่อ


10. เขียนโค้ดควบคุม

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

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


12. เขียนโค้ดควบคุม

โค้ด
โค๊ด: [Select]
            con_btn.Enabled = true;
            dis_btn.Enabled = false;
            if (serialPort1.IsOpen)
                serialPort1.Close();

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


14. เขียนโค้ดเพื่อให้ทำงานเมื่อมีข้อมูลเข้ามาทางพอร์ตอนุกรม ทำการตัดข้อมูลออกโดยอาศัยเครื่องหมาย , เขียนโค้ดให้แสดงค่าเป็น HIGH และ LOW เมื่อข้อมูลเข้ามาเป็น 1 และ 0

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

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

โค้ดส่วนที่ 3
โค๊ด: [Select]
        private void DisplayText(object sender, EventArgs e)
        {
            richTextBox1.AppendText(DispString + "\n");
            try
            {
                string[] value = DispString.Split(new string[] { "," }, StringSplitOptions.None);
                LED1 = Convert.ToInt16(value[0]);
                LED2 = Convert.ToInt16(value[1]);
                label5.Text = LED1 == 1 ? "HIGH" : "LOW";
                label6.Text = LED2 == 1 ? "HIGH" : "LOW";
            }
            catch { }
        }

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


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

โค้ด
โค๊ด: [Select]
            if (serialPort1.IsOpen)
                serialPort1.Close();
            Application.Exit();
โค้ดสำหรับบอร์ด Arduino
17. โค้ดตรวจจับการกดสวิตช์มาเปลี่ยนสถานะของ LED และส่งสถานะออกพอร์ต โดยจะส่งเฉพาะที่มีการเปลี่ยนแปลงค่าเท่านั้น (โค้ดบางส่วน)

โค้ด(เต็ม)
โค๊ด: [Select]
#define LED1  2
#define LED2  3
#define SW1   10
#define SW2   11
String newData="", oldData="";
void setup() {
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(SW1, INPUT_PULLUP);
  pinMode(SW2, INPUT_PULLUP);
  Serial.begin(9600);
}
void loop() {
  newData = "";
  if (!digitalRead(SW1)) {
    digitalWrite(LED1, HIGH);
    newData = "1,";
  }
  else {
    digitalWrite(LED1, LOW);
    newData = "0,";
  }
  if (!digitalRead(SW2)) {
    digitalWrite(LED2, HIGH);
    newData = newData + "1";
  }
  else {
    digitalWrite(LED2, LOW);
    newData = newData + "0";
  }
  if (newData!=oldData){
  Serial.println(newData);
  }
  oldData=newData;
  delay(100);
}

18. ทดลองรันโปรแกรม สังเกตุผลที่ได้

« แก้ไขครั้งสุดท้าย: มกราคม 31, 2024, 03:52:51 PM โดย admin »

admin

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

admin

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