- LiFePO4 Speicher Test         
Ergebnis 1 bis 6 von 6

Thema: So ne nette GUI

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    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  

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress