กลับไปหน้ารวมไฟล์
pcb-gyro-gaming-wheel-6524ee.md

ใครๆ ก็ชอบเล่นเกมใช่มั้ยล่ะ เวลาเล่นก็ต้องมีตัวควบคุม (Controller) ใช่ป่ะ ส่วนใหญ่ก็เป็นคีย์บอร์ด+เมาส์ ถ้าเล่นในมือถือก็ใช้ไจโรสโคปกับปุ่มกดต่างๆ เราเคยเห็นคนทำพวงมาลัยเล่นเกมกัน แต่ปัญหาหลักคือมันต้องยึดติดกับอะไรสักอย่าง เลยพกพาไปไหนไม่สะดวก

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

มาเริ่มทำกันเถอะวัยรุ่น!

อุปกรณ์ที่ต้องใช้

อุปกรณ์หลักๆ มีไม่กี่ชิ้น หาซื้อได้ตามร้านขายของช่างหรือออนไลน์ ราคาไม่แพงแน่นอน

  • IMU 6050 - 1 ชิ้น
  • Arduino Pro Micro - 1 ชิ้น
  • LED ขนาดเล็ก - 2 ดวง
  • ปุ่มกดแบบ Mini Push Button - 4 ปุ่ม
  • ตัวต้านทาน (Resistor) 10k - 4 ตัว (สำหรับปุ่มกด)
  • ตัวต้านทาน (Resistor) 330r - 2 ตัว (สำหรับ LED)

นี่คืออุปกรณ์หลัก ส่วนอุปกรณ์เสริมสำหรับบัดกรี (ถ้าต้องการ) ก็มีประมาณนี้:

  • Female Header
  • Male Header
  • ลวดบัดกรี (Soldering Wire)

และสาย USB Micro ไว้ต่อบอร์ดเข้ากับคอมเพื่ออัปโหลดโปรแกรม และใช้เล่นเกมในภายหลังด้วย

มันทำงานยังไง?

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

คอนโทรลเลอร์ตัวนี้จะทำงานเหมือนคีย์บอร์ดและเมาส์ของเรา คือกดปุ่มเดินหน้า, ซ้าย, ขวา ฯลฯ เราใช้ Arduino Pro Micro ควบคุมส่วนนี้ ส่วนการได้อารมณ์พวงมาลัยโดยไม่ต้องใช้โพเทนชิออมิเตอร์ เราใช้ IMU6050 (Inertia Measurement Unit) วัดข้อมูลแกน Y เพื่อตรวจจับการเอียง แล้วก็มีปุ่มกดสำหรับคันเร่ง, เบรก, ไนโตร ฯลฯ

เราเล็งเกม Beach Buggy เวอร์ชันพีซี เป็นเกมเบาๆ ใช้ทรัพยากรไม่มาก วิธีการตั้งค่าคอนโทรลเลอร์ให้เข้ากับเกมมีดังนี้:

  • เปิดโหมดเร่งอัตโนมัติ (Auto accelerator)
  • การเอียงซ้าย-ขวา จะกดปุ่ม - ลูกศรซ้าย, ลูกศรขวา
  • สำหรับพาวเวอร์/บูสต์ กดปุ่ม - 'z'
  • สำหรับพาวเวอร์ตัวละคร กดปุ่ม - 'A'

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

แผนภาพวงจร (Circuit Diagram)

แผนภาพวงจรง่ายๆ ไม่ซับซ้อน เราใช้ตัวแก้ไขออนไลน์อย่าง EasyEDA มาช่วยวาด ข้อดีของระบบนี้คือไม่ต้องติดตั้งอะไรเพิ่มในคอม เลยไม่กินทรัพยากรเครื่องมากนัก

เจ้า IMU นี้มันคุยกับ Arduino ผ่าน I2c protocol ง่ายๆ แค่นั้นแหละ

ลากๆ วางๆ จากเมนูด้านซ้าย หาอุปกรณ์ในส่วน Library ให้เจอ สิ่งสำคัญ! ถ้าใช้คอมโพเนนต์อะไร ต้องเช็คให้แน่ใจว่ามันมีลายพิมพ์ (จะมีภาพ mask สีขาวโชว์) ไม่งั้นงานเข้าแน่ วางทุกอย่างให้ถูกตำแหน่งแล้วเช็คซ้ำอีกรอบ นี่คือทิปส์จากรุ่นพี่ ตัวดีไซน์รุ่นพี่ทำไว้ให้แล้ว ดูได้จากรูปด้านล่างเลย

ออกแบบและทำ PCB

การทำ PCB มันง่ายมากๆ แต่พี่อยากได้รูปร่างพิเศษแบบพวงมาลัย เลยกลายเป็นเรื่องท้าทายหน่อย พี่ใช้รูปล้อในภาพที่สอง (ที่ไม่มีพื้นหลัง) เป็นต้นแบบ แล้วลากเส้นทุกเส้นด้วยมือ สุดๆไปเลยงานนี้ ใช้ EasyEDA เหมือนเดิม

โอเค พอเสร็จแล้วก็ลบภาพต้นแบบออก แล้วกำหนดเส้นทั้งหมดให้เป็นขอบ PCB ก็จะได้รูปร่างตามต้องการ จากนั้นก็จัดวางชิ้นส่วนให้เรียบร้อยแล้วสร้าง PCB

มีอย่างนึงต้องจำไว้ ระบบทั้งหมดใช้แหล่งจ่าย 5V เดียว ดังนั้นกระแสอาจจะเป็นปัญหาได้ นี่แหละที่พี่ใช้ความกว้างลายทองแดง (Track Width) = 0.300 มม. มันผ่านกระแส 1A ได้สบายๆ พอพอใจกับดีไซน์แล้ว ก็ส่งออกไฟล์ Gerber ไปยังเครื่อง

สำหรับการพิมพ์ PCB พี่ใช้บริการ PCBWay จากนั้นพี่สามารถพิมพ์ PCB สองชั้นได้ถึง 10 แผ่น ด้วยราคาแค่ 5 ดอลลาร์! ซึ่งถูกมากๆ เลย พี่ใช้ระบบ pcb-instant-quote ซึ่งเป็นระบบอัจฉริยะที่ทำทุกอย่างอัตโนมัติ พี่อัพโหลดไฟล์ Gerber ไป ระบบก็ตรวจจับข้อมูลเลเยอร์และ mask ทุกอย่างได้ในทันที

ใช้เวลาแค่ 3 วัน จากจีนถึงบังกลาเทศ ซึ่งพี่ก็ไม่คิดว่าจะเร็วขนาดนั้นเลย PCB ที่ได้มาดูดีมาก ทุกลายทองแดง การ mask ดูสมบูรณ์แบบ พี่แทบไม่อยากเชื่อว่าสามารถส่งมอบงานคุณภาพระดับนี้ในราคานี้ได้ Finish มันดูว้าวมากๆ ลักษณะมันวาวแบบแก้วยกระดับ PCB ไปอีกขั้น แม้พี่จะเป็นคนออกแบบ แต่รู้ไหม? PCB ทุกแผ่นถูกตรวจสอบโดยทีมวิศวกรของ PCBWay เพื่อส่งมอบผลิตภัณฑ์ที่ดีที่สุดให้พี่ พี่ประทับใจบริการของพวกเขาจริงๆ

PCBWay ยังสนับสนุนโปรเจคของนักเรียนด้วย ถ้าน้องคิดว่ามีไอเดียเจ๋งๆ และต้องการความช่วยเหลือ ก็ลองติดต่อพวกเขาได้

พูดมามากแล้ว มาลุยต่อขั้นตอนบัดกรีกันดีกว่า

สามารถดูรายละเอียดโปรเจค PCB ได้

บัดกรีชิ้นส่วนเข้าที่

ขั้นตอนนี้ตรงไปตรงมา วางชิ้นส่วนให้ถูกตำแหน่งแล้วบัดกรี ระวังหน่อยนะน้อง อย่าสูดควันที่มาจากหัวแร้งบัดกรีเข้าไป พี่ใช้ชิ้นส่วนเสริม (Female Headers) เพราะพี่ชอบให้อุปกรณ์เป็นแบบ Plug and Play ถ้าชิ้นส่วนไหนเสียจะได้เปลี่ยนง่ายๆ

ปกติ PCB มักจะบิดงอเล็กน้อยหลังบัดกรี (เพราะความร้อนจากหัวแร้ง) แต่ PCB นี้ยังตั้งตรงได้อยู่ ขอบคุณ PCBWay อีกครั้ง

โปรแกรมมิ่งบอร์ด

ถึงเวลาอัพโหลดโค้ดแล้ว โปรแกรมนี้เขียนด้วย Arduino Code ซึ่งก็คือ C++ (ประมาณนั้นแหละ)

น้องสามารถดาวน์โหลดโค้ดเต็มได้จาก GitHub หรือจะคัดลอกจากด้านล่างนี้ก็ได้ แต่พี่แนะนำให้ดาวน์โหลดจาก GitHub ดีกว่า โค้ดจะได้ไม่เพี้ยน

เริ่มแรกพี่ก็ import library keyboard เข้ามา แล้วก็กำหนดขาของปุ่มกับ LED ต่างๆ ในส่วน setup ก็ตั้งค่าต่างๆ ซึ่งส่วนนี้จะรันแค่ครั้งเดียวเท่านั้น ส่วนใน loop (ที่รันไปจนวันสิ้นโลก) พี่ก็เช็คว่ามีการกดปุ่มไหม ถ้ากดปุ่มคันเร่ง (pedal) ก็จะไปเช็คค่าจาก IMU (ตำแหน่งแกน Y) - การเอียงนั่นแหละ - แล้วก็กดปุ่มซ้ายขวาตามนั้น ถ้ากดปุ่มเบรคก็จะกดปุ่ม 'ลูกศรลง' ถ้ากดไนโตรก็กด 'z' ถ้ากดไนโตรสองทีก็กด 'A' ส่วน LED สองดวงนั่นเอาไว้แสดงทิศทางซ้ายขวา เวลามองจอก็จะรู้สึกได้ว่าเรากำลังบังคับเลี้ยวอยู่

เพราะพี่ใช้ Arduino ไง จะปรับแต่งเพิ่มอะไรตอนไหนก็ได้ ตามเกมที่อยากเล่นเลย

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

โปรเจคนี้เป็นการ implement แบบจริงจังของ Inertial HMI Orchestration และ Human Interface Device (HID) Diagnostics มันเชื่อมช่องว่างระหว่างพวงมาลัยแบบเดิมๆ กับอุปกรณ์เล่นเกมพกพา โดยใช้ IMU 6 แกน เปลี่ยนการหมุนทางกายภาพให้เป็นสัญญาณการกดปุ่มดิจิทัล

6-Axis IMU & Orientation Harmonics: ระบบใช้ accelerometer 3 แกนของ MPU-6050 เพื่อระบุเวกเตอร์แรงโน้มถ่วงสัมพันธ์กับแกนหลักของพวงมาลัย มันอ่านค่าจาก register ACCEL_YOUT บ่อยๆ เพื่อตรวจจับการเอียงด้านข้าง มีการใส่ฟิลเตอร์ THRESHOLD (±4000 หน่วยดิบ) เพื่อแยกแยะระหว่างการบังคับเลี้ยวจริงๆ กับสัญญาณรบกวนจากการสั่นสะเทือน ทำให้มั่นใจได้ว่ามีสถานะ "Neutral" ที่เสถียร การรับข้อมูลจัดการผ่านโปรโตคอล I2C ซึ่งเกี่ยวข้องกับการจัดการ register โดยตรงของบล็อก power-management (0x6B) และ accelerometer-data (0x3B-0x40) เพื่อให้แน่ใจว่าข้อมูลสอดคล้องกันเวลาและลด input-lag ให้น้อยที่สุด

USB-HID Stack & Logic Diagnostics: ใช้ความสามารถ USB-HID แบบ native ของ ATmega32U4 ร่วมกับ library Keyboard.h Arduino จะแปลเหตุการณ์ทางกายภาพให้เป็น virtual keystroke เพื่อประสบการณ์ที่ไร้ไดรเวอร์และดีเลย์ต่ำ การกดสวิตช์แบบสัมผัสจะ map ไปที่ปุ่ม 'z' (ไนโตร) และ 'A' (สกิล) ส่วนข้อมูลจาก IMU จะขับคำสั่ง KEY_LEFT_ARROW และ KEY_RIGHT_ARROW ปุ่มกดทั้งสี่ตัวตั้งค่าด้วยตัวต้านทาน pull-down 10kΩ เพื่อให้การเปลี่ยนสถานะ logic สะอาด โดยการวินิจฉัยจะโฟกัสที่ปุ่ม Nitro ที่มี dual-action เพื่อแยกแยะระหว่างการ trigger สกิลรอง กับสถานะ boost หลัก

Custom PCB Geometry & Signal-Integrity: PCB นี้มีขอบแบบ custom ที่เลียนแบบพวงมาลัยสไตล์ Formula-1 การเดินลาย (trace-routing) รักษาความกว้างของ track ไว้ที่ 0.3mm สำหรับสายไฟแรงดัน 5V เพื่อให้แน่ใจว่าการสั่นสะเทือนชั่วขณะหรือการสลับ LED จะไม่ทำให้แรงดันตกที่แกน logic ส่วน LED คู่จะให้ feedback ภาพแบบ real-time ของทิศทางการบังคับเลี้ยว ซึ่ง sync กับคำสั่ง Keyboard.press ที่ active อยู่

Calibration & Neutral-Point Forensics: การ implement มีลำดับการกะพริบ indicator_blink() ตอนเริ่มต้น ในช่วงนี้ระบบจะทำการ "ศูนย์" กรอบการวินิจฉัย ชวนให้ผู้ใช้ถือพวงมาลัยในตำแหน่งกลาง (neutral orientation)

/*** PCB Steer Gaming Wheel ***
 *
 *  Author: Ashraf Minhaj
 *  Mail: ashraf_minhaj@yahoo.com
 *
 *  Licence: Copyright (C) Ashraf Minhaj
 *  GNU General Public License v3.0
 */
#include 
#include
// Threshold value for steering
int THRESHOLD = 4000;
// Controller buttons
int brake = 5;
int nitro = 6;
int pedal = 4;
// Indicator LEDs
int left_led = 8;
int right_led = 9;
int x;
int y;
int z;
const int MPU_addr=0x68;  // I2C address of the MPU-6050
void indicator_blink()
{
  // blinks the leds - 5 times
  int i = 0;

for(i=0; i<5; i++){ digitalWrite(left_led, HIGH); digitalWrite(right_led, HIGH); delay(100); digitalWrite(left_led, LOW); digitalWrite(right_led, LOW); delay(100); } } void setup(){ // set pin mode and initialize things pinMode(brake, INPUT); pinMode(nitro, INPUT);

pinMode(pedal, INPUT); pinMode(left_led, OUTPUT); pinMode(right_led, OUTPUT);

Serial.begin(9600); Wire.begin(); Wire.beginTransmission(MPU_addr); Wire.write(0x6B); // PWR_MGMT_1 register Wire.write(0); // set to zero (wakes up the MPU-6050) Wire.endTransmission(true); indicator_blink(); } void loop() { // Main loop that runs forever

Wire.beginTransmission(MPU_addr); Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(MPU_addr, 14, true); // request a total of 14 registers

x = Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L) y = Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L) z = Wire.read()<<8|Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L) if (digitalRead(brake)){ Keyboard.release(KEY_UP_ARROW); Keyboard.press(KEY_DOWN_ARROW); //Keyboard.press(217); }

if (digitalRead(nitro)){ delay(10); Keyboard.press('z'); if (digitalRead(nitro)){ Keyboard.press('A'); } }

else if (digitalRead(pedal)){ Keyboard.release(KEY_DOWN_ARROW); Keyboard.press(KEY_UP_ARROW); //Keyboard.press(218);

if(y < -THRESHOLD){
      Serial.print("    Left    ");
      Keyboard.release(KEY_RIGHT_ARROW);
      Keyboard.press(KEY_LEFT_ARROW);
      digitalWrite(left_led, HIGH);
  }

else if(y > THRESHOLD){
      Serial.print("    Right    ");
      Keyboard.release(KEY_LEFT_ARROW);
      Keyboard.press(KEY_RIGHT_ARROW);
      digitalWrite(right_led, HIGH);
  //Keyboard.press(37);
  }
 else{
      Keyboard.releaseAll();
 }

}

//Serial.println(y); delay(10); digitalWrite(left_led, LOW); digitalWrite(right_led, LOW); }

อัพโหลดโค้ดจาก Arduino IDE ไปเลยวัยรุ่น ถ้าทุกอย่างโอเค LED สองตัวที่บอกทิศซ้ายขวาจะกระพริบห้าครั้ง แปลว่าบอร์ดพร้อมลุยแล้ววว

จัดไป- เชื่อมต่อแล้วลุย

เรียบร้อย! เอาสาย USB ต่อพวงมาลัยเข้ากับ PC ได้เลย แล้วก็ลุยเกมส์ได้เต็มที่ อย่าลืมปรับแต่งโค้ดให้เหมาะกับสไตล์การขับของน้องด้วยนะ สู้งาน!

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

apps:
  - "1x Arduino IDE"
author: "ashraf_minhaj"
category: ""
components:
  - "2x Resistor 330 ohm"
  - "2x LED (generic)"
  - "4x Resistor 10k ohm"
  - "4x Pushbutton Switch, Pushbutton"
  - "1x Inertial Measurement Unit (IMU) (6 deg of freedom)"
  - "1x Tweezers, SMD Soldering/Desoldering"
  - "1x Arduino Micro"
  - "1x PCBWay Custom PCB"
description: "จะมีอะไรที่เท่กว่าการทำวงล้อเล่นเกมจากบอร์ด PCB แผ่นเดียวไหม! อย่ามองข้ามน้องใหม่คนนี้เชียว ใช้อุปกรณ์ไม่กี่ชิ้นอย่าง Gyro Sensor กับ Motor Driver ก็ประกอบเป็นเกมมิ่งวีลสุดเท่ งานง่ายแต่หล่อ เอาไปจัดกันได้เลยวัยรุ่น!"
difficulty: "Easy"
documentationLinks: []
downloadableFiles:
  - "https://github.com/ashraf-minhaj/Gyro-Gaming-Wheel"
  - "https://github.com/ashraf-minhaj/Gyro-Gaming-Wheel"
encryptedPayload: "U2FsdGVkX18xdKaTLUTv3FZREwWT4Gk+xAIQ0wCLLaOvioBq8i2tsxbqQtbq9jpu1Saxjko944nbKzk3bj211/V/OmBOalqCwymDKRJurtU="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/pcb-gyro-gaming-wheel-6524ee_cover.jpg"
lang: "en"
likes: 1
passwordHash: "2f405c6a98c01ffd0852c0f1a425ecced40585952add4693a07f9082b3d60153"
price: 1499
seoDescription: "Build your own PCB Gyro Gaming Wheel with minimal components. Experience a realistic gaming steering wheel feel using just one board."
tags:
  - "art"
  - "remote control"
  - "games"
title: "PCB Gyro Gaming Wheel - วงล้อเทพจากบอร์ดเดียว เอียงแล้วเล่นได้ตึงๆ!"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/NzfHxzomoY0"
  - "https://www.youtube.com/embed/NzfHxzomoY0"
views: 6338