kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




Realisierung einer Java-Bean zur Ansteuerung eines Servos über den Parallelport

  • In den vorangehenden Kapiteln wurde beschrieben, wie sich Lesen und Schreiben als C-Funktion unter Linux auf den Parallelport realisieren läßt.
  • Außerdem wurde gezeigt, wie sich C-Funktionen über das jni (Java-Native-Interface) in Java-Klassen einbetten lassen.
  • Nun soll eine Java-Bean erstellt werden, die ein PWM-Signal auf den Parallelport erzeugt.
  • Anschließend soll diese JavaBean in eine Anwendung mit GUI eingefügt werden.
  • Dann soll ein Schieberegler hinzugefügt werden.
  • Der Schieberegler soll über eine Listener-Methode die Methode des Servo-Beans anstoßen, die die PWM-Breite für den Servo setzt.

Die Klasse Servo

  • Die Klasse Servo ist die JavaBean.
  • Damit mit ihrer Hilfe ein am Parallelport auf D7 angeschlossener Servo angesteuert werden kann, implementiert sie die Schnittstelle Runnable und wird bei Aufruf des Konstruktors in einem Thread gestartet.
  • Die Methode run() enthält eine Endlosschleife, in der ein periodisches Signal auf D7 gegeben wird, dessen Pulsbreite über den Parameter pwmpuls eingestellt werden kann.
  • Der Zugriff auf den Parallelport erfolgt über die bereits erstellte Klasse Parallelport mit der statischen Methode schreibe().
  • Um die PWM-Breite zu beeinflussen, wird die Methode setPwmpuls() verwendet, die gemeinsam mit getPwmpuls() der Konvention von JavaBeans genügt.
  • Neben der Funktionalität der Klasse Servo wird noch eine grafische Repräsentation benötigt, die es unter NetBeansIDE erlaubt ein Objekt vom Typ Servo auf ein Fenster zu ziehen und dort als Element zu sehen.
  • Aus diesem Grund erbt Servo von der Klasse JPanel und fügt auf ihre Darstellungsfläche (Panel) einen Aufkleber (Label) mit der Beschriftung "Servo".
import java.awt.Color;
import java.awt.*;
import javax.swing.*;
import java.io.Serializable;
import parallel.*;
/**
Servos: 
PWM-Periode: 50..100Hz <=> 0,02 .. 0,01s
PWM-Puls:     1..2ms   <=> 0,001 .. 0,002s
*/
public class Servo extends JPanel  implements Serializable, Runnable
{
    private long zeit;     //zuletzt gespeicherte Zeit, an der ein Puls gesendet wurde.
    private long periode;  //PWM-Periodendauer in Nanosekunden
    private long pwmpuls;  //PWM-Pulsbreite in Nanosekunden
    public void setPwmpuls(long pwmpuls)
    {
        this.pwmpuls = pwmpuls;
    }
    public long getPwmpuls()
    {
        return this.pwmpuls;
    }
    public void run()
    {
        while(true)
        {
            try
            {
                Thread.sleep(12);              
            }
            catch(Exception e)
            {
            }
            while(System.nanoTime()<zeit+periode);
            Parallelport.sende(128);
            while(System.nanoTime()<zeit+periode+pwmpuls);            
            Parallelport.sende(0);
            zeit=System.nanoTime();
        }
    }
    public Servo()
    {
        //optische Repräsentation als JavaBean:
        JLabel aufkleber = new JLabel("Servo");
        aufkleber.setForeground( Color.WHITE );
        add(aufkleber);
        setBackground( Color.BLUE );
        //Servofunktionalität vorbereiten:
        zeit    = System.nanoTime();
        periode = 15000000;
        pwmpuls = 1500000; //Mittelstellung
        Thread thread = new Thread(this);
        thread.start();
    }
    public static void main(String[] args)
    {
        if(args.length!=1)
        {
            System.out.println("Servowinkel an D7 am Parallelport einstellen.");
            System.out.println("Benutzung:");
            System.out.println("Servo <pwmpuls 1000000..2000000 in Nanosekunden");
            System.out.println("Beispiel: (mittlere Position)");
            System.out.println("Servo 1500000");
        }
        else
        {
            Servo servo = new Servo();
            servo.setPwmpuls((long)Double.parseDouble(args[0]));
            while(true)
            {
                try
                {
                    Thread.sleep(200);
                }
                catch(Exception ee)
                {
                }
            }
        }
    }
}

Code 0-1: Quellcode der Java-Bean-Klasse Servo in der Quelltextdatei Servo.java

Damit es Möglich ist im BeanBrowser unter NetBeansIDE zu der Servo-Bean ein Icon anzuzeigen und nur die Attribute als änderbar anzuzeigen, die hier wichtig sind - hier nur pwmpuls, wird eine BeanInfo-Klasse erstellt, die den Namen ServoBeanInfo tragen muß.

import java.awt.*;
import java.beans.*;
import java.lang.reflect.*;
public class ServoBeanInfo extends SimpleBeanInfo
{
  public Image getIcon(int iconKind)
  {
    return loadImage("ServoIcon.png");
  }  
  public PropertyDescriptor[] getPropertyDescriptors()
  {
    try 
    {
         return new PropertyDescriptor[] 
         {
             new PropertyDescriptor("pwmpuls",Servo.class)
         };
    } 
    catch (IntrospectionException e) 
    {
         System.out.println(e);
         return null;
    }
  }
}

Code 0-2: Quellcode der Beschreibungsklasse ServoBeanInfo in der Quelltextdatei ServoBeanInfo.java.

Die Build-Datei

  • Damit ANT die Archivdatei für die ServoBean generieren kann, müssen darin alle zugehörigen Quell- und Klassendateien (u.a. auch die Klasse Parallelport) angegeben werden.
  • Zudem wird über javadoc automatisch eine API erzeugt.
<?xml version="1.0" encoding="ISO-8859-1"?>
    <project default="build">
        <dirname property="basedir" file=""/>
        <property name="beanname" value="Servo"/>
        <property name="archivname" value="servo"/>
        <property name="jarfile" value="/.jar"/>
        <target name="build" depends="compile">
              <jar destfile="" basedir="" includes="*.class,*.png">
                  <manifest>
                      <section name=".class">
                          <attribute name="Java-Bean" value="true"/>
                      </section>
                  </manifest>
              </jar>
        </target>
        <target name="compile">
            <javac destdir="">
                <src location=""/>
            </javac>
        </target>
       <mkdir dir="/javadoc"/>
           <javadoc
               sourcepath=""
               sourcefiles="Parallelport.java,Servo.java,DoubleParameterBeanBeanInfo.java,BasisInternesFenster.java,InternesFenster.java,ServoBeanInfo.java"
               destdir="/javadoc"
               private="false"
               windowtitle=""
               doctitle=""
           />
       <zip destfile="/-doc.zip" basedir="/javadoc"/>
        <target name="clean">
            <delete file="">
                <fileset dir="" includes="*.class,*.png"/>
            </delete>
        </target>
    </project> 

Code 0-3: Build-Datei für die ServoBean build.xml.

  • Im folgenden sieht man einen Screenshot des Quellverzeichnisses, aus dem dann servo.jar erstellt wird:
Screenshot des Quellverzeichnisses

Bild 0-1: Screenshot des Quellverzeichnisses

  • Nach Aufruf von ant sieht es dann folgendermaßen aus:
Screenshot des Quellverzeichnisses nach Aufruf von ant.

Bild 0-2: Screenshot des Quellverzeichnisses nach Aufruf von ant.

Anwendungsentwicklung mit NetBeans-IDE

  • Folgende Schritte müssen durchgeführt werden:
  1. Anlegen eines neuen Verzeichnisses.
  2. Start von NetBeansIDE.
  3. Schließen aller offenen Projekte.
  4. Anlegen eines neuen Java-Anwendungs-Projekts in dem neu angelegten Verzeichnis mit Main-Methode im default-Package (vergl. vorangegangene Beispiele).
  5. Einbinden von servo.jar in Libraries (Project-Browser).
  6. Anlegen eines JFrame-Forms im default-Package.
  7. Hinzufügen der ServoBean über das gleiche servo.jar Archiv (Palette-Browser, bei Beans, rechte Maustaste, Palette-Manager, Add as .jar).
  8. Ziehen der ServoBean auf das JFrame-Form in der Design-Ansicht. (Dadurch wird ein Objekt von Servo angelegt und als Objektattribut im JFrame-Objekt abgelegt mit dem Namen servo1).
  9. Ziehen einer JScrollBar auf das JFrame-Form in der Design-Ansicht. (Dadurch wird ein Objekt von JScrollBar angelegt und als Objektattribut im JFrame-Objekt abgelegt mit dem Namen jScrollBar1)
  10. Einstellen des minimalen und maximalen Wertes der Scrollbar zu 1000000 und 2000000 für die PWM-Breite in Nanosekunden im Parameterfenster des Objekts.
  11. Markieren des JScrollBar-Objekts im Design-Modus und mit der Rechten Maustaste "Events" "adjustmentValueChanged" auswählen. (Hierdurch wird im JFrame-Objekt die Methode "private void jScrollBar1AdjustmentValueChanged(java.awt.event.AdjustmentEvent evt)" angelegt.)
  12. Wechselt man nun vom Design-Modus zum Quelltext (geschieht hier automatisch), so kann nun der Rumpf dieser Methode editiert werden.
NetBeansIDE-Oberfläche nach Fertigstellung des Projekts.

Bild 0-3: NetBeansIDE-Oberfläche nach Fertigstellung des Projekts.

Editieren der Methode

Bild 0-4: Editieren der Methode "adjustmentValueChanged".

  • Durch den oben zu sehenden Eintrag in die "adjustmentValueChanged"-Methode, reagiert nun der Servo auf die ScrollBar.
quellordner.zip - Erstellungsordner für Java-Bean
servoNETbeans.zip - Projektordner
ACHTUNG: Zum Starten des Programms werden root-Rechte benötigt.
GUI-Anwendung, um einen Servo am Parallelport per Schieberegler zu bewegen.

Bild 0-5: GUI-Anwendung, um einen Servo am Parallelport per Schieberegler zu bewegen.