« เมื่อ: ตุลาคม 12, 2018, 10:23:30 PM »
บอร์ดไมโครคอนโทรลเลอร์ Arduino ที่เชื่อมต่อกับคอมพิวเตอร์อยู่จะสื่อสารกันด้วยพอร์ตอนุกรม สามารถส่งสถานะของขาพอร์ตที่อยู่บนบอร์ด Arduino ไม่ว่าขานั้นจะต่อกับ LED หรือสวิตช์ก็ตามไปแสดงค่าบนจอคอมพิวเตอร์ด้วยโปรแกรมที่สร้างขึ้นด้วย Visual C#
คอนเซปของการสร้าง
-บอร์ด Arduino ส่งข้อมูลที่บอกสถานะของขาโดยให้ส่งเฉพาะเวลาที่มีสถานะขาพอร์ตเปลี่ยนแปลงจากเดิมเท่านั้น ข้อมูลที่ส่งออกทางพอร์ตอนุกรมจะเป็นข้อมูล 1 ชุดภายในประกอบด้วยสถานะของขาพอร์ต (ทุกขาที่ต้องการส่งค่า) ที่คั้นด้วยเครื่องหมาย ,
-โปรแกรมอินเตอร์เฟสที่สร้างขึ้นด้วย Visual C# รับข้อมูลเข้ามาทางพอร์ตอนุกรมแล้วทำการแยกข้อมูลที่เข้ามาออกเป็นส่วน ๆ โดยอาศัยเครื่องหมาย , เป็นตัวแยก แล้วนำค่าที่ได้ไปแสดงผล
มีขั้นตอนดังนี้
1. วงจรที่ใช้ทดลอง โดยวงจรประกอบด้วยส่วนเอาต์พุตแสดงผลด้วย LED และส่วนอินพุทใช้สวิตช์ ดังรูป
2. สร้างโปรเจคไฟล์แล้ววางตัวคอนโทรลและแก้ไขชื่อดังรูป ตัวคอนโทรลที่ใช้งานได้แก่
-Button
-ComboBox
-GroupBox
-Label
-SerialPort
-RichTextBox
3. กดปุ่ม Shift ค้างไว้แล้วคลิกที่คอมโบบ็อกทั้ง 2 ตัวตั้งค่าคุณสมบัติเริ่มต้นให้ DropDownStyle ให้เป็น DropDownList เพื่อไม่ให้ผู้ใช้งานพิมพ์ทับลงในช่องขณะรันโปรแกรม (ให้เลือกอย่างเดียว)
4. คลิกเพิ่มรายการในคอมโบบ็อกที่ใช้เลือกความเร็วในการสื่อสาร
ความเร็วที่ให้เลือกใช้มีดังนี้
9600
19200
38400
57600
74880
115200
5. คลิกที่ RichTextBox เลือกให้อ่านได้อ่านเดียวดังรูป
6. ดับเบิลคลิกที่ฟอร์มแล้วเขียนโค้ดให้โปรแกรมสแกนหาพอร์ตอนุกรมที่คอมพิวเตอร์มองเห็น
โค้ด
baudrate_cbb.SelectedIndex = 0;
try
{
string[] ports = SerialPort.GetPortNames();
port_cbb.Items.AddRange(ports);
port_cbb.SelectedIndex = 0;
}
catch { }
7. คลิกที่คอมโบบ็อกที่ใช้เลือกพอร์ต แล้วคลิกเลือกเหตุการณ์กระตุ้นเป็น MouseClick (แล้วดับเบิลคลิก) เพื่อเขียนโค้ดให้ทำงานเมื่อมีเมาส์มาคลิกที่คอมโบบ็อกตัวนี้
8. เขียนโค้ดให้โปรแกรมสแกนหาพอร์ตอนุกรมใหม่ที่คอมพิวเตอร์มองเห็นในจังหวะที่มีการคลิกเมาส์ที่คอมโบบ็อกนี้
โค้ด
try
{
port_cbb.Items.Clear();
string[] ports = SerialPort.GetPortNames();
port_cbb.Items.AddRange(ports);
port_cbb.SelectedIndex = 0;
}
catch { }
9. ดับเบิลคลิกที่ปุ่ม Connect เพื่อเขียนโค้ดให้โปรแกรมเปิดพอร์ตเชื่อมต่อ
10. เขียนโค้ดควบคุม
โค้ด
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. เขียนโค้ดควบคุม
โค้ด
con_btn.Enabled = true;
dis_btn.Enabled = false;
if (serialPort1.IsOpen)
serialPort1.Close();
13. คลิกไอคอน Serial Port เลือกการกระตุ้นเป็น DataReceived แล้วดับเบิลคลิก
14. เขียนโค้ดเพื่อให้ทำงานเมื่อมีข้อมูลเข้ามาทางพอร์ตอนุกรม ทำการตัดข้อมูลออกโดยอาศัยเครื่องหมาย , เขียนโค้ดให้แสดงค่าเป็น HIGH และ LOW เมื่อข้อมูลเข้ามาเป็น 1 และ 0
โค้ดส่วนที่ 1
private string DispString; //used to store the values read
Int16 LED1, LED2;
โค้ดส่วนที่ 2
DispString = serialPort1.ReadLine();
this.Invoke(new EventHandler(DisplayText));
โค้ดส่วนที่ 3
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. เขียนโค้ดให้ปิดการใช้งานพอร์ตอนุกรมก่อนปิดโปรแกรม
โค้ด
if (serialPort1.IsOpen)
serialPort1.Close();
Application.Exit();
โค้ดสำหรับบอร์ด Arduino
17. โค้ดตรวจจับการกดสวิตช์มาเปลี่ยนสถานะของ LED และส่งสถานะออกพอร์ต โดยจะส่งเฉพาะที่มีการเปลี่ยนแปลงค่าเท่านั้น (โค้ดบางส่วน)
โค้ด(เต็ม)
#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 »
บันทึกการเข้า