กลับไปหน้ารวมไฟล์
diy-addictive-arduino-1d-pong-game-ad2aac.md

Pong คือเกมตู้เกมอาร์เคด 2 มิติธีมปิงปอง ที่ผลิตโดย Atari และเปิดตัวครั้งแรกในปี 1972

คราวนี้พี่จะพาน้องไปดูวิธีทำเกม Pong แบบ 1D บน LED กัน ซึ่งเป็นโปรเจคเจ๋งๆ ที่จำลองเกม Pong บนแถว LED แบบมิติเดียว (1D) นะฮะ ทำได้ง่ายๆ ด้วยบอร์ดไมโครคอนโทรลเลอร์ Arduino การเคลื่อนที่ของลูกบอลจะถูกจำลองด้วยแถว LED ส่วนไม้ตี (paddle) ก็คือปุ่มกดสองปุ่มนั่นเอง เกมนี้เล่น 2 คน โดย "ลูกบอล" จะวิ่งไปมาตลอดความยาวของแถว LED และจะเด้งกลับมาถ้าผู้เล่นกดปุ่มในตอนที่ LED สีเหลืองติดอยู่

ผลลัพธ์จะแสดงบนหน้าจอ LCD การเคลื่อนที่ของลูกบอล การได้คะแนน รวมถึงตอนชนะ จะมีเสียงประกอบที่เหมาะสมด้วย

อุปกรณ์ทำง่ายมาก ประกอบด้วยชิ้นส่วนหลักๆ ดังนี้:

  • บอร์ดไมโครคอนโทรลเลอร์ Arduino Nano
  • จอแสดงผล LCD 16x2
  • LED 10 ดวง
  • ตัวต้านทาน (Resistor) 12 ตัว
  • ปุ่มกด 2 ปุ่ม
  • และบัซเซอร์ (Buzzer)

เกมเริ่มโดยให้ลูกบอลเคลื่อนจากผู้เล่น 1 ไปหาผู้เล่น 2 ถ้าผู้เล่น 2 กดปุ่มไม่ทันตอนที่ LED สีเหลืองติดอยู่ LED สีแดงจะติด และนั่นคือคะแนนของผู้เล่น 1 เกมแต่ละเกมจะเริ่มโดยผู้ชนะจากเกมก่อนหน้า ความเร็วของลูกบอลจะเพิ่มขึ้นทุกครั้งที่ถูกตีกลับ ทำให้การตีลูกให้ทันเวลายากขึ้นเรื่อยๆ แมตช์จะจบเมื่อมีผู้เล่นคนใดคนหนึ่งชนะครบ 10 เกม และในตอนนั้น LED ฝั่งผู้ชนะจะกระพริบ

รายละเอียดเทคนิคแบบจัดเต็ม

Pong แบบมาตรฐานเป็น 2D และต้องใช้หน้าจอ แต่ เกม Pong แบบ 1D นี่ตัดแกน Y ออกไปเลย! มันคือวิดีโอเกมในรูปแบบพื้นฐานสุดๆ ที่น่าจินตนาการได้: ผู้เล่นสองคนนั่งหันหน้าเข้าหากัน คอยกดปุ่ม Arcade Button อย่างรวดเร็วให้ทันกับ "พิกเซล" แสงจาก NeoPixel ที่วิ่งเด้งกลับไปมาอย่างรุนแรงบนแถบ LED ยาว 1 เมตร

การจัดการอาร์เรย์ 1D (FastLED)

"ลูกบอล" ก็แค่ตัวเลขจำนวนเต็มที่เพิ่มหรือลดค่าในอาร์เรย์

  1. แถบ WS2812B มี LED 60 ดวง int ballPos = 30;
  2. กฎฟิสิกส์ (Physics): ballPos += ballDirection; (โดยที่ direction คือ +1 หรือ -1)
  3. ถ้าลูกบอลเคลื่อนที่ไปทางซ้าย (ผู้เล่น 1) มันจะวิ่งเข้าหา ballPos = 0
  4. ฟังก์ชัน loop() ใน C++ จะอัปเดตอาร์เรย์อย่างรวดเร็วด้วย FastLED.show()
  5. การคำนวณ Hit-Box: ผู้เล่น 1 ต้องกดปุ่ม Arcade Button เฉพาะ เมื่อ ballPos อยู่ระหว่าง 0 ถึง 3 (โซนที่ต้องตี)
if (digitalRead(P1_Btn) == LOW && ballPos <= 3) {
   ballDirection = 1; // เด้งกลับอย่างรุนแรง! ส่งลูกกลับไปหาผู้เล่น 2!
   gameDelay -= 5;    // เพิ่มความเร็วลูกบอลแบบน่ากลัว!
} else if (digitalRead(P1_Btn) == LOW && ballPos > 3) {
   // ผู้เล่น 1 กดปุ่มเร็วเกินไปและตีพลาด! Game Over!
}

การใส่สี RGB เป็นตัวบอกสถานะ

เพราะว่ากราฟิกของเราเป็นแบบเส้นเดียว สีเลยต้องมาทำหน้าที่แทนรูปทรง

  • ลูกบอล (Ball) จะถูกวาดเป็นสี CRGB::White หรือ CRGB::Blue
  • โซนตีกลับ (Hit Zones) (LEDs 0-3 และ LEDs 56-59) จะถูกตั้งสีตายตัวเป็น CRGB::Red
  • ตอนที่ผู้เล่นตีลูกเอซแบบทำลายล้าง เส้น LED ทั้ง 60 ดวงจะระเบิดตาพร่าด้วยเอฟเฟกต์ Rainbow_Stripe_Animation() พร้อมกับเสียงแฟนฟาเร่อร์ดังสนั่นจาก Piezo Buzzer! จัดไปวัยรุ่น!

อุปกรณ์ที่ต้องมีสำหรับตารางปิงปอง

  • Arduino Uno/Nano (ความเร็วมาตรฐานพอดี)
  • สาย LED WS2812B NeoPixel (แนะนำ 60 ถึง 144 ดวงต่อเมตร จะได้ยาวพอม้วนรอบโต๊ะ!)
  • ปุ่มอาร์เคดขนาดใหญ่ 60mm แบบสปริง 2 ปุ่ม (ต้องกดแล้วสะใจ)
  • Adaptor 5V 3A (สำคัญมาก! ถ้าใช้ NeoPixel 144 ดวงเปิดสีขาวพร้อมกันจะกินกระแสถึง 5A ถ้าเอาไฟจาก USB คอมอาจจะพังได้นะตัวนี้ ห้ามช็อต!)

การตั้งค่าเกม

  • ความเร็วเริ่มต้นของการเคลื่อนที่ของ LED ตั้งค่าในบรรทัดนี้: const unsigned long initialMillisecondsPerLED = 400; ยิ่งตัวเลขน้อย ความเร็วก็ยิ่งมาก (เร็วแบบรถไฟลอยนะน้อง)
  • ระดับความเร่งหลังจากตีลูกแต่ละครั้ง ตั้งค่าในบรรทัดเหล่านี้: if (deltaMillisecondsPerLED > 50) { deltaMillisecondsPerLED -= 50; ยิ่งตัวเลขนี้มาก ความเร่งก็ยิ่งสูง (เร่งแบบติดเทอร์โบเลย)

เกมนี้เล่นได้ทั้งคนเดียวและสองคน แน่นอนว่าถ้าเล่นสองคนจะมันส์กว่า แนะนำให้ใช้ปุ่มอาร์เคดใหญ่ๆ แข็งแรงๆ ต่อข้างนอก

อย่างของพี่ใช้ปุ่มที่ทำไว้จากโปรเจคเก่า มันใหญ่ กดแล้วมีเสียงคลิกชัดเจน แม่นยำดี

สุดท้ายนี้ ขอสรุปสั้นๆ ว่าโปรเจคนี้เป็นเวอร์ชันหนึ่งมิติที่กะทัดรัดและน่าสนใจมากของเกมคลาสสิค "Pong" ใช้อุปกรณ์น้อยชิ้นแต่เล่นแล้วติดหนึบ เล่นได้เป็นชั่วโมงไม่เบื่อเลยทีเดียว ตัวเครื่องพี่ใส่ไว้ในกล่อง PVC ที่หุ้มด้วยวอลเปเปอร์ติดเอง สำหรับไฟเลี้ยง แนะนำให้ใช้แบตเตอรี่ลิเธียมเพื่อความคล่องตัว จะได้ยกไปท้าปิงปองที่ไหนก็ได้ สู้งานนะน้อง!

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

apps:
  - "1x Arduino IDE"
author: "mircemk"
category: "Gaming & Entertainment"
components:
  - "1x Arduino Nano"
  - "2x Resistor 10k"
  - "1x I2C LCD"
  - "1x Piezo Buzzer"
  - "2x Push Button"
  - "10x LED (generic)"
  - "10x Resistor 470 ohm"
  - "1x Soldering kit"
description: "Minimalist reflex engine! Program an extraordinarily fast, single-pixel physics array using pure C++ loops to simulate a high-speed ball bouncing violently back and forth on a singular line of WS2812B LEDs."
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles: []
encryptedPayload: "U2FsdGVkX1+txMjFuUZpyXykh5yMOgfjxcB+FAxFyc4jdCvWaFZbQuKqkV07a2AK/rhQ5sg1K8xe9kQoma//M/E5JE62DpzF2eZma6PLfAI="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/diy-addictive-arduino-1d-pong-game-ad2aac_cover.jpg"
lang: "en"
likes: 0
passwordHash: "d5c5b02d553acb6f3cdbb5773452f012f7d5f02e271c4e3ec878393ca9731235"
price: 1120
seoDescription: "Build a DIY 1D Pong game with Arduino using minimal components. A compact, addictive one-dimensional version of the classic Pong."
tags:
  - "Games"
  - "Audio"
  - "Kids"
  - "Lights"
title: "เกม Pong 1D แบบ DIY งานง่ายแต่หล่อ ติดงอมแงม!"
tools: []
videoLinks:
  - "https://youtu.be/gxkT4czV3vo"
views: 3366