Liste der Anhänge anzeigen (Anzahl: 1)
Hallo m.a.r.v.i.n,
vielen Dank für die Auskunft, ich hätte nicht gedacht, dass es so einfach ist. Bei RXTX ist ja noch die Datei rxtxParallel.dll dabei, die man angeblich auch noch mitkopieren soll.
Gruß,
robo
Mittlerweile habe ich es schon geschafft, mein erstes Java-Programm zu schreiben, welches testen kann, ob der ASURO da ist. Es kann auch die Werte des Linken Liniensensors auslesen.
Hier also meine erste Java-Klasse ( bin ja Java-Anfänger )
Code:
/**
* Java Testprogramm zur Kommunikation mit dem ASURO Roboter
*
* Programm zur einfachen Kommunikation des PC mit dem ASURO
* über die Infrarot Schnittstelle
*
* Kommandos:
*
* t: Testkommando, Asuro sendet xASUROy zurück
* l: Abfrage des linken Liniensensors, Asuro sendet xZAHLy zurück
*
*
* @author robo.fr ( Nickname ) christoph(at)roboterclub-freiburg.de
*
* Feb.2008
*
*/
public class Test
{
private static boolean debug = true;
// Nachbau von Msleep aus der AsuroLibV261 für Java
// ( leider müssen Methoden in Java klein geschrieben werden )
public static void msleep(int millisekunden)
{
long stop,current;
java.util.Date zeit=new java.util.Date();
stop=zeit.getTime()+millisekunden;
current=0;
while(current<stop)
{
java.util.Date zeit2=new java.util.Date();
current=zeit2.getTime();
}
}
// sende das Testzeichen 't' zum ASURO und warte auf die
// korrekte Antwort: "xASUROy"
// falls der ASURO richtig antwortet, return true
public static boolean testCommand(Rs232 port)
{
port.read(); // Empfangsbuffer leermachen durch lesen
port.write((byte)'t'); // Testkommando senden
msleep(200);
String text=port.read();
if(debug) System.out.println(text);
if(text.contains("x") && text.contains("y"))
{
//if((text.indexOf("ASURO")-text.indexOf('x'))==1)
if(text.indexOf("xASUROy")!=-1)
{
if(debug) System.out.println("Test OK");
return true; // Test OK, der ASURO antwortet korrekt
}
}
if(debug) System.out.println("No ASURO");
return false;
}
// Wert des linken Liniensensors lesen
public static double read_line_left(Rs232 port)
{
port.read(); // Empfangsbuffer leermachen durch lesen
port.write((byte)'l'); // Liniensensor Lesekommando
msleep(500);
String text=port.read();
if(debug) System.out.println(text);
double x;
if(text.contains("x") && text.contains("y"))
{
String s=text.substring(text.indexOf("x")+1,text.indexOf("y"));
x=Double.parseDouble(s);
if(debug) System.out.println(x);
return x; // Test OK, der ASURO antwortet korrekt
}
if(debug) System.out.println("No Number");
x=Double.NaN; // return Not a Number
return x;
}
public static void main(String[] args)
{
int n;
Rs232 port1=new Rs232();
port1.ports_available();
port1.open("COM10") ;
port1.write("test");
testCommand(port1);
testCommand(port1);
for(n=0;n<50;n++)
{
read_line_left(port1);
}
port1.close() ;
System.out.println("beendet");
}
}
/***************************************************************************
*
* (c) 2008 robo.fr (Nickname) , christoph(at)roboterclub-freiburg.de
*
***************************************************************************
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation version 2 of the License, *
* If you extend the program please maintain the list of authors. *
* ( if there is no real name, the nick name has to be mentioned )
* If you want to use this software for commercial purposes and you *
* don't want to make it open source, please contact the authors for *
* licensing. *
***************************************************************************/
Zur Entwicklung verwende ich Eclipse. Da gibt es ein Fenster, das heist Javadoc. Kann man damit automatisch eine Dokumentation erstellen? Wie muss ein einfacher Syntax aussehen?
Hier das ganze Projekt als Zip-File, falls es jemand ausprobieren will.
An die Java-Profis: Was könnte ich den alles besser machen?
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Du musst repaint() aufrufen!
Vielen Dank, damit sieht das ganze schon viel besser aus =P~
Jetzt versuche ich gerade, eine graphische Benutzeroberfläche mit 3 Buttons für das ferngesteuerte Einschalten der LED's des ASURO zu programmieren.
Code:
import java.awt.Image;
import java.awt.FlowLayout;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class AsuroControl
{
public static void main( String[] args )
{
JFrame fenster = new JFrame("Java ASURO CONTROL");
fenster.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
//fenster.setLayout( new FlowLayout() );
fenster.setLayout( new BorderLayout(5,5) );
fenster.setSize(320,120);
JPanel schalterPanel=new JPanel();
schalterPanel.setLayout(new FlowLayout());
JPanel bilder=new JPanel();
Icon bild = new ImageIcon(AsuroControl.class.getResource( "/images/asuro.jpg" ) );
final JButton button1 = new JButton("BACK_LED_R");
final JButton button2 = new JButton( "BACK_LED_L" );
final JButton button3 = new JButton( "FRONT_LED" );
final JButton button4 = new JButton( bild );
schalterPanel.add( button1 );
schalterPanel.add( button2 );
schalterPanel.add( button3 );
bilder.add( button4);
fenster.add(schalterPanel,BorderLayout.PAGE_END);
fenster.add(bilder,BorderLayout.PAGE_START);
/*
AsuroKommandos asuro=new AsuroKommandos();
asuro.schnittstelleOeffnen("COM10");
asuro.verbindungOk() ; // prüfen und zeigen, ob Verbindung
asuro.schnittstelleSchliessen();
*/
fenster.pack();
fenster.setVisible( true );
}
}
Das ganze sieht dann wie das Bild aus. Jetzt stellt sich mir die Frage, wie ich die Tastedrücke mit der AsuroKommandos-Klasse verbinde.
Liste der Anhänge anzeigen (Anzahl: 1)
Für Java habe ich mich wegen der Plattformunabhängigkeit entschieden. Da es ja doch immer mehr Leute gibt, die einen Mac oder Linux nutzen, wollte ich sicherstellen, dass jeder das Programm benutzen kann.
Zitat:
Nur die ganzen ActionListener würde ich noch so wie in meinem Beispiel als anonyme Klasse erstellen - also keine extra Variablen dafür sondern direkt im Aufruf von addActionListener() zusammenbauen.
Das habe ich jetzt mal für einen der Knöpfe realisiert ( Lichtorgel ). Die anderen müsste ich auch noch umbauen, das werde ich auf später verschieben.
Mittlerweile hat sich der Code schon wieder etwas erweitert
Code:
/**
* Einfache Java Klasse mit graphischer Oberflaeche
* zur Steuerung eines ASURO-Roboters ueber die IR-Schnittstelle
*
* Funktionen: Leds ein und ausschalten
*
* @author robo.fr ( Nickname ) christoph(at)roboterclub-freiburg.de
*
* March.2008
*
*/
import java.awt.Image;
import java.awt.FlowLayout;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class AsuroControl extends JFrame implements WindowListener
{
private AsuroKommandos asuro=null;
private static boolean debug=true;
private JTextField batterieWert;
// Hier müssen alle Methoden zur Behandlung der Fenster-Events folgen
public void windowClosing( WindowEvent event )
{
asuro.schnittstelleSchliessen();
System.exit( 0 );
}
public void windowClosed( WindowEvent event ) { /*Empty*/ }
public void windowDeiconified( WindowEvent event ) { /*Empty*/ }
public void windowIconified( WindowEvent event ) { /*Empty*/ }
public void windowActivated( WindowEvent event ) { /*Empty*/ }
public void windowDeactivated( WindowEvent event ) { /*Empty*/ }
public void windowOpened( WindowEvent event ) { /*Empty*/ }
// das ganze Programm befindet sich im Konstruktor
AsuroControl()
{
setSize( 550, 400 );
addWindowListener( this );
asuro=new AsuroKommandos();
// Panel erstellen, die später im Fenster sichtbar werden
JPanel ledSchalterPanel=new JPanel();
JPanel motorSchalterPanel=new JPanel();
JPanel bilder=new JPanel();
JPanel textPanel=new JPanel();
JPanel multiFunktionsPanel=new JPanel();
// Zusammenstellung der Anzeigefelder
batterieWert=new JTextField();
double x=1.23; // Dummy Wert
batterieWert.setText("Batterie "+String.valueOf(x)+" V");
textPanel.add(batterieWert);
JButton lichtorgelButton=new JButton();
lichtorgelButton.setText("Lichtorgel");
multiFunktionsPanel.add(lichtorgelButton);
// Lichtorgel Demo: mit den LED's blinken
lichtorgelButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
for(int n=0;n<10;n++)
{
asuro.ledsOff(); // Led's aus
asuro.backLedL() ; // backLedL einschalten
asuro.backLedR() ;
asuro.frontLed();
}
asuro.ledsOff(); // Led's aus
}
});
// Action beim drücken des ASURO Bildes
Action testAction = new AbstractAction( )
{
public void actionPerformed( ActionEvent e )
{
if(debug&asuro.verbindungOk()) System.out.println("passt");
batterieWert.setText("Batterie "+asuro.batterie()+" V");
}
};
//****************** LED Actions ********************************
Action FrontLedAction = new AbstractAction( "vorne" )
{
public void actionPerformed( ActionEvent e )
{
if(debug) System.out.println("FrontLed ein");
asuro.ledsOff(); // Led's aus
asuro.frontLed() ; // frontLed einschalten
}
};
Action BackLedLAction = new AbstractAction( "links" )
{
public void actionPerformed( ActionEvent e )
{
if(debug) System.out.println("linke BackLed ein");
asuro.ledsOff(); // Led's aus
asuro.backLedL() ; // backLedL einschalten
}
};
Action BackLedRAction = new AbstractAction( "rechts" )
{
public void actionPerformed( ActionEvent e )
{
if(debug) System.out.println("rechte BackLed ein");
asuro.ledsOff(); // Led's aus
asuro.backLedR() ; // backLedr einschalten
}
};
//****************** Motor Actions ********************************
Action asuroVorAction = new AbstractAction( "vor" )
{
public void actionPerformed( ActionEvent e )
{
if(debug) System.out.println("Asuro vor");
asuro.gehVor();
}
};
Action asuroRueckAction = new AbstractAction( "rueck" )
{
public void actionPerformed( ActionEvent e )
{
if(debug) System.out.println("Asuro vor");
asuro.gehRueck();
}
};
Action asuroLinksAction = new AbstractAction( "links" )
{
public void actionPerformed( ActionEvent e )
{
if(debug) System.out.println("Asuro vor");
asuro.gehLinks();
}
};
Action asuroRechtsAction = new AbstractAction( "rechts" )
{
public void actionPerformed( ActionEvent e )
{
if(debug) System.out.println("Asuro vor");
asuro.gehRechts(); // Led's aus
}
};
// Zusammenstellung der LED-Schalter
JButton buttonFrontLed = new JButton(FrontLedAction);
JButton buttonBackLedL = new JButton(BackLedLAction);
JButton buttonBackLedR = new JButton(BackLedRAction);
JTextField ledBeschriftung=new JTextField();
ledBeschriftung.setText("Leds");
ledSchalterPanel.add(ledBeschriftung);
ledSchalterPanel.add(buttonBackLedL);
ledSchalterPanel.add(buttonFrontLed);
ledSchalterPanel.add(buttonBackLedR);
// Zusammenstellung der Motorschalter
JButton asuroVor = new JButton(asuroVorAction);
JButton asuroRueck = new JButton(asuroRueckAction);
JButton asuroLinks = new JButton(asuroLinksAction);
JButton asuroRechts = new JButton(asuroRechtsAction);
JTextField motorBeschriftung=new JTextField();
motorBeschriftung.setText("Motoren");
motorSchalterPanel.add(motorBeschriftung);
motorSchalterPanel.add(asuroVor);
motorSchalterPanel.add(asuroRueck);
motorSchalterPanel.add(asuroLinks);
motorSchalterPanel.add(asuroRechts);
// Laden und Einfügen des Asuro Bildes
Icon bild = new ImageIcon(AsuroControl.class.getResource( "/images/asuro.jpg" ) );
JButton buttonAsuroBild = new JButton( bild );
buttonAsuroBild.addActionListener(testAction);
bilder.add( buttonAsuroBild);
// Layout für das Gesamtfenster festlegen
this.setLayout( new BorderLayout(5,5) );
// Alle Panel zu Fenster hinzufügen
this.add(motorSchalterPanel,BorderLayout.PAGE_START);
this.add(ledSchalterPanel,BorderLayout.PAGE_END);
this.add(bilder,BorderLayout.CENTER);
this.add(textPanel,BorderLayout.LINE_START);
this.add(multiFunktionsPanel,BorderLayout.LINE_END);
// Hauptfenster Titel setzen und sichtbar machen
this.setTitle("Java ASURO control");
setVisible( true );
asuro.schnittstelleOeffnen("COM10");
}
public static void main( String[] args )
{
new AsuroControl();
}
}
/***************************************************************************
*
* (c) 2008 robo.fr (Nickname) , christoph(at)roboterclub-freiburg.de
*
***************************************************************************
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation version 2 of the License, *
* If you extend the program please maintain the list of authors. *
* ( if there is no real name, the nick name has to be mentioned )
* If you want to use this software for commercial purposes and you *
* don't want to make it open source, please contact the authors for *
* licensing. *
***************************************************************************/
und die Oberfläche sieht wie das Bild aus.
Wenn man auf den ASURO klickt, wird die Batteriespannung des ASURO ausgelesen und übertragen. Der Knopf "Lichtorgel" läst die LEDs Java gesteuert am Asuro blinken.
Beim Auslesen der Batteriespannung wäre es natürlich schöner, wenn das timergesteuert so alle 2 Sekunden passieren würde, da ist mir aber noch nicht ganz klar, wie das geht.
Es wäre schön, wenn sich ein Beta-Tester für das Programm finden würde, dann poste ich hier das ganze Projekt wieder.
Gruß,
robo