Talking to Your Arduino with Java

Making Java and Arduino have a simple conversation isn’t too hard – after all, the Arduino IDE is written in Java and uses the RXTX Java library – however there are a few tricks that can make the difference between hair loss and success. The Arduino Playground has an article which almost has all you need to get things working, however I found a little extra Googling was required before I had success. The following steps should get the conversation between the technologies started if you’re running Eclipse on a Mac, assuming you already have an Arduino loaded with some code that spits text out to serial (see the Arduino Playground article for an example).

Setup the RXTX library

  1. Create a folder for your Java project – this is where you’ll be dumping all your files.
  2. Download and unzip the RXTX library and place is in your project folder.

Create a Java Project and Test Program

  1. Open up Eclipse and create a new Java project (File > New > Project...).
  2. Open up your project properties (Project > Properties), select Java Build Path, and then Add Jars.... Select the RXTXComm.jar and click OK.
  3. Create a new class (right click on your project’s src folder, then select New > Class).
  4. Copy the sample code from the Arduino Playground article.
  5. Create a new launch configuration (Run > Run Configurations…, then select the New launch configuration button).
  6. In the arguments tab add the following VM argument:
    Djava.library.path=/path-to-lib/rxtx-2.1-7-bins-r2/Mac_OS_X
    Changing the path as appropriate for your rxtx version and location.
  7. Select the Environment tab then click New… and create the following environment variable:
    Name: DYLD_LIBRARY_PATH
    Value: /path-to-lib/rxtx-2.1-7-bins-r2/Mac_OS_X
    Select OK and close the Run Configurations dialog.

Fix Problems with Native Libraries

  1. If you try to run the configuration now it will most likely fail with an error along the lines of:
    /path-to-lib/librxtxSerial.jnilib: no matching architecture in universal wrapper
    This can easily be fixed by downloading a more complete and compatible version of the native side of the RXTX library from here. Use this to replace the .jnilib file in /path-to-lib/rxtx-2.1-7-bins-r2/Mac_OS_X. Big thanks to Robert Harder for this.

Find Your Device and Port

  1. Back in Eclipse, find this line your sample program
    System.setProperty("gnu.io.rxtx.SerialPorts", "/dev/ttyACM0");
    and comment it out.
  2. The first thing the program does is try to find the port you will be communicating with. The sample code has a list that probably doesn’t include the port you are looking for associated with your device. To remedy this add some printlns to log all of the found ports. In the port searching loop find this line:
    CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
    and add this line after it:
    System.out.println("Found "+currPortId.getName());
  3. Connect your Arduino to your Mac’s usb port and run the program. You should see a list of ports something like this:
    Found /dev/tty.Bluetooth-Incoming-Port
    Found /dev/cu.Bluetooth-Incoming-Port
    Found /dev/tty.Bluetooth-Modem
    Found /dev/cu.Bluetooth-Modem
    Found /dev/tty.STARLIGHT-COM7
    Found /dev/cu.STARLIGHT-COM7
    Found /dev/tty.wchusbserial410
    Found /dev/cu.wchusbserial410
    In my case the device is /dev/tty.wchusbserial410.
  4. Find the PORT_NAMES variable at the top of the class and add your device to it.
  5. Run the program again and your Java program should be intently listening to all your Arduino has to say and spit it out to the console for you to see!
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s