0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何用Arduino Uno和游戏杆制作PC鼠标

454398 来源:网络整理 作者:佚名 2019-11-05 17:01 次阅读

第1步:材料

这个项目不需要很多材料:

1 Arduino Uno

5对公对母线

5对母对母线(连接到操纵杆模块并添加操纵杆的延伸长度。

1个操纵杆(我使用了SainSmart PS2游戏杆模块,并且会推荐它)

步骤2:设置Arduino Uno

Uno的设置可以在材料图片,以及这里的说明:

将五根母头线连接到操纵杆模块的引脚上。现在,将五根公头线连接到母线的末端并将它们连接到这样的Arduino:

1.操纵杆上的地面到Arduino Gnd

2.操纵杆上的+ 5V到Arduino 5V

3。操纵杆上的UPx到Arduino上的A0

4.操纵杆上的UPy到A1

5. SW引脚(数字式点击开关)到数字引脚7上Arduino

第3步:上传Joysti ck程序到Arduino

将Uno连接到你的PC并上传这里看到的操纵杆代码(请注意我最初没有创建这个代码):

int pushPin = 7; // potentiometer wiper (middle terminal) connected to analog pin 3

int xPin = 0;

int yPin = 1;

int xMove = 0;

int yMove = 0;

// outside leads to ground and +5V

int valPush = HIGH; // variable to store the value read

int valX = 0;

int valY = 0;

void setup()

{

pinMode(pushPin,INPUT);

Serial.begin(9600); // setup serial

digitalWrite(pushPin,HIGH);

}

void loop()

{

valX = analogRead(xPin); // read the x input pin

valY = analogRead(yPin); // read the y input pin

valPush = digitalRead(pushPin); // read the push button input pin

Serial.println(String(valX) + “ ” + String(valY) + “ ” + valPush); //output to Java program

}

步骤4:设置Java程序

现在已经设置了Uno,我们需要将它连接到我的Java程序,该程序能够获取Uno的串行输出值特殊库RxTx并使用库集合JNA移动鼠标。这两个库都包含在此步骤结束时供下载。请注意,我从示例RxTx中更改的代码的唯一部分是添加了以我为操纵杆校准的方式移动鼠标的方法。它有点粗糙,但它符合我的目的。

我使用BlueJ作为我的IDE,但无论你使用哪种Java IDE,都要为这个项目安装RxTx和JNA库,我将其命名为“Mouse”。完成后,创建一个项目并包含以下代码:

import java.awt.*;

import java.awt.event.InputEvent;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.OutputStream;

import gnu.io.CommPortIdentifier;

import gnu.io.SerialPort;

import gnu.io.SerialPortEvent;

import gnu.io.SerialPortEventListener;

import java.util.Enumeration;

public class Mouse implements SerialPortEventListener {

SerialPort serialPort;

/** The port we‘re normally going to use. */

private static final String PORT_NAMES[] = {

“/dev/tty.usbserial-A9007UX1”, // Mac OS X

“/dev/ttyACM0”, // Raspberry Pi

“/dev/ttyUSB0”, // Linux

“COM4”, // Windows**********(I changed)

};

/**

* A BufferedReader which will be fed by a InputStreamReader

* converting the bytes into characters

* making the displayed results codepage independent

*/

private BufferedReader input;

/** The output stream to the port */

private OutputStream output;

/** Milliseconds to block while waiting for port open */

private static final int TIME_OUT = 2000;

/** Default bits per second for COM port. */

private static final int DATA_RATE = 9600;

int buttonOld = 1;

public void initialize() {

// the next line is for Raspberry Pi and

// gets us into the while loop and was suggested here was suggested http://www.raspberrypi.org/phpBB3/viewtopic.php?f.。.

//System.setProperty(“gnu.io.rxtx.SerialPorts”, “/dev/ttyACM0”); I got rid of this

CommPortIdentifier portId = null;

Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();

//First, Find an instance of serial port as set in PORT_NAMES.

while (portEnum.hasMoreElements()) {

CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();

for (String portName : PORT_NAMES) {

if (currPortId.getName().equals(portName)) {

portId = currPortId;

break;

}

}

}

if (portId == null) {

System.out.println(“Could not find COM port.”);

return;

}

try {

// open serial port, and use class name for the appName.

serialPort = (SerialPort) portId.open(this.getClass().getName(),

TIME_OUT);

// set port parameters

serialPort.setSerialPortParams(DATA_RATE,

SerialPort.DATABITS_8,

SerialPort.STOPBITS_1,

SerialPort.PARITY_NONE);

// open the streams

input = new BufferedReader(new InputStreamReader(serialPort.getInputStream()));

output = serialPort.getOutputStream();

// add event listeners

serialPort.addEventListener(this);

serialPort.notifyOnDataAvailable(true);

} catch (Exception e) {

System.err.println(e.toString());

}

}

/**

* This should be called when you stop using the port.

* This will prevent port locking on platforms like Linux.

*/

public synchronized void close() {

if (serialPort != null) {

serialPort.removeEventListener();

serialPort.close();

}

}

/**

* Handle an event on the serial port. Read the data and print it. In this case, it calls the mouseMove method.

*/

public synchronized void serialEvent(SerialPortEvent oEvent) {

if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {

try {

String inputLine=input.readLine();

mouseMove(inputLine);

System.out.println(“********************”);

//System.out.println(inputLine);

} catch (Exception e) {

System.err.println(e.toString());

}

}

// Ignore all the other eventTypes, but you should consider the other ones.

}

public static void main(String[] args) throws Exception {

Mouse main = new Mouse();

main.initialize();

Thread t=new Thread() {

public void run() {

//the following line will keep this app alive for 1000 seconds,

//waiting for events to occur and responding to them (printing incoming messages to console)。

try {Thread.sleep(1000000);} catch (InterruptedException ie) {}

}

};

t.start();

System.out.println(“Started”);

}

// My method mouseMove, takes in a string containing the three data points and operates the mouse in turn

public void mouseMove(String data) throws AWTException

{

int index1 = data.indexOf(“ ”, 0);

int index2 = data.indexOf(“ ”, index1+1);

int yCord = Integer.valueOf(data.substring(0, index1));

int xCord = Integer.valueOf(data.substring(index1 + 1 , index2));

int button = Integer.valueOf(data.substring(index2 + 1));

Robot robot = new Robot();

int mouseY = MouseInfo.getPointerInfo().getLocation().y;

int mouseX = MouseInfo.getPointerInfo().getLocation().x;

if (button == 0)

{

if (buttonOld == 1)

{

robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);

robot.delay(10);

}

}

else

{

if (buttonOld == 0)

robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);

}

if (Math.abs(xCord - 500) 》 5)

mouseX = mouseX + (int)((500 - xCord) * 0.02);

if (Math.abs(yCord - 500) 》 5)

mouseY = mouseY - (int)((500 - yCord) * 0.02);

robot.mouseMove(mouseX, mouseY);

buttonOld = button;

System.out.println(xCord + “:” + yCord + “:” + button + “:” + mouseX + “:” + mouseY);

return;

}

}

步骤5:疑难解答

使Java程序正常工作可能是难。如果您遇到困难我会得到一些提示:

- 将PORT_NAMES []中的“Com4”字符串更改为您的arduino Uno所连接的端口。 (我从Java程序中的默认Com3更改为Com4)

- 指出与Raspberry Pi相关的行(如果你复制了我的程序,我已经这样做了)

- 单击“重建软件包”或等效的IDE

-在IDE中重置Java虚拟机。甚至可能在第一次使用鼠标之前重置程序。

第6步:结论

我希望这个项目适用于您,并且您可以改善它。最终,最简单的解决方案是使用Arduino Leonard或Mini作为鼠标输入的系统设备,但我发现使Uno功能以非设计的方式 - 鼠标 - 通过使用我的方式很有趣有限的Java知识。

我独自学习了很多方法,并希望将来增加一些功能:

-右键单击按钮。操纵杆有一个我保留左键的按钮。

- 这个项目的实际设备驱动程序。我不确定这是否可行,也许有人可以就此问题给我启发!

责任编辑:wv

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 鼠标
    +关注

    关注

    6

    文章

    591

    浏览量

    39815
  • Arduino
    +关注

    关注

    188

    文章

    6472

    浏览量

    187353
收藏 人收藏

    评论

    相关推荐

    自己设计的Arduino UNO R3主控板原理图+PCB源文件(可直接打样)

    一年前做的Arduino UNO r3,开源精神,把自己这块板子奉献给大家,板子没有什么问题,可以直接打样制作,原理图文件都表明了型号。不用谢~ Arduino
    发表于 12-10 10:14

    采用霍尔效应传感器的游戏手柄和控制设计

    电子发烧友网站提供《采用霍尔效应传感器的游戏手柄和控制设计.pdf》资料免费下载
    发表于 10-30 09:56 0次下载
    采用霍尔效应传感器的<b class='flag-5'>游戏</b>手柄和控制<b class='flag-5'>杆</b>设计

    怎样用Arduino测试锂电池容量

    本文详细介绍了如何用Arduino测量锂电池的容量。并附有电路图和Arduino的程序代码。
    的头像 发表于 07-30 09:14 939次阅读
    怎样用<b class='flag-5'>Arduino</b>测试锂电池容量

    ESP32的程序是不是和uno r3一样都是以插入就开始运行?

    大神们好,小弟一直在用Arduino Uno R3来运行hex编好了的程序,但是uno r3的容量实在是太少了,所以想问问ESP32可以代替Uno r3吗? 还有,如果我有几个hex程
    发表于 06-25 07:56

    S2GO_3D_TLE493DW2B6-A0无法与Arduino UNO一起工作是怎么回事?

    我想使用 TLE493D-W2B6 为 Youtube Maker 项目制作一个触发控制装置。 我有一块 TLE493DW2B6 shield2go 板,我将它连接到 Arduino 上 我安装
    发表于 05-28 07:03

    放下你手中的游戏鼠标 | 小白测功耗

    上一期我们测试了合宙办公室常用的办公鼠标,这一期我们测试游戏鼠标!小白对游戏鼠标的刻板印象:发光/狂拽酷炫但这次选的两款热门
    的头像 发表于 05-13 17:09 1566次阅读
    放下你手中的<b class='flag-5'>游戏</b><b class='flag-5'>鼠标</b> | 小白测功耗

    何用Arduino开发STM32G070?

    何用Arduino开发STM32G070,各位大神有相关教程吗。我如何在Arduino的开发板管理器中添加STM32G070开发板,如何把程序下载到CPU中?
    发表于 04-07 08:22

    何用Arduino制作一个简易自动喂鱼器

    。 这个装置几乎可以安装在任何类型的鱼缸上,饲养装置的尺寸也可以根据需要扩大。 说了这么多,让我们开始看看制作这个饲养器需要哪些材料。 材料准备 步进电机 Arduino Uno/nano 步进电机驱动器
    发表于 03-28 11:25

    请问stm32H743II usb HOST如何识别双遥游戏手柄?

    stm32H743II usb HOST 如何识别 双遥游戏手柄?北通usb游戏手柄插到PC上显示是XBOX 360手柄,手柄上传为14个字节数据,分别为0-7两个遥
    发表于 03-15 07:52

    全球游戏硬件市场将在未来十年持续增长

    该报告还称,电子竞技兴起、消费者可支配收入提升及对仿真度高的游戏体验追求是驱动游戏硬件行业增长主要原因。具体产品方面,游戏机、专业游戏PC
    的头像 发表于 03-14 15:10 666次阅读

    如何制作自己的Arduino电容计

    在这个项目中,您将学习如何制作自己的Arduino电容计(测量电容器的值,范围从pF到1000的uF)。一般来说,电子爱好者喜欢设计自己的小工具而不是购买。在这个项目中,我们使用两种电容测量方法,即
    的头像 发表于 02-25 15:10 1635次阅读
    如何<b class='flag-5'>制作</b>自己的<b class='flag-5'>Arduino</b>电容计

    如何使用Arduino制作智能垃圾箱

    在这个项目中,我将向您展示如何使用Arduino制作智能垃圾箱,当您带着垃圾接近时,垃圾箱的盖子会自动打开。
    的头像 发表于 02-11 12:22 3091次阅读
    如何使用<b class='flag-5'>Arduino</b><b class='flag-5'>制作</b>智能垃圾箱

    如何使用Arduino UNO板和电位器控制伺服电机

    在本Arduino伺服电机教程中,您将学习如何使用Arduino UNO板和电位器控制伺服电机。
    的头像 发表于 02-11 10:11 2881次阅读
    如何使用<b class='flag-5'>Arduino</b> <b class='flag-5'>UNO</b>板和电位器控制伺服电机

    如何使用Arduino UNO和TIP120晶体管驱动和控制直流电机的速度

    在本 Arduino 电机指南中,您将学习如何使用 Arduino UNO 和 TIP120晶体管驱动和控制直流电机的速度。在此示例中,您将使用按钮来提高电机速度,然后减慢速度,这要归功于脉宽调制 (PWM) 的强大功能。
    的头像 发表于 02-11 10:08 1556次阅读
    如何使用<b class='flag-5'>Arduino</b> <b class='flag-5'>UNO</b>和TIP120晶体管驱动和控制直流电机的速度

    如何使用arduino板控制接触器?

    我将避免铅酸电池过载。我想通过使用近 30A 的接触器和 arduino uno 板来控制电池过载。如何使用arduino板控制接触器?
    发表于 01-22 07:14