ในโปรเจกต์ Predator Numbers นี้ พี่อยากสร้างตัวนับเวลาอันโด่งดังจากหนัง Predator และ AVP ให้มันมีชีวิตขึ้นมาจริงๆ
พี่ออกแบบ PCB ขึ้นมาเพื่อเชื่อม 16-segment สองตัวให้กลายเป็น "ตัวเลขเอเลี่ยน" หนึ่งหลัก PCB ช่วยให้งานบัดกรีดูสะอาดตาขึ้น แต่ถ้าน้องไม่อยากทำ PCB ก็ทำได้เหมือนกัน แค่หาตัวผ่านรู (through-hole) มาแทน SMD ให้เจอ
ถ้าน้องอยากดูรายละเอียดวงจรหรือชิ้นส่วนต่างๆ พี่มีไฟล์ Schematic กับรายการชิ้นส่วนให้ดูใน GitHub ของโปรเจกต์นะ
มันทำอะไรได้บ้าง?
โปรเจกต์นี้คือตัวนับถอยหลังแบบ 4 หลัก แสดงเวลาที่เหลืออยู่ ค่าเริ่มต้นสามารถตั้งได้ด้วยปุ่ม BTN0 กับ BTN1
อย่างที่บอก เป้าหมายคือให้มันมี สไตล์แบบ Predator พี่ใช้รูปด้านล่างเป็นตัวอ้างอิง (ใช้แค่ตัวเลข ส่วนเลข '0' คือปิดหลักนั้นไปเลย)
พี่เคยเห็นคนอื่นทำโปรเจกต์แบบนี้เหมือนกัน แต่สิ่งที่เขาทำคือแปลง ระบบเลขฐานสิบ ของเราให้เป็นฟอนต์นี้แล้วแสดงผลเฉยๆ พี่ไม่อยากทำแบบนั้น เพราะระบบเลขฐานสิบมันน่าเบื่อ (ส่วนใหญ่เปลี่ยนแค่หลักสุดท้าย) เพื่อให้ได้อารมณ์แบบ Predator ที่ตัวเลขทั้ง 4 หลักเปลี่ยนไปทุกวินาที พี่เลยสร้างระบบตัวเลขของตัวเองขึ้นมา (ทำแบบรีบๆ นะ ใครมีไอเดียอื่นที่ใกล้เคียงของเดิมมากกว่านี้มาคุยกันได้)
สิ่งที่พี่ทำคือสร้างสูตรคำนวณค่าขึ้นมา สมมติมี 4 หลัก: 'a', 'b', 'c' และ 'd'; ค่าปัจจุบันจะตรงกับสูตรนี้: a + a*b^2 + b*c + b^2*d สูตรนี้ทำให้ตัวเลขเปลี่ยนเยอะมาก ข้อเสียอย่างเดียวคือเลขสูงสุดที่แสดงได้คือ 1,548 (แทนที่จะเป็น 9,999)
เพื่อเพิ่มความตื่นเต้น ดีเลย์ ที่รอให้ตัวเลขเปลี่ยนไปขั้นต่อไปจะไม่คงที่ ถ้าตัวเลขมากกว่า 60 มันจะใช้เวลา 1 วินาทีต่อขั้น แต่ถ้าน้อยกว่านั้นมันจะเปลี่ยนเร็วขึ้นเรื่อยๆ ยิ่งใกล้ 0 ยิ่งเร็ว (จาก 1 วินาที/เลข เหลือ 0.5 วินาที/เลข)
นอกจากนี้ เนื่องจากตัวนับแบบนี้ดูเวลาที่เหลือยาก พี่ก็มี เว็บไซต์ ให้เช็คเลขปัจจุบัน (หลัก 'a', 'b', 'c', 'd' ในฐานสิบ) และเวลาที่เหลือจนถึง 0000 ด้วย
รายละเอียดเทคนิคเพิ่มเติม
หัวใจของโปรเจกต์คือไดรเวอร์จอแสดงผลแบบกำหนดเองและลอจิกมัลติเพล็กซ์ ตัวเลขเอเลี่ยนแต่ละหลักประกอบด้วย 16-segment สองตัวเชื่อมต่อบน PCB ที่ออกแบบเอง เพื่อควบคุมทุกเซกเมนต์ใน 4 หลักโดยไม่ใช้พินเยอะเกินไป Arduino ใช้เทคนิคมัลติเพล็กซ์ นั่นคือมันสลับจ่ายไฟให้แต่ละหลักอย่างรวดเร็วทีละหลัก อาศัยความต่อเนื่องของการมองเห็น (persistence of vision) ทำให้ทั้งสี่หลักดูเหมือนติดพร้อมกัน นี่คือสาเหตุที่บางครั้งในวิดีโออาจเห็นการกระพริบ แม้ตาคนจะมองไม่เห็น
ลอจิกการจับเวลานับถอยหลังใช้ฟังก์ชัน millis() เพื่อสร้างดีเลย์แบบไม่บล็อก (non-blocking) ทำให้การมัลติเพล็กซ์ทำงานลื่นไหล สูตร a + a*b^2 + b*c + b^2*d จะถูกคำนวณในแต่ละรอบเพื่อหาค่าในฐานสิบจากตัวเลขเอเลี่ยนสี่หลัก ค่านี้จะถูกนำไปใช้ปรับดีเลย์ระหว่างการนับแบบไดนามิก สร้างความรู้สึกเร่งรีบมากขึ้นเมื่อตัวนับใกล้ถึงศูนย์
สำหรับการเก็บข้อมูลถาวร—เช่น การบันทึกค่านับถอยหลังเริ่มต้นไว้หากไฟดับ—โปรเจกต์นี้สามารถใช้ EEPROM (Electrically Erasable Programmable Read-Only Memory) ภายใน Arduino ได้ โดยการ include library EEPROM.h ตัวแปรสำคัญ เช่น ค่าเริ่มต้น สามารถเขียนและอ่านจากหน่วยความจำแบบไม่ลบเลือนนี้ได้ ทำให้ตัวนับรักษาสถานะไว้ได้แม้จะปิดแล้วเปิดเครื่องใหม่
เดโม
นี่คือวิดีโอตัวอย่างให้ดูกันนะน้อง ต้องบอกก่อนว่าพี่ขับไฟ LED แบบมัลติเพล็กซ์ (Multiplexing) นะ อาศัยหลักการที่ตาคนเรารับภาพได้ช้ากว่าจริงๆ บางทีเทคนิคนี้มันก็ตีกับกล้องถ่ายวิดีโอน่ะสิ (เลยเห็นไฟกระพริบในวิดีโอ แต่ของจริงมันสวยปรี๊ดเลยจ้า)
หวังว่าน้องๆ จะชอบกันนะ! สู้งานต่อเลยวัยรุ่น!