บทความนี้เป็นการเขียนโปรแกรมเพื่อใช้งานโมดูลจอยสติก (Joystick) ดังภาพที่ 1 ซึ่งตัวโมดูลสามารถบอกข้อมูลการเคลื่อนที่ในแกน X การเคลื่อนที่ในแกน Y และสถานะการกดสวิทตช์ที่ตัวจอยสติก โดยตัวอย่างการใช้งานโมดูลนี้เป็นการใช้กับบอร์ด esp32 โดยใช้ภาษา C++ เพื่อเชื่อมต่อกับ GPIO ด้วยคำสั่งที่เคยกล่าวไปแล้วในบทความนี้
Joystick Module
โมดูลจอยสติกจากภาพที่ 1 เป็นจอยสติกที่นิยมใช้กับเครื่องเล่นเกม มีเซ็นเซอร์แบบแอนาล็อก 2 แกนสำหรับอ่านค่าในแกน X และ Y ซึ่งข้อดีของเซ็นเซอร์เป็นแบบแอนาล็อก คือ ทำให้ทราบว่ามีการเคลื่อนที่แบบละเอียด ซึ่งแตกต่างจากการใช้สวิตช์แบบดิจิทัลที่ทราบเพียงสถานะกดหรือไม่ได้กด ขณะที่แอนาล็อกนั้นให้ความละเอียดตามความละเอียดของวงจร ADC (Analog to Digital Converter) ของไมโครคอนโทรลเลอร์ เช่น ADC แบบ 8 บิต จะให้ค่าเป็น 0 ถึง 255 และ ADC แบบ 10 บิต ให้ค่าในช่วง 0 ถึง 1023 เป็นต้น ดังนั้น การใช้โมดูลนี้ต้องเลือกใช้ไมโครคอนโทรลเลอร์ที่มีภาค ADC ให้ใช้งานอย่างน้อย 2 ช่องสัญญาณ หรือ 2 ขา และเมื่ออ่านค่าจากเซ็นเซอร์จะได้ค่าดังนี้
- น้อยสุดแทนการอยู่ด้านซ้ายหรือด้านล่าง ซึ่งเป็นค่า Xmin และ Ymin
- ค่ามากสุดเมื่อโยกไปทางขวาสุดหรือด้านบนสุด ซึ่งเป็นค่า Xmax และ Ymax
- ค่าตรงกลางเมื่อไม่ได้โยกคันโยก ซึ่งเป็นค่า Xcenter และ Ycenter
การเชื่อมต่อกับโมดูลจะต้องเชื่อมผ่านทางขา 5 ขาดังภาพที่ 2 ซึ่งการเชื่อมต่อกับ ESP32 กระทำดังตารางต่อไปนี้
จอยสติกโมดูล | ESP32 |
---|---|
VRX | SN หรือ VN หรือ IO39 |
VRY | SP หรือ VP หรือ IO36 |
SW | IO16 |
+5VDC | 3V3 |
GND | GND |
การตั้งค่าของ Arduino IDE เป็นดังภาพที่ 3
ตัวอย่างโปรแกรม
ตัวอย่างโปรแกรมอ่านค่าพิกัดแกน 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
สำหรับภาษาไพธอนเขียนได้ดังนี้
###########################################################
# 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 มาก ๆ จะให้ค่าที่ละเอียดขึ้น สามารถนำมาแปลผลสำหรับเป็นค่าของการเคลื่อนที่ได้ดียิ่งขึ้น สุดท้ายนี้ขอให้สนุกกับการเขียนโปรแกรมครับ
ท่านใดอยากพูดคุยหรือสอบถามสามารถคอมเมนท์ไว้ได้เลยครับ
แหล่งอ้างอิง
- PS2 XY Joystick Module
- JoyStick Breakout Module Shield for PS2 Joystick Game Controller For Arduino
- ADC WiKiPedia
- ESP32-DEV-KIT
(C) 2020-2021, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2021-07-04, 2021-10-12