กลับไปหน้ารวมไฟล์
tic-tac-toe-and-lights-out-game-391b3a.md

Introduction

พี่อยากทำโปรเจคที่ใช้ไฟ LED เยอะกว่าจำนวนขาที่ Arduino มีอยู่ ซึ่งมันต้องใช้ shift register มาควบคุมไฟพวกนี้ และเกมก็เป็นวิธีที่เหมาะมากในการเรียนรู้การต่อสายและเขียนโค้ดให้ระบบแบบนี้ทำงาน พี่เลือกเกม XO เพราะมันเล่นง่ายและสามารถแสดงผลด้วยไฟ LED และควบคุมด้วยปุ่มกดได้ ส่วนเกม Lights Out ก็ถูกเพิ่มเข้ามาด้วย เพราะใช้กระดานเกมแบบเดียวกันกับ XO แค่ต้องเขียนโค้ดเพิ่มเพื่อให้ผู้เล่นเลือกเล่นเกมไหนก็ได้

วิดีโอการเล่นเกม

Project Overview

"Dual-Logic Hub" นี่แหละคือตัวอย่างสุดเจ๋งของ Hardware Optimization ในระบบ embedded นะตัว พิน GPIO (General Purpose Input/Output) มันมีจำกัด โปรเจคนี้เลยโชว์เทคนิควิศวะสำคัญ 2 อย่างเพื่อก้าวข้ามขีดจำกัดนี้ไปให้ได้: Serialized Output Expansion ผ่าน shift register และ Analog Multiplexing สำหรับรับอินพุตจากปุ่มกด ผลลัพธ์คือคอนโซลที่ใช้งานได้จริง มีสถานะไฟ LED 18 ดวงและปุ่มกด 9 ปุ่ม แต่ควบคุมด้วย Arduino แค่ 4 ขาเอง งานนี้จัดไปวัยรุ่น!

Wiring

ในโปรเจคนี้จะมีวงจรหลักๆ อยู่ 2 ส่วนนะน้อง คือวงจรปุ่มกดกับวงจรไฟ LED

Technical Deep-Dive

  • The 74HC595 Serialization Forensics:
    • Bit-Shifting Logic: เพื่อควบคุมไฟ LED สองสี 9 ดวง (แอโนดแยกกัน 18 จุด) ระบบนี้ใช้ shift register 74HC595 3 ตัวต่อแบบ cascade กัน Arduino จะส่งแพ็กเก็ตข้อมูล 8 บิตผ่านฟังก์ชัน shiftOut() ทุกครั้งที่ขา "Clock" พัลส์ บิตข้อมูลก็จะถูกผลักเข้าไปใน register ตามลำดับ พอเฟรม 24 บิต (3 register) เต็มแล้ว ขา "Latch" จะถูก toggle เพื่ออัพเดตสถานะไฟ LED ทั้งหมดบนบอร์ดในทันที
    • SPI-Like Communication: การตั้งค่านี้เลียนแบบการสื่อสารแบบ Serial Peripheral Interface (SPI) ช่วยให้อัพเดตภาพได้เร็ว (เช่น ไฟกระพริบเส้นที่ชนะ, อนิเมชั่นเฉลิมฉลอง) โดยใช้ทรัพยากร CPU น้อยมาก
  • Analog Keypad Ladder (The 1-Pin Matrix):
    • Voltage Divider Chain: แทนที่จะใช้ขาดิจิตอล 9 ขา โปรเจคนี้ต่อปุ่มกดทั้ง 9 ปุ่มเข้ากับขาแอนะล็อกขาเดียว (A0) ผ่านตัวต้านทาน (Resistor) ที่คัดค่ามาอย่างดี การกดปุ่มแต่ละปุ่มจะสร้างวงจรแบ่งแรงดัน (voltage divider) ที่ให้ค่าแรงดันออกมาไม่เหมือนกัน
    • ADC Quantization: Analog-to-Digital Converter (ADC) 10-bit ของ Arduino จะแปลงแรงดันที่ได้เป็นค่าตัวเลขระหว่าง 0 ถึง 1023 เฟิร์มแวร์จะคำนวณหา "Mid-points" ระหว่างค่าแรงดันเหล่านี้เพื่อระบุว่าปุ่มไหนถูกกด แม้จะมีสัญญาณรบกวนทางไฟฟ้าเล็กน้อยก็ตาม ห้ามช็อตนะตัวนี้

เมื่อปุ่มถูกกด แรงดันของสายสัญญาณจะเปลี่ยนไป ขึ้นอยู่กับจำนวนตัวต้านทานที่กระแสไฟฟ้าไหลผ่าน โปรแกรมจะตรวจจับแรงดันนี้และระบุหมายเลขปุ่มได้ วงจรนี้ใช้ขาแอนะล็อกของ Arduino แค่ขาเดียวเท่านั้น ปุ่มซ้ายสุดในแผนภาพด้านล่างคือปุ่มหมายเลข 0 และจะให้แรงดันสูงสุด ส่วนปุ่มขวาสุดคือปุ่มหมายเลข 8 และจะให้แรงดันต่ำสุด ต่อสายสัญญาณ output เข้ากับขา A0 บน Arduino ในการตั้งค่าระบบนี้ คุณต้องป้อนค่าแรงดันบางอย่างลงในโปรแกรม เดี๋ยวพี่จะบอกวิธีทำทีหลัง

แผนภาพการต่อสายปุ่มกด

หมายเลขปุ่มกด

วงจรที่สองคือวงจรไฟ LED ใช้ shift register 3 ตัวควบคุมสถานะของไฟ LED สองสี 9 ดวง จะมองว่าเป็นไฟ LED แยกกัน 18 ดวงก็ได้นะ วงจรนี้ใช้ขา Arduino แค่ 3 ขา จากด้านบนของแผนภาพด้านล่าง ไฟ LED จะเรียงเป็น Red0, Red1, Red2 … Red7, Red8, Green0, Green1 … Green7, Green8 สู้งานนะน้อง

แผนภาพการต่อสาย LED

เกมเสร็จแล้ว งานสายกวนตีนสุดๆ

วิศวกรรมและการลงมือทำ

  • การเข้ารหัสภาพ (Visual Encoding):
    • LED สองสีพวกนี้ให้ประสบการณ์ผู้ใช้ (HMI) ที่เข้าใจง่ายมาก สีแดงคือผู้เล่น 1/คอมพิวเตอร์ ส่วนสีเขียวคือผู้เล่น 2/ผู้ใช้ หรือตัวเลือกใน "เมนู" ด้วยการควบคุมพินเหล่านี้ผ่าน shift register ด้วย PWM ระบบสามารถสร้างสถานะสี "อำพัน" แบบผสมได้ เพื่อให้ feedback ที่ซับซ้อนขึ้น
  • ความแข็งแรงทางกลและโครงสร้าง (Mechanical Integrity & Packaging):
    • โปรเจคนี้ใช้โครงตัวถังแบบแผ่นคู่ที่ตัดด้วยเลเซอร์ แผ่น "Mounting Plate" ใช้ยึดปุ่มกดและส่วนประกอบสัมผัสต่างๆ ส่วนแผ่นรองด้านล่างทำหน้าที่เป็นฐาน ใช้สแตนด์ออฟสูง 25mm เพื่อสร้างช่องว่างแนวตั้งให้พอสำหรับงานสาย jumper ที่วุ่นวายด้านล่าง
  • ขั้นตอนการปรับเทียบ (Calibration Routine):
    • เพราะค่าความคลาดเคลื่อนของตัวต้านทาน (Resistor) และความยาวสายสามารถทำให้ค่าอนาล็อกอ่านได้เปลี่ยนไป โปรเจคนี้จึงมีสเก็ตช์พิเศษชื่อ "Voltage Calibration" ไว้ให้ มันช่วยให้ผู้ใช้สามารถปรับโปรไฟล์ฮาร์ดแวร์เฉพาะของตัวเองและอัปเดตอาร์เรย์ voltages[] เพื่อความแม่นยำ 100% ในการรับอินพุต

วิธีประกอบ

ตัดแผ่นทั้ง 2 แผ่นออกมา (มีไฟล์ dxf ให้) แล้วติดตั้งปุ่มกดและ LED เข้ากับ Mounting Plate ต่อสายตามแผนภาพ รู้แหละว่ามันยุ่งยากกว่าที่ประโยคง่ายๆ บอกไว้เยอะ! ถ้าเริ่มจากต่อปุ่มกดก่อน ก็จะสามารถทดสอบส่วนนั้นได้ก่อนที่จะลงมือต่อสาย LED พี่เคยดึงสายทั้งหมดออกมาแล้วเสียบเข้ากับเบรดบอร์ดอันที่สอง มันช่วยให้มีพื้นที่มากขึ้นนิดนึงเพื่อจะได้ต่อสายพวกนั้นเข้ากับ shift register โดยใช้ jumper อีกชุดนึง

เพื่อตั้งค่าแรงดัน (voltages) ให้ต่อปุ่มกดตามคำแนะนำในนี้แล้วอัปโหลดโปรแกรม buttons ลง Arduino พอเปิด Serial Monitor ขึ้นมาแล้ว ถ้าน้องกดปุ่ม แรงดันที่แสดงออกมาคือค่าที่ต้องเอาไปใส่ในอาร์เรย์ voltages ในโปรแกรมหลัก อาร์เรย์นี้จะถูกประมวลผล และค่ากลางระหว่างแรงดันเหล่านี้จะถูกใช้ในโค้ดส่วนต่อมาเพื่อกำหนดว่าปุ่มไหนถูกกด

พอต่อสายทั้งหมดเสร็จและทดสอบแล้ว ให้ยึดแผ่นทั้งสองเข้าด้วยกันโดยใช้สแตนด์ออฟ เอาเท้ายางมาติดด้านล่างด้วยจะได้ไม่ลื่นเวลาเล่น แล้วก็เสียบแหล่งจ่ายไฟที่เหมาะสมเข้าไป

วิธีเล่นเกม

รูปแบบไฟแรกที่เห็นคือเมนู มันจะมีแถวไฟสีเขียวคั่นกลางระหว่างสองแถวสีแดง กดไฟสีแดงเพื่อเล่น XO (Tic Tac Toe) หรือกดไฟสีเขียวเพื่อเล่นดับไฟ (Lights Out)

อัลกอริทึมสถานะเกม:

  • AI XO (Tic-Tac-Toe AI): โค้ดจะรักษาอาร์เรย์ 9 องค์ประกอบที่แสดงสถานะกระดาน หลังจากผู้ใช้เล่นแต่ละตา MCU จะรัน routine ตรวจสอบการเดินที่ถูกต้อง แล้วส่งการเดินตอบโต้กลับมา พร้อมตรวจสอบ "Triplets" ที่ทำให้ชนะโดยใช้วิธี bit-masking หรือ logic เชิงเงื่อนไข
  • ดับไฟ (Lights-Out - Cellular Automata): โหมดนี้ใช้ลอจิกการสลับสถานะแบบ "XOR" การกดปุ่มหนึ่งจะกลับสถานะของตัวเองและสถานะของปุ่มข้างเคียง (เหนือ, ใต้, ตะวันออก, ตะวันตก) เกมจะชนะเมื่อผลรวมของสถานะในอาร์เรย์ LED เท่ากับศูนย์

ถ้าเลือกเล่น XO น้องจะได้เริ่มก่อนและเล่นเป็นสีแดงเสมอ กดปุ่มเพื่อวางในตำแหน่งนั้น คอมพิวเตอร์จะเดินตอบทันทีหลังน้องเดิน ถ้ามีใครชนะ แถวที่ชนะจะกระพริบ แล้วเกมจะพากลับไปที่เมนู

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

สรุป

เป็นโปรเจคที่สนุกและสอนพี่ทุกอย่างเกี่ยวกับ shift register และการควบคุมสิ่งต่างๆ ได้มากกว่าที่คิดจาก Arduino เพียงพินเดียว ใช้แค่ 4 พินสำหรับอินพุตและเอาต์พุตทั้งหมดในเกมเหล่านี้

Dual-Logic Hub เป็นโปรเจคสำคัญสำหรับนักสร้างระดับกลางที่อยากก้าวข้ามจากการออกแบบแบบ "หนึ่งพินต่อหนึ่งชิ้นส่วน" ไปสู่ **สถาปัตยกรรมแบบอนุกรม (Serialized Architectures)** ที่ซับซ้อนขึ้น มันพิสูจน์ให้เห็นว่าด้วยการออกแบบวงจรที่ฉลาดๆ Arduino Uno ตัวเดียวก็สามารถขับระบบความบันเทิงหลายเกมพร้อมประสบการณ์ผู้ใช้ (HMI) ที่ดูโปรและสมบูรณ์แบบได้

Logic in Series: ขยายขอบเขตความเป็นไปได้ด้วยการวิเคราะห์แบบต่อเนื่อง

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

apps:
  - "1x Arduino IDE"
author: "markbennettuk"
category: "Gadgets, Games & Toys"
components:
  - "8x Screw to suit standoffs"
  - "9x Pushbutton Switch, Momentary"
  - "1x Laser cutter (generic)"
  - "1x Arduino UNO"
  - "4x Standoff 25mm"
  - "18x Resistor 220 ohm"
  - "1x Breadboard (generic)"
  - "8x Rubber feet"
  - "9x Dual colour LED"
  - "3x Shift Register- Serial to Parallel"
  - "1x Solder Wire, Lead Free"
  - "30x Jumper wires (generic)"
  - "1x Soldering iron (generic)"
  - "9x Resistor 100 ohm"
description: "โปรเจคสุดเจ๋ง! เอา Arduino มาทำเป็นบอร์ดเกม 2 in 1 ทั้ง Tic Tac Toe แบบกดได้จริง และ Lights Out เกมดับไฟที่เล่นจนวางไม่ลง"
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles:
  - "https://projects.arduinocontent.cc/e31c4ae2-0dc3-4ac3-b7da-1e9029f32bd8.ino"
  - "https://projects.arduinocontent.cc/ff9de58e-48f3-4d67-97fe-1b223da82678.ino"
  - "https://projects.arduinocontent.cc/e31c4ae2-0dc3-4ac3-b7da-1e9029f32bd8.ino"
  - "https://projects.arduinocontent.cc/ff9de58e-48f3-4d67-97fe-1b223da82678.ino"
encryptedPayload: "U2FsdGVkX18o1RSmQQEZddHNsvKYT3jJKKSebnxzL25GI/OiKBqeE02pTaueG5QqdEOh4/LUVvQH91nYiwRvARE/F/BN4gzd46RHi3KH4uQ="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/tic-tac-toe-and-lights-out-game-391b3a_cover.jpg"
lang: "en"
likes: 3
passwordHash: "93ddfff3eb0c0083bf20ac8af330566919b77bca237a60eb8835d2f3a5997514"
price: 699
seoDescription: "Build an Arduino powered Tic Tac Toe and Lights Out game board. Perfect DIY electronic project for gamers and makers."
tags:
  - "toys"
  - "entertainment system"
  - "games"
title: "เกม XO กับดับไฟสุดตึง! งานง่ายแต่หล่อ"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/2ULsPdHbdHM"
views: 13876