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

时间:2014-09-24 14:40:42

标签: java windows arduino mouse processing

我为一个严重残疾的人建立了一个鼠标模拟器,它有一系列以+图案排列的按钮,中心按钮是“点击”。输入读入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();
}

0 个答案:

没有答案