ชื่อโปรเจกต์: Snake on 192 LEDs
โปรเจกต์นี้เริ่มมาจากพี่ไปเหมา LED 3mm สีส้มมา 200 ดวง เห็นมันถูกดีเลยอยากเอามาทำเป็นจอ Display ซะเลย พี่เริ่มจากเจาะรูบนแผ่นไม้ไป 192 รู จัดเรียงแบบสูง 8 กว้าง 24 แล้วใช้ไม้นั่นแหละเป็นจิ๊ก (Jig) ช่วยดามตอนบัดกรี LED เข้าด้วยกัน โดยขา Anode ของ LED ในแต่ละ Column จะเชื่อมถึงกันหมด ส่วนขา Cathode ก็เชื่อมกันเป็นแนวนอนหรือ Row นั่นเอง หลักการคือถ้าเราจ่ายไฟบวกเข้า Row ไหน แล้วต่อ Ground เข้า Column ไหน LED ตรงจุดตัดนั้นก็จะสว่างวาบขึ้นมา แต่ถ้าจะคุมให้ติดพร้อมกันทั้งจอ น้องต้องใช้เทคนิคขี้โกงนิดหน่อยที่เรียกว่า Multiplexing คือเราจะสลับเปิดทีละแถวด้วยความเร็วสูงมากจนตาเราแยกไม่ทัน ดูเหมือนมันติดพร้อมกันหมดนั่นแหละ หล่อเท่เลยงานนี้
พี่ใช้ Shift Register เบอร์ 74HC595 ทั้งหมด 4 ตัวมาคุม Row และ Column โดยสั่งงานผ่าน [Arduino](https://s.shopee.co.th/7fUgFAWSki) Nano อีกที มีตัวหนึ่งทำหน้าที่คุม Row ผ่าน Transistor ช่วยขยายกระแส เพราะถ้าสั่งเปิด LED 24 ดวงพร้อมกัน Shift Register เพียวๆ รับงานหนักจนไหม้แน่ ส่วนอีก 3 ตัวที่เหลือก็เอาไปคุม Column ผ่าน Resistor จำกัดกระแส พี่ใช้ค่า 22 Ohm ซึ่งก็ใช้งานได้ดีนะ แต่ถ้าพวกนายอยากเซฟกว่านี้ก็ขยับค่าให้สูงขึ้นหน่อยก็ได้ ที่พี่ใช้ค่าต่ำเพราะตัว Transistor มันดรอปแรงดันไปส่วนหนึ่งแล้ว แถม LED แต่ละดวงก็สว่างแค่ 1 ใน 8 ของเวลาทั้งหมดเอง นอกจากนี้พี่ยังใส่ Potentiometer ทำเป็นวงจร Voltage Divider ไว้ปรับความสว่างจอด้วย แล้วก็แอบทำ Inverter จาก Transistor 2 ตัวมาแก้ปัญหาเรื่อง Shift Register จริงๆ ไม่ต้องมีก็ได้แต่มันช่วยให้วงจรเสถียรขึ้นเยอะ ส่วนที่ยากสุดของงานนี้คือการไล่เช็กวงจร (Debugging) เพราะพื้นที่มันแคบมาก พี่ทำช็อต (Short Circuit) ไปหลายรอบเลยล่ะ ถ้าให้น้องทำ พี่แนะนำว่าเผื่อที่ว่างไว้เยอะๆ จะได้ไม่ลำบากแบบพี่




พอวงจรทำงานได้ พี่ก็เขียน Library ขึ้นมาจัดการเรื่องการเชื่อมต่อกับ Shift Register และการจัดการข้อมูลทั้งหมด กะว่าอีกปีหนึ่งกลับมาดูจะได้คุม Matrix นี้ได้ง่ายๆ ไม่ต้องมานั่งงมใหม่ ใน Library นี้พี่ใส่ไฟล์ที่รวมตัวอักษร ASCII และฟังก์ชันสำหรับแสดงข้อความทั้งแบบนิ่งและแบบเลื่อน (Scrolling Text) ไว้ด้วย จะเอาไปทำป้ายไฟโชว์หญิงก็จัดไป

เป้าหมายหลักคืออยากเล่นเกมงู (Snake) บนจอนี้นี่แหละ พอมี Library คุม LED แล้ว ทุกอย่างก็หวานเจี๊ยบ พี่เขียนเกม Snake ให้มี 2 โหมด คือคุมเองด้วย Joystick หรือจะปล่อยให้มันเล่นเองอัตโนมัติ (Autopilot) ก็ได้ โค้ดชุดนี้พี่จัดเต็มเรื่องการใช้ Class เพราะอยากฝึกวิชาที่เรียนมา ซึ่งพอเข้าใจฟีเจอร์ของ C++ แล้ว มันทำให้ชีวิตง่ายขึ้นเยอะ ส่วนโค้ด Autopilot อาจจะดูมึนๆ หน่อย แต่มันทำงานได้เนียนกริ๊บเลยล่ะ
ขั้นตอนสุดท้ายคือการทำเคส พี่เอาไม้พาเลทเหลือใช้มาทำเป็นกรอบด้านข้าง แล้วใช้พลาสติกขุ่นปิดหน้าจอไว้ จากนั้นก็ยัดแผง Matrix กับ Controller ลงไปข้างใน ทากาวประกอบร่าง เป็นอันเสร็จพิธี!
รายละเอียดทางเทคนิคเพิ่มเติม (ฉบับรุ่นพี่ติวเข้ม)
การออกแบบ Game Engine ด้วย Array
โปรเจกต์นี้เป็นการปลุกชีพเกม "Snake" ในตำนานลงบนจอ LED 192 ดวง (จัดเรียงแบบ 8x24 Matrix)
- Coordinate Mapping Algorithm: ตัวงูจะถูกเก็บเป็น Array ของค่าพิกัด X,Y ในหน่วยความจำของ Arduino พอหัวงูขยับ พิกัดของตัวงูก็จะถูก "Shift" ไล่ลำดับลงไปใน Array แล้วทำการลบพิกัดส่วนหางทิ้ง
- MAX7219 Daisy-Chaining: ใช้การเชื่อมต่อ Module Matrix 8x8 จำนวน 3 ตัวเข้าด้วยกันผ่าน Bus ความเร็วสูงแบบ SPI โดย Arduino จะจัดการส่งข้อมูลให้งูวิ่งข้ามรอยต่อระหว่าง Chip แต่ละตัวได้อย่างเนียนตา
ระบบตรวจจับการชน (Collision Detection)
- Game Physics: ตัว Firmware จะคอยเช็กตลอดเวลาว่าพิกัดของส่วนหัว ($X,Y$) มันไปตรงกับพิกัดของส่วนลำตัวหรือพิกัดของ "อาหาร" หรือเปล่า โดยระบบจะจัดการเรื่องการนับคะแนนและ Logic ตอน Game Over ด้วยความแม่นยำระดับไมโครวินาที สู้งานหน่อยนะน้อง!