นาฬิกาเล่นหมากรุกเนี่ยจำเป็นมากถ้าอยากเพิ่มความมันส์ในการแข่งขัน ช่วยให้เล่นกันแฟร์ๆ ด้วยการจำกัดเวลาคิดของแต่ละฝั่ง มันช่วยเพิ่มความตื่นเต้นและกลยุทธ์ในเกมหมากรุก ทำให้ทุกวินาทีมีค่าตอนที่เราพยายามคว้าชัยชนะ แต่ว่า... นาฬิกาแบบซื้อสำเร็จเนี่ยราคาพุ่งไปถึง 60 ดอลลาร์เลยนะ และการซื้อมันมาเนี่ยไม่สนุกเลยใช่มั้ยล่ะ?
นาฬิกาของพี่ (ซึ่งเอาไปใช้กับเกมไหนก็ได้ที่ต้องจับเวลา เช่น Scrabble, Go, หมากฮอส ฯลฯ) มีฟีเจอร์คือใช้สวิตช์แมคคานิคัลแบบกดแล้วรู้สึกดี, มีอินพุตที่ปรับแต่งได้ 4 ช่อง และหน้าจอ LCD ขนาดใหญ่สำหรับแสดงเวลา นอกจากนี้กลไกสวิตช์ใหญ่ๆ นี่กดแล้วสนุกมาก แถมยังมีเสียง *ท็อง* ที่ฟังแล้วฟินอีกด้วย
พี่ออกแบบตัวเรือนนาฬิกาใน Fusion 360 และเพราะพี่อยากให้เปลี่ยนชิ้นส่วนได้ง่ายๆ เลยใส่พารามิเตอร์ชุดหนึ่งเข้าไป ซึ่งปรับค่าได้ง่ายๆ เพื่อสร้างนาฬิกาที่เหมาะกับความต้องการของใครก็ตาม

การใช้งานหลักของพารามิเตอร์เหล่านี้คือการกำหนดขนาดทางกายภาพของชิ้นส่วน ซึ่งพี่สามารถวัดได้ด้วยเวอร์เนียคาลิปเปอร์ พารามิเตอร์ x และ z offset คือระยะห่างจากมุมด้านในบนสุดของกล่องไปยังตำแหน่งที่วางลิมิตสวิตช์ ตามรูปด้านล่างนี้:

พารามิเตอร์ "encoderBore" กำหนดขนาดรูสำหรับพอเทนชิออมิเตอร์, "buttonBore" คือเส้นผ่านศูนย์กลางของรูสำหรับปุ่มแบบติดแผงหน้า, และ "limitSwitchC2c" คือระยะห่างระหว่างรูยึดสำหรับลิมิตสวิตช์ของคุณ ส่วนพารามิเตอร์สุดท้าย "bodyThickness" กำหนดความหนาของนาฬิกาทั้งหมด พี่แนะนำให้ทำหนาเท่าที่ทำได้ เพราะการยัดชิ้นส่วนทั้งหมดลงในพื้นที่เล็กๆ นั้นยาก แต่ข้อจำกัดจะอยู่ที่ความยาวของสลักเกลียว M3 ที่น้องมี (หมายเหตุอย่างนึง: สวิตช์ไมโครส่วนใหญ่มาพร้อมรูยึด M2 แต่มันควรอยู่ในตำแหน่งที่สามารถเจาะขยายเป็น M3 ได้อย่างปลอดภัย ซึ่งสลักเกลียวยาวๆ หาง่ายกว่า) ในการตั้งค่านี้ ให้เริ่มจากความยาว (หน่วย mm) ของสลักเกลียวที่ต้องการ แล้วลบออกประมาณ 9-10mm เพื่อชดเชยความหนาของผนัง รวมถึงความยาวของแหวนเกลียว M3 ธรรมดาที่อีกฝั่งหนึ่ง
เมื่อปรับพารามิเตอร์เหล่านี้เรียบร้อยแล้ว น้องก็พร้อมที่จะพิมพ์ชิ้นส่วนทั้งหมดด้วยวัสดุแข็งๆ ใดๆ ก็ได้ (PLA, PETG หรือวัสดุที่คล้ายกัน)
ถ้าน้องตัดสินใจที่จะพิมพ์จากไฟล์ STL ที่แนบมาเฉยๆ น้องก็น่าจะทำโปรเจกต์นี้สำเร็จได้ แต่อาจต้องเจาะรูบางจุดเพิ่มเพื่อให้ทุกอย่างพอดีกัน
อัลกอริทึมนาฬิกาคู่ (millis)
Custom Chess Clock นี่คือการประยุกต์ใช้ State Machine แบบคู่ขั้นสุดเลย มันมีผู้เล่นสองคน, นาฬิกาสองเรือน และกฎลอจิกที่เข้มงวดมาก น้องไม่สามารถหยุดนาฬิกาของตัวเองได้โดยไม่เปิดนาฬิกาของคู่ต่อสู้ทันที
ต่างจากตัวจับเวลานับถอยหลังพื้นฐานตรงที่มันมีตัวแปรสองตัวที่ทำงานพร้อมกัน
- ตัวแปรสถานะหลัก (Global State Variable):
int activePlayer = 1; - เครื่องยนต์ Millis:
if(activePlayer == 1) { if (millis() - prevMillis > 1000) { player1_time--; prevMillis = millis(); } } else if (activePlayer == 2) { if (millis() - prevMillis > 1000) { player2_time--; prevMillis = millis(); } } - การขัดจังหวะ (Interruption): ทันทีที่ผู้เล่นคนที่ 1 ตบปุ่มอาร์เคดยักษ์ของตัวเอง อินเตอร์รัปต์จะสลับค่า
activePlayerไปเป็น 2 การคำนวณมิลลิวินาทีของผู้เล่นคนที่ 1 จะ หยุดทันที กลางคัน ป้องกันไม่ให้เสียเวลาแม้แต่เสี้ยววินาทีตลอดหลายชั่วโมงของการเล่น
การประกอบฮาร์ดแวร์ (กลไกไม้กระดก)
การประกอบชิ้นส่วนจริงเนี่ยสำคัญไม่แพ้การเขียนโค้ดเลยนะน้อง! แทนที่จะใช้ปุ่มกดแยกกันสองปุ่ม เด็กช่างหลายคนชอบใช้คันโยกแบบ "ไม้กระดก" ที่พิมพ์จากเครื่องพิมพ์ 3D หรือทำจากไม้ วางทับบนสวิตช์จิ๋วแบบ SPDT พอกดฝั่งตัวเองลง อีกฝั่งก็เด้งขึ้นมา บังคับให้กดได้ทีละฝั่งเท่านั้น! กลไกแบบนี้แหละที่เห็นในภาพดีไซน์ด้านบน
อุปกรณ์ที่ต้องใช้ในการประกอบ
- Arduino Nano: ตัวเล็กแบน ลงกล่องบางๆ ได้พอดี
- จอแสดงผลข้อความ 16x2 หรือจอ 7-Segment 4 หลัก 2 ตัว (หันเข้าหาผู้เล่นคนละด้าน)
- ปุ่มอาร์เคดยักษ์ หรือไม่ก็คันโยกไม้กระดกแบบกลไกวางทับบนลิมิตสวิตช์
- บัซเซอร์: สำหรับส่งเสียงเตือนน่ากลัวเวลา "ธงร่วง / หมดเวลา" ซึ่งหมายถึงแพ้แล้วนั่นเอง
แนะนำให้บัดกรีทุกจุดต่อให้เรียบร้อย และต่อสายทุกชิ้นส่วนตามแผนภาพการเดินสายด้านล่าง โดยใช้ตัวต้านทาน (Resistor) ค่าประมาณเดียวกันทุกจุด หมายเหตุ: เพราะโปรเจกต์นี้พื้นที่ค่อนข้างจำกัด ควรตัดสายให้สั้นหน่อย และบอร์ดใหญ่ๆ อย่าง UNO อาจจะใส่กล่องไม่ลงเลย ถ้าไม่ได้ทำกล่องให้หนาพิเศษ

พอเดินสายทุกอย่างเสร็จแล้ว ก็อัพโหลดโค้ด แล้วไปเล่นหมากรุกได้เลยจ้า!
(ถ้านับเวลาผิดฝั่ง ให้ลองสลับค่า "true" กับ "false" ของตัวแปร "LEFT" กับ "RIGHT" ดูนะ)