กลับไปหน้ารวมไฟล์
flip-disc-binary-clock-cb86cf.md

ผมตัดสินใจออกแบบนาฬิกาแบบไบนารี่โดยใช้จอแสดงผลแบบฟลิปดิสก์ (Flip-disc Display) ครับ ตัวผมเองใช้แพลตฟอร์ม Arduino บ่อยมาก คราวนี้ก็เลยใช้มันเหมือนเดิม นาฬิกาตัวนี้ก็คือการคัดลอกและดัดแปลง Arduino Uno ให้เรียบง่ายขึ้นนั่นแหละ (ดูแผนภาพและคำอธิบายด้านล่างได้เลย) ส่วนโค้ดก็เขียนใน Arduino IDE ครับ

นาฬิกาควรจะแสดงชั่วโมงและนาที ผมก็คิดถึงวินาทีด้วยนะ แต่สุดท้ายก็สรุปว่าการอ่านวินาทีในระบบเลขฐานสองอาจสร้างความสับสนโดยไม่จำเป็นได้ — การถอดรหัสค่ามันใช้เวลาพอสมควร แน่นอนว่าน้องฝึกอ่านบ่อยๆ ก็เร็วได้ แต่สำหรับมือใหม่มันอาจจะไม่สะดวกเท่าไหร่ ถ้าคิดว่าแต่ละดิสก์คือหนึ่งบิต (bit) การมี 6 ดิสก์จะทำให้แสดงค่าสูงสุดได้ที่ 63 ซึ่งเหมาะมากสำหรับการแสดงวินาที 0-59 พอดี ส่วนแถวบนที่แสดงชั่วโมงไม่จำเป็นต้องใช้บิตเยอะขนาดนั้น แต่เพื่อความสวยงามของนาฬิกา มันก็จะมีจำนวนบิตเท่ากันครับ

สรุปง่ายๆ: แถวบนสำหรับชั่วโมง แถวล่างสำหรับนาที จัดไปวัยรุ่น!

**นาฬิกาไบนารี่แบบฟลิปดิสก์** นี้คือแบบฝึกหัดในการจัดการกับตัวกระตุ้นแม่เหล็ก (Actuator) เป็นร้อยๆ ตัวครับ ฟลิปดิสก์ (ที่มักเห็นบนป้ายบอกเส้นทางรถเมล์รุ่นเก่า) คือจุดแสดงผลแบบไฟฟ้า-กล (Electromechanical) ด้านหนึ่งสีดำ อีกด้านสีเหลืองสด เวลาส่งพัลส์ไฟฟ้าให้กับแม่เหล็กไฟฟ้าที่อยู่ด้านล่าง มันจะ "พลิก" อย่างรุนแรง พร้อมกับเสียงคลิกที่ฟังแล้วสะใจมากกก

การทำงานแบบไฟฟ้า-กล (Electromechanical Actuation)

จอแสดงผลแบบฟลิปดิสก์เป็นเทคโนโลยีที่เก่ามากแล้วครับ มันคือจอแสดงผลแบบไฟฟ้า-กล การควบคุมมันค่อนข้างเฉพาะตัว อาศัยพัลส์กระแสที่แม่นยำเพื่อให้เราหมุนแต่ละดิสก์ได้ คำอธิบายละเอียดว่าฟลิปดิสก์ทำงานยังไงและควบคุมอย่างไร หาอ่านได้ทั่วไปในเน็ตครับ (หรือไม่ก็ถามพี่มาได้เลย สู้งานนะน้อง)

ฟลิปดิสก์ไม่ใช้ไฟฟ้าสถิตเหมือน LED นะ มันใช้การแมปขั้วแม่เหล็ก (Magnetic Polarity Mapping) ต่างหาก

  1. การส่งพัลส์ (The Pulse): น้องต้องส่งพัลส์ไฟฟ้า 24V ผ่านขดลวด (Coil) เป็นเวลา 1 มิลลิวินาทีพอดี ห้ามช็อตนะตัวนี้!
  2. การกลับขั้ว (The Reversal): ถ้าอยากให้ดิสก์พลิกกลับมาเป็นสีดำ น้องต้องกลับขั้ว (Reverse the Polarity) ของกระแสไฟฟ้าจริงๆ (โดยใช้ H-Bridge) ครับ

สมมติฐานในการออกแบบ:

  1. ออกแบบให้เป็นโมดูล (Modular Design)
  2. แสดงผลชั่วโมงและนาทีด้วยรหัสไบนารี่
  3. ใช้ ATmega328 เป็นหัวใจหลักของนาฬิกา
  4. โค้ดนาฬิกาเขียนใน Arduino IDE
  5. มีตัวเลือกให้อัพเดทโค้ดนาฬิกาเองได้
  6. มีนาฬิกาเรียลไทม์ (RTC) ที่แม่นยำบนบอร์ด
  7. มีแหล่งจ่ายไฟสำรองสำหรับ RTC — ซุปเปอร์คาปาซิเตอร์
  8. มีปุ่มสำหรับตั้งเวลา
  9. มีสวิตช์เปิด-ปิดไฟนาฬิกา
  10. มีเคสที่เรียบง่าย สวยงาม สำหรับพิมพ์ 3D และ/หรือตัดเลเซอร์

ผมชอบการสร้างอุปกรณ์อิเล็กทรอนิกส์แบบโมดูลาร์ครับ ดังนั้นนาฬิกาตัวนี้จะเป็นโครงสร้างกะทัดรัดของแผ่น PCB สองแผ่นที่เชื่อมต่อกันและเชื่อมกับตัวเคสด้วยสเปเซอร์ (Spacer) ชุดหนึ่ง นาฬิกาประกอบด้วยโมดูลหลักสองส่วนคือ: โมดูลจอแสดงผล 2x6 และโมดูลคอนโทรลเลอร์นาฬิกาครับ

จอแสดงผลฟลิปดิสก์ 2x6

จอแสดงผลที่มีสองแถว แถวละ 6 ดิสก์ วิธีควบคุมฟลิปดิสก์ที่ง่ายที่สุดคือควบคุมทีละหนึ่งดิสก์ (อ่านคำอธิบายละเอียดได้ตามลิงก์ข้างต้น) ด้วยสมมติฐานนี้ เราสามารถมองทั้งสองแถวเป็นเมทริกซ์สองแถวหกคอลัมน์ได้ ซึ่งจะลดจำนวนทรานซิสเตอร์ MOSFET ที่ต้องใช้เพื่อควบคุมดิสก์แต่ละตัวลงครึ่งหนึ่ง ดูแผนภาพด้านล่างได้เลยครับ

แผนภาพวงจรจอแสดงผลฟลิปดิสก์ 2x6

อาร์เรย์เมทริกซ์ H-Bridge

น้องไม่สามารถต่อ H-Bridge เข้ากับดิสก์ 60 ตัวแบบแยกกันได้หรอกครับ น้องต้องใช้กลยุทธ์การมัลติเพล็กซ์แบบเมทริกซ์ (Matrix Multiplexing)

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

    แผนภาพขา (Pinout) จอ Flip-disc 2x6
    แผนภาพขา (Pinout) จอ Flip-disc 2x6
    ขนาดของจอ Flip-disc 2x6
    แผ่น PCB จอ Flip-disc 2x6 - ชั้นล่าง
    แผ่น PCB จอ Flip-disc 2x6 - ชั้นบน
    แผ่น PCB ต้นแบบจอ Flip-disc 2x6 - ชั้นบน

    Binary Clock Controller

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

    วงจรควบคุม Flip-disc Binary Clock

    รุ่นพี่เลือกใช้ 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 ต้องอธิบายเพิ่มเติมหน่อย

    ไดอะแกรมแบบง่ายของแหล่งจ่ายไฟพัลส์ (Shaper) สำหรับจอ Flip-disc

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

    หลักการทำงานของแหล่งจ่ายไฟพัลส์ (Shaper) สำหรับจอ Flip-disc

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

    แผ่น PCB ของ Flip-disc Binary Clock

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

    Binary Clock แบบยังไม่ได้ใส่เคส

    วิธีอ่านเวลาแบบ 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) ง่ายมั้ยล่ะ
    วิธีอ่านเวลาแบบ Binary

    ดีไซน์ตัวเรือน (Casing Design)

    1. ดีไซน์ #1 - แบบเปิด
    2. ดีไซน์ #2 - แบบเปิด
    3. ดีไซน์ #3 - แบบเปิด
    ดีไซน์หมายเลข 1
    ดีไซน์หมายเลข 2
    ดีไซน์หมายเลข 3

    โค้ด Arduino

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

    ถ้าน้อง...

    ข้อมูล Frontmatter ดั้งเดิม

    apps:
      - "1x Arduino IDE 2.0 (beta)"
    author: "sajmarcin"
    category: "Screens & Displays"
    components:
      - "1x 2x6 Flip-disc Binary Clock"
      - "1x Soldering kit"
      - "1x Optional 3D Printer"
    description: "Click-clack timekeeping! Build a mesmerizing electromechanical clock using a matrix of clicking magnetic discs that flip to show the binary time."
    difficulty: "Intermediate"
    documentationLinks: []
    downloadableFiles:
      - "https://github.com/marcinsaj/Flipo-Binary-Clock-2x6-Flip-Disc-Display"
    encryptedPayload: "U2FsdGVkX19SxPsqlpEo7Xp4dIcARTF/6522YhaAIO9BJSCGzT0Kqd8A+8RqrQJSyOhNELJAyVhIIICyejYPT/cJ5PzasNpT8kR5LxK1pWk="
    heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/flip-disc-binary-clock-cb86cf_cover.png"
    lang: "en"
    likes: 0
    passwordHash: "1d20960c04764a8b8f18e0e4b4616383bb695ea68a1a47656ca11dfec871f4de"
    price: 2450
    seoDescription: "Unique Binary clock project using electromechanical flip-disc displays. Learn to build this Arduino-based timepiece step-by-step."
    tags:
      - "Clocks"
      - "Embedded"
    title: "นาฬิกาไบนารี Flip-disc งานง่ายแต่หล่อ!"
    tools: []
    videoLinks:
      - "https://vimeo.com/1014803674"
      - "https://vimeo.com/799096695"
      - "https://vimeo.com/1011717501"
      - "https://vimeo.com/1011737280"
    views: 3355