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

admin

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

การดำเนินการมีขั้นตอนดังนี้

1. วงจรที่ใช้ทดลอง เชื่อมต่อโพเทนธิโอมิเตอร์เข้าที่ขา A0 และ 5V,GND ดังรูป


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


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

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

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


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


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

โค้ด
โค๊ด: [Select]
using System.IO.Ports;

โค๊ด: [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. ดับเบิลคลิกที่ปุ่ม Start (ปุ่มสำหรับเปิดการทำงานพอร์ตอนุกรม) แล้วเขียนโค้ด
  -เปิดการทำงานของปุ่ม Stop
  -ปิดการทำงานของปุ่ม Start เพื่อป้องกันการเปิดพอร์ตซ้ำ
  -เปิดการทำงานพอร์ตอนุกรมโดยนำค่าหมายเลขพอร์ตและค่าความเร็วสื่อสารที่ปรากฎข้อความในคอมโบบ็อกมาใช้งาน

โค้ด
โค๊ด: [Select]
            start_btn.Enabled = false;
            stop_btn.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);
            }

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


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

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

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


13. เขียนโค้ดเพื่อให้ทำงานเมื่อมีข้อมูลเข้ามาทางพอร์ตอนุกรม

โค้ดส่วนที่ 1
โค๊ด: [Select]
        string DispString;   //used to store the values read
โค้ดส่วนที่ 2
โค๊ด: [Select]
            DispString = serialPort1.ReadLine();
            this.Invoke(new EventHandler(DisplayText));
โค้ดส่วนที่ 3
โค๊ด: [Select]
        private void DisplayText(object sender, EventArgs e)
        {
            textBox1.AppendText(DispString + "\r\n");
            try
            {
                string[] value = DispString.Split(new string[] { "," }, StringSplitOptions.None);
                label5.Text = value[0];
                label6.Text = value[1];
                progressBar1.Value = (Convert.ToInt16(value[1])) * 100 / 1023;
            }
            catch
            { }
        }

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


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

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

16. เขียนโค้ดลงบอร์ด Arduino พร้อมทดสอบการส่งค่าออกพอร์ตอนุกรม

โค้ด
โค๊ด: [Select]
int value;
void setup() {
  Serial.begin(9600);
}
void loop() {
  value++;
  int adc=analogRead(A0);
  Serial.print(value);
  Serial.print(",");
  Serial.println(adc);   
  delay(1000);
}

17. ทดสอบโปรแกรม
   -เชื่อมต่อบอร์ด Arduino เข้ากับคอมพิวเตอร์
   -รันโปรแกรม
   -เลือกพอร์ตที่เชื่อมต่อ
   -ทดสอบปรับค่าโพเทนธิโอมิเตอร์แล้วสังเกตุผล


<a href="https://www.youtube.com/v/pjOV7w1PdV4" target="_blank" class="new_win">https://www.youtube.com/v/pjOV7w1PdV4</a>
« แก้ไขครั้งสุดท้าย: มกราคม 25, 2024, 01:23:35 PM โดย admin »

admin

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

admin

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