PC mus gjorda med Arduino Uno och Joystick (4 / 6 steg)
Steg 4: Installera Java-program
Nu när Uno har ställts in, måste vi ansluta den till min Java program som kan ta Uno's serial output värden med särskilda biblioteket RxTx och flytta musen med biblioteket samling JNA. Båda dessa bibliotek ingår för nedladdning i slutet av detta steg. Observera att den enda delen av koden jag ändrade från exemplet RxTx var att lägga den metod som flyttar musen på ett sätt att jag kalibrerat för min joystick. Det är lite rå, men det tjänade mina syften.
Jag använt BlueJ som min IDE, men oavsett vilken Java IDE du använder, installera RxTx och JNA bibliotek för detta projekt, som jag döpt till "Mus". När det är gjort, skapat ett projekt och inkludera denna koden:
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;
allmän klass mus implementerar SerialPortEventListener {
SerialPort serialPort;
/ ** Hamnen vi normalt ska använda. */
privata statisk sista sträng PORT_NAMES [] = {
"/dev/tty.usbserial-A9007UX1", / / Mac OS X
"/ dev/ttyACM0", / / Raspberry Pi
"/ dev/ttyUSB0", / / Linux
"COM4", / / Windows *** (jag ändrat)
};
/**
* En BufferedReader som kommer att matas av en InputStreamReader
* konvertera byte till tecken
* att göra visas resultaten teckentabellen oberoende
*/
privat BufferedReader ingång;
/ ** Utdataström till porten * /
privat OutputStream utgång;
/ ** Millisekunder för att blockera väntan port öppen * /
privata statisk sista int TIME_OUT = 2000.
/ ** Standard bitar per sekund för COM-porten. */
privata statisk sista int DATA_RATE = 9600;
int buttonOld = 1;
public void initialize() {
nästa rad är för Raspberry Pi och
får oss in while loop och var föreslog här var föreslagna http://www.raspberrypi.org/phpBB3/viewtopic.php?f...
System.setProperty ("gnu.io.rxtx.SerialPorts", "/ dev/ttyACM0"); Jag fik befria för detta
CommPortIdentifier portId = null;
Uppräkning portEnum = CommPortIdentifier.getPortIdentifiers();
Hitta först en instans av seriell port som anges i PORT_NAMES.
samtidigt (portEnum.hasMoreElements()) {
CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
för (sträng portName: PORT_NAMES) {
om (currPortId.getName().equals(portName)) {
portId = currPortId;
bryta;
}
}
}
om (portId == null) {
System.out.println kunde ("inte hitta COM-porten.");
hemkomst.
}
försök {
Öppna serieporten och använder klassnamnet för programnamn.
serialPort = (SerialPort) portId.open(this.getClass().getName(),
TIME_OUT);
Set port-parametrar
serialPort.setSerialPortParams (DATA_RATE,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
Öppna strömmarna
input = nya BufferedReader (nya InputStreamReader(serialPort.getInputStream()));
output = serialPort.getOutputStream();
lägga till händelseavlyssnare
serialPort.addEventListener(this);
serialPort.notifyOnDataAvailable(true);
} fånga (undantag e) {
System.ERR.println(e.toString());
}
}
/**
* Detta ska anropas när du slutar använda porten.
* Detta förhindrar port låsning på plattformar som Linux.
*/
offentliga synkroniseras void close() {
om (serialPort! = null) {
serialPort.removeEventListener();
serialPort.close();
}
}
/**
* Hantera en händelse på den seriella porten. Läsa data och skriva ut den. I det här fallet anropar det metoden mouseMove.
*/
offentliga synkroniseras void serialEvent(SerialPortEvent oEvent) {
om (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
försök {
Sträng inputLine=input.readLine();
mouseMove(inputLine);
System.out.println("***");
System.out.println(inputLine);
} fånga (undantag e) {
System.ERR.println(e.toString());
}
}
Ignorera alla andra eventTypes, men du bör överväga andra de.
}
offentliga statisk void main (String [] args) kastar undantag {
Mus main = nya Mouse();
Main.Initialize();
Gänga t = nya Thread() {
public void run() {
följande rad kommer att hålla denna app liv för 1000 sekunder,
väntar på händelsen och svara på dem (skriva ut inkommande meddelanden till konsolen).
försök {Thread.sleep(1000000);} fånga (InterruptedException dvs) {}
}
};
t.start();
System.out.println("Started");
}
Min metod mouseMove, tar i en sträng som innehåller tre datapunkter och fungerar musen i sin tur
public void mouseMove(String data) kastar 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 knappen = Integer.valueOf (data.substring(index2 + 1));
Robot robot = nya Robot();
int mouseY = MouseInfo.getPointerInfo () .getLocation () .y;
int mouseX = MouseInfo.getPointerInfo () .getLocation () .x;
om (knappen == 0)
{
om (buttonOld == 1)
{
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
robot.Delay(10);
}
}
annat
{
om (buttonOld == 0)
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
}
om (Math.abs (xCord - 500) > 5)
mouseX = mouseX + (int) ((500-xCord) * 0.02);
om (Math.abs (yCord - 500) > 5)
mouseY = mouseY - (int) ((500-yCord) * 0.02);
robot.mouseMove (mouseX, mouseY);
buttonOld = knappen;
System.out.println (xCord + ":" + yCord + ":" + knappen + ":" + mouseX + ":" + mouseY);
hemkomst.
}
}