คนคอมพิวเตอร์

มาสร้างหุ่นแอ๊บแบ๊วกันเถอะ [6]

Posted on: กันยายน 21, 2009

หน้าแรก สารบัญ เกี่ยวกับบล็อกนี้ เกี่ยวกับผู้เขียน

มาสร้างหุ่นแอ๊บแบ๊วกันเถอะ [6]

ทำให้เพื่อนๆ ของคุณทึ่งด้วยการสร้างหุ่นยนต์น่ารักคิกขุที่จะส่งสัญญาณให้คุณทราบทันทีที่แฟนของคุณปรากฏกายใน MSN

บทความโดย : ลาภลอย วานิชอังกูร (laploy.com)

หุ่น แอ๊บแบ๊วคือตุ๊กตาตัวเล็กๆ ที่เรานำมาติดไว้กับเซอร์โว (servo motor) เมื่อบุคคลที่เราต้องการติดตามเฝ้าดูสถานะ (ต่อไปจะเรียกสั้นๆ ว่าแฟน) เปลี่ยนแปลงสภานะในโปรแกรมวินโดวส์ ไลฟว์ แมสเซนเจอร์ (Windows Live Messenger ต่อไปจะเรียกย่อว่า MSN) ด้วยการออนไลน์หรือออฟไลน์ เซอร์โวจะทำงาน หุ่นแอ๊บแบ๊วก็จะเคลื่อนที่ ขณะที่เรานั่งที่โต๊ะคอมพิวเตอร์ หรือเดินผ่าน เพียงชำเลืองมองที่หุ่นแอ๊บแบ๊วเราก็จะทราบทันทีว่าแฟนของเรากำลังออนไลน์ อยู่หรือไม่

บท ความนี้จะแนะนำวิธีสร้างหุ่นแอ๊บแบ๊วทั้งทางฮาร์ดแวร์และซอฟท์แวร์โดย ละเอียด ฮาร์ดแวร์ประกอบด้วยอุปกรณ์หาง่ายน้อยชิ้น นำมาประกอบเป็นวงจรง่ายๆ ไม่ซับซ้อน ส่วนซอฟท์แวร์ผู้เขียนเตรียมไฟล์ซอร์สโค้ดไว้ให้ครบ ท่านสามารถนำไปปรับปรุงเปลี่ยนแปลงได้อย่างรวดเร็ว

คอนสทรักเตอร์ของคลาส AvailabotForm
คอนสทรักเตอร์ของคลาส AvailabotForm ทำหน้าที่กำหนดค่าเริ่มต้นให้แก่ออพเจ็กต์ที่จะถูกสร้างจากคลาสนี้

1 public AvailabotForm()
2 {
3     InitializeComponent();
4     timer1.Interval = 1000;
5     textBox1.Text = "Start at " + DateTime.Now.ToString() + "\r\n";
6 }

บรรทัดที่ 3 เรียกเมธอด InitializeComponent ซึ่งเป็นเมธอดที่ถูกสร้างโดยดีไซเนอร์ของ MSVS เพื่อวาดภาพกล่องตัวอักษรและปุ่ม บรรทัดที่ 4 กำหนดค่าให้แก่ตัวจับเวลา timer1 ให้มีช่วงเวลาหน่วง 1,000 มิลลิวินาที หรือหนึ่งวินาที (เราใช้ timer1 เพื่อตรวจสอบสถานะของแฟนทุกๆ วินาที) บรรทัดที่ 5 แสดงข้อความแจ้งการเริ่มทำงานในกล่องตัวอักษร textBox1

เมธอด MoveCW
เมธอด MoveCW ทำหน้าที่หมุนเซอร์โวตามเข็มนาฬิกา (Clock Wise เรียกย่อ CW)คือการหมุนวนขวา (ทักษิณาวรรต)  เมธอด MoveCW มีโค้ดดังนี้

1 private void MoveCW(int r)
2 {
3      timer1.Enabled = false;
4      for (int i = 0; i < r; i++)
5      {
6          myPort.OutPut(255);
7          myPort.OutPut(0);
8          Thread.Sleep(40);
9      }
10     timer1.Enabled = true;
11 }

บรรทัดที่ 1 ทำหน้าที่กำหนดว่าเมธอดนี้ไม่มีค่าส่งกลับและมีพารามิเตอร์หนึ่งตัวคือ r ทำหน้าที่กำหนดจำนวนพัลส์ คำสั่งวนซ้ำในบรรทัดที่ 3 นำค่า r มากำหนดจำนวนรอบของการทำงานซ้ำ การทำงานหนึ่งรอบจะสร้างพัลส์หนึ่งลูกซึ่งจะทำให้เซอร์โวเคลื่อนไปประมาณ 8 องศา (เซอร์โวรุ่นอื่นหรือยี่ห้ออื่นอาจเคลื่อนมากหรือน้อยกว่านี้)

เราต้องหยุดการทำงานของ timer1 ไว้ชั่วคราว (บรรทัดที่ 3)เพื่อไม่ให้รบกวนการทำงานของพัลส์ และให้ทำงานต่อเมื่อเราส่งพัลส์เสร็จแล้ว (บรรทัดที่ 11)

บรรทัดที่ 6 ถึง 9 คือโค้ดไส้ในของการวนซ้ำทำหน้าที่สร้างพัลส์หนึ่งลูก บรรทัดที่ 6 เซตให้ทุกบิตของพอร์ทเครื่องพิมพ์มีค่าเป็นหนึ่ง บรรทัดที่ 7 ทำหน้าที่หน่วงเวลานาน 1 มิลลิวินาที บรรทัดที่ 8 เซตให้ทุกบิตของพอร์ทเครื่องพิมพ์มีค่าเป็นศูนย์ และบรรทัดที่ 9 ทำหน้าที่หน่วงเวลานาน 20 มิลลิวินาที ผลลัพธ์ที่ได้คือพัลส์หนึ่งลูกตาม (โปรดดูแผนภูมิประกอบการทำงานของโปรแกรม)

แผนภูมิเวลาของพัลส์ที่ถูกสร้างด้วยเมธอด MoveCW

เมธอด MoveCC
เมธอด MoveCW ทำหน้าที่หมุนเซอร์โวทวนเข็มนาฬิกา (Counter Clock Wise เรียกย่อ CC)คือการหมุนวนซ้าย (อุตราวรรต)  โค้ดของเมธอด MoveCW เหมือนโค้ดของเมธอด MoveCW ทุกประการ ยกเว้นช่วงหน่วงขณะโลจิกสูงมีระยะเวลาสองมิลลิวินาที

1  private void MoveCC(int r)
2  {
3      timer1.Enabled = false;
4      for (int i = 0; i < r; i++)
5      {
6          myPort.OutPut(255);
7          Thread.Sleep(2);
8          myPort.OutPut(0);
9          Thread.Sleep(40);
10      }
11      timer1.Enabled = true;
12  }

เมธอด RepeatMove
เมธอดนี้จะทำงานหากเรากำหนดให้หุ่นแอ๊บแบ๊วทำงานในโหมดหันต่อเนื่อง หน้าที่ของมันคือทำให้หุ่นแอ๊บแบ๊วหันไปทางซ้าย แล้วหันไปทางขวาสลับไปเช่นนี้ตลอดเวลาที่แฟนออนไลน์

1  private void RepeatMove(int x)
2  {
3      if (x == 1)
4      {
5          textBox1.Text = " Love On-line!!!";
6          if (moveToLeft)
7              MoveCW(18);
8          else
9              MoveCC(17);
10         moveToLeft = !moveToLeft;
11     }
12 }

เมธอด OneTimeMove
เมธอดนี้จะทำงานหากเรากำหนดให้หุ่นแอ๊บแบ๊วทำงานในโหมดหันครั้งเดียว หน้าที่ของมันคือทำให้หุ่นแอ๊บแบ๊วหันหน้ามาหาเราเมื่อแฟนออนไลน์ และหันหลังให้เราหากแฟนออฟไลน์

1   private void OneTimeMove(int x)
2   {
3       if (x == 1)
4       {
5           if (!userStat)
6           {
7               textBox1.Text = " Love On-line!!!";
8               userStat = true;
9               MoveCW(18);
10          }
11      }
12      else
13      {
14          if (userStat)
15          {
16              textBox1.Text = " *** Love Off-line **** ";
17              userStat = false;
18              MoveCC(17);
19          }
20      }
21  }

เมธอด timer1_Tick
เมธอด timer1_Tick จะทำงานเองโดยอัตโนมัติทุกๆ หนึ่งวินาที เพราะเรากำหนดค่า timer1.interval ไว้ในเมธอดคอนสทรักเตอร์ ให้มีค่าเป็นหนึ่งวินาที

1   private void timer1_Tick(object sender, EventArgs e)
2   {
3       myTR = new StreamReader(@"c:\msn-test\log.txt");
4       int x = Convert.ToInt32(myTR.ReadLine());
5       myTR.Close();
6       if (repeat)
7           RepeatMove(x);
8       else
9           OneTimeMove(x);
10  }

บรรทัดที่ 3 อ่านข้อมูลจากแฟ้มข้อมูลตัวอักษรชื่อ log.txt ซึ่งอยู่ในโฟลเดอร์ c:\msn-test ค่าที่อ่านได้จะมีเพียงเลข 0 หรือเลข 1 อย่างใดอย่างหนึ่งเท่านั้น แต่เราอ่านมาเป็นข้อความ จึงต้องแปลงเป็นข้อมูลแบบเลขจำนวนเต็มเสียก่อน (บรรทัดที่ 4) เมื่ออ่านเสร็จแล้วปิดไฟล์ (บรรทัดที่ 5 หากไม่ปิดไฟล์ GetAlert จะเปิดไฟล์นี้ไม่ได้และจะเกิดเออเรอร์)

นำค่าที่อ่านได้มาตรวจสอบว่าเป็น 1 หรือไม่  (บรรทัดที่ 6) ถ้าใช่ แสดงว่าแฟนออนไลน์แล้ว เราจะหมุนเซอร์โว  (บรรทัดที่ 12) และแสดงข้อความในกล่องตัวอักษร textBox1  (บรรทัดที่ 10)

เนื่องจากตัวจับเวลา timer1 จะตรวจสอบการออนไลน์นี้ทุกๆ หนึ่งวินาที แต่การหมุนเซอร์โวเราต้องทำเมื่อแฟนเริ่มออนไลน์เพียงครั้งเดียว (ไม่ใช่ทำทุกๆ หนึ่งวินาที เราจะไม่หมุนเซอร์โวอีก จนกว่าแฟนของเราจะออฟไลน์ และออนไลน์ใหม่อีกครั้ง) ดังนั้นเราจึงจำเป็นต้องตรวจสอบเงื่อนไขดังกล่าวนี้

วิธีตรวจสอบทำได้หลายแบบ อย่างง่ายสุดคือใช้ตัวแสดงสถานะ (status หรือ flag) ในโปรแกรมนี้เราใช้ฟิลด์ userStat เพื่อไม่ให้โปรแกรมหมุนเซอร์โวทุกครั้งที่ timer1 ทำงาน โปรดไล่ดูคำสั่งในโปรแกรมเพื่อวิเคราะห์ว่าฟิลด์ userStat ถูกนำมาใช้แก้ปัญหานี้ได้อย่างไร 

เมธอด buttonStart_Click
เมธอด buttonStart_Click ทำงานเมื่อผู้ใช้กดปุ่ม Start ขั้นแรกเราต้องตรวจสอบว่า timer1 กำลังทำงานอยู่หรือไม่ (บรรทัดที่ 3) หากใช่ เราต้องหยุด timer1  (บรรทัดที่ 5) เปลี่ยนข้อความบนปุ่มเป็น Start (บรรทัดที่ 6) และแสดข้อความใน textBox1 ให้ผู้ใช้งานรู้ว่า timer1 หยุดทำงานแล้ว  (บรรทัดที่ 7)

หาก timer1 หยุดทำงานอยู่ เราต้องให้มันเริ่มทำงาน (บรรทัดที่ 11)เปลี่ยนข้อความบนปุ่มเป็น Stop (บรรทัดที่ 12)และแสดข้อความใน textBox1 ให้ผู้ใช้งานรู้ว่าบัดนี้ timer1 เริ่มทำงานแล้ว  (บรรทัดที่ 13)

1   private void buttonStart_Click(object sender, EventArgs e)
2   {
3       if (timer1.Enabled)
4       {
5           timer1.Enabled = false;
6           buttonStart.Text = "Start";
7           textBox1.Text += "Timer Stop\r\n";
8       }
9        else
10      {
11          timer1.Enabled = true;
12          buttonStart.Text = "Stop";
13          textBox1.Text += "Timer Start\r\n";
14      }
15  }

 

โปรดติดตามตอนต่อไป

ใส่ความเห็น

เกี่ยวกับบล็อกนี้

เว็บบล็อก “คนคอมพิวเตอร์” หรือ Laploy’s articles เป็นบล็อกรวบรวมบทความจาก ลาภลอย วานิชอังกูร มีบทความหลายประเภทคละกัน เช่นบทความเกี่ยวกับการพัฒนาซอฟต์แวร์ บทความเกี่ยวกับการสร้างและดัดแปลงฮาร์ดแวร์ บทความเกี่ยวกับเทคโนโลยีคอมพิวเตอร์ทั่วไป บทความทั่วไป และนิยายนักสืบ

เกี่ยวกับผู้เขียน

ลาภลอย วานิชอังกูร เป็นผู้เชี่ยวชาญการพัฒนาแอพลิเกชันฐานข้อมูลและ Business Intelligence โดยเริ่มจากการพัฒนาโปรแกรมด้วย dBaseII, Clipper, FoxPro ปัจจุบันเป็นผู้เชี่ยวชาญในการบูรณาการระบบฐานข้อมูลด้วยเทคโนโลยีของไมโคร ซอฟต์เช่น ASP.NET, ADO.NET, Microsoft SQL Server 2008 และ LINQ ชำนาญการเขียนคิวรีเพื่อแก้ปัญหาทางธุรกิจที่ซับซ้อน Data mining, Data Warehouse, OLAP (SSRS), OLTP เคยออกแบบฐานข้อมูลสัมพันธ์ในองค์กรระหว่างประเทศ เคยพัฒนาแอพลิเกชันฐานข้อมูลในโครงการขนาดใหญ่หลายโครงการ และเคยให้คำปรึกษาด้าน BI ในศูนย์คอมพิวเตอร์ (T-Center) ในองค์กรของประเทศฝรั่งเศส
นอกจากงานฐานข้อมูลแล้ว ลาภลอย วานิชอังกูร ยังเชี่ยวชาญการพัฒนาซอฟต์แวร์ระบบฝังตัว (Microprocessor / Microcontroller Based Embedded System) งานพัฒนาแอพลิเกชันในอินเตอร์เน็ตแบบ RIA (Rich Internet Application) งานพัฒนาโครงสร้างพื้นฐานของซอฟต์แวร์ด้วยหลักการ OOP (Framework Development in Object Oriented Programming) ด้วยภาษา C# และ .NET Framework และงานบูรณาการระบบในองค์กรหรือ SOA (Service Oriented Architecture for Enterprise Orchestration) เคยร่วมงานกับทีมพัฒนาซอฟต์แวร์ในหลายๆ ประเทศ เช่น ไทย อินเดีย สวิส เยอรมัน และประเทศสหรัฐอเมริกา
ปัจจุบัน ลาภลอย วานิชอังกูร ทำหน้าที่ให้คำปรึกษาการวางระบบ IT (เช่น SQL, OLAP,.NET, SCADA, BI, SOA และอื่นๆ) ให้แก่หน่วยงานขนาดใหญ่หลายแห่ง และมีบทความทางวิชาการตีพิมพ์ในวารสารหลายเล่มอย่างสม่ำเสมอ และเป็นผู้เขียนหนังสือ "เรียนรู้ด้วยตนเอง DataBase - Query - T-SQL - Stored Procedure" และ “เรียนรู้ด้วยตนเอง OOP C# ASP.NET” (ISBN 13:978-974-212-598-1)
ท่านสามารถติดต่อผู้เขียนได้ที่อีเมล laploy@gmail.com

เรียนรู้ด้วยตนเอง OOP C# ASP.NET

ชื่อหนังสือ : เรียนรู้ด้วยตนเอง OOP C# ASP.NET โดย : ลาภลอย วานิชอังกูร จัดพิมพ์จัดจำหน่ายโดย : บริษัท ซีเอ็ดยูเคชั่น จำกัด (มหาชน) ISBN : 13:978-974-212-598-1 ราคา : 349 บาท จำนวนหน้า : 648 ขนาด : 19x29 ซ.ม.

เรียนรู้ด้วยตนเอง DataBase – Query – T-SQL – Stored Procedure

ชื่อหนังสือ: เรียนรู้ด้วยตนเอง DataBase - Query - T-SQL - Stored Procedure โดย: ลาภลอย วานิชอังกูร จัดพิมพ์จัดจำหน่าย: บริษัท ซีเอ็ดยูเคชั่น จำกัด (มหาชน) ISBN: 978-616-08-0009-4 ราคา: 559 บาท จำนวนหน้า: 1,100 ขนาด: 19x29 ซ.ม. วางตลาด: ตุลา 2552

กรุณาป้อนอีเมลของท่าน

Join 17 other subscribers