查看: 4486|回复: 5

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

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

打赏作者鼓励一下!

2人打赏

该用户从未签到

发表于 2017-6-5 12:18 | 显示全部楼层
打印个外壳更佳
  • TA的每日心情
    慵懒
    2018-4-19 10:23
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    发表于 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个键,却写了五个键啊,这是为什么,求教

    方向键可以按下去的
    打赏作者鼓励一下!
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    BlinkerAT固件不能用
    BlinkerAT固件不能用
    如图,在配网的时候就卡住了,再发指令就没用了,固件和库都是今天刚下载的,以前的也不好
    为什么这个库已经装好了可是在调用的时候却没有显示
    为什么这个库已经装好了可
    为什么这个库已经装好了可是在调用的时候却没有显示求解决
    UART 传输(字符)不稳定,如何解决数据错位和乱码的情况
    UART 传输(字符)不稳定
    求助大家,我正在写一个 UART 传输多组数据的项目,想要将一端 Arduino 的多组数据通
    请问这是什么板子?
    请问这是什么板子?
    如图,两年前比赛学校发的,但网上找不到资料,现在翻出来,想问问有人知道它怎么用吗
    【原创】 drawbot平面关节scara机械臂写字机 画画机器人直播...
    【原创】 drawbot平面关节
    这个项目上个月就在做了,结构和代码反反复复改了多次,加上自己又太忙,一直没来得及
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表