虽然说买一个简易的手柄也就几十块钱,效果还比这个好很多,但总是想自己做一个玩玩。
所用材料:
arduino leonardo板子一个,
arduino mega2560外壳一个,
JoyStick Shield手柄扩展板一个。
将上述物品组装在一起,如图:
接着就是能够实现手柄功能的代码:
#include <Joystick.h>
#define RANGE 30
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,JOYSTICK_TYPE_GAMEPAD,
7, 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);
pinMode(7, 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[7] = {0,0,0,0,0,0,0};
int X,oldX;
int Y,oldY;
void loop() {
// Read pin values
for (int index = 0; index < 7; index++)
{
int currentButtonState = !digitalRead(index + 2);
if (currentButtonState != lastButtonState[index])
{
Joystick.setButton(index, currentButtonState);
lastButtonState[index] = 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);
}
所用到的库文件:https://github.com/MHeironimus/ArduinoJoystickLibrary
其中有些参数可以根据需要酌情修改。
扩展版引脚定义:
X值接A0口
Y值接A1口
A接D2
B接D3
C接D5
D接D4
E接D6
F接D7
下载完程序,连上电脑就能识别成一个手柄了,但现在还没有按键映射,这里还需要另一个工具Xpadder(点击下载),利用这个来完成按键的映射。推荐使用提供的这个老版本,功能够用操作简单,新版在win10上好像有点问题。软件使用很简单,新建配置文件和映射文件即可。
最后一切搞定,来吧小时候的魂斗罗~
参考连接:
https://www.arduino.cn/thread-46192-1-2.html
https://www.jianshu.com/p/9fc765524050