廚老伯開槍中

Adruino 搖桿元件

PS2 XY 搖桿模組

這是 37 in 1 配件中的 XY搖桿模組
這模組其實有 XYZ三種輸出
不過 Z 只有 0/1,對應的接腳是 SW
X/Y 的輸出是0-1024, 在中間時是 522
基本上是個很容易使用的模組
基本使用法是 joystick1

joystick2 是一個小小的改進
目標是讓搖桿歸零時,數值不歸零
想到的作法有兩種,一種作法是用 Z 軸記錄指數,然後忽略一定時間內的輸出,並在輸出達到特定範圍內才解除鎖定
另一種想法是偵測輸出參數是否超出中心範圍,只在超出中心的情況下記錄指數
用z軸歸零,這種作法會需要用到中斷設計
下面的 joyStick2 就是這種作法

不過這個號稱 PS2 XY 搖桿的模組有點怪怪的..
z 軸輸入很不穩定,把它放到中斷的話會一直中斷...
所以上述作法不能用 orz
最後是將 z 換到 A2, 透過按下去時輸入為 0 的情況清空記錄
這段放在 joystick2

// joyStick1.ino

int xValue = 0;
int yValue = 0;
int zValue = 0;

int xPin = 0;
int yPin = 1;
int zPin = 2;

void setup() {
    pinMode(zPin, OUTPUT);
    Serial.begin(9600);
}

void loop() {
    xValue = analogRead(xPin);
    Serial.print("X: ");
    Serial.print(xValue, DEC);

    yValue = analogRead(yPin);
    Serial.print(" | Y: ");
    Serial.print(yValue, DEC);

    zValue = digitalRead(zPin);
    Serial.print(" | Z:");
    Serial.println(zValue, DEC);
    delay(500);
}

// joyStick2.ino

// 數值暫存
int xValue = 0;
int yValue = 0;

//volatile int zFlag = LOW;
// 數值記錄
int recordX = 0;
int recordY = 0;

// 接腳, x/y 是 A0/A1
int xPin = 0; // A0
int yPin = 1; // A1
int zPin = 2; // A2

// 高通、低通,因為中間是 512左右,所以上下加 200
int lowPass = 312;
int highPass = 712;

void setup() {
    // pinMode(xPin, INPUT);
    // pinMode(yPin, INPUT);
    // pinMode(zPin, INPUT);
    Serial.begin(9600);
}

void loop() {
    xValue = analogRead(xPin);
    yValue = analogRead(yPin);

    // 有時間的話,可以把這邊換成三角函數
    if((xValue > highPass || xValue < lowPass)
        || (yValue > highPass || yValue < lowPass)) {
        recordX = xValue;
        recordY = yValue;
    }
    // 假設使用者只會在按鈕置於中央時按下 Z 鍵
    else if(analogRead(zPin) == 0){
        // cycle of reset
        recordX = 512;
        recordY = 512;
    }

    // 檢查 x ,y, z 用
    Serial.print("X: ");
    Serial.print(recordX, DEC);
    Serial.print(" | Y: ");
    // Serial.println(recordY, DEC);
    Serial.print(recordY, DEC);
    Serial.print(" | Z:");
    Serial.println(analogRead(zPin), DEC);
    delay(200);
}
comments powered by Disqus