[TH] Arduino: Joystick Module

บทความนี้เป็นการเขียนโปรแกรมเพื่อใช้งานโมดูลจอยสติก (Joystick) ดังภาพที่ 1 ซึ่งตัวโมดูลสามารถบอกข้อมูลการเคลื่อนที่ในแกน X การเคลื่อนที่ในแกน Y และสถานะการกดสวิทตช์ที่ตัวจอยสติก โดยตัวอย่างการใช้งานโมดูลนี้เป็นการใช้กับบอร์ด esp32 โดยใช้ภาษา C++ เพื่อเชื่อมต่อกับ GPIO ด้วยคำสั่งที่เคยกล่าวไปแล้วในบทความนี้

ภาพที่ 1 โมดูลจอยสติกกับ esp32

Joystick Module

โมดูลจอยสติกจากภาพที่ 1 เป็นจอยสติกที่นิยมใช้กับเครื่องเล่นเกม มีเซ็นเซอร์แบบแอนาล็อก 2 แกนสำหรับอ่านค่าในแกน X และ Y ซึ่งข้อดีของเซ็นเซอร์เป็นแบบแอนาล็อก คือ ทำให้ทราบว่ามีการเคลื่อนที่แบบละเอียด ซึ่งแตกต่างจากการใช้สวิตช์แบบดิจิทัลที่ทราบเพียงสถานะกดหรือไม่ได้กด ขณะที่แอนาล็อกนั้นให้ความละเอียดตามความละเอียดของวงจร ADC (Analog to Digital Converter) ของไมโครคอนโทรลเลอร์ เช่น ADC แบบ 8 บิต จะให้ค่าเป็น 0 ถึง 255 และ ADC แบบ 10 บิต ให้ค่าในช่วง 0 ถึง 1023 เป็นต้น ดังนั้น การใช้โมดูลนี้ต้องเลือกใช้ไมโครคอนโทรลเลอร์ที่มีภาค ADC ให้ใช้งานอย่างน้อย 2 ช่องสัญญาณ หรือ 2 ขา และเมื่ออ่านค่าจากเซ็นเซอร์จะได้ค่าดังนี้

  1. น้อยสุดแทนการอยู่ด้านซ้ายหรือด้านล่าง ซึ่งเป็นค่า Xmin และ Ymin
  2. ค่ามากสุดเมื่อโยกไปทางขวาสุดหรือด้านบนสุด ซึ่งเป็นค่า Xmax และ Ymax
  3. ค่าตรงกลางเมื่อไม่ได้โยกคันโยก ซึ่งเป็นค่า Xcenter และ Ycenter

การเชื่อมต่อกับโมดูลจะต้องเชื่อมผ่านทางขา 5 ขาดังภาพที่ 2 ซึ่งการเชื่อมต่อกับ ESP32 กระทำดังตารางต่อไปนี้

จอยสติกโมดูลESP32
VRXSN หรือ VN หรือ IO39
VRYSP หรือ VP หรือ IO36
SWIO16
+5VDC3V3
GNDGND
ภาพที่ 2 ขาของโมดูลจอยสติก

การตั้งค่าของ Arduino IDE เป็นดังภาพที่ 3

ภาพที่ 4 การตั้งค่าสำหรับบอร์ด ESP32 Dev Kit

ตัวอย่างโปรแกรม

ตัวอย่างโปรแกรมอ่านค่าพิกัดแกน X, Y และสถานะการกดสวิตช์ของคันโยกเป็นดังนี้

#define VR_X_PIN 39
#define VR_Y_PIN 36
#define SW_PIN 16

void setup() {
  Serial.begin(115200);
  pinMode( SW_PIN, INPUT_PULLUP );
}

void doUpdate() {
  uint16_t x = analogRead( VR_X_PIN );
  uint16_t y = analogRead( VR_Y_PIN );
  bool sw = digitalRead( SW_PIN );
  Serial.print(x);
  Serial.print(" ");
  Serial.print(y);
  Serial.print(" ");
  Serial.println(sw);
}

void loop() {
  doUpdate();
  delay(500);
}

ตัวอย่างผลลัพธ์ของการทำงานจากโปรแกรมตัวอย่างเป็นดังภาพที่ 4

ภาพที่ 4 ตัวอย่างผลลัพธ์ของการอ่านข้อมูลจากโมดูลจอยสติก

สำหรับภาษาไพธอนเขียนได้ดังนี้

###########################################################
# Joystick module + ESP32 + MicroPython
# By JarutEx (https://www.jarutex.com)
###########################################################
from machine import Pin, ADC
import time
import machine as mc

mc.freq(240000000)
vrx = ADC(Pin(39, Pin.IN))
vrx.atten(ADC.ATTN_11DB)       #Full range: 3.3v
vry = ADC(Pin(36, Pin.IN))
vry.atten(ADC.ATTN_11DB)       #Full range: 3.3v
sw = Pin(16, Pin.IN, Pin.PULL_UP)

def doUpdate():
    vrxValue = vrx.read()
    vryValue = vry.read()
    swValue = sw.value()
    print("({},{}):{}".format(vrxValue,vryValue,swValue))

while True:
    doUpdate()
    time.sleep_ms(500)

สรุป

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

ท่านใดอยากพูดคุยหรือสอบถามสามารถคอมเมนท์ไว้ได้เลยครับ

แหล่งอ้างอิง

  1. PS2 XY Joystick Module
  2. JoyStick Breakout Module Shield for PS2 Joystick Game Controller For Arduino
  3. ADC WiKiPedia
  4. ESP32-DEV-KIT

(C) 2020-2021, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2021-07-04, 2021-10-12