GLOBALBYTE / ARDUINO UNO / VFD / RETRO GAMING
Space Invaders บนจอ VFD เก่า: Arduino Uno คุมเกมอย่างไร
จอเรืองแสงจากอุปกรณ์เก่าที่ปกติเอาไว้แสดงตัวเลขหรือข้อความ จะนำมาเล่นเกมยิงเอเลี่ยนได้จริงไหม? José Luis Monteiro และคุณพ่อทดลองนำ Vacuum Fluorescent Display (VFD) ที่ถอดจากอุปกรณ์เดิมมาควบคุมด้วย Arduino Uno จนเล่นเกมแนว Space Invaders ได้ โดยมีทั้งโค้ดเกมและตัวอย่างการขับจอให้ศึกษา
CONCEPT ILLUSTRATION · NOT ACTUAL GAMEPLAY
VFD CHARACTER CELLS · 2 ROWS × 20 COLUMNS
- โครงการใช้ Arduino Uno ควบคุม VFD แบบ 2 แถว × 20 Character Cells แต่ละ Cell มี Dot Matrix 5 × 7
- ไดรเวอร์ HV5812/UCN5812 จำนวน 4 ตัวทำงานเป็น Grid Chain และ Dot Chain อย่างละ 2 ตัว
- เกมใช้ Logical Canvas ขนาด 100 × 14 พร้อม Joystick, ปุ่มยิง และ Active Buzzer
- มีโค้ด RawGrid, TextDisplay, JoystickReadout และ VfdInvaders ที่ตรวจสอบได้ใน GitHub
- VFD ต้องใช้วงจรไฟเลี้ยงแยก ไม่สามารถนำไฟแรงดันสูงจาก Driver ไปต่อเข้าขา Arduino ได้
ทำไมถึงเอาจอ VFD เก่ามาเล่น Space Invaders?
หลายคนคุ้นกับแสงสีฟ้าอมเขียวของ VFD จากเครื่องเล่นเสียง นาฬิกา และอุปกรณ์อิเล็กทรอนิกส์รุ่นเก่า จอชนิดนี้มีเอกลักษณ์ที่เรืองแสงในตัวเอง แม้จะไม่ได้มีความละเอียดมากแบบจอสมัยใหม่ก็ตาม
Hackaday รายงานการทดลองของ José Luis Monteiro และคุณพ่อที่นำจอ VFD เก่ามาใช้ใหม่ แทนที่จะสั่งให้แสดงข้อความธรรมดา ทั้งคู่พัฒนาเกมแนว Space Invaders ที่ต้องมีตัวละคร ศัตรู การยิง และการอัปเดตภาพอย่างต่อเนื่อง จึงเป็นการทดสอบการขับจอที่ท้าทายกว่าการแสดงตัวอักษรคงที่
ที่สำคัญนี่เป็นเกมแนว Space Invaders ซึ่งพัฒนาขึ้นสำหรับจอ VFD เครื่องนี้ ไม่ใช่การยืนยันว่าได้ Emulate ฮาร์ดแวร์เกม Arcade ต้นฉบับของปี 1978
VFD คืออะไร และต่างจาก OLED หรือ LCD อย่างไร?
VFD (Vacuum Fluorescent Display) เป็นจอที่ใช้หลอดแก้วสุญญากาศและสารเรืองแสง Phosphor เมื่ออิเล็กตรอนถูกควบคุมให้ไปชนบริเวณ Anode ที่เคลือบสารเรืองแสงก็เกิดแสงที่มองเห็นได้ ต่างจาก LCD ที่อาศัยการปรับการผ่านของแสง และต่างจาก OLED ที่ใช้สาร Organic Emissive Layer
จอในโครงการนี้แบ่งพื้นที่แสดงผลเป็น 2 แถว × 20 ตัวอักษร แต่ละตำแหน่งประกอบด้วยจุด 5 × 7 จึงเหมาะกับการวาดอักขระและ Sprite ขนาดเล็ก มากกว่าภาพกราฟิกละเอียดสูงแบบจอ TFT
Hardware ที่ใช้สร้างเกมบน VFD
| อุปกรณ์ | บทบาทในโปรเจกต์ |
|---|---|
| Arduino Uno | ควบคุม Display Scanning, Game Logic และ Input |
| VFD 2 × 20 Characters | จอเรืองแสงแบบ Character Dot Matrix 5 × 7 |
| HV5812 / UCN5812 × 4 | High-voltage Serial Drivers แยก Grid Chain และ Dot Chain |
| Joystick แบบ Analog | ควบคุมทิศทางซ้ายและขวา |
| Fire Button | สั่งยิงและเริ่มเกม |
| Active Buzzer + Transistor Driver | แสดง Sound Effect ตามการออกแบบ |
| แหล่งจ่าย VFD และ Filament | จ่ายไฟตามพิกัดของจอและไดรเวอร์ แยกจาก Logic ของ Arduino |
GitHub ไม่ได้ระบุเลขรุ่นผู้ผลิตและ Part Number ของตัวแก้ว VFD แบบที่นำไปซื้อมาใช้แทนกันได้โดยตรง ดังนั้นไม่ควรเลือกจอ 2 × 20 ใด ๆ แล้วสรุปว่าต่อกับวงจรเดียวกันได้ทันที
HV5812 / UCN5812 คือหัวใจของการขับจอ
ไดรเวอร์ HV5812 แต่ละตัวมี 20-bit Shift Register พร้อม Output Latch และขาเอาต์พุตแรงดันสูง 20 ช่อง เมื่อต่อไดรเวอร์สองตัวเป็น Daisy Chain จะส่งข้อมูลได้ 40 บิตต่อสาย ทั้งโครงการใช้สองสายแยกกัน ได้แก่สายเลือก Grid และสาย Dot Data
ตัวอย่างลำดับการทำงานจาก README: ส่ง Grid Word 40 บิตและ Dot Word 40 บิต แล้ว Pulse สัญญาณ STROBE เพื่ออัปเดต Output จากนั้นหน่วงการแสดงของ Cell ชั่วครู่ ก่อนเคลียร์การเลือก Grid และเลื่อนไปตำแหน่งถัดไป
Arduino Uno ใช้ขาอะไรส่งสัญญาณ?
ตารางนี้ยกจาก README ของบอร์ดต้นแบบ เป็นขา Logic ของ Arduino ไม่ใช่ IC Pin Numbers ต้องตรวจวงจร Driver และ Pinout ของ Panel จริงก่อนนำไปต่อ
| Arduino Uno | Signal | คำอธิบาย |
|---|---|---|
| D4 | Dot DATA IN | ข้อมูลของ Dot Chain |
| D5 | Dot CLOCK | Clock สำหรับ Dot Chain |
| D7 | Grid DATA IN | ข้อมูลของ Grid Chain |
| D8 | Grid CLOCK | Clock สำหรับ Grid Chain |
| D9 | Shared STROBE | อัปเดตข้อมูลจาก Shift Register ไป Output Latch |
| D10 | Shared BLANK | ควบคุมการอนุญาตให้ Output ทำงาน |
| GND | Logic / Driver Ground | อ้างอิง Ground ตามวงจรของโครงการ |
เอกสาร HV5812 ระบุ Logic VDD 4.5–5.5V และ VPP ของไดรเวอร์ 20–80V แต่ตัวเลขนี้ ไม่ใช่แรงดันจ่ายสำหรับ VFD ทุกรุ่น วงจรต้นแบบใช้แหล่งจ่าย VFD และ Filament แยกต่างหาก ห้ามนำ VPP ต่อเข้า Arduino GPIO หรือใช้แรงดันกับหลอดที่ยังไม่ทราบพิกัดจริง
Multiplexing ทำให้ 40 Character Cells แสดงภาพได้อย่างไร?
ถ้าต้องขับแต่ละจุดแยกตลอดเวลา จะใช้ขาและวงจรจำนวนมาก แต่ระบบนี้ใช้การสแกนทีละ Cell อย่างรวดเร็ว เรียกว่า Multiplexing โดยสลับ Grid ที่เปิดพร้อมส่ง Dot Pattern ของตำแหน่งนั้น ๆ ให้เกิดภาพรวมจากการมองเห็นอย่างต่อเนื่อง
README ระบุ Hold Time ค่าเริ่มต้น 150 µs ต่อ Grid และเรียก refresh() บ่อย ๆ เพื่อสแกนต่อเนื่อง หากโค้ดมีการหน่วงแบบ Blocking นานเกินไป อาจเห็นอาการกวาดภาพหรือกระพริบ ทั้งนี้ Source ไม่ได้ระบุค่า FPS ที่รับรองได้สำหรับเกมบน Panel นี้
พื้นที่เกมแบ่งตามโครงสร้างจริง 20 × 2 Cells โดยแต่ละ Cell มี 5 × 7 Dots รวมเป็น Logical Canvas ขนาด 100 × 14 แต่ระหว่าง Character Cells มีช่องว่างทางกายภาพอยู่ Sprite จึงต้องถูกออกแบบให้ดูดีภายใต้ข้อจำกัดนี้
Space Invaders บน VFD มีอะไรที่น่าสนใจ?
โค้ดเกมอยู่ใน VfdInvaders.ino และแยกไฟล์สำหรับสถานะเกมกับ Sprite โดยใช้ข้อมูลขนาดเล็กในการเก็บรูปแบบ Pixel แทนการโหลดภาพ Bitmap ขนาดใหญ่
จากคู่มือเกม ผู้สร้างกำหนดรูปแบบตัวละคร Compact Sprite เพื่อประหยัดความสูงบนจอซึ่งมีเพียง 14 Dot Rows และมีตัวเลือกขนาดใหญ่สำหรับผู้ที่ต้องการทดลองความต่างด้านการแสดงผล
ระบบยังมีคะแนน จำนวนชีวิต Wave ใหม่ การเปลี่ยนทิศทางศัตรู และ Boss Encounter โดยคู่มือระบุว่า Boss ปรากฏหลังผ่านทุกสาม Formation ที่เคลียร์สำเร็จ จุดเหล่านี้เป็นฟีเจอร์ของ Firmware ที่ตรวจพบ ไม่ใช่การรับประกัน Frame Rate ของเครื่อง
ควบคุมเกมด้วย Joystick ปุ่มยิง และ Serial Monitor
| Input | Arduino Pin / Command | หน้าที่ |
|---|---|---|
| Joystick แนวนอน | A0 | เลื่อนตัวละครซ้าย/ขวา |
| Fire Button | D12, INPUT_PULLUP | เริ่มเกมและยิง |
| Active Buzzer | D11 ผ่าน Transistor Driver | Sound Effect |
| Serial Monitor | 115200 baud | ปรับค่าและส่งคำสั่งทดสอบ |
ผู้สร้างระบุให้ปล่อย Joystick อยู่ตำแหน่งกลางขณะเริ่มระบบประมาณหนึ่งวินาที เพื่อให้การ Calibrate ศูนย์ทำงานอย่างถูกต้อง จากนั้นกด Fire เพื่อเริ่มเล่น หรือส่งคำสั่งผ่าน Serial Monitor ได้
คำสั่งที่ยืนยันจากเอกสาร เช่น menu เปิดเมนู, reversex กลับทิศการบังคับ, center Calibrate ใหม่, p Pause, demo เล่นอัตโนมัติ และ boss test ทดสอบ Boss Encounter
เริ่มศึกษาโครงการจากไหน? ลำดับทดสอบที่ผู้สร้างเตรียมไว้
Repository แยก Sketch สำหรับการทดสอบทีละระบบ ทำให้ศึกษา Display Interface ก่อนเพิ่ม Logic ของเกมได้ โดยควรเริ่มจากการอ่านวงจรและตรวจไฟเลี้ยงของจอจริงกับผู้มีประสบการณ์
- RawGrid: ทดสอบสแกนตำแหน่งเดียวและแสดงตัวอักษรพื้นฐาน
- TextDisplay: แสดงข้อความสองแถวและรับคำสั่งจาก Serial Monitor
- JoystickReadout: ตรวจ Analog Input และปุ่มยิงแยกจากวงจรจอ
- VfdInvaders: เพิ่มเกม, Sprite, Input, Sound และเมนู
.ino ของแต่ละตัวอย่างใน Arduino IDE เลือก Arduino Uno และอัปโหลดตามแนวทางของผู้พัฒนา โดยต้องตรวจเรื่อง Header และโครงสร้างไฟล์ให้ตรงกับ Source ที่ดาวน์โหลดCode Snippet ที่ตรวจจาก GitHub จริง
ตัวอย่างด้านล่างเป็นเพียงส่วนหนึ่งของ Source Code ของผู้พัฒนา ไม่ใช่ Wiring Tutorial สำหรับแรงดันสูง และไม่ใช่โปรแกรมเดี่ยวที่ Compile ได้โดยไม่มีไฟล์อื่นใน Repository
constexpr uint8_t XPin = A0, FirePin = 12, BuzzerPin = 11;
// Increasing X voltage moves left; reversex changes this direction.
bool reverseX = false;
display.begin();
display.enable(true);
display.write(0, 0, "HELLO VFD");
row1 HELLO VFD
row2 Arduino text
hold 150
scan active
clear
?
ภาพเกมจริงและวิดีโอสาธิตอยู่ที่ไหน?
บทความ Hackaday แสดงภาพข่าวชื่อไฟล์ vfdinvade_feat.jpg และระบุวิดีโอสาธิตชื่อ I Hacked This Old Display to Play Space Invaders แต่การตรวจแหล่งข้อมูลรอบนี้ยังไม่ได้ Direct Image URL หรือ Video ID ที่ยืนยันได้ จึงไม่ฝัง URL คาดเดาหรือใส่คลิปที่เป็นคนละโปรเจกต์แทน
เป็นแหล่งต้นฉบับสำหรับภาพและวิดีโอของ José Luis Monteiro และคุณพ่อ
เปิดข่าว Hackaday พร้อมภาพและวิดีโอสาธิตหากจะนำภาพจาก Hackaday หรือวิดีโอของผู้สร้างมาฝังบนเว็บไซต์เชิงพาณิชย์ ควรตรวจทั้ง Direct URL และสิทธิ์การใช้งานก่อน เพื่อหลีกเลี่ยงภาพเสียหรือการใช้สื่อเกินขอบเขตสิทธิ์ที่ได้รับ
ข้อจำกัดทางเทคนิคและความปลอดภัย
- ห้ามนำ VPP ของไดรเวอร์แรงดันสูงต่อเข้าขา Arduino Uno โดยตรง
- ตรวจแรงดันและกระแสของ Filament, Grid และ Anode ของหลอด VFD จริงก่อนใช้แหล่งจ่าย
- ขอบเขตแรงดัน 20–80V เป็นสเปกของ Driver ไม่ใช่คำแนะนำให้จ่ายแรงดันระดับนั้นกับจอทุกตัว
- หากใช้ UCN5812 แทน HV5812 ต้องตรวจ Datasheet และ Pinout รุ่นย่อย ไม่ควรถือว่าเสียบแทนกันได้ทันที
- จอที่ถอดจากเครื่องอื่นอาจมี Grid Mapping, Dot Mapping และ Timing แตกต่างจากตัวอย่าง GitHub
README ของผู้สร้างยังเน้นให้ควบคุม BLANK ให้อยู่ในสถานะปลอดภัยขณะ Reset และกำหนดลำดับ Power-up/Power-down อย่างถูกต้อง บทความนี้จึงเน้นอธิบายหลักการ ไม่ใช้เป็นคู่มือประกอบวงจรแรงดันสูงแบบพร้อมต่อทันที
Source Code, Arduino Sketch, Datasheet และไฟล์ดาวน์โหลด
จากแหล่งข้อมูลที่ตรวจสอบ ไม่พบไฟล์ Gerber, STL หรือ PDF คู่มือประกอบแยกสำหรับโครงการนี้ นอกเหนือจาก Datasheet ที่ผู้สร้างอ้างอิง และยังไม่สามารถยืนยัน Video ID สำหรับ Embed โดยตรงได้
FAQ: คำถามที่พบบ่อยเกี่ยวกับ Space Invaders บน VFD
1. เกมนี้ใช้ Arduino รุ่นใด?
ผู้สร้างระบุ Arduino Uno ใน Repository หลัก
2. VFD ย่อมาจากอะไร?
Vacuum Fluorescent Display หรือจอสุญญากาศเรืองแสง
3. VFD เครื่องนี้แสดงได้กี่ตัวอักษร?
2 แถว × 20 ตัวอักษร โดยแต่ละตำแหน่งมี 5 × 7 Dots
4. ใช้ไดรเวอร์กี่ตัว?
สี่ตัว แบ่ง Grid Chain สองตัวและ Dot Chain สองตัว
5. Logical Canvas 100 × 14 หมายถึงอะไร?
พื้นที่ Logic ที่รวม Dot Matrix ของ Character Cells สำหรับเกม โดยยังมีช่องว่างทางกายภาพระหว่าง Cell
6. เกมมีปุ่มอะไรบ้าง?
ใช้ Joystick แนวนอนที่ A0 และ Fire Button ที่ D12 ส่วน D11 ขับ Active Buzzer ผ่าน Transistor
7. มีเมนูตั้งค่าความยากไหม?
มี เลือกความยาก ขนาด Sprite, Wave และ Boss Encounter ได้ตาม Game README
8. มีโหมดให้เกมเล่นเองไหม?
มีคำสั่ง demo สำหรับ Automatic Play
9. สามารถส่งคำสั่งจากคอมพิวเตอร์ได้ไหม?
ได้ผ่าน Serial Monitor ที่ 115200 Baud และคำสั่งตามที่ README ระบุ
10. ต้องติดตั้ง Arduino Library เพิ่มหรือไม่?
README ระบุว่า Header ที่จำเป็นอยู่ใน Repository แล้ว ไม่ต้องติดตั้ง Library แยกสำหรับตัวอย่างเหล่านี้
11. จ่ายไฟ VFD จาก Arduino 5V อย่างเดียวได้หรือไม่?
ไม่ได้ตามโครงการนี้ ต้องมีไฟเลี้ยงแยกสำหรับ Driver และ Filament ตามพิกัดจริงของจอ
12. ใช้จอ VFD รุ่นอื่นได้ทันทีไหม?
Source ไม่ได้รับรอง ต้องตรวจ Grid Mapping, Dot Mapping, Driver และแรงดันไฟฟ้าของจอใหม่
13. มีไฟล์เกมให้ดาวน์โหลดหรือไม่?
มีทั้ง VfdInvaders.ino, README เกม และ ZIP รวมโครงการ
14. มีวิดีโอสาธิตไหม?
Hackaday ระบุวิดีโอสาธิตของผู้สร้าง แต่ยังไม่สามารถยืนยัน Direct Video URL ได้ ให้เปิดดูผ่านหน้าข่าวต้นฉบับ
สรุป: จอเก่าก็สร้างโปรเจกต์เกมที่น่าสนใจได้
จุดเด่นของ Space Invaders บน VFD คือการใช้ Hardware เก่าที่มีข้อจำกัดมาทดลองเรื่อง Shift Register, Multiplexing, Sprite Design และ Input Handling ในโปรเจกต์เดียว แทนที่จะซื้อจอกราฟิกใหม่แล้วเริ่มจาก Library สำเร็จรูป
สำหรับ Maker ที่อยากเข้าใจการขับ Display ระดับล่าง ลองอ่าน README แล้วเริ่มศึกษาตัวอย่าง RawGrid, TextDisplay และ JoystickReadout ก่อน Game Firmware โดยต้องตรวจระบบไฟเลี้ยง VFD อย่างปลอดภัย และใช้ Source ต้นฉบับประกอบเสมอ
References / แหล่งข้อมูลต้นฉบับ
ต่อยอด Arduino และ Retro Electronics กับ GlobalByte
สนใจเรียนรู้ Arduino, Display Driver, Joystick หรือชิ้นส่วน Electronics สำหรับโปรเจกต์ Maker? สามารถสอบถามทีม GlobalByte เพื่อเลือกบอร์ดและอุปกรณ์ที่เหมาะกับงาน โดยต้องตรวจความเข้ากันได้และความปลอดภัยของวงจรไฟเลี้ยงก่อนใช้งานจริง