บอร์ดไมโครคอนโทรลเลอร์ที่เป็นที่นิยมมากในปัจจุบันใช้แพลทฟอร์ม Arduino บอร์ดหนึ่งคือ Arduino UNO หรือ Arduino Nano3.0 ซึ่งบอร์ดดังกล่าวนี้สามารถติดต่อสื่อสารด้วยพอร์ตอนุกรมผ่านทางพอร์ต USB (มีวงจรแปลง USB to UART ภายใน) เราสามารถสร้างโปรแกรมเพื่อติดต่อสื่อสารกับบอร์ดไมโครคอนโทรลเลอร์นี้เพื่อให้บอร์ดทำสิ่งหนึ่งสิ่งใดตามที่ต้องการได้ การสร้างโปรแกรมติดต่อสื่อสารใช้การสื่อสารผ่านพอร์ตอนุกรม
สิ่งสำคัญในการเขียนโปรแกรมสื่อสารผ่านพอร์ตอนุกรม
1. เปิดการใช้งานพอร์ตอนุกรมซ้ำในพอร์ตที่เคยเปิดแล้วไม่ได้
2. ก่อนปิดโปรแกรมพอร์ตอนุกรมจะต้องถูกสั่งปิดการใช้งาน
การดำเนินการมีขั้นตอนดังนี้
1. วงจรที่ใช้ทดลอง เชื่อมต่อ LED อนุกรมกับตัวต้านทาน 220 โอห์มเข้าที่ขา D13 กับกราวด์ดังรูป
(http://www.praphas.com/PhotoForum/interface/HowTo16/1.png)
2. สร้างโปรเจคไฟล์แล้ววางตัวคอนโทรลและแก้ไขชื่อดังรูป ตัวคอนโทรลที่ใช้งานได้แก่
-Button
-ComboBox
-GroupBox
-Label
-SerialPort
(http://www.praphas.com/PhotoForum/interface/HowTo16/2.png)
3. กดปุ่ม Shift ค้างไว้แล้วคลิกที่ปุ่ม Close, ON, OFF ตั้งค่าคุณสมบัติเริ่มต้นให้ Enable เป็น False เพื่อไม่ให้ปุ่มนี้ทำงาน (เพื่อไม่ให้ถูกใช้งานในกรณีที่พอร์ตอนุกรมยังไม่ถูกเปิด)
(http://www.praphas.com/PhotoForum/interface/HowTo16/3.png)
4. กดปุ่ม Shift ค้างไว้แล้วคลิกที่คอมโบบ็อกทั้ง 2 ตัวตั้งค่าคุณสมบัติเริ่มต้นให้ DropDownStyle ให้เป็น DropDownList เพื่อไม่ให้ผู้ใช้งานพิมพ์ทับลงในช่องขณะรันโปรแกรม (ให้เลือกอย่างเดียว)
(http://www.praphas.com/PhotoForum/interface/HowTo16/4.png)
5. คลิกเพิ่มรายการในคอมโบบ็อกที่ใช้เลือกความเร็วในการสื่อสาร
(http://www.praphas.com/PhotoForum/interface/HowTo16/5.png)
ความเร็วที่ให้เลือกใช้มีดังนี้
9600
19200
38400
57600
74880
115200
6. ดับเบิลคลิกที่ฟอร์ม เขียนโค้ดเพื่อให้โปรแกรมสแกนหาพอร์ตอนุกรมที่คอมพิวเตอร์มองเห็น
(http://www.praphas.com/PhotoForum/interface/HowTo16/6.png)
โค้ด
baudrate_cbb.SelectedIndex = 0;
string[] ports = SerialPort.GetPortNames();
try
{
port_cbb.Items.AddRange(ports);
port_cbb.SelectedIndex = 0;
}
catch
{
}
7. คลิกที่คอมโบบ็อกที่ใช้เลือกพอร์ต แล้วคลิกเลือกเหตุการณ์กระตุ้นเป็น MouseClick (แล้วดับเบิลคลิก) เพื่อเขียนโค้ดให้ทำงานเมื่อมีเมาส์มาคลิกที่คอมโบบ็อกตัวนี้
(http://www.praphas.com/PhotoForum/interface/HowTo16/7.png)
8. เขียนโค้ดให้โปรแกรมสแกนหาพอร์ตอนุกรมใหม่ที่คอมพิวเตอร์มองเห็นในจังหวะที่มีการคลิกเมาส์ที่คอมโบบ็อกนี้
(http://www.praphas.com/PhotoForum/interface/HowTo16/8.png)
โค้ด
port_cbb.Items.Clear();
string[] ports = SerialPort.GetPortNames();
try
{
port_cbb.Items.AddRange(ports);
port_cbb.SelectedIndex = 0;
}
catch
{
}
9. ดับเบิลคลิกที่ปุ่ม Open (ปุ่มสำหรับเปิดการทำงานพอร์ตอนุกรม) แล้วเขียนโค้ด
-เปิดการทำงานของปุ่ม Close, ON, OFF
-เปิดการทำงานพอร์ตอนุกรมโดยนำค่าหมายเลขพอร์ตและค่าความเร็วสื่อสารที่ปรากฎข้อความในคอมโบบ็อกมาใช้งาน
(http://www.praphas.com/PhotoForum/interface/HowTo16/9.png)
โค้ด
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 (ปุ่มสำหรับปิดการทำงานพอร์ตอนุกรม) แล้วเขียนโค้ด
(http://www.praphas.com/PhotoForum/interface/HowTo16/10.png)
โค้ด
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'
(http://www.praphas.com/PhotoForum/interface/HowTo16/11.png)
โค้ดปุ่ม ON
try
{
serialPort1.Write("a");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
โค้ดปุ่ม OFF
try
{
serialPort1.Write("A");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
12. คลิกที่ฟอร์มเลือกเหตุการณ์กระตุ้นเป็น FormClosing เขียนโค้ดให้ปิดการใช้งานพอร์ตอนุกรมก่อนปิดโปรแกรม
(http://www.praphas.com/PhotoForum/interface/HowTo16/12.png)
13. โค้ดให้ปิดการใช้งานพอร์ตอนุกรมก่อนปิดโปรแกรม
(http://www.praphas.com/PhotoForum/interface/HowTo16/13.png)
โค้ด
if (serialPort1.IsOpen)
serialPort1.Close();
Application.Exit();
14. หน้าตาโปรแกรมเมื่อรัน
(http://www.praphas.com/PhotoForum/interface/HowTo16/14.png)
15. เขียนโค้ดในฝั่ง Arduino เพื่อให้รับค่า a, A ที่เข้ามาทางพอร์ตอนุกรมเพื่อมาควบคุมการติดดับของ LED
(http://www.praphas.com/PhotoForum/interface/HowTo16/15.png)
โค้ด
#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. ผลการรัน
https://www.youtube.com/v/cs7ChNoUS3k
เวอร์ชั่นที่ไม่มีปุ่ม Open, Close (ปุ่มเปิด/ปิดพอร์ต)
สำหรับผู้ที่ต้องการลดปุ่มใช้งาน แต่ต้องอาศัยเทคนิคการเขียนโปรแกรมโดยเวอร์ชั่นนี้ต่างจากเวอร์ชั่นข้างต้นกล่าวคือจะใช้การเปิดพอร์ตทุกครั้งเมื่อมีการกดปุ่มส่งค่า (ปุ่ม ON, OFF) โดยเขียนคำสั่งไว้ที่ปุ่มแทนการสร้างปุ่ม Open และเมื่อส่งค่าเสร็จให้ทำการปิดพอร์ตทันที ขั้นตอนมีดังนี้
1. ปรับปรุงหน้าต่างโปรแกรมโดยตัดปุม Open, Close ออกไป และแก้คุณสมบัติเริ่มต้นปุ่ม ON, OFF ในส่วน Enable เป็น True
(http://www.praphas.com/PhotoForum/interface/HowTo16/16.png)
2. แก้ไขโค้ดปุ่ม ON โดย
(1) การตรวจสอบพอร์ตเปิดอยู่หรือไม่หากไม่ได้เปิดให้ทำการเปิดพอร์ต
(2) ส่งค่าออกพอร์ตเมื่อส่งเสร็จให้ปิดพอร์ตทันที
(http://www.praphas.com/PhotoForum/interface/HowTo16/17.png)
โค้ด
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
(http://www.praphas.com/PhotoForum/interface/HowTo16/18.png)
โค้ด
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();