Arduino Controlled LED Multi-Player Game on Arduino
title: "โปรเจกต์เกม LED Ping-Pong: การเปลี่ยนผ่านจาก Raspberry Pi สู่ระบบ Arduino Shield"
โปรเจกต์นี้ได้รับแรงบันดาลใจจากวิดีโอชื่อดังจาก Jabrils บน YouTube ซึ่งเขาสร้างเกมสไตล์อาเขตโดยใช้ Raspberry Pi และเขียนโปรแกรมด้วย Python อย่างไรก็ตาม สำหรับโปรเจกต์นี้ ในฐานะวิศวกรระบบสมองกลฝังตัว (embedded systems engineer) ผมได้ปรับปรุงและพัฒนาแนวคิดดังกล่าวใหม่ให้เป็นรูปแบบ Arduino Shield ซึ่งมีความเสถียรและประหยัดพลังงานมากกว่า การควบคุมทั้งหมดถูกนำไปใช้ด้วยภาษา C++
ด้านล่างนี้คือรูปภาพของโปรเจกต์ที่เสร็จสมบูรณ์ ซึ่งแสดงให้เห็นถึง Printed Circuit Board (PCB) ที่ออกแบบมาโดยเฉพาะ





ขั้นตอนการสร้าง (วิศวกรรมฮาร์ดแวร์)
หัวใจสำคัญของโปรเจกต์นี้คือ Custom PCB Shield (สีเขียว) ที่ออกแบบด้วย EasyEDA และผลิตโดย JLCPCB เพื่อให้มั่นใจถึงการเชื่อมต่อที่แม่นยำกับขา (pins) ของ Arduino Uno คุณสามารถดาวน์โหลด Gerber File ได้จากลิงก์ด้านล่างเพื่อนำไปผลิตได้ด้วยตนเอง
การวิเคราะห์ส่วนประกอบอิเล็กทรอนิกส์:
- Resistors: วงจรใช้ Resistors ขนาด 10K Ohm (3 ตัว) เพื่อทำหน้าที่เป็น Pull-down resistors สำหรับปุ่มกด เพื่อป้องกันสัญญาณลอย (floating signals) ส่วน Resistor ขนาด 220 Ohm (1 ตัว) ใช้เพื่อจำกัดกระแสสำหรับ LED ป้องกันกระแสไฟที่มากเกินไปซึ่งอาจทำให้ LED เสียหายได้
- LED Forward Voltage: ข้อสังเกตทางเทคนิคคือ LED สีเขียวอาจดูหรี่กว่า LED สีแดง นี่เป็นเพราะ LED สีเขียวมักจะมี Forward Voltage ที่สูงกว่า เมื่อใช้ค่าความต้านทาน (resistance) เดียวกัน กระแสที่ไหลผ่านก็จะต่ำลงเล็กน้อย
คำแนะนำในการประกอบ:
- ขา (pins) ของ Push Button ควรถอดให้ตรงและขนานกันก่อนเสียบลงใน PCB เพื่อป้องกันความเสียหายต่อลายวงจร (traces)
- บอร์ดนี้ออกแบบมาเป็น "Shield" คุณสามารถเสียบเข้ากับ Arduino ได้โดยตรงหลังจากบัดกรีเสร็จสมบูรณ์
ตรรกะของซอฟต์แวร์ (การวิเคราะห์ตรรกะของโค้ด)
โปรแกรมถูกเขียนขึ้นโดยใช้หลักการของ Finite State Machine (FSM) เพื่อจัดการสถานะต่างๆ ของเกมอย่างเป็นระบบ:
- สถานะเมนูหลัก (รอเริ่มเกม): เมื่อเปิดเครื่องครั้งแรก LED จะกะพริบช้าๆ ไปมาเพื่อแสดงว่าระบบพร้อมใช้งานแล้ว
- การเริ่มต้น (Initialization): หากต้องการเข้าสู่เกม ให้กดปุ่มใดปุ่มหนึ่งค้างไว้ 5 วินาที (ระบุด้วยการกะพริบ 5 ครั้ง) ระบบจะรีเซ็ตตัวแปรคะแนน (score variables) และเข้าสู่โหมดพร้อมเล่น โดยจะกะพริบ LED ทั้งหมด 3 ครั้ง
- ตรรกะการเล่นเกม (Gameplay Logic): ระบบจะส่องสว่าง LED ตามลำดับด้วยความเร็วที่กำหนด
- ผู้เล่นจะต้องกดปุ่มเมื่อแสงไปถึง "จุดทำคะแนน" (Green LED) ที่ฝั่งตรงข้าม
- หากกดพลาด (แสงยังไม่ถึงหรือไม่ผ่านไปแล้ว) LED สีแดงในตำแหน่งนั้นจะสว่างขึ้นเป็นเวลา 500ms เพื่อระบุข้อผิดพลาด
- ระบบป้องกัน "Own Goals" โดยการบล็อกคำสั่งหากมีการกดปุ่มในโซนของผู้เล่นเอง
- การให้คะแนนและการชนะ (Scoring & Winning): เมื่อผู้เล่นทำคะแนนได้ ระบบจะกะพริบไฟตามคะแนนสะสมปัจจุบัน (Score Tracking) เมื่อผู้เล่นคนใดคนหนึ่งทำคะแนนถึง 5 แต้มก่อน พวกเขาจะเข้าสู่ Win State โดยไฟของฝั่งที่ชนะจะกะพริบอย่างต่อเนื่องจนกว่าจะมีการกดปุ่ม Restart
วิธีการเล่นและควบคุม
เกมนี้ออกแบบมาสำหรับการแข่งขันแบบ 2 ผู้เล่น:
- Buttons 1 และ 2: ใช้ควบคุมการหยุดแสงสำหรับแต่ละด้าน
- Button 3 (RESTART): ใช้เพื่อรีเซ็ตเกมกลับไปยังเมนูหลัก
เทคนิคการจ่ายไฟ: คุณสามารถรันโปรแกรมผ่านสาย USB จากคอมพิวเตอร์ หรือเปลี่ยนไปใช้ DC Power Jack (2.1 mm) ได้ ทั้งนี้เนื่องจาก Arduino มี Internal Flash Memory ซึ่งโปรแกรมจะถูกเก็บไว้ถาวร
ข้อควรทราบและการแก้ไขปัญหาที่สำคัญ: ในกรณีที่ปุ่ม Restart บน PCB ไม่ทำงาน (ซึ่งอาจเกิดขึ้นได้เนื่องจากความไม่แม่นยำของ hardware debounce) คุณสามารถกดปุ่ม Reset สีแดงบนบอร์ด Arduino ได้โดยตรงเพื่อคืนค่าเริ่มต้นทันที หากระบบค้าง ให้ลองตรวจสอบแหล่งจ่ายไฟ (power supply) หรือเปลี่ยนพอร์ต USB เพื่อให้แน่ใจว่ากระแสไฟมีความเสถียร
ดาวน์โหลดไฟล์โปรเจกต์
- Source Code: สามารถคัดลอกได้จากส่วนด้านล่าง
- Gerber File: [Link to download for PCB manufacturing]