- LiTime Speicher und Akkus         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 23

Thema: ASURO mit Java steuern

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    12.02.2006
    Beiträge
    459

    ASURO mit Java steuern

    Anzeige

    Praxistest und DIY Projekte
    Hallo Alle,

    den ASURO will ich mit einem kleine Java-Programm steuern. Um über die Schnittstelle Daten zu übertragen, werde ich RXTX einsetzen.
    Hat schon mal jemand versucht, ein Java-Programm zu schreiben?

    Gruß,
    robo

    Nachtrag:
    hier ein Bild vom Zwischenstand

    Bild hier  

  2. #2
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.062
    es gib eine eigene virtual machine die auf dem atmega8 läuft. damit könntest du auch java programme auf dem asuro laufen lassen.

    meintest du das?
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    12.02.2006
    Beiträge
    459
    Nein, auf dem Atmega8 soll ein C-Programm laufen. Das Steuerprogramm auf dem PC mit Java.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    09.05.2007
    Beiträge
    99
    Ich mache das mit JAVA!
    Ungefähr so:
    Code:
    import javax.comm.*;
    ...
    
    serialPort=open("COM1");
    serialPort.setSerialPortParams(2400, SerialPort.DATABITS_8,SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
    outputStream = serialPort.getOutputStream();
    
    ...
    outputStream.write(char);
    ...
    mit
    Code:
    SerialPort open(String name) throws PortInUseException {
    	CommPortIdentifier portId;
    
    	Enumeration portList;
    
    	portList = CommPortIdentifier.getPortIdentifiers();
    
    	while (portList.hasMoreElements()) {
    		portId = (CommPortIdentifier) portList.nextElement();
    		if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
    			if (portId.getName().equals(name)) {
    				return (SerialPort) portId.open(name, 2000);
    			}
    		}
    	}	
    	return null;
    }

    Tut's

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    12.02.2006
    Beiträge
    459
    Hallo rosir,

    Zugegebenermaßen habe ich erst vor 4 Tagen angefangen, mich mit Java zu beschäftigen. Die Grundlegende Kommunikation habe ich aber vor kurzem schon hingekriegt.

    import javax.comm.*;
    Wenn ich beim Durchstöbern des Internet nichts übersehen habe, unterstützen die Orginal comm Klassen von Sun Windows nicht.
    Unter Window muss man RXTX verwenden und dann sieht das ganze so aus

    import gnu.io.*;
    Was ich mich Frage: Wenn man jemandem ein Java-Programm geben möchte, wie ist das mit der Installation?
    Für die Kommunikation wird die JRE und RXTX gebraucht. Gibt es Installer, die alle Datein auf einem Computer an die richtigen Stellen schieben? Kann man ein Java-Programm über eine Verknüpfung auf dem Desktop starten?

    Gruß,
    robo

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    09.05.2007
    Beiträge
    99
    Also, wenn ich mich richtig erinnere und man JAVA von den SUN Seiten installiert funktioniert doch alles automatisch?! Selbst JAR Dateien werden mit javaw.exe verbunden. D.h. ein Doppelklick auf eine JAR Datei startet dann das darin enthaltene JAVA Programm.

    Ok, bei RXTX wird man wohl die entsprechenden Libraries (jars) händig ins richtige Verzeichnis kopieren müssen (mit RXTX habe ich aber keine Erfahrung).

    Oder, habe ich Deine Frage nicht richtig verstanden?

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    12.02.2006
    Beiträge
    459
    Hallo rosir,

    Also, wenn ich mich richtig erinnere und man JAVA von den SUN Seiten installiert funktioniert doch alles automatisch?! Selbst JAR Dateien werden mit javaw.exe verbunden. D.h. ein Doppelklick auf eine JAR Datei startet dann das darin enthaltene JAVA Programm.
    Leier weis ich das nicht. Ich hatte mir Java als großes Zip-File heruntergeladen und dann das Java-Verzeichnis 'händisch' angelegt. Dadurch sind die *.jar- Files leider nicht mit Java verbunden.
    ( BTW: wie macht man das eigentlich nachträglich? )
    Ok, bei RXTX wird man wohl die entsprechenden Libraries (jars) händig ins richtige Verzeichnis kopieren müssen
    Ja, das befürchte ich auch. Könnte es sein, dass es einfache, selbst zu konfigurierende Installer gibt?

    (mit RXTX habe ich aber keine Erfahrung).
    Geht es auch anders mit Windows? Ich dachte die Sun-Comm-Lib funktioniert nur mit Linus und Mac ( laut Internet ).

    Gruß,
    robo

    Kommunikationsprogramm auf ASURO-Seite

    Hier habe ich ein sehr einfaches Kommunikationsprogramm in C für die ASURO Seite geschrieben. Es versteht im Moment nur zwei Kommandos:

    't' für Test
    'l' um den linken Liniensesnor abzufragen

    man kann aber sehr einfach weitere Kommandos an das Programm hinzufügen. Für das Programm wird die Asuro LibV261 von http://sourceforge.net/projects/asuro/ benötigt

    Code:
    #include "asuro.h"
    /***************************************************************************
     *   
     *  AsuroEasyCom
     *
     *  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 
     *
     ***************************************************************************
    */
    
    // Status LED Farbe wechseln
    void toggle_led()	
    {
    	static uint8_t k=0;
    	
    	if(k)StatusLED(GREEN);
    	else StatusLED(YELLOW);
    	k=~k;			
    }
    // Ein Zeichen von IR empfangen
    uint8_t receive()
    {
    	/* Warten auf ein Zeichen von der seriellen Schnittstelle */
    	UCSRB = 0x10; // enable receiver
    	while(!(UCSRA & 0x80)); // wait for received byte
    	toggle_led();
    	return UDR;
    }
    // Text senden
    void SerPrint(unsigned char *data)
    {
    	SerWrite(data,strlen(data));
    }
    
    int main(void)
    {
    	uint8_t command;
    	int linie[2];
    	
    	Init();
    	SerPrint("\n\r-- ASURO Ready --\n\r");
    	StatusLED(GREEN);
    	
    	while(1)
    	{
    		/* Warten auf ein Kommando der seriellen Schnittstelle */
    		command = receive();
    
    		switch(command)
    		{
    
            	// Testcommando
    			case 't':
            	{
    				SerPrint("xASUROy");
    			}
    			break;
    
    			// Liniensensor links abfragen
    			case 'l':
            	{
    				LineData(linie);
    				SerPrint("x");
    				PrintInt(linie[0]);
    				SerPrint("y");
    			}
    			break;
    
    			// nicht erkannte Kommandos
    			default:
    			{ 
    				StatusLED(RED);
    				SerPrint("E"); /* Falls kein bekanntes Kommando, 'E' für Error senden */  			
    			}break;
    		}
    	}      
    return 0;
    }
    /***************************************************************************
     *   
     *   (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.                                                            *
     ***************************************************************************/

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hallo robo,

    Geht es auch anders mit Windows? Ich dachte die Sun-Comm-Lib funktioniert nur mit Linus und Mac ( laut Internet ).
    So ist es. Beim c't-Bot wurde deshalb auch die RXTX Lib verwendet. Zur Installation unter Windows wird lediglich die Datei
    rxtxSerial.dll benötigt, die in das Verzeichnis JAVA_HOME\jre\bin kopiert werden muß.
    Mit einen Installprogramm wie z.B. NSIS eigentlich kein Problem.

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    12.02.2006
    Beiträge
    459
    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?
    Angehängte Dateien Angehängte Dateien

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    15.02.2008
    Ort
    Bremen
    Alter
    44
    Beiträge
    119
    Allgemein solltest du dir die Objektorientierung mal etwas näher anschauen -- einfach alle Methoden static zu machen entspricht eigentlich nicht dem Gedanken der objektorientierten Programmierung

    Als einfaches Beispiel könnte deine Klasse für die ASURO-Kommunikation folgendes Schema haben:

    Code:
    public class ASURO {
    
        private RS232 thePort = null;
    
    
        public boolean testCommand() {
            //...
        }
    
        //.... Hier alle möglichen Methoden zur
        // Kommunikation mit dem ASURO
    
        public ASURO(Rs232 port) {
            thePort = port;
        }
        public ~ASURO() {}
    
        public static void main() {
            s232 port1=new Rs232();
            port1.ports_available();
            port1.open("COM10") 
            ASURO myAsuro = new ASURO(port1);
            myAsuro.testCommand();
            //usw.
        }
    
    
    }
    JavaDoc kann aus den Quellcodekommentaren eine Dokumentation erstellen, bspw. in HTML (siehe SUNs Java API Dokumentation, die ist so erstellt). Damit Javadoc weiß, was/wie/wo dokumentiert wird, muss man sich bei der Erstellung der Kommentare an ein paar Konventionen halten.

    Siehe bspw. hier:
    http://www.tobias-seckinger.de/java/...inf-hrung.html

    Eine gute Alternative zu Javadoc, die auch mit C++ usw. umgehen kann, ist Doxygen (+doxywizard):
    http://www.stack.nl/~dimitri/doxygen/

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus