แทนที่จะใช้เมาส์หรือแทร็กแพดควบคุมเคอร์เซอร์คอมพ์แบบเดิมๆ พี่ก็เลยทำแอปนี้ขึ้นมา แต่ใช้จอยสติกแทน! จอยสติกนี่มันขยับเคอร์เซอร์ไปทางไหนก็ได้ (ทั้งแกน X กับ Y) แถมยังกดคลิกได้ด้วยปุ่มสวิตช์ในตัวเลย
พื้นฐานคร่าวๆ
จอยสติกธรรมดาๆ ก็แค่มีโพเทนชิโอมิเตอร์ 2 ตัววางตั้งฉากกันในแกน X กับ Y ไง อาร์ดุยโน่จะอ่านค่าอะนาล็อกจากจอยสติกได้ในช่วง 0 ถึง 1023 เพราะฉะนั้น ตอนจอยอยู่ตำแหน่งกลาง (default) ค่าอะนาล็อกก็จะอยู่ราวๆ 500 (กึ่งกลางระหว่าง 0 กับ 1023)

เราจะโปรแกรมสเก็ตช์บนอาร์ดุยโน่ให้เมื่อขยับจอยออกจากจุดกลาง มันจะปริ้นต์ค่าออกมาในช่วง -sensitivity ถึง +sensitivity (ค่า default ที่ตั้งไว้คือ 10) ขึ้นอยู่กับตำแหน่งที่ขยับ ตัวอย่างเช่น ถ้าดันจอยไปสุดทางด้านหนึ่ง อาร์ดุยโน่จะปริ้นต์ค่า 10 ออกมา แต่ถ้าดันไปอีกด้านหนึ่ง ก็จะได้ค่า -10
เพื่อให้แยกค่าของแกน X กับ Y ออกจากกัน เราจะใช้เครื่องหมาย ":" คั่นระหว่างค่าทั้งสอง ตัวอย่างเช่น

สถานะของปุ่มกดบนจอยสติก (SW) จะถูกปริ้นต์ออกมา (เป็น 1 หรือ 0) บน Serial Monitor หลังจากค่าของแกน X และ Y
เพื่อให้แล็ปท็อป/คอมพิวเตอร์อ่านค่าพวกนี้ได้ เราต้องใช้โมดูล pyautogui ของ Python
เลียนแบบ HID: เปลี่ยนจอยสติกเป็นเมาส์พีซี
โปรเจกต์ Joystick Controlled Mouse นี้จะปลดปล่อย "พลังแฝง" ของบอร์ดอาร์ดุยโน่บางรุ่น นั่นคือความสามารถในการ เลียนแบบ Human Interface Device (HID) พอเสียบเข้าไป คอมพ์คุณจะไม่เห็นมันเป็นไมโครคอนโทรลเลอร์ แต่จะเห็นเป็นเมาส์ USB แบบ plug-and-play ธรรมดาๆ เลย!
จุดเด่นของ Leonardo / Micro
โปรเจกต์นี้ทำกับ Arduino Uno หรือ Nano แบบธรรมดาไม่ได้นะ! เพราะ Uno ใช้ชิปแยกสำหรับการสื่อสาร USB ในขณะที่ Arduino Leonardo (หรือ Arduino Micro / Pro Micro) มีชิป ATmega32U4 ที่การสื่อสาร USB มันอยู่ในตัวเลย
แค่ include library `
- `Mouse.move(10, -5, 0)`: ขยับเคอร์เซอร์ไปทางขวา 10 พิกเซล และขึ้นบน 5 พิกเซล
- `Mouse.click()`: ทำการคลิกซ้ายมาตรฐาน
แปลงค่าอะนาล็อกเป็นพิกเซล
กระบวนการนี้มี 3 ขั้นตอนหลัก:
- อ่านค่า (The Read): จอยสติกอะนาล็อก (ที่สร้างจากโพเทนชิโอมิเตอร์ 2 ตัวในตัวมัน) ส่งค่าจาก 0 ถึง 1023 ไปที่พิน A0 และ A1 ตำแหน่งกลางอยู่ที่ประมาณ 512
- แมปค่า (The Mapping): โค้ดใช้ฟังก์ชัน `map()` เพื่อแปลงช่วงค่ากว้างๆ `0-1023` ให้เป็นช่วงการขยับเคอร์เซอร์ที่แคบลง เช่น `-10 ถึง +10` พิกเซล
- โซนตาย (The Deadzone): จอยอะนาล็อกมันมีสัญญาณรบกวน! การโปรแกรม "deadzone" (เช่น `if(x > 500 && x < 520) then speed = 0`) เป็นเรื่องสำคัญมาก มันจะหยุดไม่ให้เคอร์เซอร์เลื่อนไปเรื่อยๆ ตอนที่คุณปล่อยจอย
ของที่ต้องใช้
- Arduino Leonardo หรือ Arduino Micro (ต้องเป็นรุ่นที่มีชิป ATmega32U4)
- โมดูลจอยสติกแบบกดได้ (2 แกน พร้อมปุ่มกด)
- สาย Micro-USB
โปรเจกต์นี้พิสูจน์แล้วว่าน้องสามารถสร้างคอนโทรลเลอร์เกมแบบกำหนดเอง อุปกรณ์ช่วยการเข้าถึง หรือแผงควบคุมเครื่องบินจำลองได้ด้วยตัวเอง!
เขียนโปรแกรมด้วย Python
(แก้ไขเมื่อ 12/11/2020 - เปลี่ยนไลบรารีจาก 'pyautogui' เป็น 'mouse')
ผู้ใช้ต้องติดตั้ง Python 3 ไว้บนแล็ปท็อป/คอมพิวเตอร์ของตัวเองก่อน
หลังการติดตั้ง ให้คัดลอกพาธของตำแหน่งไฟล์ Python
ขั้นตอนต่อไปนี้ให้ทำใน Command Prompt เปิด CMD ขึ้นมาแล้วพิมพ์ตามนี้เลยจ้า-
1. cd
2. py –m pip install –-upgrade pip
3. py –m pip install mouse
4. py -m pip install pyserial
โมดูล mouse เอาไว้สั่งให้เมาส์ขยับ ส่วนโมดูล pyserial เอาไว้คุยกับ Arduino พี่ลงไว้แล้ว เลยได้หน้าตาแบบนี้
โปรแกรม Python ที่เราทำขึ้นมา มันจะอ่านข้อมูลที่ Arduino ส่งมา แล้วแยกค่า x กับ y รวมถึงสถานะของสวิตช์ (SW) ออกมา
ตำแหน่งปัจจุบันของเคอร์เซอร์ได้มาจากฟังก์ชัน mouse.get_position() ซึ่งจะคืนค่า X กับ Y ของเคอร์เซอร์มาให้ในหน่วยพิกเซล
พอขยับจอยสติ๊ก ค่า Analog ที่ Arduino ส่งมาก็จะถูกนำไปบวก/ลบกับตำแหน่งปัจจุบันของเคอร์เซอร์ เพื่อเลื่อนไปทิศทางที่เราต้องการ
การจะขยับเคอร์เซอร์ไปตามทิศทางที่กำหนด ใช้ฟังก์ชัน mouse.move(X+x,Y+y) จัดการได้เลย
โดยที่ X กับ Y คือตำแหน่งปัจจุบันของเคอร์เซอร์ ส่วน x กับ y คือค่าที่เพิ่ม/ลด ที่ได้จาก Arduino
ตัวอย่าง: mouse.moveTo(100,150) จะขยับเคอร์เซอร์ไปที่พิกเซลที่ 100 บนแกน x และ 150 บนแกน y
ส่วนการคลิกเมาส์ตามสถานะของ SW ใช้ mouse.click(button="left") เลย
ขั้นตอนรันจริงจ้า
อัพโหลดโค้ด Arduino (ด้านล่าง) ลงบอร์ด Arduino UNO ของคุณ แล้วต่อจอยสติ๊กกับขา Arduino ตาม Schematic ที่ให้ไว้
หลังจากแน่ใจแล้วว่าโมดูล mouse กับ pyserial ติดตั้งในคอม/แล็ปท็อปเรียบร้อยแล้ว ให้ทำตามขั้นตอนนี้
1. คัดลอกโค้ด Python ไปไว้ในไฟล์ Notepad อย่าลืมระบุ COM port ของ Arduino ให้ถูกต้อง ดู COM port จาก Device Manager ได้เลย บันทึกไฟล์เป็น ".py" หลังจากแก้ไขแล้ว
2. เปิด IDLE ของ Python (python GUI) แล้วเปิดไฟล์ Notepad จากในนั้น
3. รันโมดูลซะ
จากนั้นมันจะพาคุณกลับไปที่หน้าจอใน Fig 4
ถ้าเห็น Error อะไรขึ้นมา ให้ลองรีสตาร์ท IDLE ใหม่ แล้วตรวจสอบว่าใส่ COM port ของ Arduino ถูกต้องมั้ย
ถ้าไม่มี Error แล้ว ลองขยับจอยสติ๊กดู คุณจะเห็นเคอร์เซอร์ขยับตามเลย สู้งานนะน้อง!