Arduono Leonardo 打造USB 手柄-Arduino中文社区 - Powered by Discuz! Archiver

Zoologist 发表于 2017-6-4 17:18

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,会对整体操作有很大的影响。
如果有兴趣,可以设计更多按键的手柄,可以在按键上定义自己的功能。按下一个按钮就可以发出连续的招数会让游戏更简单。

li_qiuming 发表于 2017-6-5 12:18

打印个外壳更佳

798463521ljl 发表于 2018-3-18 13:36

某些摇杆Y轴中点是504左右,正常

Zoologist 发表于 2018-3-18 20:57

798463521ljl 发表于 2018-3-18 13:36
某些摇杆Y轴中点是504左右,正常

为什么做成这样的?

冬季风吹雪 发表于 2019-3-14 20:14

为啥声明4个键,却写了五个键啊,这是为什么,求教

Zoologist 发表于 2019-3-14 21:24

冬季风吹雪 发表于 2019-3-14 20:14
为啥声明4个键,却写了五个键啊,这是为什么,求教

方向键可以按下去的

362442340 发表于 2020-2-25 22:40

为什么我做出来的摇杆没有线性控制的呢。。win10 系统

Zoologist 发表于 2020-2-26 08:34

362442340 发表于 2020-2-25 22:40
为什么我做出来的摇杆没有线性控制的呢。。win10 系统

我这个代码里面没有线性控制的,都是按键就是按下抬起

362442340 发表于 2020-2-26 22:18

Zoologist 发表于 2020-2-26 08:34
我这个代码里面没有线性控制的,都是按键就是按下抬起

请问怎么才能实现摇杆线性控制呢

Zoologist 发表于 2020-2-27 08:56

362442340 发表于 2020-2-26 22:18
请问怎么才能实现摇杆线性控制呢

你看看 https://github.com/MHeironimus/ArduinoJoystickLibrary 这个项目

其中 x y z 轴用16Bit实现的,你可以研究一下
页: [1] 2
查看完整版本: Arduono Leonardo 打造USB 手柄