ผมตัดสินใจออกแบบนาฬิกาแบบไบนารี่โดยใช้จอแสดงผลแบบฟลิปดิสก์ (Flip-disc Display) ครับ ตัวผมเองใช้แพลตฟอร์ม Arduino บ่อยมาก คราวนี้ก็เลยใช้มันเหมือนเดิม นาฬิกาตัวนี้ก็คือการคัดลอกและดัดแปลง Arduino Uno ให้เรียบง่ายขึ้นนั่นแหละ (ดูแผนภาพและคำอธิบายด้านล่างได้เลย) ส่วนโค้ดก็เขียนใน Arduino IDE ครับ
นาฬิกาควรจะแสดงชั่วโมงและนาที ผมก็คิดถึงวินาทีด้วยนะ แต่สุดท้ายก็สรุปว่าการอ่านวินาทีในระบบเลขฐานสองอาจสร้างความสับสนโดยไม่จำเป็นได้ — การถอดรหัสค่ามันใช้เวลาพอสมควร แน่นอนว่าน้องฝึกอ่านบ่อยๆ ก็เร็วได้ แต่สำหรับมือใหม่มันอาจจะไม่สะดวกเท่าไหร่ ถ้าคิดว่าแต่ละดิสก์คือหนึ่งบิต (bit) การมี 6 ดิสก์จะทำให้แสดงค่าสูงสุดได้ที่ 63 ซึ่งเหมาะมากสำหรับการแสดงวินาที 0-59 พอดี ส่วนแถวบนที่แสดงชั่วโมงไม่จำเป็นต้องใช้บิตเยอะขนาดนั้น แต่เพื่อความสวยงามของนาฬิกา มันก็จะมีจำนวนบิตเท่ากันครับ
สรุปง่ายๆ: แถวบนสำหรับชั่วโมง แถวล่างสำหรับนาที จัดไปวัยรุ่น!
**นาฬิกาไบนารี่แบบฟลิปดิสก์** นี้คือแบบฝึกหัดในการจัดการกับตัวกระตุ้นแม่เหล็ก (Actuator) เป็นร้อยๆ ตัวครับ ฟลิปดิสก์ (ที่มักเห็นบนป้ายบอกเส้นทางรถเมล์รุ่นเก่า) คือจุดแสดงผลแบบไฟฟ้า-กล (Electromechanical) ด้านหนึ่งสีดำ อีกด้านสีเหลืองสด เวลาส่งพัลส์ไฟฟ้าให้กับแม่เหล็กไฟฟ้าที่อยู่ด้านล่าง มันจะ "พลิก" อย่างรุนแรง พร้อมกับเสียงคลิกที่ฟังแล้วสะใจมากกก
การทำงานแบบไฟฟ้า-กล (Electromechanical Actuation)
จอแสดงผลแบบฟลิปดิสก์เป็นเทคโนโลยีที่เก่ามากแล้วครับ มันคือจอแสดงผลแบบไฟฟ้า-กล การควบคุมมันค่อนข้างเฉพาะตัว อาศัยพัลส์กระแสที่แม่นยำเพื่อให้เราหมุนแต่ละดิสก์ได้ คำอธิบายละเอียดว่าฟลิปดิสก์ทำงานยังไงและควบคุมอย่างไร หาอ่านได้ทั่วไปในเน็ตครับ (หรือไม่ก็ถามพี่มาได้เลย สู้งานนะน้อง)
ฟลิปดิสก์ไม่ใช้ไฟฟ้าสถิตเหมือน LED นะ มันใช้การแมปขั้วแม่เหล็ก (Magnetic Polarity Mapping) ต่างหาก
- การส่งพัลส์ (The Pulse): น้องต้องส่งพัลส์ไฟฟ้า 24V ผ่านขดลวด (Coil) เป็นเวลา 1 มิลลิวินาทีพอดี ห้ามช็อตนะตัวนี้!
- การกลับขั้ว (The Reversal): ถ้าอยากให้ดิสก์พลิกกลับมาเป็นสีดำ น้องต้องกลับขั้ว (Reverse the Polarity) ของกระแสไฟฟ้าจริงๆ (โดยใช้ H-Bridge) ครับ
สมมติฐานในการออกแบบ:
- ออกแบบให้เป็นโมดูล (Modular Design)
- แสดงผลชั่วโมงและนาทีด้วยรหัสไบนารี่
- ใช้ ATmega328 เป็นหัวใจหลักของนาฬิกา
- โค้ดนาฬิกาเขียนใน Arduino IDE
- มีตัวเลือกให้อัพเดทโค้ดนาฬิกาเองได้
- มีนาฬิกาเรียลไทม์ (RTC) ที่แม่นยำบนบอร์ด
- มีแหล่งจ่ายไฟสำรองสำหรับ RTC — ซุปเปอร์คาปาซิเตอร์
- มีปุ่มสำหรับตั้งเวลา
- มีสวิตช์เปิด-ปิดไฟนาฬิกา
- มีเคสที่เรียบง่าย สวยงาม สำหรับพิมพ์ 3D และ/หรือตัดเลเซอร์
ผมชอบการสร้างอุปกรณ์อิเล็กทรอนิกส์แบบโมดูลาร์ครับ ดังนั้นนาฬิกาตัวนี้จะเป็นโครงสร้างกะทัดรัดของแผ่น PCB สองแผ่นที่เชื่อมต่อกันและเชื่อมกับตัวเคสด้วยสเปเซอร์ (Spacer) ชุดหนึ่ง นาฬิกาประกอบด้วยโมดูลหลักสองส่วนคือ: โมดูลจอแสดงผล 2x6 และโมดูลคอนโทรลเลอร์นาฬิกาครับ
จอแสดงผลฟลิปดิสก์ 2x6
จอแสดงผลที่มีสองแถว แถวละ 6 ดิสก์ วิธีควบคุมฟลิปดิสก์ที่ง่ายที่สุดคือควบคุมทีละหนึ่งดิสก์ (อ่านคำอธิบายละเอียดได้ตามลิงก์ข้างต้น) ด้วยสมมติฐานนี้ เราสามารถมองทั้งสองแถวเป็นเมทริกซ์สองแถวหกคอลัมน์ได้ ซึ่งจะลดจำนวนทรานซิสเตอร์ MOSFET ที่ต้องใช้เพื่อควบคุมดิสก์แต่ละตัวลงครึ่งหนึ่ง ดูแผนภาพด้านล่างได้เลยครับ

อาร์เรย์เมทริกซ์ H-Bridge
น้องไม่สามารถต่อ H-Bridge เข้ากับดิสก์ 60 ตัวแบบแยกกันได้หรอกครับ น้องต้องใช้กลยุทธ์การมัลติเพล็กซ์แบบเมทริกซ์ (Matrix Multiplexing)
- จัดกลุ่มขดลวด (Coil) ออกเป็นแถว (Rows) และคอลัมน์ (Columns)
- ใช้อาร์เรย์ของ Shift Registers (74HC595) และ Darlington Transistor Arrays (ULN2803) จำนวนมหาศาล
พี่ใช้ทรานซิสเตอร์แบบ mosfet N/P มาควบคุมแผ่นดิสก์โดยตรง ส่วนตัวทรานซิสเตอร์ก็ถูกควบคุมด้วย shift register ตัวดัง 595D อีกทีสองตัว วิธีนี้ช่วยลดจำนวนขาควบคุมจากไมโครคอนโทรลเลอร์เหลือแค่ 3 ขา จัดไปวัยรุ่น! แน่นอนว่าน้องจะไม่ใช้ shift register ก็ได้ แล้วไปควบคุมทรานซิสเตอร์ตรงๆ ผ่านไมโครคอนโทรลเลอร์เลย แต่มันจะใช้ขาถึง 16 ขา แล้วขาที่เหลือสำหรับงานอื่นก็จะน้อยลงไปอีก พี่อยากให้จอ Flip-disc ขนาด 2x6 นี้ใช้งานได้หลากหลาย ไม่ใช่แค่นาฬิกาไบนารีเท่านั้น ยังมีข้อดีอีกอย่างของการใช้ shift register ที่พี่ยังไม่ได้บอก คือเราสามารถต่อจอ Flip-disc หลายๆ ตัวเป็นอนุกรมกันได้ถึง 8 ตัว โดยที่จำนวนขาควบคุมยังคงเดิม แค่ 3 ขาเท่านั้น! การต่ออนุกรมทำได้ง่ายๆ ด้วยไลบรารี Arduino FlipDisc.h ที่เขียนไว้เฉพาะ















Binary Clock Controller
ด้านล่างนี้คือวงจรควบคุมนาฬิกา เอาไปศึกษาได้เลยจ้า

รุ่นพี่เลือกใช้ RTC แบบ RX8025T นะ — รุ่นพี่เขียนไลบรารี RX8025T.h สำหรับ Arduino เองเลย ความแม่นยำมันเทียบเท่ากับ DS3231 ที่ฮิตๆ กันเลย
หลักการทำงานของนาฬิกา Binary: RX8025T จะเก็บเวลาปัจจุบันไว้ และสร้างอินเตอร์รัพต์ออกมาทางขา INT0 ทุกๆ 60 วินาที พอ ATmega328 ตรวจจับอินเตอร์รัพต์ได้ มันก็จะอ่านเวลาปัจจุบันจาก RTC แล้วส่งไปแสดงผลบนจอ Flip-disc ในรูปแบบโค้ดไบนารี RTC ตัวนี้มีแบตเตอรี่สำรองเป็นซุปเปอร์แคปด้วยนะ มีปุ่ม 2 ปุ่มเอาไว้ตั้งเวลาและเลือกรูปแบบ 12/24 ชั่วโมง ส่วนเรื่องไฟเลี้ยงนี่ค่อนข้างคลาสสิคหน่อย เพราะใช้ 12V — มันเป็นวิธีที่ง่ายสุดโดยไม่ต้องพึ่ง DC-DC converter ให้วุ่นวาย ไมโครคอนโทรลเลอร์และวงจรควบคุมทั้งหมดทำงานที่ 5V
ส่วน VF — ไฟเลี้ยงสำหรับจอ Flip-disc ต้องอธิบายเพิ่มเติมหน่อย

แหล่งจ่ายไฟพัลส์ชาเปอร์นี้ประกอบด้วยทรานซิสเตอร์สวิตช์ 2 ตัวและตัวเก็บประจุ (Capacitor) พอสัญญาณ CH (Charging) ทำงาน ตัวเก็บประจุก็จะสะสมประจุ จากนั้นประจุจะถูกปล่อยออกมาเมื่อสัญญาณ PL (Pulse) ทำงาน

ถ้าอยากรู้รายละเอียดการทำงานเพิ่มเติม ลองไปหาอ่านดูได้นะ งานนี้ต้องศึกษาด้วยตัวเองบ้างน้อง





บอร์ดคอนโทรลเลอร์สามารถเชื่อมต่อกับบอร์ดจอ Flip-disc ได้ผ่านคอนเนคเตอร์ PH1 ที่มีอยู่ทั้งสองบอร์ด เพื่อให้โครงสร้างแข็งแรงขึ้น มีสเปเซอร์ยาว 6mm จำนวน 4 ตัวคั่นระหว่างบอร์ด ส่วนสเปเซอร์ที่เหลือเอาไว้ยึดนาฬิกาเข้ากับตัวเคส

วิธีอ่านเวลาแบบ Binary
นาฬิกาจะแสดงชั่วโมงและนาที แถวบนแสดงชั่วโมง แถวล่างแสดงนาที เวลาจะแสดงในรูปแบบโค้ดไบนารี นั่นคือแต่ละดิสก์ในสองแถวจะมีน้ำหนักบิต (Bit Weight) ต่างกัน เริ่มจาก 2^0 = 1 แต่ละบิตถัดไปคือเลขยกกำลังสองถัดไป 2^1 = 2, 2^2 = 4 ไปเรื่อยๆ ดิสก์ที่ไม่ได้แสดงผลจะถูกนับเป็น 0 ส่วนดิสก์ที่แสดงผลจะนับเป็น 1 พอนำค่าของดิสก์ที่แสดงผลทั้งหมดมาบวกกัน เราก็จะได้เวลาออกมา ง่ายมั้ยล่ะ! อย่าช็อตนะตัวนี้
ช่วงแรกอาจจะงงๆ ต้องใช้สมองคิดนิดนึง แต่พอเข้าใจแล้วมันฟินมาก แถมฝึกอ่านเลขฐานสอง (Binary) ได้ไวอีกต่างหาก สู้งานนะน้อง!
วิธีอ่านเวลาแบบ Binary
แทนที่จะบอกว่า "12:30" นาฬิกาเรือนนี้ใช้ระบบเลขฐานสอง (Base-2) มาบอกเวลาแทน
- แถวบนมี 6 คอลัมน์ แทนค่าตัวเลข 32, 16, 8, 4, 2, 1 (ใช้บอกชั่วโมง)
- แถวล่างมี 6 คอลัมน์ แทนค่าตัวเลข 32, 16, 8, 4, 2, 1 เช่นกัน (ใช้บอกนาที)
- ถ้าแผ่นที่ 8 กับแผ่นที่ 1 เปิดเป็นสีเหลือง แปลว่าชั่วโมงคือ 9! (8+1) ง่ายมั้ยล่ะ

ดีไซน์ตัวเรือน (Casing Design)
- ดีไซน์ #1 - แบบเปิด
- ดีไซน์ #2 - แบบเปิด
- ดีไซน์ #3 - แบบเปิด



โค้ด Arduino
หัวใจหลักของนาฬิกาคือไมโครคอนโทรลเลอร์ ATmega 328 (ใช้คริสตัลภายนอก 16 MHz ตามค่าเริ่มต้น) โค้ดสำหรับนาฬิกาถูกเขียนบน Arduino IDE และใช้ MiniCore ในการทำงาน
ถ้าน้อง...