kramann.info
© Guido Kramann

Login: Passwort:










Robuste Systemintegration
1 Grundlagen
..1.1 Newton
....1.1.1 LinearSchwinger
....1.1.2 Daempfung
....1.1.4 ODE
....1.1.5 Saaluebung
..1.2 NewtonEuler
....1.2.1 Traegheitsmomente
....1.2.2 Modellgleichungen
....1.2.3 Einfachpendel
..1.3 Scilab
....1.3.1 Erste_Schritte
....1.3.2 Skripte
....1.3.3 Funktionen
..1.4 Laplace
....1.4.1 Eigenwerte
....1.4.2 PT1
..1.5 Regleroptimierung
....1.5.1 Guetefunktion
....1.5.2 Heuristiken
....1.5.3 Scilab
..1.6 Einstellregeln
....1.6.1 Totzeit
....1.6.2 Methode1
....1.6.3 Methode2
....1.6.4 Scilab
..1.7 Zustandsregler
..1.8 Polvorgabe
..1.8 Polvorgabe_alt
..1.9 Beobachter
....1.9.1 Haengependel
..1.10 Daempfungsgrad
..1.11 Processing
....1.11.1 Installation
....1.11.2 Erste_Schritte
....1.11.3 Mechatronik
....1.11.4 Bibliotheken
....1.11.5 Uebung
....1.11.6 Snippets
......1.11.6.1 Dateioperationen
......1.11.6.2 Bilder
......1.11.6.3 GUI
......1.11.6.4 Text
......1.11.6.5 PDF
......1.11.6.8 Maus
......1.11.6.10 Zeit
......1.11.6.13 Animation
......1.11.6.15 Simulation
....1.11.7 Referenzen
..1.12 Breakout
2 Beispiel
3 Beispielloesung
4 Praxis
5 javasci
6 Fehlertoleranz1
7 Reglerentwurf
..7.1 Sprungantwort
..7.2 Messdaten
..7.3 Systemidentifikation
..7.4 Polvorgabe
..7.5 Beobachter
..7.6 Robuster_Entwurf
..7.7 SIL
8 Systementwicklung
9 Arduino
..9.1 Lauflicht
..9.2 Taster
..9.3 Sensor
..9.12 Motor_PWM1
..9.13 Motor_PWM2_seriell
..9.14 Motor_PWM3_analogWrite
..9.15 Scheduler
..9.20 AV
..9.21 Mikrofon
..9.22 Universal
....9.22.1 Laborplatine
....9.22.2 LED_Leiste
....9.22.3 Motortreiber
....9.22.4 Sensoreingaenge
....9.22.5 Taster
....9.22.6 Tests
....9.22.7 Mikrofon
....9.22.8 Lautsprecher
....9.22.9 Fahrgestell
..9.23 Zauberkiste
..9.24 OOP
....9.24.1 Uebungen
..9.25 AVneu
....9.25.1 Tests
..9.26 DA_Wandler
..9.27 CompBoard
....9.27.1 Tastenmatrix
....9.27.2 ASCIIDisplay
..9.28 CTC
..9.29 Tonerzeugung
10 EvoFuzzy
..10.1 Fuzzy
....10.1.1 Fuzzylogik
....10.1.2 FuzzyRegler
....10.1.3 Uebung9
....10.1.5 Softwareentwicklung
......10.1.5.1 AgileSoftwareentwicklung
......10.1.5.2 FuzzyRegler
......10.1.5.3 Uebung
....10.1.6 Umsetzung
......10.1.6.1 FuzzyRegler
......10.1.6.2 Simulation
......10.1.6.3 Optimierung
......10.1.6.4 Uebung
....10.1.7 Haengependel
......10.1.7.1 Haengependel
......10.1.7.2 Simulation
......10.1.7.3 FuzzyRegler
......10.1.7.4 Optimierer
......10.1.7.5 Genetisch
....10.1.8 Information
....10.1.9 Energie
..10.2 Optimierung
....10.2.1 Gradientenverfahren
....10.2.2 Heuristiken
....10.2.3 ModifizierteG
....10.2.4 optim
..10.3 Genalgorithmus
..10.4 NeuronaleNetze
....10.4.1 Neuron
....10.4.2 Backpropagation
....10.4.3 Umsetzung
....10.4.4 Winkelerkennung
..10.5 RiccatiRegler
11 Agentensysteme
12 Simulation
20 Massnahmen
21 Kalmanfilter
..21.1 Vorarbeit
..21.2 Minimalversion
..21.3 Beispiel
30 Dreirad
31 Gleiter
..31.1 Fehlertoleranz

1.12 Breakout - Ausbrechen aus den bisher behandelten Programmierumgebungen

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 1.12-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 1.12-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 1.12-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:

  • Der Standardname, unter dem sich der serielle Port des Arduino-Boards unter Linux anmeldet ist: /dev/ttyACM
  • Dieser name wird nicht standardmäßig als serielles Device erkannt.
  • Abhilfe schafft ein symbolischwer Link von einem Standardnamen zu diesem Device, beispielsweise mit:
  • ln -s /dev/ttyACM /dev/ttyS80

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 1.12-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 1.12-5: Arduino-seitiges Programm: Lesen an zwei Pins des Analogeingangs und binäres Senden der Sensordaten.