Realisierung einer Java-Bean zur Ansteuerung eines Servos über den Parallelport
|
Die Klasse 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
|
<?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.
|
Bild 0-1: Screenshot des Quellverzeichnisses
|
Bild 0-2: Screenshot des Quellverzeichnisses nach Aufruf von ant.
Anwendungsentwicklung mit NetBeans-IDE
|
|
Bild 0-3: NetBeansIDE-Oberfläche nach Fertigstellung des Projekts.
Bild 0-4: Editieren der Methode "adjustmentValueChanged".
|
servoNETbeans.zip - Projektordner
ACHTUNG: Zum Starten des Programms werden root-Rechte benötigt.
Bild 0-5: GUI-Anwendung, um einen Servo am Parallelport per Schieberegler zu bewegen.