Arduino in Java fernsteuern (Firmata, Processing, Eclipse, SWT)

Veröffentlicht von

Meine letzten versuche ein eigenes einfaches  Message Protokoll zur Datenübertragung PC <> Arduino zu schreiben waren nicht besonders erfolgreich. Diverse Probleme mit der Fehlererkennung brachten mich dazu doch lieber im Netz nach einer fertigen Lösung zu suchen.

Gefunden habe ich Firmata, ein auf MIDI basierendes Protokoll, für das es auch fertige Libraries für Arduino und Processing gibt.

Processing basiert auf Java und da ich lieber in Eclipse programmiere, habe ich die Processing libraries dort eingebunden und verzichte so auf die mitgelieferte  IDE.

Arduino Firmware

Als ersten Schritt habe ich das Arduino Board mit der Firmata Firmware bestückt. Die findet man im Examples Ordner der Arduino IDE.

Eclipse Projekt

Die nächsten Schritte betreffen die Vorbereitung des Eclipse Projekts:

  1. Erstellen eines Java Projekts
  2. Den Java Buildpath um die benötigten Libs erweitern
    1. Prozessing Core  (\processing-1.0.9\lib\core.jar)
    2. Serial  (\processing-1.0.9\libraries\serial\library\serial.jar)
    3. RXTXcomm (\processing-1.0.9\libraries\serial\library\RXTXcomm.jar)
    4. Arduino  (download von http://www.arduino.cc/playground/uploads/Interfacing/processing-arduino-0017.zip )
    5. Die reichen erst einmal für anfängliche Tests, vermutlich braucht man später noch mehr.
  3. Die eigene Klasse erweitert processing.core.PApplet und überschreibt die setup() und die draw() Methode.  So ist es schon lauffähig  und man bekommt ein kleines Applet Fenster.
import processing.core.*;
import cc.arduino.*;

public class arduino_blink extends PApplet
{
	public void setup()
	{
	   //TODO
	}

	public void draw()
	{
	   //TODO
	}
}

Blink App

Jetzt eine einfache kleine Blink Applikation in Eclipse.

import processing.core.*;
import cc.arduino.*;

public class arduino_blink extends PApplet
{
	private Arduino arduino = null;
	private int ledPin = 13;
	private int state = Arduino.LOW;

	public void setup()
	{
		arduino = new Arduino(this, Arduino.list()[1], 57600);
		arduino.pinMode(ledPin, Arduino.OUTPUT);
	}

	public void draw()
	{
		try
		{
			if (state==Arduino.LOW)	state = Arduino.HIGH;
			else state = Arduino.LOW;

			arduino.digitalWrite(ledPin, state);
			Thread.sleep(1000);
		}
		catch (InterruptedException e)
		{
			e.printStackTrace();
		}
	}
}

Eigentlich schon selbsterklärend. In der setup Methode wird ein Arduino Objekt erzeugt. Dem wird über this eine Instanz von PApplet, der Serielle Port und die Bautrate übergeben.

Über das Arduino Objekt kann man dann den LED Pin 13 auf Ausgang stellen.

Weiter geht es in der draw Methode, die kontinuierlich durchlaufen wird. In einer if/else abfrage wird der „state“ zwischen High und Low  gewechselt und im Arduino gesetzt. Zuletzt wird noch eine Sekunde in einem Thread.sleep gewartet. Da dieser auch eine Exception werfen kann muss noch ein try/catch drumherum und fertig ist die Blink Applikation.

SWT Applikation

Zuletzt dann noch eine SWT Anwendung. Die SWT Lib (swt-win32-3139.jar) muss noch zum Buildpath hinzugefügt werden. Im Beispiel schaltet ein Toggle Button die LED des Arduino an und aus.

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

import processing.core.*;
import cc.arduino.*;

public class Arduino_test2
{
	private Arduino mArduino = null;
	private int mLedPin = 13;
	private PApplet mPApplet=null;
	private int mState=Arduino.LOW;
	private Button mButton= null;

	public static void main(String[] args)
	{
		Arduino_test2 a= new Arduino_test2();
	}

	private Arduino_test2()
	{
		Display display = new Display();
	    Shell shell = new Shell(display);
	    shell.setText("Arduino_test2");
	    shell.setSize(200, 150);
	    initArduino();
	    initGui(shell);
	    shell.open();
	    while(! shell.isDisposed()) {
	      if(! display.readAndDispatch())
	      {
	        display.sleep();
	      }
	    }
	    mPApplet.exit();
	    display.dispose();
	}

	private void initGui(Shell shell) {
		shell.setLayout(new RowLayout());
	    mButton = new Button(shell, SWT.TOGGLE);
	    mButton.setText("on");
	    mButton.addSelectionListener(new SelectionAdapter() {
	          public void widgetSelected(SelectionEvent e) {
	        	  if (mButton.getSelection())
	        		  mState=Arduino.HIGH;
	        	  else
	        		  mState=Arduino.LOW;

	        	  updateArduino();
	            };
	          });
	}

	private void updateArduino() {
		mArduino.digitalWrite(mLedPin, mState);
	}

	private void initArduino()
	{
		mPApplet = new PApplet();
		mPApplet.init();
		mArduino = new Arduino(mPApplet, Arduino.list()[1], 57600);
		mArduino.pinMode(mLedPin, Arduino.OUTPUT);
	}
}

3 Kommentare

  1. Kannst du mir weiter helfen, ich finde die Libraries nicht.
    Prozessing Core (\processing-1.0.9\lib\core.jar)
    Serial (\processing-1.0.9\libraries\serial\library\serial.jar)
    RXTXcomm (\processing-1.0.9\libraries\serial\library\RXTXcomm.jar

Kommentar verfassen