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) {
;
}
它只用于调试,所以当你打开串行监视器时程序就会启动,你不会错过任何开头的调试信息。
我正在尝试使用非品牌 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) {
;
}
它只用于调试,所以当你打开串行监视器时程序就会启动,你不会错过任何开头的调试信息。