Sunday, April 24, 2011

Arduino and Java - Part 2

Ok. The plan that modify the Java script inside Serial Midi Converter was failed. This is because one serial port can't have two kind of converter to convert the message. I have come out with another solution which the serial port only detect the keypress for SPACE and the drum sound will be played back inside flash. This is the last way for me to simplify the convert of signal received through serial port. The code that we'll using is the tutorial that i posted in previous post. I've seek help from my house mate who is also a IT student which good in coding and Java. This is the code after edit:


package serialtalk;

import java.io.InputStream;
import java.io.OutputStream;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.util.Enumeration;
import java.awt.Robot;
import java.awt.event.KeyEvent;

public class Main implements SerialPortEventListener {
SerialPort serialPort;
static Robot robot;
/** The port we're normally going to use. */
private static final String PORT_NAMES[] = {
"/dev/tty.usbserial-A9007UX1", // Mac OS X
"/dev/ttyUSB0", // Linux
"COM11", // Windows
};
/** Buffered input stream from the port */
private InputStream 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;

public void initialize() {
CommPortIdentifier portId = null;
Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();

// iterate through, looking for the port
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 = 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.
*/
public synchronized void serialEvent(SerialPortEvent oEvent) {
System.out.println("\n *** [VIBRATION DETECTED] *** ");
//robot.mouseMove(0, 0);
robot.keyPress(KeyEvent.VK_SPACE);
if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
try {
int available = input.available();
byte chunk[] = new byte[available];
input.read(chunk, 0, available);

// Displayed results are codepage dependent
System.out.print(new String(chunk));
} 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 {
Main main = new Main();
robot = new Robot();

main.initialize();
System.out.println("Started");
}
}


We used "Robot" function to trigger the keypress "SPACE" once it detected signal received from Arduino board. "COM11" is the USB serial port that I'm using woth Arduino board. Every different computer will have different serial number for the port. So if the installation need to present at another computer, this is the one that need to be change according to the port number at that computer, and whole Java script will need to compile again. Below is the output in NetBean after it detect vibration signal in Arduino board:



It successfully to receive signal from Arduino! And after we test with the flash, it successfully to trigger SPACE key as well. This indeed is a big move toward the success in my installation. I want to thanks Jay Lim in helping me with his professional knowledge.

No comments:

Post a Comment