Arduino 操纵杆在串行监视器中工作,而不是游戏控制器对话框

Arduino Joystick works in serial monitor, not game controller dialog

我正在尝试使用非品牌 ATmega32U4 板创建一个简单的 2 轴、2 按钮操纵杆,该板注册为 Arduino Leonardo .

我在 Arduino IDE 的串口监视器上运行良好,并且在 "Devices and Printers" 中显示为具有正确输入量的游戏控制器,但出于某种原因串口数据未传输到游戏控制器测试对话框,因此操纵杆在串口监视器之外无法正常工作。

这是我使用 Arduino 的第一个项目,所以我确定我只是遗漏了一些简单的东西,但老实说,我很困惑。

在用尽我所有的 Google-fu 和一些试验和错误之后,这是我能想到的最好的,所以我很感激我能得到的任何帮助来让这个工作适当地。我正在使用 THIS 操纵杆库。

// Pin A2 = X Axis
// Pin A3 = Y Axis
// Pin 16 = Button 1
// Pin 10 = Button 2
//
//--------------------------------------------------------------

#include "Joystick.h"

// 2 Buttons, No hats, X and Y axis, no Z axis, Rx, Ry, Rz, Rudder, Throttle, Brake, or Steering
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,JOYSTICK_TYPE_JOYSTICK, 2, 0, true, true, false, false, false, false, false, false, false, false, false);

void setup() {

    Serial.begin(9600);
    while (!Serial) {
    ;
    }

    pinMode(A2, INPUT);
    pinMode(A3, INPUT);
    pinMode(16, INPUT_PULLUP);
    pinMode(10, INPUT_PULLUP);

    Joystick.begin();
    Joystick.setXAxisRange(-512, 512);
    Joystick.setYAxisRange(-512, 512);
}

void loop() {

    // X-Axis
    int xAxis = analogRead(A2);
    Joystick.setXAxis(xAxis);
    Serial.println(xAxis);

    // Y-Axis
    int yAxis = analogRead(A3);
    Joystick.setYAxis(yAxis);
    Serial.println(yAxis);

    // Button 1
    int button1State = !digitalRead(16);
    if (button1State = 1)
    {         
       Joystick.pressButton(0);
    }

    // Button 2
    int button2State = !digitalRead(10);
    if (button2State = 1)
    {         
       Joystick.pressButton(1);
    }
}

我在我的循环中添加了延迟,我认为这似乎解决了我的问题(并让我注意到另一个问题),但由于某种原因它似乎只工作 部分 的时候......有时它工作得很好,有时测试对话框没有注意到我的输入,有时对话框只是冻结......这是我所做的更改:

// X-Axis
int xAxis = analogRead(A2);
Joystick.setXAxis(xAxis);
Serial.println(xAxis);
delay(50);

// Y-Axis
int yAxis = analogRead(A3);
Joystick.setYAxis(yAxis);
Serial.println(yAxis);
delay(50);

// Button 1
int button1State = !digitalRead(16);
if (button1State == 1)
{         
   Joystick.pressButton(0);
   delay(50);
}


// Button 2
int button2State = !digitalRead(10);
if (button2State == 1)
{         
   Joystick.pressButton(1);
   delay(50);
}

您可能想在 'if' 语句中使用 == 来检查是否相等,现在无论输入如何,它都会分配值 1。

在尝试了几乎所有其他方法之后,我决定尝试注释掉所有串行通信,现在它可以工作了!我对 Arduino 没有足够的经验,不知道我写的串行通信的哪一部分搞砸了,但没有它我的草图工作得很好。 (除了我的一个按钮,但我认为那可能只是一个错误的别针)

这就是我最终得到的,以防其他人发现它有用:

// Pin A2 = X Axis
// Pin A3 = Y Axis
// Pin 16 = Button 1
// Pin 10 = Button 2
//
//--------------------------------------------------------------

#include "Joystick.h"

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,JOYSTICK_TYPE_JOYSTICK, 2, 0, true, true, false, false, false, false, false, false, false, false, false);

void setup() {    

    pinMode(A2, INPUT);
    pinMode(A3, INPUT);
    pinMode(16, INPUT_PULLUP);
    pinMode(10, INPUT_PULLUP);

    Joystick.begin();
}

void loop() {

    // X-Axis
    int xAxis = analogRead(A2);
    Joystick.setXAxis(xAxis);

    // Y-Axis
    int yAxis = analogRead(A3);
    Joystick.setYAxis(yAxis);

    // Button 1
    int button1State = !digitalRead(16);
    if (button1State == 1)
    {         
       Joystick.pressButton(0);
    }
    else
    {  
      Joystick.releaseButton(0);
    }

    // Button 2
    int button2State = !digitalRead(10);
    if (button2State == 1)
    {         
       Joystick.pressButton(1);
    }
    else
    {  
      Joystick.releaseButton(1);
    }

    delay(50);
}

while (!Serial) 等待串行连接打开。当您打开 Arduino IDE 的串行监视器时,您的代码开始执行。如果不这样做,代码将不会 运行 并且不会向 PC 发送任何输入。

删除

while (!Serial) {
;
}

它只用于调试,所以当你打开串行监视器时程序就会启动,你不会错过任何开头的调试信息。