กลับไปหน้ารวมไฟล์
control-games-using-arduino-mpu6050-and-python-d8438d.md

สวัสดีน้องๆ ทุกคน!

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

งั้นมาดูกันดีกว่าว่ามันทำงานยังไง

ในโปรเจคนี้ Arduino Uno จะอ่านสถานะของปุ่มเร่ง (throttle) ปุ่มเบรก (brake) และข้อมูลจากเซ็นเซอร์ MPU6050 จากนั้นก็พิมพ์ตัวอักษรออกมาทาง Serial Monitor แล้วโปรแกรม Python ก็จะอ่านตัวอักษรนั้นเพื่อจำลองการกดคีย์บอร์ดให้กับโปรแกรม (เกม) อีกที

แล้วเราจะทำของเจ๋งๆ แบบนี้ยังไงล่ะ?

ขั้นตอนที่ 1

เริ่มแรกต้องต่อวงจรพื้นฐานกันก่อน โดยเชื่อมต่อ Arduino เข้ากับ MPU6050 และปุ่มกดสองปุ่ม ปุ่มนึงสำหรับเร่ง อีกปุ่มสำหรับเบรก

ทีนี้ก็ต้องติดตั้งฮาร์ดแวร์บนจักรยานซะหน่อย จะได้อารมณ์เหมือนขับจริงๆ (จะข้ามขั้นตอนนี้หรือจะติดตั้งตรงไหนก็ตามใจเลยน้อง)

ติดตั้งเซ็นเซอร์ MPU6050 ให้แน่นหนา วางแกน Z ให้เหมือนกับที่พี่ตั้งไว้ (จะเปลี่ยนก็ได้นะ แต่ต้องไปแก้โค้ดเพิ่มอีกนิดนึง)

ขั้นตอนที่ 3

มาถึงส่วนซอฟต์แวร์ พี่ใช้ไลบรารี่ <MPU6050_tockn.h> และ <wire.h> นะ

ติดตั้ง MPU6050_tockn.h ซะ

ทีนี้พี่ใช้รหัสคีย์สำหรับการเคลื่อนไหวแต่ละแบบแบบนี้เลย

เหตุการณ์ การกระทำ กดปุ่มเร่ง (throttle) พิมพ์ 'w' ลง Serial port กดปุ่มเบรก (brake) พิมพ์ 's' ลง Serial port เอียงไปทางขวา พิมพ์ 'd' ลง Serial port เอียงไปทางซ้าย พิมพ์ 'a' ลง Serial port กดปุ่มเร่ง และ เอียงไปทางขวา พิมพ์ 'e' ลง Serial port กดปุ่มเร่ง และ เอียงไปทางซ้าย พิมพ์ 'q' ลง Serial port กดปุ่มเบรก และ เอียงไปทางขวา พิมพ์ 'c' ลง Serial port กดปุ่มเบรก และ เอียงไปทางซ้าย พิมพ์ 'z' ลง Serial port

การจะทำแบบนี้ได้ เราต้องใช้โค้ดประมาณนี้เลย

if(mpu6050.getAngleZ()>25 && digitalRead(A0))
  Serial.println('q');
 else if(mpu6050.getAngleZ()<-25 && digitalRead(A0))
  Serial.println('e');
 else if(mpu6050.getAngleZ()>25 && digitalRead(A1))
  Serial.println('z');
 else if(mpu6050.getAngleZ()<-25 && digitalRead(A1))
  Serial.println('c');
 else if(digitalRead(A0))
  Serial.println('w');
 else if(digitalRead(A1))
  Serial.println('s');
 else if(mpu6050.getAngleZ()>25)
 Serial.println('a');
 else if(mpu6050.getAngleZ()<-25)
 Serial.println('d');

ข้อมูลเทคนิคแบบละเอียดยิบ

Sensor Fusion & การประมวลผลข้อมูล

เจ้า MPU6050 เนี่ย มันมีทั้งตัววัดความเร่ง 3 แกน (3-axis accelerometer) และไจโรสโคป 3 แกน (3-axis gyroscope) อยู่ข้างใน โปรเจคเราใช้ไลบรารี่ MPU6050_tockn เพื่อให้ดึงข้อมูลผ่าน I2C ง่ายขึ้น ไลบรารี่มันจะจัดการเรื่องการอินทิเกรตข้อมูลดิบจากไจโรให้กลายเป็นมุมที่เสถียรให้เอง การบังคับเลี้ยวคำนวณมาจากมุมของ แกน Z (Yaw) โดยตั้งเกณฑ์ (threshold) ไว้ที่ +/- 25 องศา เพื่อแยกระหว่างโซนตาย (dead-zone) กับการเลี้ยวจริงๆ

โครงสร้างฮาร์ดแวร์

  • Inertial Measurement Unit (IMU): ติดไว้ที่แฮนด์จับมอเตอร์ไซค์เพื่อตรวจจับการเอียงและหมุน
  • ปุ่มควบคุมกายภาพ: ปุ่มบนที่จับจัดการอินพุตแบบ binary เช่น คันเร่งและเบรก
  • โปรโตคอล Serial: การสื่อสารด้วยตัวอักษร ('w', 'a', 's', 'd', 'q', 'e', 'z', 'c') ช่วยให้เรากดปุ่มผสมกันได้ (เช่น กด 'q' เพื่อคันเร่งพร้อมเลี้ยวซ้าย)

Python Bridge (ตัวกลาง)

สคริปต์ Python ที่มาด้วย ใช้ไลบรารี่ pyserial เพื่อฟังข้อมูลจากพอร์ต COM พอได้รับตัวอักษรมา มันก็จะใช้ไลบรารี่อย่าง pyautogui หรือ pydirectinput ในการส่งสัญญาณการกดคีย์บอร์ดเสมือนเข้าไปในระบบปฏิบัติการ

  • ทิปลดความหน่วง (Low-Latency Tip): แนะนำให้ใช้ pydirectinput สำหรับเกม Direct-X (อย่าง Asphalt 8) เพราะมันเลียนแบบ Scancodes ในระดับที่ต่ำกว่าการเรียกใช้ Windows API ทั่วไป ซึ่งมักจะถูกเกมที่เปิดเต็มจองเวินซะเฉยๆ

หมายเหตุ - ถ้าน้องอยากใช้แกนอื่น ก็สามารถใช้ mpu6050.getAngleX() หรือ mpu6050.getAngleY() แทนได้นะ

mpu6050.getAngleZ()>25

ตรงนี้พี่จะถือว่าเป็นการเลี้ยวซ้ายเมื่อ mpu6050.getAngleZ() คืนค่ามากกว่า 25 (จุดเกณฑ์) น้องสามารถเปลี่ยนและตั้งค่าเกณฑ์ของตัวเองได้เลย วิธีการหาค่าเกณฑ์ของตัวเองก็คือ ใช้โค้ดตัวอย่าง getAngle นี้เพื่อเช็คค่าจากเซนเซอร์ในทุกตำแหน่ง แล้วค่อยเลือกค่าที่ตำแหน่งที่ต้องการ

ใช้ตัวอย่างนี้เพื่อเช็คค่าจากเซนเซอร์ในทุกตำแหน่ง

ดู Serial monitor ของพี่สิ

ถึงตอนนี้ เราได้ค่ามาจากพอร์ต serial แล้วล่ะ ต่อไปเราจะสแกนพอร์ต serial ด้วย python แล้วจำลองการอินพุต ในส่วนนี้พี่จะให้โค้ด python สองตัว ตัวแรกสร้างอินพุตโดยใช้ pyautogui แต่บางทีมันอาจไม่ทำงานกับเกม Direct X พี่เลยจะให้โค้ด python ตัวที่สอง (port2.py) ด้วย หวังว่าคงจะใช้ได้ ลองรันโค้ด python ทั้งสองตัว (port1.py และ port2.py) ทีละตัวดูนะ ว่าตัวไหนเวิร์ค น้องสามารถลองเปิด Notepad หลังจากรันโปรแกรม python แล้วดูได้ ถ้ามันพิมพ์ 'w' ออกมาเวลากดปุ่มคันเร่งหรือทำการเคลื่อนไหวอื่นๆ แสดงว่าทุกอย่างโอเคจากฝั่งฮาร์ดแวร์และ Arduino แล้ว

พี่ให้โค้ดสมบูรณ์ไว้ด้านล่างแล้ว [หมายเหตุ - ภายในโปรแกรม python ให้น้องเปลี่ยนชื่อพอร์ตเป็นพอร์ต Arduino ของน้องเอง สำหรับพี่คือ 'COM3']

ขั้นตอน 4 - ลงมือรันเลย

1st - ก่อนอื่นต่อ Arduino เข้าไป เปิด Serial monitor ถ้าทุกอย่างทำงานปกติ น้องจะเห็นผลลัพธ์ที่ถูกต้องใน Serial monitor จากนั้นปิด Serial monitor ซะ

2nd - เปิดเกมที่อยากเล่น

3rd - รันสคริปต์ python แล้วไปที่หน้าต่างเกม

4th - จัดไปวัยรุ่น! เสร็จสรรพแล้ววว สู้งานนะน้อง!

มาดูกันว่าเจ้านี่ทำงานยังไงแบบเรียลไทม์ พี่ใช้มันในเกม Asphalt 8 - Airborne นะ

*ดูการทำงานของคอนโทรลเลอร์ตัวนี้กันนะ ส่วนสกิลขับรถพี่ในเกมให้มองข้ามไปเลย 555 พี่ไม่ใช่โปรด้านเกม*

ก็หวังว่าน้องๆ จะชอบกันนะ ไปลองทำกันดู สู้งานนะน้อง!

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

apps:
  - "1x Arduino IDE"
  - "1x python"
author: "hassankamran107"
category: "Gadgets, Games & Toys"
components:
  - "2x Pushbutton Switch, Pushbutton"
  - "1x Arduino UNO"
  - "1x Jumper wires (generic)"
  - "1x 6 DOF Sensor - MPU6050"
description: "งานนี้พี่จัดให้! ใช้จักรยานเก่าอัพเกรดเป็นคอนโทรลเลอร์เทพๆ เล่น Asphalt 8 กันแบบตึงๆ อยากรู้ใช่ไหมว่ามันเวิร์คยังไง? ตามมาดูเลย งานง่ายแต่หล่อแน่นอน!"
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles:
  - "https://projects.arduinocontent.cc/b4b450e1-76d6-40f6-bedb-75c49f17d1b9.py"
encryptedPayload: "U2FsdGVkX1/2/bz+vKQe8hgQpaAgtbG4LLLghthpwOdiaEN0ywc7sJHaXTHVbnGEBZMss66DR5zR3B1kVug7Tlld2F44ZYuTGyt7SDVu8r0="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/control-games-using-arduino-mpu6050-and-python-d8438d_cover.jpg"
lang: "en"
likes: 1
passwordHash: "ce595e0cf24fb917c3715995cfa96bcfc3311f8bed6299aca8dc6e3106d0ed24"
price: 2450
seoDescription: "Control asphalt 8 using arduino, mpu6050, and python with an upgraded bicycle. Learn how this DIY game controller project works."
tags:
  - "mpu6050"
  - "gyroscope"
  - "games"
title: "ควง Arduino + MPU6050 ควบ Python เล่นเกมแบบจัดเต็ม!"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/Jvi1t5T9_x4"
  - "https://www.youtube.com/embed/IpYEGoXckYs"
views: 8532