使用Arduino Leonardo将操纵杆作为游戏控制器的方式

描述

  在这个项目中,我们将使用与游戏手柄或游戏控制器相同的操纵杆来玩任何需要左右移动的电脑游戏。要玩需要更多控制选项的游戏,可以使用两个或更多操纵杆。在这里,我们将使用 Arduino Leonardo 将操纵杆作为游戏控制器进行接口。Arduino Leonardo 比 Uno 的优势在于我们可以在其上安装 USB 驱动程序,并且在连接时可以被计算机检测为鼠标、键盘或操纵杆。

  所需组件

  阿杜诺·莱昂纳多

  双轴XY操纵杆模块

  Arduino IDE

  连接线

  阿杜诺·莱昂纳多

  对于这个项目,我们使用的是 Arduino Leonardo,它是一个基于 ATmega32u4 的微控制器板。它有 20 个数字输入/输出引脚(其中 7 个可用作 PWM 输出,12 个用作模拟输入)、一个 16 MHz 晶体振荡器、一个微型 USB 连接、一个电源插孔、一个 ICSP 接头和一个复位按钮。它包含支持微控制器所需的一切;只需使用 USB 电缆将其连接到计算机或使用 AC-DC 适配器或电池为其供电即可开始使用。

操纵杆

  Leonardo 与之前所有开发板的不同之处在于 ATmega32u4 具有内置 USB 通信功能,无需辅助处理器。除了虚拟 (CDC) 串行/COM 端口外,这允许 Leonardo 在连接的计算机上显示为鼠标和键盘。

  技术规格

操纵杆

  引脚输出参考

操纵杆

  双轴XY操纵杆模块

  操纵杆 有不同的形状和尺寸。典型的 操纵杆模块 如下图所示。此操纵杆模块通常提供模拟输出,并且此模块提供的输出电压会根据我们移动它的方向不断变化。我们可以通过使用一些微控制器解释这些电压变化来获得运动方向。

操纵杆

  如您所见,此操纵杆模块有两个轴。它们是 X 轴和 Y 轴。JOY STICK 的每个轴都安装在电位器或电位器上。这些电位器的中点被驱动为 Rx 和 Ry。所以 Rx 和 Ry 是这些底池的可变点。当操纵杆处于待机状态时,Rx 和 Ry 充当分压器。

  当操纵杆沿水平轴移动时,Rx 引脚上的电压会发生变化。类似地,当它沿垂直轴移动时,Ry 引脚上的电压会发生变化。所以 我们在两个 ADC 输出上有四个方向的操纵杆。当摇杆移动时,每个引脚上的电压会根据方向变高或变低。

  电路原理图

  此Arduino 操纵杆游戏控制器需要 Arduino 和操纵杆之间的连接,如下所示:

操纵杆

操纵杆

操纵杆

  代码和工作说明

  最后给出完整的代码和演示视频;在这里,我们解释它的几个重要部分。

  首先,我们需要初始化键盘库

  #include《键盘.h》

  接下来在下面的代码中,我们分别为模拟引脚 A0 和 A1 初始化了操纵杆模块的 X 和 Y 轴。

  const int X_pin 和 const int Y_pin 分别

  读取 VRX 引脚的模拟值,如果值为 1023,则给出“向上”命令,如果值为 0,则给出“向下”命令。

  类似地,读取 VRY 引脚的模拟值,如果值为 1023,则给出“右”命令,如果值为 0,则给出“左”命令。

  操纵杆顶部还有一个按钮,因此该按钮 (SW) 也会被读取,如果按下按钮,则值将为 0,然后给出“输入”命令。

  最后将代码烧录到 Arduino 中,并将 Arduino 与计算机连接。

  接下来检查控制面板中的“设备和打印机”,您将能够在设备部分下看到“ Arduino Leonardo”,如下图所示。现在您可以开始使用操纵杆了。

操纵杆

  我们可以使用此操纵杆控制任何游戏控件。摇杆内部有两个电位器,一个用于 X 轴移动,另一个用于 Y 轴移动。每个电位器从 Arduino 获得 5v。所以当我们移动操纵杆时,电压值会改变,模拟引脚 A0 和 A1 的模拟值也会改变。所以操纵杆将充当游戏手柄。

操纵杆

  因此,这就是使用 Arduino Leonardo 将普通操纵杆转换为游戏控制器的方式,并可用于玩具有向左、向右、向上和向下移动的所有控件的游戏。如前所述,除了这四个基本功能之外,可以连接多个操纵杆以获得更多控制。

#include<键盘.h>


常量 int SW_pin = 2; // 数字引脚连接到开关输出

const int X_pin = A0; // 模拟引脚连接到 X 输出

const int Y_pin = A1; // 模拟引脚连接到 Y 输出

int x, y;

无效设置()

{

pinMode(SW_pin,输入);// SW 引脚设置为输入

digitalWrite(SW_pin, HIGH); // 向 SW 引脚写入高值

Serial.begin(115200);

键盘.开始();

}

无效循环()

{

x = 模拟读取(X_pin);// 读取 X_pin 的输出

if (x == 1023) // 检查 x = 1023

{

Serial.println("Up:");

键盘.press(218); // 键向上移动

}

else

{

键盘.release(218); // 释放键

}

x = analogRead(X_pin); // 读取 X_pin 的输出

if (x == 0) // 检查 x 的值是否 = 0


{

Serial.println("向下:");

键盘.press(217); // 键向下移动

}

else

{

Keyboard.release(217); // 释放键

}

y = analogRead(Y_pin); // 读取 Y_pin 的输出


if (y == 1023) // 检查 y = 1023

{

Serial.println("Right:");

键盘.press(216); // 键向右移动

}

else

{

Keyboard.release(216); // 释放键

}

y = analogRead(Y_pin); // 读取 Y_pin 的输出


if (y == 0) // 检查 y = 0

{

Serial.println("Left:");

键盘.press(215); // 键向左移动


}

else

{

键盘.release(215); // 释放密钥

}

int z = digitalRead(SW_pin); // 读取 SW pin 的值

if (z == 0) // 检查 z 的值是否 = 0

{

Serial.println("Enter:");

键盘.println(); //按下回车键

}

delay(500);

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
评论(0)
发评论
出生入屎 2023-11-14
0 回复 举报
您好,我也做了一个,用了四个轴,但是四个轴一起用的时候轴间有干扰,怎么解决啊 收起回复

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分