Arduino Joystick适用于串行监视器,而不是游戏控制器对话框

时间:2018-02-15 05:12:11

标签: arduino hid atmega joystick

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

我在Arduino IDE的串行监视器上运行得很好,它在“设备和打印机”中显示为具有正确输入量的游戏控制器,但由于某种原因,串行数据不是转移到游戏控制器测试对话框,因此操纵杆无法在串行监视器外工作。

这是我与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);
    }
}

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

// 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);
}

3 个答案:

答案 0 :(得分:3)

您可能希望在'内使用==检查是否相等的语句,现在无论输入如何都分配值1.

答案 1 :(得分: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);
}

答案 2 :(得分:1)

int main (void)等待打开串行连接。当您打开Arduino IDE的串行监视器时,您的代码就会开始执行。如果您没有,代码将无法运行,并且不会向PC发送任何输入。

删除

while (!Serial)

它仅用于调试,因此程序在您打开串行监视器时启动,并且您不会在开始时错过任何调试消息。