การควบคุมการทำงานของเซอร์โวมอเตอร์ที่ต่ออยู่กับบอร์ด Arduino ซึ่งบอร์ดเชื่อมต่อกับคอมพิวเตอร์ผ่านพอร์ต USB ด้วยการสื่อสารของพอร์ตอนุกรม (ในบอร์ด Arduino มีวงจรแปลง USB to UART) ดังนั้นสามารถสร้างโปรแกรมวินโดว์ให้สามารถควบคุมการทำงานของเซอร์โวมอเตอร์ได้
การดำเนินการมีขั้นตอนดังนี้
1. วงจรที่ใช้ทดลอง เชื่อมต่อเซอร์โวมอเตอร์โดยขาสัญญาณควบคุมเข้าที่ขา D10 และต่อขาไฟบวกและกราวด์เข้าที่ 5V และ GND ดังรูป
(http://www.praphas.com/PhotoForum/interface/HowTo18/1.png)
2. ด้วยโครงสร้างของเซอร์โวมอเตอร์ใช้ โพเทนธิโอมิเตอร์เป็นอุปกรณ์ตรวจจับตำแหน่งส่งกลับเข้าวงจรควบคุม ดังนั้นมุมที่สุดทางทั้ง 2 ข้างเซอร์โวอาจทำงานได้ไม่สมบูรณ์ซึ่งตามหลักการเซอร์โวจะหมุนได้ตั้งแต่ 0-180 องศา ในทางปฏิบัติจะต้องลดมุมทั้ง 2 ข้าง ในการทดลองนี้บังคับให้เซอร์โวหมุนตั้งแต่ 5-175 องศา
(http://www.praphas.com/PhotoForum/interface/HowTo18/2.png)
*ภาพจากเวปไซต์ https://howtomechatronics.com/how-it-works/how-servo-motors-work-how-to-control-servos-using-arduino/
3. สัญญาณที่ใช้ควบคุมการเคลื่อนที่ไปยังมุมต่าง ๆ
(http://www.praphas.com/PhotoForum/interface/HowTo18/3.png)
4. สร้างโปรเจคไฟล์แล้ววางตัวคอนโทรลและแก้ไขชื่อดังรูป ซึ่งบางตัวไม่ได้แก้ชื่อใช้ชื่อเดิม (อักษรสีเขียว) ตัวคอนโทรลที่ใช้งานได้แก่
-Button
-ComboBox
-GroupBox
-Label
-SerialPort
-TextBox
-trackBar
*กำหนดค่าสูงสุดของ trackBar1=175 และค่าต่ำสุด=5
(http://www.praphas.com/PhotoForum/interface/HowTo18/4.png)
5. คลิกเพิ่มรายการในคอมโบบ็อกที่ใช้เลือกความเร็วในการสื่อสาร
(http://www.praphas.com/PhotoForum/interface/HowTo18/5.png)
ความเร็วที่ให้เลือกใช้มีดังนี้
9600
19200
38400
57600
74880
115200
6. กดปุ่ม Shift ค้างไว้แล้วคลิกที่คอมโบบ็อกทั้ง 2 ตัวตั้งค่าคุณสมบัติเริ่มต้นให้ DropDownStyle ให้เป็น DropDownList เพื่อไม่ให้ผู้ใช้งานพิมพ์ทับลงในช่องขณะรันโปรแกรม (ให้เลือกอย่างเดียว)
(http://www.praphas.com/PhotoForum/interface/HowTo18/6.png)
7. คลิกที่ Text Box เลือกให้เป็น MultiLine แล้วลากปรับขนาดเพื่อให้แสดงข้อมูลที่รับมาได้หลายบรรทัด
(http://www.praphas.com/PhotoForum/interface/HowTo18/7.png)
8. ดับเบิลคลิกที่ฟอร์ม เขียนโค้ดเพื่อให้โปรแกรมสแกนหาพอร์ตอนุกรมที่คอมพิวเตอร์มองเห็น
(http://www.praphas.com/PhotoForum/interface/HowTo18/8.png)
โค้ด
baudrate_cbb.SelectedIndex = 0;
string[] ports = SerialPort.GetPortNames();
port_cbb.Items.AddRange(ports);
port_cbb.SelectedIndex = 0;
9. คลิกที่คอมโบบ็อกที่ใช้เลือกพอร์ต แล้วคลิกเลือกเหตุการณ์กระตุ้นเป็น MouseClick (แล้วดับเบิลคลิก) เพื่อเขียนโค้ดให้ทำงานเมื่อมีเมาส์มาคลิกที่คอมโบบ็อกตัวนี้
(http://www.praphas.com/PhotoForum/interface/HowTo18/9.png)
10. เขียนโค้ดให้โปรแกรมสแกนหาพอร์ตอนุกรมใหม่ที่คอมพิวเตอร์มองเห็นในจังหวะที่มีการคลิกเมาส์ที่คอมโบบ็อกนี้
(http://www.praphas.com/PhotoForum/interface/HowTo18/10.png)
โค้ด
port_cbb.Items.Clear();
string[] ports = SerialPort.GetPortNames();
port_cbb.Items.AddRange(ports);
port_cbb.SelectedIndex = 0;
11. ดับเบิลคลิกที่ปุ่ม Connect (ปุ่มสำหรับเปิดการทำงานพอร์ตอนุกรม) แล้วเขียนโค้ด
-เปิดการทำงานของปุ่ม Disconnect
-ปิดการทำงานของปุ่ม Connect เพื่อป้องกันการเปิดพอร์ตซ้ำ
-เปิดการทำงานพอร์ตอนุกรมโดยนำค่าหมายเลขพอร์ตและค่าความเร็วสื่อสารที่ปรากฎข้อความในคอมโบบ็อกมาใช้งาน
(http://www.praphas.com/PhotoForum/interface/HowTo18/11.png)
โค้ด
con_btn.Enabled = false;
dis_btn.Enabled = true;
trackBar1.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);
}
12. คลิกที่ปุ่ม Disconnect ตั้งค่าเริ่มต้นให้ Enable เป็น False
(http://www.praphas.com/PhotoForum/interface/HowTo18/12.png)
13. ดับเบิลคลิกที่ปุ่ม Disconnect เขียนคำสั่งปิดการใช้พอร์ต
(http://www.praphas.com/PhotoForum/interface/HowTo18/13.png)
โค้ด
con_btn.Enabled = true;
dis_btn.Enabled = false;
trackBar1.Enabled = false;
if (serialPort1.IsOpen)
serialPort1.Close();
14. คลิกไอคอน Serial Port เลือกการกระตุ้นเป็น DataReceived แล้วเบิลคลิก
(http://www.praphas.com/PhotoForum/interface/HowTo18/14.png)
15. เขียนโค้ดเพื่อให้ทำงานเมื่อมีข้อมูลเข้ามาทางพอร์ตอนุกรม (แสดงข้อมูลที่รับเข้ามาไว้ที่ textBox1)
(http://www.praphas.com/PhotoForum/interface/HowTo18/15.png)
โค้ดส่วนที่ 1
private string DispString; //used to store the values read
โค้ดส่วนที่ 2
DispString = serialPort1.ReadExisting();
this.Invoke(new EventHandler(DisplayText));
โค้ดส่วนที่ 3
private void DisplayText(object sender, EventArgs e)
{
textBox1.AppendText(DispString);
}
16. คลิกที่ trackBar1 เลือกการกระตุ้นดังรูป
(http://www.praphas.com/PhotoForum/interface/HowTo18/16.png)
17. เขียนโค้ดอ่านค่าจาก trackBar แสดงผลค่าที่อ่านได้พร้อมทั้งส่งค่าออกทางพอร์ตอนุกรม
(http://www.praphas.com/PhotoForum/interface/HowTo18/17.png)
โค้ด
string x = trackBar1.Value.ToString();
degree_lb.Text = x;
serialPort1.WriteLine(x);
18. คลิกที่ฟอร์มเลือกเหตุการณ์กระตุ้นเป็น FormClosing
(http://www.praphas.com/PhotoForum/interface/HowTo18/18.png)
19. เขียนโค้ดให้ปิดการใช้งานพอร์ตอนุกรมก่อนปิดโปรแกรม
(http://www.praphas.com/PhotoForum/interface/HowTo18/19.png)
โค้ด
if (serialPort1.IsOpen)
serialPort1.Close();
Application.Exit();
โค้ดสำหรับบอร์ด Arduino
#include <Servo.h>
Servo myservo; // create servo object to control a servo
String inputString = ""; // a String to hold incoming data
bool stringComplete = false; // whether the string is complete
void setup() {
Serial.begin(9600); // initialize serial:
myservo.attach(10); // attaches the servo on pin 10 to the servo object
inputString.reserve(200); // reserve 200 bytes for the inputString:
}
void loop() {
int x = inputString.length() - 1;
int degree = inputString.substring(0, x).toInt(); //convert to int and delete '\n'
if (stringComplete) {
Serial.println(degree);
myservo.write(degree);
inputString = ""; // clear the string:
stringComplete = false;
}
}
void serialEvent() {
while (Serial.available()) {
char inChar = (char)Serial.read();
inputString += inChar;
if (inChar == '\n') {
stringComplete = true;
}
}
}
20. ส่วนที่ใช้คำนวณค่าข้อมูลที่รับเข้ามา
(1) คำนวณจำนวนตัวอักษรที่รับเข้ามาที่ไม่นับตัวปิดท้าย (\n)
(2) ตัดเอาเฉพาะข้อมูลที่เป็นตัวเลขโดยไม่เอาตัวปิดท้าย
(http://www.praphas.com/PhotoForum/interface/HowTo18/20.png)
21. ฟังก์ชั่นย่อยที่ทำงานอัตโนมัติเมื่อมีข้อมูลเข้าโดยรับค่าเข้าเก็บลงในตัวแปร inString
(http://www.praphas.com/PhotoForum/interface/HowTo18/21.png)
22. ทดสอบโปรแกรม แล้วสังเกตุผล
https://www.youtube.com/v/QrP91oObIGg