มาสร้างหุ่นแอ๊บแบ๊วกันเถอะ [6]
Posted กันยายน 21, 2009
on:
หน้าแรก สารบัญ เกี่ยวกับบล็อกนี้ เกี่ยวกับผู้เขียน มาสร้างหุ่นแอ๊บแบ๊วกันเถอะ [6] ทำให้เพื่อนๆ ของคุณทึ่งด้วยการสร้างหุ่นยนต์น่ารักคิกขุที่จะส่งสัญญาณให้คุณทราบทันทีที่แฟนของคุณปรากฏกายใน MSN บทความโดย : ลาภลอย วานิชอังกูร (laploy.com) หุ่น แอ๊บแบ๊วคือตุ๊กตาตัวเล็กๆ ที่เรานำมาติดไว้กับเซอร์โว (servo motor) เมื่อบุคคลที่เราต้องการติดตามเฝ้าดูสถานะ (ต่อไปจะเรียกสั้นๆ ว่าแฟน) เปลี่ยนแปลงสภานะในโปรแกรมวินโดวส์ ไลฟว์ แมสเซนเจอร์ (Windows Live Messenger ต่อไปจะเรียกย่อว่า MSN) ด้วยการออนไลน์หรือออฟไลน์ เซอร์โวจะทำงาน หุ่นแอ๊บแบ๊วก็จะเคลื่อนที่ ขณะที่เรานั่งที่โต๊ะคอมพิวเตอร์ หรือเดินผ่าน เพียงชำเลืองมองที่หุ่นแอ๊บแบ๊วเราก็จะทราบทันทีว่าแฟนของเรากำลังออนไลน์ อยู่หรือไม่ บท ความนี้จะแนะนำวิธีสร้างหุ่นแอ๊บแบ๊วทั้งทางฮาร์ดแวร์และซอฟท์แวร์โดย ละเอียด ฮาร์ดแวร์ประกอบด้วยอุปกรณ์หาง่ายน้อยชิ้น นำมาประกอบเป็นวงจรง่ายๆ ไม่ซับซ้อน ส่วนซอฟท์แวร์ผู้เขียนเตรียมไฟล์ซอร์สโค้ดไว้ให้ครบ ท่านสามารถนำไปปรับปรุงเปลี่ยนแปลงได้อย่างรวดเร็ว คอนสทรักเตอร์ของคลาส 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 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 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 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 หาก 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 }
โปรดติดตามตอนต่อไป |
ใส่ความเห็น