-         

Ergebnis 1 bis 6 von 6

Thema: So ne nette GUI

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.12.2007
    Ort
    Berlin
    Alter
    33
    Beiträge
    211

    So ne nette GUI

    Anzeige

    Die hätte ich ja gerne für den RP6
    solch ein GUI
    carlitoco

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.07.2004
    Ort
    Südhessen
    Beiträge
    1.312
    Das ist alles eine Frage der Programmierung.
    Nur Versuch mach kluch.

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    24558
    Alter
    39
    Beiträge
    1.356
    hi @ carlitoco,

    sag mal woher hast du denn dieses Bild überhaupt. Interessiere mich dafür weil da oben Bioloid dran steht...vielleicht kann ich das für meinen Bioloid nutzen. Vielen Dank schon mal


    mfg
    "Es ist schwierig, jemanden dazu zu bringen, etwas zu verstehen, wenn er sein Gehalt dafür bekommt, dass er es nicht versteht" [Upton Sinclair] gez-boykott

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.07.2004
    Ort
    Südhessen
    Beiträge
    1.312
    Zitat Zitat von HeXPloreR
    sag mal woher hast du denn dieses Bild überhaupt. Interessiere mich dafür weil da oben Bioloid dran steht...vielleicht kann ich das für meinen Bioloid nutzen.
    Laut Link kommt das von dieser Seite.
    Dazu gibts auch ein generelles Wiki.

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    Bei meiner Suche nach einer GUI für meinen RP6 bin ich mal über Profan gestolpert. Voller Zugriff auf alle Windows-Geräte, grafikfähig und vor allem kostenlos! Die Syntax ist etwas gewöhnungsbedürftig, aber viele praktische Beispiele und eine aktive Kommunity machen den Einstieg einfach. Für meinen Greifer hatte ich mir ein paar Buttons zusammengebastelt die beim Anklicken ein paar Zeichen über die com-Schnittstelle zum RP6 senden. Auf der RP6-Seite läuft dann ein Programm das diese Zeichen auswertet und entsprechend die Positionen der Servos ändert. Das Ganze dient zum Teachen einer Folge von Greiferpositionen:
    Code:
    // Domino Day für den RP6 mit neuem Greifarm und ADC-ISR         5.2.2008  mic
    
    #include "RP6RobotBaseLib.h"
    
    uint8_t s0, s1, s2, s3, s4 ,s5, s6, s[7],s_aktiv, n, eingabe;
    uint8_t step, step_start, step_stop, steps[26][7];
    uint16_t pause;
    
    uint8_t adc_pos, adc_count;
    uint16_t adc_servo;
    
    void servo_ON(void)
    {
    	cli();
    // Freeruning, 5V-Ref, ISR enable, prescale /16
    // AVCC with external capacitor at AREF pin, Ergebniss rechtsbündig, Kanal ADC7 (UBAT)
    	ADMUX = (0<<REFS1) | (1<<REFS0)  | (0<<ADLAR) | 4;
    // setzte free running triggern
    	SFIOR = (0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
    // Interrupt ein, Wandler einschalten, prescaller /16
    	ADCSRA = (1<<ADIE) | (1<<ADEN) | (1<<ADPS2) | (0<<ADPS1)  | (0<<ADPS0);
    // Autotriggern bedeutet jetzt free running aktivieren, altes Flag löschen
    	ADCSRA |= (1<<ADATE) | (1<<ADIF);
    // Initialisierung starten
    	ADCSRA |= (1<<ADSC);
    // und noch die wohl eher unnötige Initiallesung
    	while (!(ADCSRA & (1<<ADIF)));
    	ADCSRA |= (1<<ADIF);
    
    	DDRC |= 0x70;		// LED1-3 auf Ausgang und low
    	PORTC &= ~0x70;
    	DDRB |= 0x83;		// LED4-6 auf Ausgang und low
    	PORTB &= ~0x83;
    	//DDRC |= 3;		// SCL und SDA auf Ausgang und low
    	//PORTC &= ~3;
    	//DDRA |= 16;    // E_INT auf Ausgang und low
    	//PORTA &= ~16;
    	sei();
    }
    void servo_OFF(void)
    {
    	cli();
    	// Initialize ADC: (Defaultsetup der RP6-Library)
    	ADMUX = 0; //external reference
    	ADCSRA = (0<<ADIE) | (0<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADIF);
    	SFIOR = 0;
    	sei();
    	updateStatusLEDs(); // LEDs restaurieren
    }
    int main(void)
    {
    	initRobotBase();
    
    	s0=s[0]=20;
    	s1=s[1]=68;
    	s2=s[2]=84;
    	s3=s[3]=58;
    	s4=s[4]=22;
    	s5=s[5]=92;
    	s6=s[6]=46;
    	servo_ON();
    	s_aktiv=1;
    	step=0;
    	step_start=step_stop=0;
    
    	while(1)
    	{
    		s0=s[0];
    		s1=s[1];
    		s2=s[2];
    		s3=s[3];
    		s4=s[4];
    		s5=s[5];
    		s6=s[6];
    		writeString_P("Step: ");
    		writeChar(step+'a');
    		writeChar(' ');
    		for(n=1; n<7; n++)
    		{
    			if(n == s_aktiv) writeString_P(" >|s");
    				else writeString_P(" s");
    			writeChar(n+'0');
    			writeString_P(":"); writeInteger(s[n], 10);
    			if(n == s_aktiv) writeString_P("|<");
    		}
    		if(0 == s_aktiv) writeString_P(" >|");
    			else writeString_P(" ");
    		writeString_P("pause:"); writeInteger(s[0], 10);
    		if(0 == s_aktiv) writeString_P("|<");
    		writeString_P("\n");
    		writeString("1-6 Servo | + - Wert ändern | S speichern | a-z Schritt | I Einfügen | L list\n");
       	while(!getBufferLength());
    		eingabe=readChar();
    		n=readChar();
    		switch(eingabe)
    		{
    	   	case ('0'): s_aktiv=0; break;
    	   	case ('1'): s_aktiv=1; break;
    	   	case ('2'): s_aktiv=2; break;
    	   	case ('3'): s_aktiv=3; break;
    	   	case ('4'): s_aktiv=4; break;
    	   	case ('5'): s_aktiv=5; break;
    	   	case ('6'): s_aktiv=6; break;
    	   	case ('+'): s[s_aktiv]++; break;
    	   	case ('-'): s[s_aktiv]--; break;
    	   	case ('*'): if (step<25) step++; break;
    	   	case ('_'): if (step>0)step--; break;
    		}
    	}
    	return 0;
    }
    
    ISR(ADC_vect)
    {
    	static uint16_t count=0;
    	//uint8_t dummy;
    	//dummy=ADCH;
    	(count>s1)?(PORTC&=~SL1):(PORTC|=SL1);
    	(count>s2)?(PORTC&=~SL2):(PORTC|=SL2);
    	(count>s3)?(PORTC&=~SL3):(PORTC|=SL3);
    	(count>s4)?(PORTB&=~SL4):(PORTB|=SL4);
    	(count>s5)?(PORTB&=~SL5):(PORTB|=SL5);
    	(count>s6)?(PORTB&=~SL6):(PORTB|=SL6);
    
    	//(count>s1)?(PORTC&=~1):(PORTC|=1); // SCL
    	//(count>s2)?(PORTC&=~2):(PORTC|=2); // SDA
    	if (count>adc_pos) // E_INT
    	{
    		DDRA &= ~16;
    		PORTA &= ~16;
    		if (count == adc_pos+100)
    		{
    			adc_servo=ADC;
    		}
    	}
    	else
    	{
    		DDRA |= 16;
    		PORTA |= 16;
    	}
    	if(count<1000) count++; else {count=0; if (pause) pause--;}
    }
    Das kann man mit dem Terminal des RP6-Loader bedienen. Die Mini-GUI mit Profan kann es aber auch:
    Code:
    Declare f%, Ende%, meldung$
    declare s1%, s2%, s3%, s4%, s5%, s6%, fertig%, pause%, test%
    declare s1_dec%, s2_dec%, s3_dec%, s4_dec%, s5_dec%, s6_dec%
    declare s1_inc%, s2_inc%, s3_inc%, s4_inc%, s5_inc%, s6_inc%
    declare pos1%, pos2%, pos3%, pos4%, pos5%, pos6%
    
    windowtitle "RP6 mit Greifer v1.0 5.2.2008 mic"
    'windowstyle 24
    windowstyle $1C
    window 0,0-1024,768
    TextColor @RGB(255,255,255),@RGB(0,16,16)
    Cls @RGB(0,16,16)
    loadbmp "rp6.bmp",130,80;0
    
    let pos1%=68
    let pos2%=84
    let pos3%=58
    let pos4%=22
    let pos5%=92
    let pos6%=46
    let pause%=10
    
    
    let s1_dec%=@createbutton(%HWnd,"+",200,104,56,24) ' 3408848
    let s2_dec%=@createbutton(%HWnd,"+",264,104,56,24) ' 1573810
    let s3_dec%=@createbutton(%HWnd,"+",328,104,56,24) ' 3408848
    let s4_dec%=@createbutton(%HWnd,"+",392,104,56,24) ' 1573810
    let s5_dec%=@createbutton(%HWnd,"+",456,104,56,24) ' 3408848
    let s6_dec%=@createbutton(%HWnd,"+",520,104,56,24) ' 1573810
    
    let s1%=@createbutton(%HWnd,"s1",200,136,56,40) ' 3408854
    let s2%=@createbutton(%HWnd,"s2",264,136,56,40) ' 2032418
    let s3%=@createbutton(%HWnd,"s3",328,136,56,40) ' 1901522
    let s4%=@createbutton(%HWnd,"s4",392,136,56,40) ' 1573664
    let s5%=@createbutton(%HWnd,"s5",456,136,56,40) ' 1704780
    let s6%=@createbutton(%HWnd,"s6",520,136,56,40) ' 6095828
    
    let s1_inc%=@createbutton(%HWnd,"-",200,184,56,24) ' 1573826
    let s2_inc%=@createbutton(%HWnd,"-",264,184,56,24) ' 1442478
    let s3_inc%=@createbutton(%HWnd,"-",328,184,56,24) ' 1573826
    let s4_inc%=@createbutton(%HWnd,"-",392,184,56,24) ' 1442478
    let s5_inc%=@createbutton(%HWnd,"-",456,184,56,24) ' 1573826
    let s6_inc%=@createbutton(%HWnd,"-",520,184,56,24) ' 1442478
    
    let fertig%=@createbutton(%HWnd,"Ende",200,216,376,48) ' 1442478
    let s6%=@DestroyWindow(s6%)
    let s6%=@createbutton(%HWnd,"123",520,136,56,40) ' 6095828
    
    'SetText s5%,"test"
    'let test%=567
    
    Let f% = @OpenCom("COM5",1024,1024)
    @setCom("com5: baud=38400 parity=n data=8 stop=1 rts=off")
    
    Let Ende% = 0
    WhileNot Ende%    'Solange Ende den Wert 0 hat ...
            settext s1%,@str$(pos1%)
            settext s2%,@str$(pos2%)
            settext s3%,@str$(pos3%)
            settext s4%,@str$(pos4%)
            settext s5%,@str$(pos5%)
            settext s6%,@str$(pos6%)
    	WaitInput     'Auf Tastendruck oder Mausklick warten
    
            If @GetFocus(s1%)
                    meldung$= "s1 "
                    @WriteCom(f%,"1")
                    elseif @GetFocus(s1_inc%)
                            meldung$= "s1-"
                            @WriteCom(f%,"-")
                            sub pos1%,1
                            elseif @GetFocus(s1_dec%)
                                    meldung$= "s1+"
                                    @WriteCom(f%,"+")
                                    add pos1%,1
                            endif
            If @GetFocus(s2%)
                    meldung$= "s2 "
                    @WriteCom(f%,"2")
                    elseif @GetFocus(s2_inc%)
                            meldung$= "s2-"
                            @WriteCom(f%,"-")
                            elseif @GetFocus(s2_dec%)
                                    meldung$= "s2+"
                                    @WriteCom(f%,"+")
                            endif
            If @GetFocus(s3%)
                    meldung$= "s3 "
                    @WriteCom(f%,"3")
                    elseif @GetFocus(s3_inc%)
                            meldung$= "s3-"
                            @WriteCom(f%,"-")
                            elseif @GetFocus(s3_dec%)
                                    meldung$= "s3+"
                                    @WriteCom(f%,"+")
                            endif
            If @GetFocus(s4%)
                    meldung$= "s4 "
                    @WriteCom(f%,"4")
                    elseif @GetFocus(s4_inc%)
                            meldung$= "s4-"
                            @WriteCom(f%,"-")
                            elseif @GetFocus(s4_dec%)
                                    meldung$= "s4+"
                                    @WriteCom(f%,"+")
                            endif
            If @GetFocus(s5%)
                    meldung$= "s5 "
                    @WriteCom(f%,"5")
                    elseif @GetFocus(s5_inc%)
                            meldung$= "s5-"
                            @WriteCom(f%,"-")
                            elseif @GetFocus(s5_dec%)
                                    meldung$= "s5+"
                                    @WriteCom(f%,"+")
                            endif
            If @GetFocus(s6%)
                    meldung$= "s6 "
                    @WriteCom(f%,"6")
                    elseif @GetFocus(s6_inc%)
                            meldung$= "s6-"
                            @WriteCom(f%,"-")
                            elseif @GetFocus(s6_dec%)
                                    meldung$= "s6+"
                                    @WriteCom(f%,"+")
                            endif
            If @GetFocus(fertig%)
                    meldung$= "end"
                    let ende%=1
            endif
    
            TextColor @RGB(255,255,255),@RGB(0,16,16)
            DrawText 0,0,meldung$+" "
    Wend
    @CloseCom(f%)
    Waitinput
    End
    Noch ein weiteres Beispiel: Ein Terminal aus den Beispielcodes an den RP6 angepasst (Baudrate 38400 und RTS gelöscht):
    Code:
    Declare a$, f%, ende%
    
    Proc GetComInput
    '---------------
    Parameters id%
    Declare x$
      Let x$=@ReadCom$(id%,1)
      @ComError(id%)
      Print x$;
      WhileNot @equ$(x$,"")
        Let x$=@ReadCom$(id%,1)
        @ComError(id%)
        Print x$;
      EndWhile
    EndProc
    
    Window 0,0-%MaxX,%MaxY
    
    Let f% = @OpenCom("COM5",1024,1024)
    @setCom("com5: baud=38400 parity=n data=8 stop=1 rts=off")
    WhileNot ende%
      Let a$ = @inkey$()   ' Tastatur abfragen
      If @Equ$(a$,"§")     ' Ende mit SHIFT-3
        Let ende%=1
      Else
        IfNot @equ$(a$,"") ' Wurde ein Zeichen eingegeben, dann ans Modem
          @WriteCom(f%,a$)
        Endif
        GetComInput f%     ' empfangene Zeichen lesen
    
      Endif
    Wend
    @CloseCom(f%)
    End
    Gruß

    mic
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken greifer-gui.jpg  

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    24558
    Alter
    39
    Beiträge
    1.356
    thx carlitoco für die Links [-o<

    leider alles in "english", war irgendwie noch nie meins...

    ...aber da kann man sich durchbeißen...auf jedenfall ziemlich imteresant was so alles geht...wenn ich nur 10% davon raelisiert bekommen was ich grade die letzte Stunde gelesen habe dann bin ich echt begeistert.

    nochmals vielen Dank


    mfg
    "Es ist schwierig, jemanden dazu zu bringen, etwas zu verstehen, wenn er sein Gehalt dafür bekommt, dass er es nicht versteht" [Upton Sinclair] gez-boykott

Berechtigungen

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