虽然说买一个简易的手柄也就几十块钱,效果还比这个好很多,但总是想自己做一个玩玩。
所用材料:
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