Wie geht serielle Datenübertragung mit Java? (neue Version)



Ziel:   Java-Programme, sog. "Frontends", senden und empfangen Informationen über USB zu/von Arduino.


Java-Program?


Es ist eine gute Idee, Java zu verwenden.

  • Einerseits läuft Java auf allen möglichen Betriebssystemen.

  • Andererseits liefern viele Java-Entwickler Programmbausteine, die wir für unsere Projekte nutzen können.
    Wir werden gleich so ein Programmpaket benutzen.

  • Ein Lernziel dabei ist es auch, dass Du mit Java Kontakt aufnimmst.
    Demnächst
    gibt es auf der Arduinospielwiese vielleicht auch einen Java-Einführungskurs. 

Arduino → Computer:

Die Programme können dazu dienen, Informationen oder Daten auf dem Computer als Zahlen, Zeigermessgeräte, Diagramme oder Kennlinien auszugeben. Eine weitere Anwendung kann darin bestehen, vom Arduino kommende große Datenmengen auf dem Computer auf Festplatte oder in Datenbanken zu speichern.


Computer → Arduino:

Die Programme können dazu dienen, mittels auf ihnen befindlichen Tasten, Checkboxes oder Sliders Zustände und Vorgänge im Arduino zu beeinflussen, um so z. B. Leuchtdioden oder Motoren zu steuern.



    Hier einige Beispiele:

Ardunino sendet periodisch einen Zahlenwert an den Computer.
Dort wir dieser in einer Konsole ausgegeben.

Dies ist das Einstiegsexperiment.
Du findest es am Ende dieser Seite.






Ardunino sendet periodisch seine 6 Analogwerte an den Computer.
Dort werden sie in einer Konsole ausgegeben:





Ardunino sendet periodisch seine 6 Analogwerte an den Computer.
Dort werden sie in einem Fenster als Zahlen ausgegeben:





Ardunino sendet periodisch seine 6 Analogwerte an den Computer.
Dort werden sie in einem Fenster als Balken ausgegeben:





Ardunino sendet periodisch seine 6 Analogwerte an den Computer.
Dort werden sie in einem Fenster mittels Zeigerinstrumenten (hier: JSlider mit Skalen) ausgegeben:





Ardunino sendet periodisch seine 6 Analogwerte an den Computer.
Dort werden sie in einem Fenster als Kennlinien ausgegeben:





Ein Fenster mit einem Slider liefert einen Wert, der seriell zum Arduino übertragen und im LCD ausgegeben wird:

    




Ein Fenster mit sechs Sliders liefert sechs Werte, die LCD ausgegeben werden:

     




Ein Fenster ermöglicht die Eingabe von Text, der im LCD des Arduino ausgegeben wird:

     


  


Das Einstiegsexperiment: eine Java-Programm, das mittels jSerialCom mit Arduino kommuniziert:

Was nun folgt, soll keineswegs ein Java-Grundkurs sein - den gibt es vielleicht später mal auf der Arduinospielwiese.
Ich will hier nur kurz die Vorgehensweise darlegen, wie man den unten zu findenden, fertigen Java-Programmcode für das Frontend zum Laufen bekommt.

Ich benutze zur Java-Programmierung gern Eclipse.
Unter anderem, weil es unter Windows, Linux und MacOS läuft.

Für andere Java-Programmierfreunde ist Netbeans oder IntelliJ die erste Wahl.

Ich zeige Dir hier, wie man in Eclipse vorgeht.


Wenn Du noch nicht weißt, was ein Analogwert ist, dann lies erst hier!
Es gibt auch
hier ein einfacheres Experiment, bei dem ein Analogwert zum Computer gesendet wird.



Schaltung:


       



Arduino-Programm:

Arduino holt sich von seinem Analogeingang A0 einen Wert zwischen 0 und 1023 und sendet ihn seriell zum Computer.
Der Wert wird zum String umgewandelt und zwischen zwei Zeichen eingeklemmt: vorn ein @ und hinten ein #.
Dies habe ich getan, weil mir das die Möglichkeit gibt festzustellen, ob ein vollständiger Zahlenwert (und
später auch mehrere Werte) seriell angekommen sind.

void setup() {
  Serial.begin(9600);
}

void loop() {
  int wert = analogRead(A0);
  String myString = "@" + String(wert) + "#";
  Serial.println(myString);
  Serial.flush();
  delay(1000);
}



Java-Programm:

Ist Eclipse installiert und gestartet, legst Du ein neues Java-Projekt (z. B. "Arduino") an - der Name des Projektes ist egal.

Aber die folgenden Namen solltest Du wie gefordert vergeben, damit Du später den untenstehenden Java-Programmcode exakt so bei Dir einfügen kannst.

In diesem neuen Java-Projekt legst Du ein neues Package namens: "arduinosendet" an.
In diesem Package legst Du eine neue Klasse namens "EinenAnalogWertInConsoleAusgeben" an.

Ist die geforderte Klasse bei Dir angelegt, steht schon einwenig Code darin.
Den kannst Du komplett löschen und statt dessen dort den folgenden Programmcode hineinkopieren:


package arduinosendet;

import com.fazecast.jSerialComm.SerialPort;


// Vom Arduino wird seriell sekündlich ein String in 
// der Form: @wert# gesendet, wobei wert = [0, 1023] ist.
//	
// Dies geschieht, damit in der Auswertung des Wertes Steuerzeichen
// und Datenmüll weggefiltert werden können.


public class EinenAnalogWertInConsoleAusgeben {

 // globale Variablen:
 SerialPort mySerialPort;
 String empfangenerString = "";

 // Constructor:
 public EinenAnalogWertInConsoleAusgeben() {
		verbindung_herstellen();
 }

 public void verbindung_herstellen() {

	// an welchem Port hängt ARDUINO? (Win10 - auch Mac & Linux?)
	SerialPort[] availablePorts = SerialPort.getCommPorts();

	// den ersten gefundenen Port benutzen:
	mySerialPort = availablePorts[0];
	
	int BaudRate = 9600;
	int DataBits = 8;
	int StopBits = SerialPort.ONE_STOP_BIT;
	int Parity = SerialPort.NO_PARITY;

	mySerialPort.setComPortParameters(BaudRate, DataBits, StopBits, Parity);

	mySerialPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_BLOCKING, 1000, 0);

	mySerialPort.openPort(); // Aduino erhält dabei RESET

	// Pause, damit Arduino nach RESET wieder "da" ist
	try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	// Test, ob obiger Port geöffnet ist:
	if (mySerialPort.isOpen())
		System.out.println(mySerialPort + " is open");
	else
		System.out.println("Port not open");

	try {
	  while (true) {

		byte[] readBuffer = new byte[100];

		mySerialPort.readBytes(readBuffer, readBuffer.length);

		// Konvertiere Bytes zu String
		String empfangenerString = new String(readBuffer, "UTF-8");

		// Test auf Vorhandensein von vorn "@" und hinten "#"
		if (empfangenerString.indexOf("@") > -1  
			&& empfangenerString.indexOf("#") > -1
			&& empfangenerString.indexOf("#") > 
			                         empfangenerString.indexOf("@")) {

			empfangenerString = empfangenerString.replaceAll("null", "");
			empfangenerString = empfangenerString.replaceAll("\n", "");
			empfangenerString = empfangenerString.replaceAll("\r", "");

			// String zwischen '@' und '#' herausholen
			empfangenerString = 
			   empfangenerString.substring(1, empfangenerString.indexOf("#"));

			System.out.println(empfangenerString);
		}
	  }
	} catch (Exception e) {	e.printStackTrace(); }
 }

 public static void main(String[] args) {
		new EinenAnalogWertInConsoleAusgeben();
 }

}
        

Ist dies geschehen, gibt es sicher einige rote Unterstreichungen im Quelltext.
Aber keine Panik! Es ist nämlich noch ein Werkzeug zur seriellen Kommunikation zu installieren:

jSerialComm - ein Tool zur seriellen Datenübertragung

Für die Kommunikation über USB benutzen wir ein fertiges Programmpaket: "jSerialComm-2.9.3.jar".
(2.9.3 war die aktuelle Version im Mai 2023).

Das kannst Du hier in oder hier herunterladen. Wähle dort einfach die letzte Version.

Nach dem Download entpackst Du die zip-Datei (wenn eine vorhanden ist) - es entsteht ein Ordner mit allerlei Dateien, wo Du z. B. die Lizenzbedingungen findest. Uns interessiert in erster Linie eine Datei namens jSerialComm-2.9.3.jar, die Du später in Deinen Java-Projektordner legen kannst.

Du musst die Datei jSerialComm-2.9.3.jar mit einem Dateimanager Deines Betriebssystems (Windows-Explorer, Mac-Finder, Linux-Was-Weiß-Ich-Welchen-Dateimanager-Du-Benutzt) in den Projektordner Deines Arduino-Java-Projektes hineinkopieren.

Wenn Du jetzt in Eclipse im Package- oder im Projekt-Explorer mit rechts auf Dein Projekt klickst und "refresh" wählst, müsstest Du die Datei "jSerialComm-2.9.3.jar" dort sehen. Rechtsklicke dort auf die Datei jSerialComm-2.9.3.jar und wähle: Build Path --> zum Build Path hinzufügen (englisch: Add to Buildpath).


Fertig!

Du kannst jetzt Dein Java-Programm starten (in Eclipse ist oben ein grüner Startknopf).
Du siehst dann in der Console von Eclipse die periodische Ausgabe der Zahlen:

       

Verändere die Stellung Deines einstellbaren Widerstandes - und die Zahl wird sich ändern!   .