Breakout - Ausbrechen aus den bisher behandelten Programmierumgebungen
(EN google-translate)
(PL google-translate)
Verbindung zwischen Java und Scilab
Innerhalb der Vorlesung soll der gleiche PC, der zur Simulation dynamischer Systeme mit Scilab benutzt wird, als eingebettetes System für ein geregeltes System dienen, wobei auch dabei der Regelkreis mit Hilfe von Scilab realisiert werden soll.
Dazu müssen natürlich Sensordaten von Scilab empfangen und Aktuatordaten von Scilab gesendet werden können. Als Zwischenschicht soll dazu Java/Processing dienen.
Im folgenden ist in aller Kürze als bloßes Rezept gezeigt, wie es möglich ist, Scilab von Java aus zu nutzen (vergl. hierzu auch die Scilab-Hilfe zu javasci):
/* * * This file is released under the 3-clause BSD license. See COPYING-BSD. * */ import org.scilab.modules.javasci.Scilab; import org.scilab.modules.types.ScilabType; import org.scilab.modules.types.ScilabDouble; class Example1 { public static void main(String[] args) { try { Scilab sci = new Scilab(); if (sci.open()) { /* Send a Scilab instruction */ sci.exec("foo = [ 2, 4, 6; 4, 0, 10; 6, 10, 12 ];"); /* Retrieve the variable foo */ ScilabType foo = sci.get("foo"); /* Display the variable */ System.out.println("Representation of : "+foo); /* Get the data and retrieve the 2,2 value */ double[][] aReal = ((ScilabDouble)foo).getRealPart(); System.out.println("foo[1,1] = " + aReal[1][1]); /* Change the value of 2,2 */ aReal[1][1] = Math.PI; /* Create a new variable */ ScilabDouble bar = new ScilabDouble(aReal); /* Send it to Scilab */ sci.put("bar",bar); /* Display it through Scilab */ sci.exec("disp(bar)"); sci.close(); } else { System.out.println("Could not start Scilab "); } /* Can be improved by other exceptions: AlreadyRunningException, * InitializationException, UndefinedVariableException, * UnknownTypeException, etc */ } catch (org.scilab.modules.javasci.JavasciException e) { System.err.println("An exception occurred: " + e.getLocalizedMessage()); } } }
Code 0-1: Verwendung von Scilab aus Java heraus - Java-Beispielklasse Example1.java.
import org.scilab.modules.javasci.Scilab; import org.scilab.modules.types.ScilabType; import org.scilab.modules.types.ScilabDouble; class Example2 { public static void main(String[] args) { try { Scilab sci = new Scilab(); sci.open(); sci.exec("disp(%pi);"); double [][]data={{42, Math.PI}}; ScilabDouble a = new ScilabDouble(data); sci.put("a",a); sci.exec("b=cos(a);"); ScilabType b = sci.get("b"); System.out.println("b = " + b); sci.close(); } catch (org.scilab.modules.javasci.JavasciException e) { System.err.println("An exception occurred: " + e.getLocalizedMessage()); } } }
Code 0-2: Verwendung von Scilab aus Java heraus - Java-Beispielklasse Example2.java.
#Installationspfad von Scilab 5.5.0: direkt im home-Directory "/home/fhbstud". Dort gint es dann: scilab-5.5.0 #API (javadoc): https://help.scilab.org/docs/5.5.0/en_US/javasci/javadoc/index.html #holen: wget -r -l 5 -np --no-check-certificate https://help.scilab.org/docs/5.5.0/en_US/javasci/javadoc/index.html export SCI=/scilab-5.5.0/share/scilab export SCILIB=/scilab-5.5.0/lib/scilab export CLASSPATHSCILAB=.:/modules/javasci/jar/org.scilab.modules.javasci.jar:/modules/types/jar/org.scilab.modules.types.jar export LIBPATHSCILAB=.:/scilab-5.5.0/lib/scilab:/scilab-5.5.0/lib/thirdparty export LD_LIBRARY_PATH=:; javac -cp Example1.java java -cp Example1 javac -cp Example2.java java -cp Example2
Code 0-3: Verwendung von Scilab aus Java heraus - KONSOLENBEFEHLE.
Verbindung zwischen Java und Arduino
Um äußere Meß- und Steuervorgänge realisieren zu können, wird in der Vorlesung ein Arduino-Board vom Typ Arduino-Micro verwendet.
Damit dieses Informationen über die serielle Schnittstelle mit Processing/Java auf dem PC austauschen kann, ist unter Linux die Anwendung eines kleinen Tricks nötig:
|
Beispiel-Processing-Programm:
import processing.serial.*; Serial myPort; // Create object from Serial class int sensorwert1 = 0; int sensorwert2 = 0; int seriellwert = 0; void setup() { size(200, 200); myPort = new Serial(this,"/dev/ttyS80", 9600); frameRate(25); } void draw() { if ( myPort.available() >= 1) { seriellwert = myPort.read(); sensorwert1 = seriellwert & 15; sensorwert2 = (seriellwert>>4) & 15; println("Sensor1:"+sensorwert1+" Sensor2:"+sensorwert2); } background(255); rect(50, 50, 100, 100); }
Code 0-4: Processing-Beispiel zum seriellen Empfang von Sensordaten.
//Dieses Arduino-Programm ist die Grundlage //für die Sensorerfassung bei KIBA. int sensorwert1; int sensorwert2; int ergebnis; void setup() { Serial.begin(9600); // setup serial } void loop() { sensorwert1 = analogRead(0); delay(50); sensorwert2 = analogRead(1); delay(50); ergebnis = (sensorwert1>>6) | ((sensorwert2>>6)<<4); Serial.write(ergebnis); delay(500); }
Code 0-5: Arduino-seitiges Programm: Lesen an zwei Pins des Analogeingangs und binäres Senden der Sensordaten.