Skip to content

Arduino and Java

Arduino

Arduino is a free popular platform for embedded programming based on a simple I/O board easily programmable. Interfacing it with Java allow us to create sophisticated interfaces and take advantages from the several API available in the Java ecosystem.

I’m following the original Arduino and Java interfacing tutorial by Dave Brink but in a more practical approach and with more details.

Step 1) Install the Arduino IDE

This is not a completely mandatory step but it will easy a lot our work. Our program will borrow some Arduino IDE libraries and configurations  like which serial port it is using and at which boud rate. At the moment I wrote this tutorial the version of Arduino IDE was 0013.

Step 2) Prepare your Arduino

Connect your Arduino to the serial port in your computer. Here I’m connecting my Arduino with my laptop throught a USB.

Arduino

Make sure your Arduino IDE is configured and communicating well if your Arduino. Let put on it a little program that sends to us a mensage:

void setup(){
  Serial.begin(9600);
}
 
void loop(){
  Serial.println("Is there anybody out there?");
  delay(1000);
}

Step 3) Install RXTX Library

We will use some libraries to acess the serial port, some of them relies on binary implementations on our system. Our first step is to install the RXTX library (Java CommAPI) in your system. In a Debian like Linux you can do that by:

sudo apt-get install librxtx-java

Or using a graphical package tool like Synaptic:

installing rxtx

For others systems like Windows see the RXTX installation docs.

Step 4) Start a new NetBeans project

Again, this is not a mandatory step but will easy a lot our work. NetBeans is a free and open source Java IDE that will help us to develop our little application. Create a new project at File → New Project and choose at Java at Categories and Java Application at Projects.

netbeans new project

Chose a name for your project. I called mine SerialTalker.

name your project

At the moment I wrote this tutorial I was using Netbeans version 6.5 and Java 6 update 10 but should work as well on newer and some older versions

Step 5) Adding Libraries and a Working Directory

On NetBeans the Projects tab, right-click your project and choose Properties.

libraries

On the Project Properties window select the Libraries on the Categories panel.

Netbeans project libraries

Click the Add JAR/Folder button.

arduino directory

Find where you placed your Arduino IDE installation. Inside this directory there’s a lib directory will some JAR files. Select all them and click Ok.

jars libraries

As we want to borrow the Arduino IDE configuration the program needs to know where is they configuration files.  There’s a simple way to do that.

Still in the Project Properties window select Run at Categories panel. At Working Directory click in the Browse button and select the directory of your Arduino IDE. Mine is at /home/silveira/arduino-0013.

Working directory

You can close now the Project Properties window. At this moment in autocomplete for these libraries are enable in your code.

netbeans autocomplete

Step 6) Codding and running

Here is the code you can replace at Main.java in your project:

package serialtalk;
 
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import java.io.InputStream;
import java.io.OutputStream;
import processing.app.Preferences;
 
public class Main {
    static InputStream input;
    static OutputStream output;
 
    public static void main(String[] args) throws Exception{
        Preferences.init();
        System.out.println("Using port: " + Preferences.get("serial.port"));
        CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier(
                Preferences.get("serial.port"));
 
        SerialPort port = (SerialPort)portId.open("serial talk", 4000);
        input = port.getInputStream();
        output = port.getOutputStream();
        port.setSerialPortParams(Preferences.getInteger("serial.debug_rate"),
                SerialPort.DATABITS_8,
                SerialPort.STOPBITS_1,
                SerialPort.PARITY_NONE);
        while(true){
            while(input.available()>0) {
                System.out.print((char)(input.read()));
            }
        }
    }
}

Now just compile and run (with your Arduino attached in your serial port and running the program of step 2).

voillá

There is. Now you can make your Java programs to talk with your Arduino using a IDE like NetBeans to create rich interfaces.

Published inenglish

93 Comments

  1. WOW – nice job – now I don’t have to use Micro$oft bloated C#

  2. Tom Tom

    Very nice, but still doesn’t want to work with me, I have: Using port: COM4
    java.lang.NoClassDefFoundError: javax/comm/CommDriver thrown while loading gnu.io.RXTXCommDriver
    Exception in thread “main” gnu.io.NoSuchPortException
    at gnu.io.CommPortIdentifier.getPortIdentifier(CommPortIdentifier.java:218)
    at arduino2.Main.main(Main.java:16)
    Java Result: 1

    Maybe you know why tat’s happend?

  3. Tom, you installed RXTX library in your system? Seems like the problem I had when it was missing.

  4. Tom Tom

    I installed RXTX as in the instruction, it means, I copied rxtxserial.dll and rxtxparallel.dll to lib folders jre and jdk, and rxtxcom.jar copied to ext folder in Java subfolder in program files, it is all about installation, or maybe I’ve lost something?

  5. Tom Tom

    I use Windows XP.

  6. Tom Tom

    Can You write how did You do that? Info from RXTX wiki isn’t easy to follow. Thank you very much ;)

  7. aggie aggie

    invalid conversion from ‘const char*’ to ‘long unsigned int’… do you know what exactly would correct this error

  8. Victor Victor

    Hello,

    I was getting the same problem as Tom, which was”
    java.lang.NoClassDefFoundError: javax/comm/CommDriver thrown while loading gnu.io.RXTXCommDriver
    Exception in thread “main” gnu.io.NoSuchPortException
    at gnu.io.CommPortIdentifier.getPortIdentifier(CommPortIdentifier.java:218)
    at arduino2.Main.main(Main.java:16)”

    But then I ran into this post: http://www.arduino.cc/en/Guide/Troubleshooting#toc13.

    I then relized that the program that was interfearing with Netbeans was the Arduinos serial monitor. I then closed it and the Serialtaker program ran successfully with no errors.

  9. @Victor Good tip. You can only open one serial input/output stream at time. You can’t run the Arduino IDE monitor or Arduino uploader and this program at the same time.

  10. Michael Michael

    aggie said:
    “invalid conversion from ‘const char*’ to ‘long unsigned int’… do you know what exactly would correct this error”

    change the delay(“1000”) to delay(1000).

    What’s happening is the delay function is trying to cast a string (I’m assuming a pointer to a character array, I’m not big on Java) as a long unsigned int.

  11. […] something oriented to angles instead. So I wrote some routines to do that. In another post I wrote how create a Java program to talk with Arduino. We’ll use this to send messages to Arduino to it moves.  For this first version of BumbaBot […]

  12. Mary Ann Mary Ann

    HI I AM DESIGNING AN A REAL ALARM CLOCK WHICH NEEDS JAVASCRIPT IS IT POSSIBLE TO TRANSFER JAVASCRIPT INFO THROUGH ARDUINO SO THAT THIS ALARM CLOCK DOES WHAT I WANT? I DONT KNOW WHERE TO BEGIN!

  13. Kam Kam

    I’m trying to create a GUI with this using Swing in Netbeans.
    I created a JForm and put in a text box. Now I want to update the text in the text field from the serial communication.

    I created a method and used this to convert to String:
    String text = Integer.toString(input.read());

    But now how do I invoke textField1.setSet()? Where do I invoke it? I tried creating a method, and invoking it there but I’m getting no love. I tried invoking it from main() but I get “non-static member cannot…from static etc” <-hate this

    Haven’t programmed in Java for 2 years so I’m still fresh.

  14. William Pietri William Pietri

    Thanks! This was just what I needed.

  15. Claudio Claudio

    Hi…very nice job…it’s what I was looking for….but I can’t understand why I’ve got this errors:

    …./arduino/Main.java:28: ‘)’ expected
    while(input.available()>0) {
    …./arduino/Main.java:28: not a statement
    while(input.available()>0) {
    …./arduino/Main.java:28: ‘;’ expected
    while(input.available()>0) {
    Thanks CIAO..

  16. Claudio, was a problem in the post encondig. Fixed.

  17. Hey, thanks for the info!!

    I would like to make a servo run with java, does anyone know where to start, or what kind of commands I need to power the motor?

    Cheers,

    NLStitch

    P.S:
    I have some simple C code from arduino.cc, which does the job, but I want to do this in JAVA:

    #include

    Servo myservo;
    int pos=90;

    void setup()
    {
    myservo.attach(9);
    }

    void loop()
    {
    myservo.write(pos);

    delay(5);

    pos=constrain(pos,0,180);

    pos++

    if(pos > 170)
    {
    pos = 90
    }

    }

  18. Hi Marijin, I create my own methods for controling the servo. The default servo library doesn’t worked with me.

  19. But I will put here in the blog here all the code. I guess I already did it, but if not, I will.

  20. owoyale owoyale

    Hi,
    I want to create a graph showing the result of my data which was saved in mysql database. Please,how can I make it happen using netbeans?

  21. […] 网络上随便一搜就找到了Java如何访问Arduino的文章,实际上它使用了RXTX的Java包,这个包背后其实是通过不同平台不同库文件来实现的,支持很多平台,包括Windows和Linux。而Java和Arduino通讯的办法其实就是访问第4号串口(一个虚拟出来的串口,物理上实际上是个USB口)。 […]

  22. Tolm Tolm

    With Arduino 0017 The problem is Preferences.init() now needs a path to “preferences.txt”. If I give it throws that init() has protected access and doesn’t want compile.

  23. Progcraft Progcraft

    Thanks for this tutorial. It was very helpful to me as I am a Java newbie.
    But, I’m using Arduino 017 so I got totally tripped up on that Preferences.init().
    My solution was simply to remove it all together and just set the values directly.

    So, for any other newbies to Java that want to try this, simply remove these 2 lines:
    import processing.app.Preferences;
    System.out.println(“Using port: ” + Preferences.get(“serial.port”));

    Then set the port directly with a string:
    CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier(“/dev/ttyUSB0”);

    and the speed with an int:
    port.setSerialPortParams(9600,
    SerialPort.DATABITS_8,
    SerialPort.STOPBITS_1,
    SerialPort.PARITY_NONE);

    Hope that helps any other newbies that get tripped up on this.
    There are other solutions and an explanation here:
    http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1251256638

    It’s a great tutorial and everything is great! :)

  24. […] hacerlo con Java en general y, con el IDE Netbeans en particular, acabamos encontrándonos con el post de Siverira Nieto en su web. Interesante artículo que nos permite empezar a explorar las posibilidades de ambos mundos. Sin […]

  25. Хм… А по-моему, что минусы в данном случае намного превосходят плюсы.

  26. Уважаемые, а нельзя оставлять комментарии по теме, а не разную глупость типа Автор молодец и т.д.

  27. Rasael Rasael

    Thank you for this tutorial.
    Everything works fine but everytime I hook up the connection to the arduino it does an automatic reset. How can I fix this?

  28. Marcos Marcos

    Silveira, how can i send datas from Java to Arduino?

  29. Marcos Marcos

    Silveira, I tried output.Write(x), but could not. You have some sample code that can be disclosed?

    Thanks

  30. Muy buen ejersicio(“Tutorial”) Silveira
    y Progcraft muy buen tip*

    saludos. (1337)

  31. run:
    Using port: null
    Stable Library
    =========================================
    Native lib Version = RXTX-2.1-7
    Java lib Version = RXTX-2.1-7
    RXTX Warning: Removing stale lock file. /var/lock/LCK..ttyUSB0
    Is there anybody out there?

    cer0x00> is there?…

  32. Jackson Leite Jackson Leite

    Hi, I’m working in project, where i have to take the values of sensors using java. I’ve done all the instructions here, but i’ve got these erros:

    ERROR You have not installed the DLL named ‘ICE_JNIRegistry.DLL’.
    no ICE_JNIRegistry in java.library.path
    Exception in thread “main” java.lang.UnsatisfiedLinkError: com.ice.jni.registry.RegistryKey.openSubKey(Ljava/lang/String;I)Lcom/ice/jni/registry/RegistryKey;
    at com.ice.jni.registry.RegistryKey.openSubKey(Native Method)
    at com.ice.jni.registry.RegistryKey.openSubKey(RegistryKey.java:185)
    at processing.app.Base.getSettingsFolder(Base.java:281)
    at processing.app.Base.getSettingsFile(Base.java:329)
    at processing.app.Preferences.init(Preferences.java:190)
    at com.nokia.www.Main.main(Main.java:14)

    i’m working with win XP and Java eclipse
    I’d like to know what these erros mean and if you can help me

  33. Jackson Leite Jackson Leite

    i forgot to say…
    I’m working with a arduino 0018,

    i’ve got those erros using the libraries of arduino 0013, but my arduino is 0018. I tried follow this tutorial in two ways:

    1° i tried do this with those instructions for arduino 0017, but i had the same erro in that line:”Preferences.init”
    2° i tried do this using the libraries of arduino 0013 and i’ve got those errors that i wrote before.

    thanks for the tutorial and everything.

  34. jackson leite jackson leite

    OK. I just removed this line: ” Preferences.init();” and i’ve got success.
    I don’t think it’s gonna change the project’s function and the results.

    This is my last code, after the changes:

    package br.com.nokia.RXTX.Serial;

    import gnu.io.CommPortIdentifier;
    import gnu.io.SerialPort;
    import java.io.InputStream;
    import java.io.OutputStream;
    //import processing.app.Preferences;

    public class MainFun {
    static InputStream input;
    static OutputStream output;

    public static void main(String[] args) throws Exception{
    // Preferences.init();
    //System.out.println(“Using port: ” + Preferences.get(“serial.port”));
    CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier(“COM7”);

    SerialPort port = (SerialPort)portId.open(“serial talk”, 4000);
    input = port.getInputStream();
    output = port.getOutputStream();
    port.setSerialPortParams(9600,
    SerialPort.DATABITS_8,
    SerialPort.STOPBITS_1,
    SerialPort.PARITY_NONE);
    while(true){
    while(input.available()>0) {
    System.out.print((char)(input.read()));
    }
    }
    }
    }

  35. cer0x00 cer0x00

    Learning something new is challenging. Learning something new on your own redefines challenging.

  36. Jackson leite Jackson leite

    Hey, let me tell you one thing:
    I want to put the informations(i’m sending one array of chars from arduino to java) came from arduino in a variable, but when i put the datas in string variable like this:
    “dados = ((char)(input.read()))”
    using your function, Java understands that the array came from arduino is just ONE char, not a array, and can’t brake the string “dados”. Can you help me how to brake the string “dados” ?

  37. Jackson Leite Jackson Leite

    I followed every step of your tutorial, I managed to do successfully receiving data in Java, but Java code reads the message from the serial port as if it were a single character, and I stored the message into a string variable (after some conversions) but I can not break the string character by character and allocate the message read on other variables.

    I am wanting to parse this string because in my Arduino code I am sending an array of char to ‘0 ‘and ‘1’ to indicate the status of each parking sensor, and the Java code, I can read and write in the same console array correctly as it is, however, as I said, I can not parse the string to address the status of each sensor, which would each character, because the Java code means that the array is just a character. And no I could not even compare this string with another value however, if I write the string value, I will result in the array that I sent through the serial port on the Arduino code.

    I wonder if you can help me and tell me if something is wrong, how can I parse this string or other character by character to receive the message from the serial port, it does not have much time to deliver the project.

  38. cesar cesar

    your tutorial very beast Congratulations!
    You already programmed for cell J2me who sends commands through the bluetooth arduino bt to perform some actions?
    I’m trying to develop this idea for my college thesis.
    because I’m in doubt on the creation of software for the phone that would function as part of bluetooth communication.
    would like some tips if you can send me some tutorial sites with source code examples using Java and J2ME with arduino.
    My email: cesarmasaharu@gmail.com
    thanks!

  39. cesar cesar

    very good tutorial!
    sorry did not want to have spoken badly wrong because my translator
    and ended up going a few more words

  40. nagli nagli

    Cool tutorial, got almost everything to work, but I have 64 bit system and get an error:
    (I know this has nothing to do with this tutorial, just would like to know if someone already solve this issue or know a fix for it. Thanks)

    java.lang.UnsatisfiedLinkError: C:\Program Files\Java\jdk1.6.0_18\jre\bin\rxtxSerial.dll: Can’t load IA 32-bit .dll on a AMD 64-bit platform thrown while loading gnu.io.RXTXCommDriver
    Exception in thread “main” java.lang.UnsatisfiedLinkError: C:\Program Files\Java\jdk1.6.0_18\jre\bin\rxtxSerial.dll: Can’t load IA 32-bit .dll on a AMD 64-bit platform

  41. oatkinson oatkinson

    Have you seen anyone doing aduino programming in scala?

  42. Hein Hein

    @Nagli: You could have both the 32Bit and 64Bit Java Runtimes on your machine and specify which vm to use for your application. This can easily be configured in netbeans under the project settings. Also I believe RXTX has 64Bit support in their latest version.

  43. Hein Hein

    I stand corrected, RXTX does not have 64 Bit support for Windows.

  44. Lutin_malin Lutin_malin

    @Hein :
    I had trouble too with arduino & RxTx and found the solution there :

    http://rxtx.qbang.org/wiki/index.php/Download

    / ! \ Using 2.2pre2 instead of 2.1-7 solved my problem.
    64 bit is supported with the 2.2 version.

    As information, i’m working on controlling Arduino (mega) through java program, using the processing librairy and the ones granted by arduino.cc

    for people interesting, i found the required librairies on :
    http://www.arduino.cc/playground/Interfacing/Processing
    http://processing.org/download/
    and rxtx

    the tutorial here (http://www.benjohansen.com/arduino-in-eclipse-via-processing) is very usefull for beginners as me !
    see ya

  45. Lutin_malin Lutin_malin

    (I forgot , i’m using firmata firmware too !)

Leave a Reply

Your email address will not be published. Required fields are marked *