เมื่อผมซื้อ 800 x 480 IPS Touchscreen shield (รุ่น MAR4018) สำหรับ Mega ผมรู้สึกทึ่งกับคุณภาพของหน้าจอ ตอนแรกผมแสดงรูปภาพในรูปแบบสไลด์โชว์ และคุณภาพของภาพก็ยอดเยี่ยมมาก ในที่สุดผมก็ตัดสินใจที่จะสร้างเกม Poker แบบกราฟิกเต็มรูปแบบสำหรับมัน ผมใช้รูปไพ่ที่มีรายละเอียดสูงมาก และใช้ Micro SD card บน Touchscreen เพื่อจัดเก็บรูปภาพเหล่านั้น ไฟล์ BMP ทั้งหมดถูกแปลงเป็น 16 Bit 565 Color เพื่อลดเวลาในการโหลด
เกมนี้ควรจะทำงานได้ง่ายหากคุณใช้ฮาร์ดแวร์เดียวกัน คุณต้องใช้ Mega เนื่องจากเกมต้องการ RAM เพิ่มเติม (ใช้สำหรับการโหลด BMP อย่างรวดเร็ว) คุณต้องใช้หน้าจอขนาด 800x480 เนื่องจากเกมถูกเขียนขึ้นสำหรับความละเอียดนั้น
เพียงคัดลอกไฟล์ BMP ทั้ง 53 ไฟล์ไปยัง Micro SD Card และเสียบเข้าไปในช่อง SD ของหน้าจอ คอมไพล์ sketch และโปรแกรม Mega มันก็น่าจะทำงานได้
เกมนี้ใช้งานง่ายมาก มันจะแจ้งให้ผู้ใช้ทราบว่าจะต้องทำอะไร เช่น Deal, Hold, Shuffle เป็นต้น ทั้งหมดนี้ควบคุมด้วยระบบ Touch
สิ่งหนึ่งที่ผมค้นพบขณะเขียนโปรเจกต์นี้ LCDWIKI_Touch driver ไม่สามารถทำงานร่วมกับ Micro SD card ที่กำลังใช้งานอยู่ได้ SD card driver ใช้ Hardware SPI แต่ LCDWIKI_Touch driver ใช้ Software SPI ระบบ Touch จะไม่ทำงานหลังจาก SD card driver ถูกเริ่มต้น อย่างไรก็ตาม ผมพบ Touchscreen driver ที่ใช้ Hardware SPI ซึ่งคุณจำเป็นต้องใช้ driver ตัวนี้ ขอบคุณ Paul Stoffregen ที่เผยแพร่ driver นี้ มีให้ใช้งานบน Github ที่
ผมกำลังใช้ LCDWIKI NT35510 Screen driver รุ่นของ Touchscreen คือ MAR4018 มันคุ้มค่ากับราคาอย่างมาก มันเป็นหน้าจอ IPS แท้ ไม่เหมือนหน้าจออื่นๆ ในช่วงขนาดนี้ที่เป็น TFT
Link to the Library for the 4 Inch Screen on the LCDWIKI Web Page.
ผมได้อัปเดตโค้ดให้ใช้ SdFat Library เพื่อเข้าถึง SD Card Library นั้นมีความเร็วในการอ่านประมาณสองเท่าของ SD Library แบบเก่า คุณจะต้องติดตั้ง SdFat Library จาก Library Manager ใน IDE
ผมเคยมีปัญหาบางอย่างกับ SdFat เนื่องจากมันเข้ากันได้ไม่สมบูรณ์กับ SD Library อย่างไรก็ตาม ตอนนี้มันทำงานได้แล้ว และแสดงไพ่ทั้ง 5 ใบได้ในเวลาประมาณ 1.5 วินาที
17 พฤศจิกายน 2022: การอัปเดตครั้งสำคัญ
MAR4018 เป็นหน้าจอ IPS ที่ดีมาก สีสันสดใสและความคมชัดยอดเยี่ยม อย่างไรก็ตาม Touch panel ที่พวกเขาใช้นั้นมีคุณภาพต่ำมาก หน้าจอของผมมีข้อผิดพลาดในการหมุน (Rotation Errors) ที่สังเกตเห็นได้ และข้อผิดพลาดเชิงเส้น (Linearity Errors) ที่ "รุนแรง" ข้อผิดพลาดเชิงเส้นนั้นแย่มากจนผมต้องปรับเทียบตำแหน่งปุ่มแต่ละปุ่มด้วยตนเอง วิธีการปรับเทียบ Touch Screen มาตรฐานไม่สามารถใช้งานได้
ผมได้เพิ่ม Calibration code ลงใน Sketch รวมถึง Test Calibration code ด้วย ดูไฟล์ Read_Me สำหรับข้อมูลเกี่ยวกับการ Calibration และอื่นๆ
รายละเอียดทางเทคนิคเพิ่มเติม
ตรรกะของเกมและ State Machine
โปรเจกต์นี้ใช้เกม Draw Poker สำหรับผู้เล่นคนเดียวบน Arduino
- การจัดการสำรับไพ่ (Deck Management): firmware ใช้อาร์เรย์เพื่อแสดงสำรับไพ่ 52 ใบ ฟังก์ชันการสุ่ม (seeded via an open analog pin) จะสับไพ่เมื่อเริ่มต้นแต่ละรอบ
- การเลือกไพ่ (Card Selection): ผู้เล่นโต้ตอบกับ pushbuttons เพื่อ "Hold" หรือ "Discard" ไพ่จากไพ่ 5 ใบแรกในมือ state machine ของเกมจะเปลี่ยนจาก "Deal" ไปยัง "Hold" ไปยัง "Draw" และสุดท้ายไปยัง "Evaluate"
กลไกการประเมินผล (Evaluation Engine)
Arduino ทำการจับคู่รูปแบบที่ซับซ้อนเพื่อระบุไพ่ที่ชนะ:
- การจัดอันดับไพ่ (Hand Ranking): มันจะตรวจสอบหา pairs, three-of-a-kind, straights, flushes และ Royal Flush ที่เป็นที่ต้องการ
- การแสดงผลด้วยภาพ (Visual Display): ผลลัพธ์จะแสดงบน LCD หรือ OLED display ด้วยการแสดงผลแบบข้อความ (เช่น "KH" สำหรับ King of Hearts) คะแนนจะถูกติดตามและอัปเดตตามความหายากของไพ่ที่ได้ ทำให้ได้รับประสบการณ์การเล่นเกมคาสิโนแบบพกพาที่ใช้พลังงานต่ำ