有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用Processing、Arduino和Robot类的java鼠标模拟器:函数不一致

我为一个严重残疾的人制作了一个鼠标模拟器,它有一系列按+模式排列的按钮,中间的按钮是“点击”。输入被读入Arduino Micro,然后通过USB连接到计算机。使用Arduino库的处理脚本通过使用Robot类移动鼠标来响应这些更改。我导出了一个适用于32位和64位windows的应用程序,但发现。exe文件有问题,于是选择了。使用嵌入式Java的bat文件

这一切都在我的电脑(微软Surface,Windows 8,64位)上完美运行。但在客户端计算机(Windows 7,32位)上,结果不稳定。每次加载程序,我都会得到不同的结果。例如,有时向上、向下和单击“工作”。有时只需要点击“工作”。等等点击通常似乎有效,但方向不太可靠,垂直方向比水平方向更有效

我已经证实董事会没有问题。我试着输入一条调试语句,每当一个动作的“if”语句被触发时,它都会运行println()——我只会从那个特定运行的指令中得到打印

我看到了这个问题的一些潜在来源:32位和64位Windows之间的差异、Robot类可能存在的问题、USB性能问题(尽管我在客户端的笔记本电脑上尝试了多个端口),等等。客户的笔记本电脑通常性能较差(例如,如果我单击“控制面板”,可能需要整整一分钟才能打开控制面板),因此这也可能与此有关

有人对此有其他见解吗

编辑:根据要求,这里是处理代码的最低版本。Arduino正在运行Firmata:

import processing.serial.*;
import cc.arduino.*; 
import java.awt.*;
import java.awt.event.*;
Arduino arduino;
Robot r;
final int upPin=8;
final int downPin=12;
final int leftPin=10;
final int rightPin=11;
final int buttonPin=9;
final int SPEED=8;
boolean arduinoConnected;
int prevButton=Arduino.LOW;

void setup() {
  arduinoConnected = (Arduino.list().length>0);
  if (arduinoConnected) {
    arduino = new Arduino(this, Arduino.list()[Arduino.list().length-1], 57600);
    arduino.pinMode(buttonPin, Arduino.INPUT);
    arduino.pinMode(upPin, Arduino.INPUT);
    arduino.pinMode(downPin, Arduino.INPUT);
    arduino.pinMode(leftPin, Arduino.INPUT);
    arduino.pinMode(rightPin, Arduino.INPUT);
  } 
  try {
    r = new Robot();
  } 
  catch (Exception e) {
    e.printStackTrace();
  }
}

void draw() {
  arduinoConnected = (Arduino.list().length>0);
  if (arduinoConnected && arduino==null) setup();
  if (arduinoConnected) {
    if (arduino.digitalRead(upPin)==Arduino.HIGH) moveMouse(0,0-SPEED);
    if (arduino.digitalRead(downPin)==Arduino.HIGH) moveMouse(0,SPEED);
    if (arduino.digitalRead(leftPin)==Arduino.HIGH) moveMouse(0-SPEED,0);
    if (arduino.digitalRead(rightPin)==Arduino.HIGH) moveMouse(SPEED,0);
    int button=arduino.digitalRead(buttonPin);
    if (button==Arduino.LOW && prevButton==Arduino.HIGH) clickMouse(InputEvent.BUTTON1_DOWN_MASK);
    prevButton=button;
  }
}

void moveMouse(int x, int y) {
  PointerInfo pinfo = MouseInfo.getPointerInfo();
  Point p = pinfo.getLocation();
  r.mouseMove((int)p.getX()+x, (int)p.getY()+y);
}

void clickMouse(int whichType) {
  r.mousePress(whichType);
  r.mouseRelease(whichType);
  r.waitForIdle();
}

共 (0) 个答案