我为一个严重残疾的人建立了一个鼠标模拟器,它有一系列以+图案排列的按钮,中心按钮是“点击”。输入读入Arduino Micro,然后通过USB连接到计算机。使用Arduino库的处理脚本通过使用Robot类移动鼠标来响应这些更改。我为32位和64位窗口导出了一个应用程序,但发现.exe文件存在问题,而是使用嵌入式Java选择了.bat文件。
这一切都在我的电脑上完美运行(Microsoft 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();
}