PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : So ne nette GUI



carlitoco
29.10.2008, 11:36
Die hätte ich ja gerne für den RP6
solch ein GUI
http://www.huv.com/blog/uploaded_images/MicroRaptor-OperationsGUI-02-708187.PNG

thewulf00
29.10.2008, 11:38
Das ist alles eine Frage der Programmierung.
Nur Versuch mach kluch.

HeXPloreR
29.10.2008, 12:49
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

thewulf00
29.10.2008, 13:02
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 (http://www.huv.com/blog/).
Dazu gibts auch ein generelles Wiki (http://www.bioloid.info/tiki/tiki-index.php).

radbruch
29.10.2008, 15:45
Hallo

Bei meiner Suche nach einer GUI für meinen RP6 bin ich mal über Profan (http://xprofan.com/start.html) 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:

// 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:

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):

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

HeXPloreR
29.10.2008, 19:17
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