Arduono Leonardo 打造USB 手柄
Lenorado 本身支持原生 USB,因此我们有机会用它来制作一个USB游戏手柄。先说两句关于 USB 游戏操作杆的事情。常见的有两种,一种是类似下面的称作gamepad,可以用来玩格斗游戏 还有一种是玩模拟飞行的 Joystick,个人觉得翻译为游戏摇杆比较合适 大多数情况下,这两个词可以通用。以我的理解来说,二者的差别在于 Gamepad 输出可以理解为数字信号。比如:四个按键输出值是0和1,上下左右输出也是0 和1。而Joystick还会输出模拟值,比如:飞行时发动机输出功率就是一个模拟值,或者是当前倾斜角度等等。今天我们要做的是Gamepad。实现一个十字键和四个按钮。简单起见,我在淘宝上选择下面的 JoyStichShield。这个Shield上有5个按键(X Y 轴带有一个按键,可以按下),X Y轴 的输出实际上是从0到1023的模拟值。处于原点时,输出为512 (实际测试上由于一些原因,我的Y轴原点输出在504 左右)。 为了实现这个功能,我使用了来自https://github.com/MHeironimus/ArduinoJoystickLibrary的JoyStick库。使用下面的代码来完成对于GamePad的初始化。Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,JOYSTICK_TYPE_GAMEPAD,
4, 0, // 只声明4个按键
true, true, false, // 声明有 X 轴,Y轴,但是没有Z轴
false, false, false, // 没有XYZ的模拟输出
false, false, // 没有舵和节流阀
false, false, false);// 没有加速器,刹车和转向
此外,代码中还设置了一个XY 的阈值,在一定范围内的都被算作出于0的位置.最终的代码如下// Simple gamepad example that demonstraits how to read five Arduino
// digital pins and map them to the Arduino Joystick library.
//
// The digital pins 2 - 6 are grounded when they are pressed.
// Pin 2 = UP
// Pin 3 = RIGHT
// Pin 4 = DOWN
// Pin 5 = LEFT
// Pin 6 = FIRE
//
// NOTE: This sketch file is for use with Arduino Leonardo and
// Arduino Micro only.
//
// by Matthew Heironimus
// 2016-11-24
//--------------------------------------------------------------------
#include <Joystick.h>
#define RANGE 30
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,JOYSTICK_TYPE_GAMEPAD,
4, 0, // Button Count, Hat Switch Count
true, true, false, // X and Y, but no Z Axis
false, false, false, // No Rx, Ry, or Rz
false, false, // No rudder or throttle
false, false, false);// No accelerator, brake, or steering
void setup() {
// Initialize Button Pins
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
pinMode(5, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP);
// Initialize Joystick Library
Joystick.begin();
Joystick.setXAxisRange(-1, 1);
Joystick.setYAxisRange(-1, 1);
Serial.begin(115200);
}
// Last state of the buttons
int lastButtonState = {0,0,0,0,0};
int X,oldX;
int Y,oldY;
void loop() {
// Read pin values
for (int index = 0; index < 5; index++)
{
int currentButtonState = !digitalRead(index + 2);
if (currentButtonState != lastButtonState)
{
Joystick.setButton(index, currentButtonState);
lastButtonState = currentButtonState;
}
}
X=analogRead(A0);
Y=analogRead(A1);
if ((X!=oldX) || (Y!=oldY))
{
if ((X>=512-RANGE) && (X<=512+RANGE))
{Joystick.setXAxis(0);}
else
if (X>512+RANGE)
{Joystick.setXAxis(-1);}
else
{Joystick.setXAxis(1);}
if ((Y>=512-RANGE)&&(Y<=512+RANGE))
{Joystick.setYAxis(0);}
else
if (Y>512+RANGE)
{Joystick.setYAxis(-1);}
else
{Joystick.setYAxis(1);}
oldX=X; oldY=Y;
}
delay(10);
}最后在调试的时候,可以在 Control Panel –>Hardware and Sound ->View devices painters 中看到我们的设备 在 Arduino Leonardo 设备上点击右键 弹出下面的窗口 查看 properties,可以用来进行测试 特别注意:你编写的代码在不按下任何键的时候,Arduino 的 TX LED都不应该亮.如果亮说明有数据传输,你的代码有bug,会对整体操作有很大的影响。
如果有兴趣,可以设计更多按键的手柄,可以在按键上定义自己的功能。按下一个按钮就可以发出连续的招数会让游戏更简单。
打印个外壳更佳 某些摇杆Y轴中点是504左右,正常
798463521ljl 发表于 2018-3-18 13:36
某些摇杆Y轴中点是504左右,正常
为什么做成这样的? 为啥声明4个键,却写了五个键啊,这是为什么,求教 冬季风吹雪 发表于 2019-3-14 20:14
为啥声明4个键,却写了五个键啊,这是为什么,求教
方向键可以按下去的 为什么我做出来的摇杆没有线性控制的呢。。win10 系统 362442340 发表于 2020-2-25 22:40
为什么我做出来的摇杆没有线性控制的呢。。win10 系统
我这个代码里面没有线性控制的,都是按键就是按下抬起 Zoologist 发表于 2020-2-26 08:34
我这个代码里面没有线性控制的,都是按键就是按下抬起
请问怎么才能实现摇杆线性控制呢 362442340 发表于 2020-2-26 22:18
请问怎么才能实现摇杆线性控制呢
你看看 https://github.com/MHeironimus/ArduinoJoystickLibrary 这个项目
其中 x y z 轴用16Bit实现的,你可以研究一下
页:
[1]
2