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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 15986|回复: 15

Arduono Leonardo 打造USB 手柄

[复制链接]
发表于 2017-6-4 17:18 | 显示全部楼层 |阅读模式
Lenorado 本身支持原生 USB,因此我们有机会用它来制作一个USB游戏手柄。
先说两句关于 USB 游戏操作杆的事情。常见的有两种,一种是类似下面的称作  gamepad,可以用来玩格斗游戏
image001.jpg
                              
还有一种是玩模拟飞行的 Joystick,个人觉得翻译为游戏摇杆比较合适
image002.jpg
大多数情况下,这两个词可以通用。以我的理解来说,二者的差别在于 Gamepad 输出可以理解为数字信号。比如:四个按键输出值是01,上下左右输出也是0 1。而Joystick还会输出模拟值,比如:飞行时发动机输出功率就是一个模拟值,或者是当前倾斜角度等等。
今天我们要做的是Gamepad。实现一个十字键和四个按钮。简单起见,我在淘宝上选择下面的 JoyStichShield。这个Shield上有5个按键(X Y 轴带有一个按键,可以按下),X Y 的输出实际上是从01023的模拟值。处于原点时,输出为512 (实际测试上由于一些原因,我的Y轴原点输出在504 左右)。
image003.png
为了实现这个功能,我使用了来自https://github.com/MHeironimus/ArduinoJoystickLibraryJoyStick库。
使用下面的代码来完成对于GamePad的初始化。

[kenrobot_code]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);  // 没有加速器,刹车和转向[/kenrobot_code]

此外,代码中还设置了一个XY 的阈值,在一定范围内的都被算作出于0的位置.
最终的代码如下
[kenrobot_code]// 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[5] = {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[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);
}[/kenrobot_code]
最后在调试的时候,可以在 Control Panel –>Hardware and Sound ->View devices painters 中看到我们的设备
image004.png
Arduino Leonardo 设备上点击右键
image005.png
弹出下面的窗口
image006.png
查看 properties,可以用来进行测试
image007.png
特别注意:你编写的代码在不按下任何键的时候,Arduino TX LED都不应该亮.如果亮说明有数据传输,你的代码有bug,会对整体操作有很大的影响。
image008.jpg

如果有兴趣,可以设计更多按键的手柄,可以在按键上定义自己的功能。按下一个按钮就可以发出连续的招数会让游戏更简单。

发表于 2017-6-5 12:18 | 显示全部楼层
打印个外壳更佳
发表于 2018-3-18 13:36 | 显示全部楼层
某些摇杆Y轴中点是504左右,正常
 楼主| 发表于 2018-3-18 20:57 | 显示全部楼层
798463521ljl 发表于 2018-3-18 13:36
某些摇杆Y轴中点是504左右,正常

为什么做成这样的?
发表于 2019-3-14 20:14 | 显示全部楼层
为啥声明4个键,却写了五个键啊,这是为什么,求教
 楼主| 发表于 2019-3-14 21:24 | 显示全部楼层
冬季风吹雪 发表于 2019-3-14 20:14
为啥声明4个键,却写了五个键啊,这是为什么,求教

方向键可以按下去的
发表于 2020-2-25 22:40 | 显示全部楼层
为什么我做出来的摇杆没有线性控制的呢。。win10 系统
 楼主| 发表于 2020-2-26 08:34 | 显示全部楼层
362442340 发表于 2020-2-25 22:40
为什么我做出来的摇杆没有线性控制的呢。。win10 系统

我这个代码里面没有线性控制的,都是按键就是按下抬起
发表于 2020-2-26 22:18 | 显示全部楼层
Zoologist 发表于 2020-2-26 08:34
我这个代码里面没有线性控制的,都是按键就是按下抬起

请问怎么才能实现摇杆线性控制呢
 楼主| 发表于 2020-2-27 08:56 | 显示全部楼层
362442340 发表于 2020-2-26 22:18
请问怎么才能实现摇杆线性控制呢

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

其中 x y z 轴用  16Bit实现的,你可以研究一下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 09:33 , Processed in 0.101166 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表